《單片機(jī)課程設(shè)計說明書》占空比可調(diào)信號發(fā)生器

上傳人:仙*** 文檔編號:33656447 上傳時間:2021-10-18 格式:DOC 頁數(shù):34 大?。?.38MB
收藏 版權(quán)申訴 舉報 下載
《單片機(jī)課程設(shè)計說明書》占空比可調(diào)信號發(fā)生器_第1頁
第1頁 / 共34頁
《單片機(jī)課程設(shè)計說明書》占空比可調(diào)信號發(fā)生器_第2頁
第2頁 / 共34頁
《單片機(jī)課程設(shè)計說明書》占空比可調(diào)信號發(fā)生器_第3頁
第3頁 / 共34頁

下載文檔到電腦,查找使用更方便

15 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《《單片機(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 #include #define uchar unsigned char #define uint unsigned int void delay1ms(void); void write_data(uchar date); void write_com(uchar com); void lcd_init(); void display_init(); void store_num(); void ok(); void refresh_time_0(); void refresh_duty

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 uchar key,keycode; extern freq,duty_factor; uchar num[4],freq_num[4],duty_factor_num[2],n; uint freq1; void delay

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;m0;b--) for(a=113;a>0;a--); } //*******************************lcd寫數(shù)據(jù)*****************//

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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!