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