《單片機(jī)課程設(shè)計說明書》占空比可調(diào)信號發(fā)生器
《《單片機(jī)課程設(shè)計說明書》占空比可調(diào)信號發(fā)生器》由會員分享,可在線閱讀,更多相關(guān)《《單片機(jī)課程設(shè)計說明書》占空比可調(diào)信號發(fā)生器(34頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、武漢理工大學(xué)《單片機(jī)課程設(shè)計說明書》 占空比可調(diào)信號發(fā)生器 1 軟件介紹 1.1 proteus軟件 Proteus ISIS是英國Labcenter公司開發(fā)的電路分析與實(shí)物仿真軟件。它運(yùn)行于Windows操作系統(tǒng)上,可以仿真、分析(SPICE)各種模擬器件和集成電路,該軟件的特點(diǎn)是: (1)實(shí)現(xiàn)了單片機(jī)仿真和SPICE電路仿真相結(jié)合。具有模擬電路仿真、數(shù)字電路仿真、單片機(jī)及其外圍電路組成的系統(tǒng)的仿真、RS232動態(tài)仿真、I2C調(diào)試器、SPI調(diào)試器、鍵盤和LCD系統(tǒng)仿真的功能;有各種虛擬儀器,如示波器、邏輯分析儀、信號發(fā)生器等。 (2)支持主流單片機(jī)系統(tǒng)的仿真。目前支持的單片機(jī)類
2、型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各種外圍芯片。 (3) 提供軟件調(diào)試功能。在硬件仿真系統(tǒng)中具有全速、單步、設(shè)置斷點(diǎn)等調(diào)試功能,同時可以觀察各個變量、寄存器等的當(dāng)前狀態(tài),因此在該軟件仿真系統(tǒng)中,也必須具有這些功能;同時支持第三方的軟件編譯和調(diào)試環(huán)境,如Keil C51 uVision2等軟件。 (4) 具有強(qiáng)大的原理圖繪制功能??傊撥浖且豢罴瘑纹瑱C(jī)和SPICE分析于一身的仿真軟件,功能極其強(qiáng)大。本章介紹Proteus ISIS軟件的工作環(huán)境和一些基本操作。 特點(diǎn):支持ARM7,PIC ,AVR
3、,HC11以及8051系列的微處理器CPU模型,更多模型正在開發(fā)中: 交互外設(shè)模型有LCD顯示、RS232終端、通用鍵盤、開關(guān)、按鈕、LED等; 強(qiáng)大的調(diào)試功能,如訪問寄存器與內(nèi)存,設(shè)置斷點(diǎn)和單步運(yùn)行模式; 支持如IAR、Keil和Hitech等開發(fā)工具的源碼C和匯編的調(diào)試; 一鍵“make”特性:一個鍵完成編譯與仿真操作; 內(nèi)置超過6000標(biāo)準(zhǔn)SPICE模型,完全兼容制造商提供的SPICE模型; DLL界面為應(yīng)用提供特定的模式; 基于工業(yè)標(biāo)準(zhǔn)的SPICE3F5混合模型電路仿真器 14種虛擬儀器:示波器、邏輯分析儀、信號發(fā)生器、規(guī)程分析儀等; 高級仿真包含強(qiáng)大的基于圖形的分
4、析功能:模擬、數(shù)字和混合瞬時圖形;頻率;轉(zhuǎn)換;噪聲;失真;付立葉;交流、直流和音頻曲線; 模擬信號發(fā)生器包括直流、正旋、脈沖、分段線性、音頻、指數(shù)、單頻FM;數(shù)字信號發(fā)生器包括尖脈沖、脈沖、時鐘和碼流; 集成PROTEUS PCB設(shè)計形成完整的電子設(shè)計系統(tǒng)。 1.2 Keil軟件 Keil C51是美國Keil Software公司出品的51系列兼容單片機(jī)C語言軟件開發(fā)系統(tǒng),與匯編相比,C語言在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢,因而易學(xué)易用。Keil提供了包括C編譯器、宏匯編、連接器、庫管理和一個功能強(qiáng)大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過一個集成開發(fā)環(huán)境(uVisi
5、on)將這些部分組合在一起。運(yùn)行Keil軟件需要WIN98、NT、WIN2000、WINXP等操作系統(tǒng)。如果你使用C語言編程,那么Keil幾乎就是你的不二之選,即使不使用C語言而僅用匯編語言編程,其方便易用的集成環(huán)境、強(qiáng)大的軟件仿真調(diào)試工具也會令你事半功倍。 Keil C51開發(fā)系統(tǒng)基本知識Keil C51開發(fā)系統(tǒng)基本知識 (1)系統(tǒng)概述 Keil C51軟件提供豐富的庫函數(shù)和功能強(qiáng)大的集成開發(fā)調(diào)試工具,全Windows界面。另外重要的一點(diǎn),只要看一下編譯后生成的匯編代碼,就能體會到Keil C51生成的目標(biāo)代碼效率非常之高,多數(shù)語句生成的匯編代碼很緊湊,容易理解。在開發(fā)大型
6、軟件時更能體現(xiàn)高級語言的優(yōu)勢。下面詳細(xì)介紹Keil C51開發(fā)系統(tǒng)各部分功能和使用。 (2)Keil C51單片機(jī)軟件開發(fā)系統(tǒng)的整體結(jié)構(gòu) C51工具包的整體結(jié)構(gòu),uVision與Ishell分別是C51 for Windows和for Dos的集成開發(fā)環(huán)境(IDE),可以完成編輯、編譯、連接、調(diào)試、仿真等整個開發(fā)流程。開發(fā)人員可用IDE本身或其它編輯器編輯C或匯編源文件。然后分別由C51及C51編譯器編譯生成目標(biāo)文件(.OBJ)。目標(biāo)文件可由LIB51創(chuàng)建生成庫文件,也可以與庫文件一起經(jīng)L51連接定位生成絕對目標(biāo)文件(.ABS)。ABS文件由OH51轉(zhuǎn)換成標(biāo)準(zhǔn)的Hex文件,以供
7、調(diào)試器dScope51或tScope51使用進(jìn)行源代碼級調(diào)試,也可由仿真器使用直接對目標(biāo)板進(jìn)行調(diào)試,也可以直接寫入程序存貯器如EPROM中。 Keil C51生成的目標(biāo)代碼效率非常之高,多數(shù)語句生成的匯編代碼很緊湊,容易理解。在開發(fā)大型軟件時更能體現(xiàn)高級語言的優(yōu)勢。 2 設(shè)計原理及方法 2.1 定時器、的工作原理 定時/計數(shù)器實(shí)質(zhì)上是一個加1計數(shù)器,它可以工作于定時方式,也可以工作于計數(shù)方式,兩種工作方式實(shí)際是對脈沖計數(shù),只不過是所計脈沖來源不同。定時/計數(shù)器的內(nèi)部結(jié)構(gòu)和控制信號如下圖2.1.1所示。 圖2.1.1定時器/計數(shù)器內(nèi)部結(jié)構(gòu)和控制信號 當(dāng)其工作于定時方式
8、時, =0,開關(guān)S打向上,計數(shù)器,的計數(shù)脈沖來自振蕩器的12分頻后的脈沖(即/12),即對系統(tǒng)的機(jī)器周期計數(shù)。檔開關(guān)K受控合上時,每過一個周期,計數(shù)器,加1;當(dāng)記滿了預(yù)設(shè)的個數(shù),,回零,置位定時/計數(shù)器溢出中斷標(biāo)志位,產(chǎn)生溢出中斷。定時/計數(shù)器亦是如此。 工作方式寄存器TMOD(地址:89H)為8位寄存器,用于設(shè)置定時/計數(shù)器的工作方式,低四位用于,高四位用于。其格式如下表2.1.1所示。 表2.1.1 定時/計數(shù)器方式控制寄存器TMOD GATE C/T M1 M0 GATE C/T M1 M0 GATE:門控位。GATE=0時,只要用軟件使TCON中的為1,就可
9、以啟動定時/計數(shù)器工作;GATA=1時,要用軟件使為1,同時外部中斷引腳也為高電平時,才能啟動定時/計數(shù)器工作。即此時定時器的啟動多了一條件。 :定時/計數(shù)模式選擇位。 =0為定時模式; =1為計數(shù)模式。 :工作方式設(shè)置位。定時/計數(shù)器有四種工作方式,由進(jìn)行設(shè)置。 定時/計數(shù)器控制寄存器TCON(地址88H)設(shè)置如下表2.1.3所示。 表2.1.3 定時/計數(shù)器控制寄存器TCON 在TCON寄存器中,定時/計數(shù)器的控制僅用了其中的高四位。 :溢出中斷請求標(biāo)志位。,計數(shù)溢出時由硬件自動置為1。CPU響應(yīng)中斷后由硬件自動清0
10、。工作時,CPU可隨時查詢的狀態(tài)。所以,可用作查詢測試的標(biāo)志。也可以用軟件置1或清0,同硬件置1或清0的效果一樣。 :運(yùn)行控制位。置1時,開始工作;置0時,停止工作。由軟件置1或清0。所以,用軟件可控制定時/計數(shù)器的啟動與停止。 :溢出中斷請求標(biāo)志位,其功能與類同。 :運(yùn)行控制位,其功能與類同。 定時/計數(shù)器工作方式設(shè)置如下表2.1.2所示。 表2.1.2 定時/計數(shù)器工作方式設(shè)置表 M1M0 工作方式 說明 00 方式0 13位定時/計數(shù)器 01 方式1 16位定時/計數(shù)器 10 方式2 8自動重裝定時/計數(shù)器 11 方式3 分成兩個獨(dú)立的8位定時
11、/計數(shù)器;此方式停止計數(shù) 方式0為13位計數(shù),由的低5位(高3位未用)和的8位組成,最大計數(shù)值為(8192個脈沖)。啟動后計數(shù)器加1計數(shù)。的低5位計數(shù)滿回零后向進(jìn)位,當(dāng)13位計數(shù)滿回零時,中斷溢出位置1,產(chǎn)生中斷請求。 定時器模式時有:N=t/ Tcy 計數(shù)初值計算的公式為: 定時器的初值還可以采用計數(shù)個數(shù)直接取補(bǔ)法獲得。 方式1和方式0基本相同,唯一的區(qū)別是方式1的計數(shù)位數(shù)是16位,由作為低8位、作為高8位,組成了16位加1計數(shù)器 。其最大計數(shù)值為(65536個脈沖),是幾種方式中計數(shù)值最大的方式。 計數(shù)個數(shù)與計數(shù)初值的關(guān)系為: 方式2為自動重裝初值的8位計數(shù)方式。在這種方式
12、下,在和兩個寄存器中,專用于寄存8位計數(shù)初值并保持不變,進(jìn)行8位加1計數(shù),當(dāng)計數(shù)溢出時,除產(chǎn)生溢出中斷請求外,還自動將中不變的初值重新裝載到。 計數(shù)個數(shù)與計數(shù)初值的關(guān)系為: 方式3只適用于定時/計數(shù)器,定時器處于方式3時相當(dāng)于=0,停止計數(shù)。工作方式3將分成為兩個獨(dú)立的8位計數(shù)器和 。 2.2 定時器的工作原理 定時器/計數(shù)器也是一個16 位定時器/計數(shù)器。除了具備定時/計數(shù)器、的定時計數(shù)功能外,還具有16位自動重裝載、捕獲方式和加、減計數(shù)方式。所謂捕獲方式,就是把16位瞬時計數(shù)值同時記錄在特殊功能寄存器的RCAP2H和RCAP2L中,這樣CPU在讀數(shù)值的時候,就避免了在讀高字節(jié)時
13、低字節(jié)在變化,從而引起誤差。 定時/計數(shù)器的內(nèi)部結(jié)構(gòu)和捕捉方式原理如圖2.2.1所示。由圖可見,除了具有相同的定時計數(shù)結(jié)構(gòu)外,增加了特殊功能寄存器的RCAP2H/RCAP2L和控制位,在不同的工作方式下有不同的作用。 圖2.2.1 定時/計數(shù)器的內(nèi)部結(jié)構(gòu)和捕捉方式原理 引用了兩個外部引腳和作用如下: ():定時/計數(shù)器2的外部計數(shù)脈沖輸入,定時脈沖輸出。 (T2EX):定時/計數(shù)器2的捕捉/重裝方式的觸發(fā)和檢測控制。 定時器/計數(shù)器控制寄存器T2CON(地址C8H)的設(shè)置如下表2.2.1所示。 表2.2.1 定時/計數(shù)器控制寄存器T2CON (MSB
14、) (LSB) EXF2 RLCLK TCLK EXEN2 C/ CP/RL2 :計數(shù)溢出標(biāo)志位,當(dāng)允許中斷,將引起中斷,必須軟件清零。=1,有溢出;=0,無溢出。如果RCLK=1或TCLK=1,此位無效。 EXF2:的外部標(biāo)志位。當(dāng)外部使能位EXEN2=1,且T2EX(引腳)有一個下降沿產(chǎn)生,EXF2被置1,如果允許中斷將引起中斷,EXF2必須軟件清零。 RCLK、TCLK:發(fā)送時鐘、接收時鐘允許。如果RCLK=1或TCLK=1,則8XX5
15、1的串行使用作為波特率發(fā)生器,分別產(chǎn)生發(fā)送時鐘或接收時鐘,兩個可以分別控制。如果RCLK=0或TCLK=0,則定時器作為串行口波特率發(fā)生器。 :的啟動控制標(biāo)志;=0:停止;=1:啟動 C/:定時計數(shù)器選擇。只能通過軟件的置位或清除;C/=0,工作于定時器方式,對/12的脈沖(機(jī)器周期)計數(shù);C/=1,工作于計數(shù)器方式,對(引腳)外部輸入脈沖的下降沿計數(shù)。 CP/RT2:捕獲/重裝方式選擇,只能通過軟件的置位或清除。CP/RT2=0時,工作于重裝方式,RCAP2H,RCAP2L;CP/RT2=1時,工作于捕獲方式,RCAP2H,RCAP2L。 定時器/計數(shù)器方式控制寄存器T2MOD(地址
16、C9H)的設(shè)置如下表2.2.2所示。 表 2.2.2定時器/計數(shù)器方式控制寄存器T2MOD (MSB) (LSB) T2OE DCEN T2OE:輸出允許位,T2OE=1,允許定時時鐘輸出到。T2OE=1,禁止定時時鐘輸出到。 DCEN:計數(shù)方式選擇。DCEN=1,的計數(shù)方式由引腳狀態(tài)分配:=1,減計數(shù);=0,加計數(shù)。DCEN=0,計數(shù)方式與無關(guān),同和一樣,采用加計數(shù)方式。 的數(shù)據(jù)寄存器、和、的用法一樣,而捕獲寄存器RCAP2
17、H、RCAP2L只是在捕獲方式下,產(chǎn)生捕獲操作時自動保存、的值。 定時器/計數(shù)器的工作方式見下表2.2.3所示。 表2.2.3定時器/計數(shù)器的工作方式 RCLK+TCLK CP/RL2 方式 0 0 1 X 0 1 X X 1 1 1 0 16位自動重裝 16位捕捉方式 波特率發(fā)生器 停止工作 自動捕捉方式下,如果從檢測到一個下降沿,和的當(dāng)前值就會被捕捉到RCAP2H和RCAP2L中,同時使EXF2=1.如果允許中斷,將產(chǎn)生中斷。 自動重裝方式1(DCEN=0)下,如果從檢測到一個下降沿,RCAP2H和RCAP2L中的值就會被重裝到和中,同
18、時使EXF2=1。 自動重裝方式2(DCEN=1)下,=1,減計數(shù),當(dāng)計數(shù)溢出時,和中自動重裝為0FFH;=0,加計數(shù),當(dāng)計數(shù)溢出時,和中自動重裝為RCAP2H和RCAP2L中的值。無論是加計數(shù)還是減計數(shù),溢出時=1。 波特率發(fā)生器方式下,的計數(shù)脈沖可以由/2或輸入。此時,RCAP2H和RCAP2L中的值用做計數(shù)初值,溢出后此值自動裝到和中。如果RCLK或TCLK中某值為1時,表示收發(fā)時鐘一個用,一個用。在這種方式下,如果在檢測到一個下降沿,則EXF2變?yōu)?,可引起中斷。 (波特率)== 時鐘輸出方式 的溢出脈沖從輸出。輸出脈沖頻率由下式?jīng)Q定: = 2.3 設(shè)計方法 (1)方波
19、的產(chǎn)生 在本設(shè)計方案中,采用的定時器產(chǎn)生頻率和占空比可調(diào)的方波。對于工作方式0,工作方式1具有16位的寄存器,定時時間更長,產(chǎn)生的頻率范圍更寬。對比于工作方式2,雖然方式2的自動重載功能使定時更加準(zhǔn)確,但對于產(chǎn)生低頻來說,方式2的只有256us的定時時間,產(chǎn)生的中斷多,誤差更大,因此選擇設(shè)置在工作方式1下,GATE=0。 設(shè)定定時器設(shè)置初始值,即給高低電平分別分配定時時間。當(dāng)程序啟動,由輸入給定高電平,定時器開始加1計數(shù),當(dāng)高電平16位計數(shù)滿回零時,置1,產(chǎn)生中斷,高電平轉(zhuǎn)為低電平,當(dāng)?shù)碗娖?6位計數(shù)滿回零時,置1,產(chǎn)生中斷,低電平再轉(zhuǎn)為高電平,得出方波。 定時器初始值計算如下所示:
20、 高電平初始值=-高電平時間 低電平初始值=-低電平時間 (2)高電平時間的測量 本設(shè)計方案中,采用定時器測量高電平的時間。將定時器設(shè)置在工作方式1下,并設(shè)置GATE=1,此時要用軟件使為1,同時外部中斷1(INT1)引腳也為高電平時,才能啟動定時/計數(shù)器工作。所以將控制輸出的方波接在外部中斷1的輸入引腳上,當(dāng)輸入高電平,定時器開始啟動,在下降沿的時候,讀、的值,同時將、清零,即可算出高電平時間T1_high。 (3)頻率的測量 在本設(shè)計方案中,采用定時器測量輸出方波一周期的時間。將定時器設(shè)置在工作方式16位捕捉方式下,為了更加準(zhǔn)確,在前兩個下降沿的時候,先清、、、,當(dāng)?shù)谌齻€下降
21、沿來臨的時候,讀取RCAP2(即、)的值(相當(dāng)于三個周期中只測量了一個周期)即為輸出方波的周期T2。 綜合(2)(3)上述,根據(jù)以下公式 f=1/T2 占空比=高電平時間/周期=T1_high/T2 由此測出所輸出方波的頻率和占空比。
22、
23、
24、
25、
26、
27、
28、
29、
30、
31、
32、
33、
34、
35、
36、
37、
38、
39、
40、 3系統(tǒng)硬件線路設(shè)計圖 3.1仿真電路連線圖 圖3.1.1 仿真線路連接圖 3.2 實(shí)物連線圖 圖3.2.1 實(shí)物線路連接圖 4 程序框圖
41、圖4.1 主程序框圖 圖4.2 定時器0中斷程序框圖 圖4.3 定時器2中斷程序框圖 5 資源分配表 I/O口分配表如下表5.1所示。 表5.1 I/O口分配表 - 、 液晶數(shù)據(jù)線 捕捉方式下方波信號輸入端 液晶控制器 鍵盤掃描 方波輸出 測高電平時方波輸入端 內(nèi)部資源分配表如下表5.2所示。 表5.2 內(nèi)部資源分配表 定時器 定時器 定時器 產(chǎn)生頻率、占空比可調(diào)方波 測量高電平的時間 測量輸出方波的周期 6 源程序 函數(shù)聲明
42、:文件public.h
#include
43、(); void keycode_return(); uchar keyscan(); void init(); void dis_freq_futy(); 主程序:文件main.c #include"public.h" sbit out=P3^0;//輸出 sbit out2=P3^1; sfr16 RCAP2 = 0xCA; //T2捕獲寄存器 sfr T2MOD = 0xC9; char th0_low,tl0_low,th0_high,tl0_high,th1_out,tl1_out; float time0,freq_test,duty_test; uch
44、ar freq_out_num[4],duty_test_num[3],vaule=1; uint freq=100,duty_factor=50,flag=1,time0_high,time0_low,high_count=0,low_count=0,count1,count2; uint Last,Now,freq_test1=500,duty_test1=0; void time_2() interrupt 5 //T2中斷程序 { if(EXF2) { if(vaule==2) { th1_out=TH1; tl1_out=TL1;
45、 EXF2=0;//外部標(biāo)志位需要軟件清零; Now=RCAP2; vaule=0; } else { EXF2=0; vaule++; TH2=TH1=0; TL2=TL1=0; } } else { TF2=0; } } void time_0() interrupt 1 //T0中斷程序 { if(flag==0) { TH0=th0_low; TL0=tl0_low; flag=1; out=0; out2=0; } else
46、 { TH0=th0_high; TL0=tl0_high; flag=0; out=1; out2=1; } } void main() { init(); while(1) { keycode_return(); time0=1000000/freq; //不求time0直接求高低電平,可能精度高些 time0_high=time0/100*duty_factor; //高電平時間 time0_low=time0-time0_high; //低電平 high_count=low_count=0
47、; th0_high=(65536-time0_high)/256; // 高低電平的定時器初值 tl0_high=(65536-time0_high)%256; th0_low=(65536-time0_low)/256; tl0_low=(65536-time0_low)%256; //************T2頻率測量處理************************ // ET2=0; freq_test=1000000/Now; //計算出頻率值 //************T1占空比測量處理*********************
48、 duty_test=th1_out*256+tl1_out;//計算T1計數(shù)值 duty_test=duty_test*1000/Now;//求百分比 // if(abs(duty_test-duty_factor)>1) // duty_test+=600; dis_freq_futy(); // ET2=1; } } void dis_freq_futy() { uchar j; //*************頻率顯示**************************** freq_test1=(uint)freq_test;
49、 for(j=0;j<4;j++) { freq_out_num[j]=freq_test1%10; freq_test1/=10; } write_com(0x95); for(j=0;j<4;j++) { write_data(freq_out_num[3-j]+0x30); } //*************占空比顯示************************** duty_test1=(uint)duty_test; write_com(0x9d); for(j=0;j<3;j++) { duty_test_n
50、um[j]=duty_test1%10; duty_test1/=10; } for(j=0;j<2;j++) { write_data(duty_test_num[2-j]+0x30); } write_data(.); write_data(duty_test_num[0]+0x30); write_data(%); } void init() { display_init(); //*************************************************** //**************定時器0初始化*
51、*********************** time0=1000000/freq; //不求time0直接求高低電平,可能精度高些 time0_high=time0/100*duty_factor; //高電平時間 time0_low=time0-time0_high; //低電平 TMOD=0x91;//設(shè)置工作方式GATE1 C/T M1 M0=1001;工作方式GATE0 C/T M1 M0=0001 th0_high=(65536-time0_high)/256; // 高低電平的定時器初值 tl0_high=(65536-time0_high
52、)%256; th0_low=(65536-time0_low)/256;// tl0_low=(65536-time0_low)%256; EA=1; ET0=1; TR0=1; //**************************************************** //***************定時器2初始化************************ ET2=1;//開T2中斷 T2MOD=0X00; T2CON=0x0d;//16位捕獲模式,定時,外部使能 TH2=0; TL2=0; //**********
53、******************************************
//****************定時器1初始化***********************
// ET1=1;//不開T1中斷
TR1=1;
TH1=0;
TL1=0;
}
矩陣鍵盤程序:文件keycode.c
#include
54、(uint z)//4.476ms { uint x,y; for(y=z;y>0;y--) for(x=110;x>0;x--); } unsigned char code KeyTable[4][4]={ {1,2,3,A}, {4,5,6,B}, {7,8,9,C}, {0,F,E,D}}; //***鍵盤掃描*********// uchar keyscan() { unsigned int row=0,column=0; uchar key=0; // EA=0; P2=0xf0; ke
55、y=P2; if(key!=0xf0){ delay(10); key=P2; if(key!=0xf0){ P2=key|0x0f; switch(key) { case 0xe0:column=0;break;//1110 case 0xd0:column=1;break;//1101 case 0xb0:column=2;break;//1011 case 0x70:column=3;break;//0111 } key=P2&0x0f; switch(key) {
56、 case 0x0e:row=0;break;//1110 case 0x0d:row=1;break;//1101 case 0x0b:row=2;break;//1011 case 0x07:row=3;break;//0111 } } P2=0x0f; key=P2; while((key&0x0f)!=0x0f){key=P2;} EA=0; return KeyTable[row][column]; } return 0; } //*************************
57、****************************// //*************鍵盤值返回******************************// void keycode_return() { uint m=0; keycode=keyscan(); // keycode=B; switch(keycode) { case A:duty_factor+=1;refresh_duty();break; case B:duty_factor-=1;refresh_duty();break; case C:freq+=10;refres
58、h_time_0();break; case D:freq-=10;refresh_time_0();break; case F:ok();break; case 0:store_num();break; case 1:store_num();break; case 2:store_num();break; case 3:store_num();break; case 4:store_num();break; case 5:store_num();break; case 6:store_num();break; case 7:stor
59、e_num();break; case 8:store_num();break; case 9:store_num();break; } EA=1; } //**************************************************// void refresh_time_0() { uint m,freq1; freq1=freq; for(m=0;m<4;m++) { num[m]=freq1%10; freq1/=10; } write_com(0x85);//第2行第5位 for(m=0;
60、m<4;m++) { write_data(num[3-m]+0x30); } } void refresh_duty() { uint m,duty_factor1; duty_factor1=(uint)(duty_factor); for(m=0;m<2;m++) { duty_factor_num[m]=duty_factor1%10; duty_factor1/=10; } write_com(0x88+0x05);//第4行第6位 for(m=0;m<2;m++) { write_data(duty
61、_factor_num[1-m]+0x30);
}
// write_data(.);
// write_data(duty_factor_num[0]+0x30);
write_data(%);
}
void ok()
{
uint m;
freq=0;
for(m=0;m 62、for(m=0;m<4;m++)
{
num[m]=freq1%10;
freq1/=10;
}
write_com(0x90+0x04);//第2行第四位
for(m=0;m<4;m++)
{
write_data(num[3-m]+0x30);
}
*/
}
void store_num()
{
uint m;
freq_num[n++]=keycode-0x30;
write_com(0x85);
for(m=0;m<4;m++) //清除之前輸入值
write_data( );
write_com(0 63、x85);
for(m=0;m 64、
void write_data(uchar date)
{
lcdrw=0;
lcden=0;
lcdrs=1; //寫數(shù)據(jù),高電平有效
P0=date; //先賦值,
delay1ms(); //延時最小值1500ns
lcden=1; //lcden一旦拉高,數(shù)據(jù)立馬寫入
delay1ms(); //寫數(shù)據(jù)持續(xù)時間最小值1500ns
lcden=0; //再次置低,準(zhǔn)備下一次拉高
}
//******************************lcd寫指令************** 65、*******//
void write_com(uchar com)
{
lcdrw=0;
lcden=0;
lcdrs=0; //寫指令,低電平有效
P0=com; //賦值
delay1ms(); //延時最小值1500ns
lcden=1; //lcden拉高
delay1ms(); //寫數(shù)據(jù)持續(xù)時間最小值1500ns
lcden=0; //再次置低
}
/************************************lcd初始化*********************/
66、
void lcd_init()
{
lcden=0;
lcdrw=0; //表示對lcd進(jìn)行寫操作
lcdrs=0; //表示對lcd進(jìn)行寫指令
write_com(0x30); //表示寫入 基本指令集,執(zhí)行時間72us
delay1ms();
write_com(0x02); //地址歸位,DDRAM位址計數(shù)器AC到00H,執(zhí)行時間72us
delay1ms();
write_com(0x0c); //開整體顯示,游標(biāo)關(guān)閉游標(biāo)位置不反白,執(zhí)行時間72us
delay1ms();
write_com(0x06); //進(jìn)入點(diǎn)設(shè)定,游標(biāo)右移DDRAM位址計數(shù)器(AC)+1
//表示,寫入1個數(shù)據(jù)后光標(biāo)自動怎么動,執(zhí)行時間72us
delay1ms();
write_com(0x80); //設(shè)定顯示起始地址
write_com(0x01);
}
v
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 噪聲危害和控制
- 英美短篇小 說Unit 4 A New Dress
- 10資本主義時代的曙光教學(xué)課件
- 葡萄溝PPT模版教學(xué)課件
- 第四章+厭氧生物處理課件
- 遼寧省燈塔市第二初級中學(xué)八年級語文下冊 20俗世奇人好嘴楊巴課件 新人教版
- 胖乎乎的小手--課件正式版
- 六年級科學(xué)上冊33《精彩紛呈__展示篇》-優(yōu)選課件1大象版
- 六年級數(shù)學(xué)上冊41比的意義課件2新人教版
- 人教版美術(shù)三上第8課《星空的聯(lián)想》課件
- 第三章-商事登記與商業(yè)賬簿課件
- 人教版小學(xué)數(shù)學(xué)一年級下冊《找規(guī)律》整理143508課件
- 人教版小學(xué)二年級數(shù)學(xué)下冊第三單元《平移與旋轉(zhuǎn)》課件6
- 西師版三上數(shù)學(xué)第3課時-一位數(shù)乘兩位數(shù)的筆算(不進(jìn)位)課件
- (部編)人教版小學(xué)語文三年級上冊《18富饒的西沙群島》名師教學(xué)ppt課件