《單片機(jī)技術(shù)》課件項目四 單片機(jī)頻率計設(shè)計_第1頁
《單片機(jī)技術(shù)》課件項目四 單片機(jī)頻率計設(shè)計_第2頁
《單片機(jī)技術(shù)》課件項目四 單片機(jī)頻率計設(shè)計_第3頁
《單片機(jī)技術(shù)》課件項目四 單片機(jī)頻率計設(shè)計_第4頁
《單片機(jī)技術(shù)》課件項目四 單片機(jī)頻率計設(shè)計_第5頁
已閱讀5頁,還剩97頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

一、學(xué)習(xí)目標(biāo)1.了解定時/計數(shù)器的結(jié)構(gòu)及其工作原理。2.掌握單片機(jī)的定時/計數(shù)器控制方式。3.掌握應(yīng)用單片機(jī)進(jìn)行頻率測試控制的原理。4.掌握液晶的使用方法。二、學(xué)習(xí)任務(wù)任務(wù)一方波信號的產(chǎn)生;任務(wù)二單片機(jī)驅(qū)動液晶;任務(wù)三單片機(jī)簡易頻率計設(shè)計。三、任務(wù)分解任務(wù)一方波信號的產(chǎn)生【任務(wù)描述】本任務(wù)采用AT89C51單片機(jī),利用定時/計數(shù)器T0通過P1.1引腳輸出周期為500Hz的方波?!救蝿?wù)描述】【任務(wù)分析】從P1.1引腳輸出周期為500Hz的方波信號,實際就是要產(chǎn)生周期為2ms的方波,只要每1ms將信號的幅值由0變到1或由1變到0即可,可采用取反指令來實現(xiàn)。為了提高CPU的效率,可采用定時中斷的方式,每1ms產(chǎn)生一次中斷,在中斷服務(wù)程序中將輸出信號取反即可。【相關(guān)知識】內(nèi)設(shè)2個16位可編程定時/計數(shù)器T0,T1具有計數(shù)方式和定時方式4種工作模式一、定時器的結(jié)構(gòu)及工作原理組成:兩個16位的定時器T0和T1,以及他們的工作方式寄存器TMOD和控制寄存器TCON等組成。內(nèi)部通過總線與CPU相連。定時器T0和T1各由兩個8位特殊功能寄存器TH0、TL0、TH1、TL1構(gòu)成。工作方式寄存器TMOD:用于設(shè)置定時器的工作模式和工作方式;控制寄存器TCON:用于啟動和停止定時器的計數(shù),并控制定時器的狀態(tài);單片機(jī)復(fù)位時,兩個寄存器的所有位都被清0。8051定時器內(nèi)部結(jié)構(gòu)框圖一、定時器的結(jié)構(gòu)及工作原理兩個可編程的定時器/計數(shù)器T1、T0。每個定時器內(nèi)部結(jié)構(gòu)實際上就是一個可編程的加法計數(shù)器,由編程來設(shè)置它工作在定時狀態(tài)還是計數(shù)狀態(tài)。兩種工作模式: (1)計數(shù)器工作模式

就是對外部事件進(jìn)行計數(shù)。計數(shù)脈沖來自相應(yīng)的外部輸入引腳T0(P3.4)或T1(P3.5)。當(dāng)輸入信號發(fā)生由1至0的負(fù)跳變(下降沿)時,計數(shù)器(TH0,TL0或TH1,TL1)的值增1。計數(shù)的最高頻率一般為振蕩頻率的1/24。Why? (2)定時器工作模式

也是通過計數(shù)實現(xiàn)的。計數(shù)脈沖來自內(nèi)部時鐘脈沖,每個機(jī)器周期計數(shù)值增1,每個機(jī)器周期=12個振蕩周期,因此計數(shù)頻率為振蕩頻率的1/12。所以定時時間=計數(shù)值×機(jī)器周期。4種工作方式(方式0-方式3)。一、定時器的結(jié)構(gòu)及工作原理當(dāng)控制信號定時器工作在定時方式;加1計數(shù)器對脈沖f進(jìn)行計數(shù),每來一個脈沖,計數(shù)器加1,直到計時器計滿溢出;因為,即一個計數(shù)脈沖的周期就是一個機(jī)器周期;計數(shù)器計數(shù)的是機(jī)器周期脈沖個數(shù)。從而實現(xiàn)定時。當(dāng)控制信號定時器工作在計數(shù)方式;加1計數(shù)器對來自輸入引腳T0(P3.4)和T1(P3.5)的外信號脈沖進(jìn)行計數(shù),每來一個脈沖,計數(shù)器加1,直到計時器計滿溢出;TxTHxTFxTLxTRxINTx定時計數(shù)

控制信號K“1”啟動,計數(shù)器運(yùn)行;“0”停止,計數(shù)器停止;定時器/計數(shù)器原理框圖加1計數(shù)器控制信號K可以控制計數(shù)器的“啟動”和“停止”,

TCON(88H)振蕩周期:是振蕩脈沖的周期,也成為“拍”,用P表示。就是晶體振蕩器的周期,或外部振蕩脈沖的周期。是MCS-51單片機(jī)的最小時序單位。P1P2S1振蕩周期時鐘周期機(jī)器周期機(jī)器周期指令周期XTAL2(OSC)S2S3S4S5S6S1S2S4S5S3S6P1P1P1P1P1P1P1P1P1P1P1P2P2P2P2P2P2P2P2P2P2P2時鐘周期:是振蕩源信號經(jīng)二分頻后形成的時鐘脈沖信號,用S表示。每個時鐘周期分成P1、P2兩個節(jié)拍,又被稱為一個狀態(tài)。是MCS-51單片機(jī)的最基本的時序單位。機(jī)器周期:通常將完成一個基本操作所需的時間稱為機(jī)器周期,由6個狀態(tài)(12拍)組成,所以一個機(jī)器周期可以依次表示為S1P1、S2P2……S6P1、S6P2。通常算術(shù)邏輯操作發(fā)生在節(jié)拍P1期間,而內(nèi)部寄存器到寄存器的傳送發(fā)生在節(jié)拍P2期間。指令周期:是指CPU執(zhí)行一條指令所需要的時間。是MCS-51單片機(jī)的最大的時序單位,由若干個振蕩周期組成。一個指令周期通常含有1~4個機(jī)器周期,MCS-51典型的指令周期為一個機(jī)器周期。

振蕩周期、時鐘周期、機(jī)器周期和指令周期在每個機(jī)器周期的S5P2期間采樣檢測引腳輸入電平。若前一個機(jī)器周期采樣值為“1”,后一個機(jī)器周期采樣值為“0”,則計數(shù)器加1。新的計數(shù)值在檢測到輸入引腳電平發(fā)生“1”到“0”的負(fù)跳變(下降沿)后,于下一個機(jī)器周期的S3P1期間裝入計數(shù)器中。由于CPU需要兩個機(jī)器周期來識別一個“1”到“0”的跳變信號,所以最高的計數(shù)頻率為振蕩周期的1/24。P1P2S1振蕩周期狀態(tài)周期機(jī)器周期機(jī)器周期指令周期XTAL2(OSC)S2S3S4S5S6S1S2S4S5S3S6P1P1P1P1P1P1P1P1P1P1P1P2P2P2P2P2P2P2P2P2P2P2定時/計數(shù)器對輸入信號的要求外部計數(shù)脈沖的最高頻率為系統(tǒng)振蕩器頻率的1/24,例如選用12MHz頻率的晶體,則可輸入500KHz的外部脈沖。輸入信號的高、低電平至少要分別保持一個機(jī)器周期。 如圖所示,圖中Tcy為機(jī)器周期??删幊潭〞r器的工作方式、啟動、停止、溢出標(biāo)志、計數(shù)器等都是可編程的——通過設(shè)置寄存器TMOD,TCON,TH0,TL0,TH1和TL1實現(xiàn)。當(dāng)設(shè)置了定時器的工作方式并啟動定時器工作后,定時器就按被設(shè)定好的工作方式獨(dú)立工作,不再占用CPU,只有在計數(shù)器計滿溢出時才向CPU申請中斷,占用CPU。由此可見,定時器是單片機(jī)中工作效率高且應(yīng)用靈活的部件。二、定時器的TMOD和TCON寄存器8051單片機(jī)定時器主要有幾個特殊功能寄存器組成: TMOD,TCON,TH0,TL0,TH1,TL1。TMOD:設(shè)置定時器的工作方式;TCON:控制定時器的啟動和停止;TH0和TL0

:存放定時器T0的初值或計數(shù)結(jié)果;TH0存放高8位,TL0存放低8位;TH1和TL1

:存放定時器T1的初值或計數(shù)結(jié)果;TH1存放高8位,TL1存放低8位;

8位分為兩組,高4位控制T1,低4位控制T0。(1)GATE—門控位

0:

以TRX(X=0,1)來啟動定時器/計數(shù)器運(yùn)行。

1:

用外中斷引腳(INT0*或INT1*)上的高電平和TRX來啟 動定時器/計數(shù)器運(yùn)行。(2)M1、M0—工作方式選擇位

M1M0

工作方式

00

方式0,13位定時器/計數(shù)器。

01

方式1,16位定時器/計數(shù)器。

10

方式2,8位常數(shù)自動重新裝載

11

方式3,僅適用于T0,

T0分成兩個8位計數(shù)器,T1停止計數(shù)。(3)C/T*—計數(shù)器模式和定時器模式選擇位

0:

定時器模式。

1:

計數(shù)器模式。(4)TMOD無位地址,不能位尋址。(5)復(fù)位時,TMOD所有位均為“0”。低4位與外部中斷有關(guān),后面介紹。高4位的功能如下:

(1)TF1、TF0

—計數(shù)溢出標(biāo)志位 定時器T0或T1計數(shù)溢出時,由硬件自動將此位置“1”;

TFx可以由程序查詢,也是定時中斷的請求源;

(2)TR1、TR0

—計數(shù)運(yùn)行控制位

TRx=1:

啟動定時器/計數(shù)器工作

TRx=0:

停止定時器/計數(shù)器工作MCS-51單片機(jī)的定時器/計數(shù)器是可編程的,但在進(jìn)行定時或計數(shù)之前要對程序進(jìn)行初始化,具體步驟如下:(1)對TMOD賦值,以確定定時器的工作模式;(2)置定時/計數(shù)器初值,直接將初值寫入寄存器的TH0、TL0或TH1、TL1;(3)根據(jù)需要,對IE置初值,開放定時器中斷;(4)對TCON寄存器中的TR0或TR1置位,啟動定時/計數(shù)器,置位以后,計數(shù)器即按規(guī)定的工作模式和初值進(jìn)行計數(shù)或開始定時。初值計算:

設(shè)計數(shù)器的最大值為M,則置入的初值X為:計數(shù)方式:X=M-計數(shù)值定時方式:由(M-X)T=定時值,得X=M-定時值/TT為計數(shù)周期,是單片機(jī)的機(jī)器周期。(模式0:M為213,模式1:M為216,模式2和3:M為28)例如:機(jī)器周期為1μs時,若工作在模式0,則最大定時值為:213×1μs=8.192ms

若工作在模式1,則最大定時值為:216×1μs=65.536ms三、定時器的工作方式MCS-51的定時器T0有4種工作方式: 即:方式0,方式1,方式2,方式3。MCS-51的定時器T1有3種工作方式: 即:方式0,方式1,方式2。1.方式0

M1、M0設(shè)置為00,為13位計數(shù)器,以T1為例,其框圖如下:計數(shù)脈沖輸入加1計數(shù)器TH1D12D11D10D9D8D7D6D5TL1×

×

×

D4D3D2D1D0在這種方式下,16位寄存器TH1和TL1只用13位,由TH1的8位和TL1的低5位組成。TL1的高3位不定。當(dāng)TL1的低5位計數(shù)溢出時,向TH1進(jìn)位。而TH1計數(shù)溢出時,則向中斷標(biāo)志位TF1進(jìn)位(即硬件將TF1置1),并請求中斷??赏ㄟ^查詢TF1是否置“1”或考察中斷是否發(fā)生來判定定時器T1的操作完成與否。當(dāng)C/T=0時,為定時工作模式,開關(guān)接到振蕩器的12分頻器輸出上,計數(shù)器對機(jī)器周期脈沖計數(shù)。其定時時間為:

(213-初值)×振蕩周期×12

例如:若晶振頻率為12MHz,則最長的定時時間為(213-0)×(1/12)×12us=8.191ms當(dāng)C/T=1時,為計數(shù)工作模式,開關(guān)與外部引腳T1(P3.5)接通,計數(shù)器對來自外部引腳的輸入脈沖計數(shù)。當(dāng)外部信號發(fā)生負(fù)跳變時計數(shù)器加1。

GATE控制定時器Tx(T1或T0)的條件:(1)當(dāng)GATE=0時,“或門”輸出恒為1,“與門”的輸出信號K由TRx決定(即此時K=TRx),定時器不受INTx輸入電平的影響,由TRx直接控制定時器的啟動和停止。

TRx=1;計數(shù)啟動;

TRx=0;計數(shù)停止;(2)當(dāng)GATE=1時,“與門”的輸出信號K由INTx輸入電平和TRx位的狀態(tài)一起決定(即此時K=TRx·INTx), 當(dāng)且僅當(dāng)TRx=1且INTx=1(高電平)時,計數(shù)啟動;

否則,計數(shù)停止。

返回2.方式1

M1、M0=01,為16位的計數(shù)器,除位數(shù)外,其他與方式0相同。其定時時間為:

(216-初值)×振蕩周期×12

例如:若晶振頻率為12MHz,則最長的定時時間為

(216-0)×(1/12)×12us=65.536ms2.方式2

M1、M0=10,為自動恢復(fù)初值的8位計數(shù)器,等效框圖如下:TLx作為8位計數(shù)器,THx作為重置初值的緩沖器。

THx作為常數(shù)緩沖器,當(dāng)TLx計數(shù)溢出時,在置“1”溢出標(biāo)志TFx的同時,還自動的將THx中的初值送至TLx,使TLx從初值開始重新計數(shù)。定時器/計數(shù)器的方式2工作過程如圖(x=0,1)。優(yōu)點:

方式0和方式1用于循環(huán)重復(fù)定時或計數(shù)時,在每次計數(shù)器擠滿溢出后,計數(shù)器復(fù)0。若要進(jìn)行新一輪的計數(shù),就得重新裝入計數(shù)初值。這樣一來不僅造成編程麻煩,而且影響定時精度。而方式2具有初值自動裝入的功能,避免了這個缺點,可實現(xiàn)精確的定時。缺點: 只有8位計數(shù)器,定時時間短、計數(shù)范圍小。其定時時間為:

(28-初值)×振蕩周期×12若晶振頻率為12MHz,則最長的定時時間為(28-0)×(1/12)×12us=0.256ms方式2工作過程圖

(x=0,1)。3.方式3

只適用于定時器/計數(shù)器T0。T1不能工作在方式3。 如果將T1置為方式3,則相當(dāng)于TR1=0,停止計數(shù)(此時T1可用來作串行口波特率產(chǎn)生器)。1.工作方式3下的T0

T0在方式3時被拆成兩個獨(dú)立的8位計數(shù)器:TH0和TL0。

8位計數(shù)器TL0使用T0的狀態(tài)控制位C/T*、GATE、TR0、INT0,它既可以工作在定時方式,也可以工作在計數(shù)方式。8位定時器TH0被固定為一個8位定時器(不能作外部計數(shù)模式),并使用定時器T1的狀態(tài)控制位TR1,同時占用定時器T1的中斷請求源TF1。此時,定時器TH0的啟動或停止只受TR1控制。

TR1=1時,啟動TH0的計數(shù);TR1=0時,停止TH0的計數(shù)各引腳與T0的邏輯關(guān)系如圖所示:2.T0工作在方式3下T1的各種工作方式注意:當(dāng)T0處于方式3時,T1仍可設(shè)置為方式0、方式1和方式2。當(dāng)時由于TR1、TF1和T1的中斷源都已被定時器T0(中的TH0)占用,所以定時器T1僅有控制位C/T來決定其工作在定時方式或計數(shù)方式。當(dāng)計數(shù)器計滿溢出時,不能置位“TF1”,而只能將輸出送往串口。所以,此時定時器T1一般用作串口的波特率發(fā)生器,或不需要中斷的場合。

(1)T1工作在方式0(2)T1工作在方式1(3)T1工作在方式2【例4-1】若單片機(jī)的頻率為12MHz,請計算2ms所需要的定時器初值。解:在頻率為12MHz時,每個計數(shù)脈沖的時間間隔為0.001ms,所以其計數(shù)脈沖個數(shù)為2/0.001=1000個。在方式0,則計數(shù)初值為:213-2000=6192=1100000110000B即:(TH0)=11000001B=0xC1(取初值X的高8位),(TL0)=00010000B=0x10(取初值X的低5位,TL0寄存器在方式0下只用到低5位,高3位未使用,TH0使用了8位,一共的計數(shù)位是8+5=13位)所以定時器的初值為(TH0)=0xC1,(TL0)=00010000B=0x10H?!救蝿?wù)實施】P1.0引腳輸出方波電路對應(yīng)的程序代碼如下:#include<reg51.h>//定義頭文件sbitP1_1=P1^1;voidtimer0(void)interrupt1//定時器0中斷服務(wù)程序

{TH0=0xE0;TL0=0x18; //裝入時間常數(shù)P1_1=!P1_1; //P1.1取反

}voidmain(void){TMOD=0x00; //定時器0方式0TH0=0xE0;TL0=0x18; //裝入時間常數(shù)TR0=1; //啟動定時器TF0=0;EA=1; //開全局中斷

ET0=1; //開定時器0中斷

while(1); //主程序死循環(huán),空等待

}【進(jìn)階提高】前面我們已經(jīng)熟悉了定時器的一般應(yīng)用,如果定時器要實現(xiàn)比較長時間的定時,還能用我們之前介紹的方法予以解決嗎?使用定時器T0的中斷來控制P2.0引腳LED的閃爍,要求閃爍周期2s,即亮1s,滅1s。定時器T0工作于方式1時,其最大可計脈沖數(shù)次數(shù)為65536,對于12MHz的時鐘頻率,一個脈沖的寬度為1.00μs,則最大計時長度只有1.00×65536=65536μs,即大約65ms。所以要計時1s或更長的時間,還需采用一種被稱作“軟件計數(shù)”的方法:加入我們設(shè)定定時時間為50ms,設(shè)置一個變量Countor來儲存定時器T0的中斷次數(shù),即每產(chǎn)生1次50ms定時中斷,使變量Countor自加1,那么當(dāng)Countor自加20次時,所計時間就是1s。#include<reg51.h>#defineuintunsignedint#defineucharunsignedcharsbitLED=P1^0;uintCount=0;voidmain(){TMOD=0x01;//設(shè)置定時器0為工作方式1TH0=0x3C;TL0=0xB0;EA=1;//開總中斷

ET0=1;//開定時器0中斷

TR0=1;//啟動定時器0while(1){if(TF0==1){TF0=0;TH0=0x3c;//1次定時100ms,計數(shù)10次,就為1秒。

TL0=0xb0;}if(Count==20){Count=0;LED=~LED;}}}voidtime0()interrupt1{Count++;}任務(wù)二單片機(jī)驅(qū)動液晶【任務(wù)描述】單片機(jī)驅(qū)動液晶1602,能夠?qū)⒂⑽暮蛿?shù)字顯示出來。本任務(wù)要求設(shè)計LCD1602與單片機(jī)的接口電路,編寫程序使LCD1602的第一行顯示“OK”,第二行顯示“AT89C51”?!救蝿?wù)分析】最直接把要顯示的內(nèi)容寫在數(shù)組里,程序開始LCD初始化,寫字符顯示位置指令,滿足其各種時序要求,然后根據(jù)顯示的字符所占的位數(shù),寫個for循環(huán)語句,放入數(shù)據(jù)函數(shù),這樣就可以在指定位置開始顯示要顯示的內(nèi)容?!鞠嚓P(guān)知識】一、液晶1602驅(qū)動方法VL-液晶屏對比度的調(diào)節(jié)L命令是對液晶屏顯示的設(shè)置H數(shù)據(jù)是要顯示的東西51單片機(jī)的1602液晶1602液晶的存儲器結(jié)構(gòu)1.DDRAM:顯示數(shù)據(jù)RAM,用來寄存待顯示的字符代碼。共80個字節(jié),其地址和屏幕的對應(yīng)關(guān)系如下圖:要在屏幕上顯示字符,只需向相關(guān)DDRAM中寫入該字符的ASCII碼即可。1602液晶的存儲器結(jié)構(gòu)2.CGROM:字符發(fā)生存儲器,已經(jīng)存儲了160個不同的點陣字符圖形,按ASCII碼排列,如下圖所示:字符代碼:0x00~0x0F為用戶自定義的字符圖形RAM。0x20~0x7F為標(biāo)準(zhǔn)的ASCII碼。0xA0~0xFF為日文字符和希臘文字符。1602液晶的存儲器結(jié)構(gòu)3.CGRAM:用戶自定義字符發(fā)生存儲器,共64字節(jié),地址為0x00~0x3f,可存儲8個5*8點陣圖形,其中地址0x00~0x07存儲字符代碼為0x00的字符圖形,0x08~0x0f存儲字符代碼為0x01的字符圖形,以此類推。voidLCD_write_cmd(unsignedcharcmd){ LCD_check_busy(); delay(1); LCD_RS=0; LCD_RW=0; LCD_DATA=cmd; delay(50); LCD_EN=1; delay(50); LCD_EN=0; delay(50);}液晶顯示

750x38E使能高電平命令選擇DB0-DB7使能E開使能E關(guān)寫命令子函數(shù)寫數(shù)據(jù)子函數(shù)E使能高電平數(shù)據(jù)選擇DB0-DB7使能E開使能E關(guān)段位都關(guān)上,關(guān)液晶0x380x0e=0000.11100x06=0000.0110初始化子函數(shù)初始化子函數(shù)ILIKEMCU!一共11位0X18左移一下

1602液晶總結(jié):(1)寫命令子函數(shù)(2)寫數(shù)據(jù)子函數(shù)(3)初始化子函數(shù)(4)Main第一行顯示,第二行顯示,移動?!救蝿?wù)實施】#include<reg51.h>#include<intrins.h>#defineuintunsignedint//預(yù)定義一下#defineucharunsignedcharsbitrs=P3^5;//1602的數(shù)據(jù)/指令選擇控制線sbitrw=P3^6;//1602的讀寫控制線sbiten=P3^7;//1602的使能控制線#defineDataPortP2/*P2口接1602的D0~D7,注意不要接錯了順序*/ucharcodetable[]="OK?";//要顯示的內(nèi)容1放入數(shù)組tableucharcodetable1[]="AT89C51";//要顯示的內(nèi)容2放入數(shù)組table1voiddelay(uintn)//延時函數(shù){uintx,y;for(x=n;x>0;x--)for(y=110;y>0;y--);}voidLCD_Check_Busy(void){while(1){DataPort=0xff;rs=0;rw=1;en=0;_nop_();en=1;if(DataPort&0x80)break;}en=0;delay(2);} voidlcd_wcom(ucharcom)//1602寫命令函數(shù)(單片機(jī)給1602寫命令){LCD_Check_Busy();//1602接收到命令后,不用存儲,直接由HD44780執(zhí)行并產(chǎn)生相應(yīng)動作

rs=0;//選擇指令寄存器

rw=0;//選擇寫

P2=com;//把命令字送入P2en=1;//使能線電平變化,命令送入1602的8位數(shù)據(jù)口

en=0;}voidlcd_wdat(uchardat)//1602寫數(shù)據(jù)函數(shù){ LCD_Check_Busy();rs=1;//選擇數(shù)據(jù)寄存器

rw=0;//選擇寫

P2=dat;//把要顯示的數(shù)據(jù)送入P2en=1;//使能線電平變化,數(shù)據(jù)送入1602的8位數(shù)據(jù)口

en=0;}voidlcd_init()//1602初始化函數(shù){lcd_wcom(0x38);//8位數(shù)據(jù),雙列,5*7字形

lcd_wcom(0x0c);//開啟顯示屏,關(guān)光標(biāo),光標(biāo)不閃爍

lcd_wcom(0x06);//顯示地址遞增,即寫一個數(shù)據(jù)后,顯示位置右移一位

lcd_wcom(0x01);//清屏}voidmain()//主函數(shù){ucharn,m=0;lcd_init();//液晶初始化

lcd_wcom(0x80);//顯示地址設(shè)為80H(即00H,)上排第一位(也是執(zhí)行一條命令)

for(m=0;m<4;m++)//將table[]中的數(shù)據(jù)依次寫入1602顯示

{lcd_wdat(table[m]);delay(200);}lcd_wcom(0x80+0x40);//重新設(shè)定顯示地址為0xc4,即下排第一位

for(n=0;n<8;n++)//將table1[]中的數(shù)據(jù)依次寫入1602顯示

{lcd_wdat(table1[n]);delay(200);}while(1);//動態(tài)停機(jī)}【進(jìn)階提高】上面驅(qū)動液晶1602實際上沒有判斷液晶忙與否,直接用了延時函數(shù)延時達(dá)到單片機(jī)與液晶的同步,下面討論下如何用判斷忙的方法驅(qū)動液晶1602。讀忙的時序為:RS=L,RW=H,E=H

,據(jù)此寫判忙函數(shù):voidLCD_Check_Busy(void){while(1){DataPort=0xff;rs=0;rw=1;en=0;_nop_();en=1;if(DataPort&0x80)break;}en=0;delay(2);}任務(wù)三單片機(jī)簡易頻率計設(shè)計【任務(wù)描述】使用如圖4-12所示電路,用AT89C51設(shè)計一個數(shù)顯頻率計數(shù)器對0~300KHz的方波信號進(jìn)行測量,信號從P3.5引腳輸入,P1、P2口做輸出口,接液晶1602,編寫程序,測出從P3.5引腳輸入的方波信號的頻率并顯示出來?!救蝿?wù)分析】在計數(shù)器工作方式下,加至外部引腳的待測信號發(fā)生從1到0的跳變時計數(shù)器加1。外部輸入在每個機(jī)器周期被采樣一次,這樣檢測一次從1到0的跳變至少需要2個機(jī)器周期(24個振蕩周期),所以最大計數(shù)速率為時鐘頻率的1/24(使用12MHz時鐘時,最大計數(shù)速率為500kHz),也就是說使用12MHz時鐘的AT89C51單片機(jī)設(shè)計的頻率計數(shù)器系統(tǒng),所測的信號的頻率不能大于500kHz,若大于則必須通過分頻器分頻才能測試,而本次任務(wù)的要求是對0~300KHz的信號進(jìn)行測量,所以可以直接進(jìn)行。利用AT89C51單片機(jī)的T0、T1的定時計數(shù)器功能,來完成對輸入的信號進(jìn)行頻率計數(shù)。設(shè)置定時器0工作在定時方式1,定時1秒,并產(chǎn)生方波信號從P1.1引腳輸出。設(shè)置定時器1工作在計數(shù)方式1,對輸入脈沖進(jìn)行計數(shù),溢出產(chǎn)生中斷。將定時器1中斷定義為優(yōu)先。由于16位二進(jìn)制加法計數(shù)器的最大計數(shù)值為65535,1秒之內(nèi)可能會產(chǎn)生多次溢出,所以需要在中斷處理程序里對中斷次數(shù)進(jìn)行計數(shù)。1秒到后,將中斷次數(shù)和計數(shù)器里的計數(shù)值取出進(jìn)行綜合數(shù)據(jù)處理,處理后的數(shù)據(jù)送顯示?!鞠嚓P(guān)知識】頻率計計數(shù)原理:T1工作在計數(shù)方式時最大的計數(shù)值為216,若假設(shè)1S內(nèi)溢出C1次,最后未溢出的計數(shù)值為C2,則F=C1*216+C2=C1*65536+(TH1*256+TL1)。【任務(wù)實施】本工程程序一共用了2個文件,一個是LCD1602.c和main.c。把這兩個文件都要添加到工程中,然后再編譯生成hex文件。下面分別給出LCD1602.c和main.c的代碼:LCD1602.c源文件如下://-----------------------------------------------------------------//液晶控制與顯示程序//-----------------------------------------------------------------#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintsbitRS=P2^0; //寄存器選擇線sbitRW=P2^1; //讀/寫控制線sbitEN=P2^2; //使能控制線//sbitBF=P0^7; //LCD忙標(biāo)記//-----------------------------------------------------------------//延時//-----------------------------------------------------------------voiddelay_ms(uintms){ uchari;while(ms--)for(i=0;i<120;i++);}//-----------------------------------------------------------------//忙檢查//-----------------------------------------------------------------bitLCD_Busy_Wait(){bitresult;RS=0;RW=1;EN=1;_nop_();_nop_();_nop_();_nop_();result=(bit)(P0&0x80);EN=0;returnresult;}//-----------------------------------------------------------------//寫LCD命令//-----------------------------------------------------------------voidWrite_LCD_Command(ucharcmd){while(LCD_Busy_Wait());//判斷LCD是否忙碌RS=0;RW=0;EN=0;_nop_();_nop_();P0=cmd;_nop_();_nop_();_nop_();_nop_();EN=1;_nop_();_nop_();_nop_();_nop_();EN=0;}//-----------------------------------------------------------------//發(fā)送數(shù)據(jù)//-----------------------------------------------------------------voidWrite_LCD_Data(uchardat){while(LCD_Busy_Wait());//判斷LCD是否忙碌RS=1;RW=0;EN=0;P0=dat;_nop_();_nop_();_nop_();_nop_();EN=1;_nop_();_nop_();_nop_();_nop_();EN=0;}//-----------------------------------------------------------------//LCD初始化//-----------------------------------------------------------------voidInitialize_LCD(){ Write_LCD_Command(0x38);delay_ms(10);Write_LCD_Command(0x0c);delay_ms(10);Write_LCD_Command(0x06);delay_ms(10);Write_LCD_Command(0x01);delay_ms(10);}voidlcd_pos(unsignedcharpos)//寫入顯示控制位置命令{Write_LCD_Command(pos|0x80);}//-----------------------------------------------------------------main.c源文件代碼如下:#include<reg51.h>//包含51單片機(jī)寄存器定義的頭文件#defineucharunsignedchar#defineuintunsignedintexterndelay_ms(uintx);externvoidInitialize_LCD();externvoidWrite_LCD_Command(ucharcmd);externvoidWrite_LCD_Data(uchardat);externvoidlcd_pos(ucharpos);externvoidLCD_ShowString(uchar,uchar,uchar*);ucharOutputData[16]={0};//用于存放頻率值的16進(jìn)數(shù)組uchardisplay_data[8]={0,0,0,0,0,0,0,0};//定義數(shù)組存放顯示數(shù)據(jù)的各位ucharc1,b1;sbitP1_1=P1^1;//延時程序

voidDelayMS(uintValMS){ uintuiVal,ujVal; for(uiVal=0;uiVal<ValMS;uiVal++) for(ujVal=0;ujVal<120;ujVal++);}/**************************************************函數(shù)功能:將數(shù)組轉(zhuǎn)成字符,適合1602顯示***************************************************/voidirwork(){uchari;for(i=0;i<8;i++){ if((display_data[i]%16+'0')==0x3a)//頻率值為0,就對OutputData[i]賦為0,顯示0OutputData[i]='0';

else{ OutputData[i]=display_data[i]%16+'0';//如果是10進(jìn)數(shù)就轉(zhuǎn)化為16進(jìn)進(jìn)數(shù)顯示}} OutputData[8]='H';

OutputData[9]='z'; OutputData[10]='\0';}voidconvert()//轉(zhuǎn)換程序{uchari,f2;longf,f1,k;f=c1*65536+TH1*256+TL1;f1=f-f%10; //此變量是為了讓八位LED的高位為0時不顯示而設(shè)置for(i=7;i>0;i--) //此循環(huán)將計數(shù)值轉(zhuǎn)換為顯示數(shù)組,從高位到低位依次存放在//display_data[0]至display_data[7]{display_data[i]=f%10;f=f/10;} display_data[0]=f;k=1e7; //從這開始到本子程序結(jié)束的語句完成讓八位LED的高位為0時不顯示for(i=0;i<7;i++){f2=f1/k;if(f2==0){display_data[i]=10;k=k/10;}}}voidtimer1(void)interrupt3//定時器1中斷服務(wù)程序

{c1++; }voidtimer0(void)interrupt1//定時器0中斷服務(wù)程序

{TH0=0xb1; //裝入時間常數(shù)TL0=0xe0; P1_1=!P1_1; //P1.1取反,從P1.1引腳輸出25Hz的方波信號,通過導(dǎo)線連接//到P3.5引腳輸入,以方便調(diào)試程序。若使用其它信號源,則去掉即可。if(b1==49){convert();c1=0; //將計數(shù)值清零b1=0;TH1=0;TL1=0;}elseb1++;}/***************************************************函數(shù)功能:主函數(shù)***************************************************/main(void){uinti;P1_1=0;c1=0;b1=0;TH1=0;TL1=0;TMOD=0x51;TH0=0Xb1;TL0=0Xe0;IE=0x8a;TCON=0x50;Initialize_LCD();while(1){irwork();DelayMS(10);

lcd_pos(0x01);//設(shè)置顯示位置在第一行

i=0;while(OutputData[i]!='\0')//顯示到字符結(jié)束{Write_LCD_Data(OutputData[i]);//顯示字符i++;}}}【進(jìn)階提高】綜合運(yùn)用單片機(jī)中斷、定時器知識,設(shè)計一4位數(shù)碼管抽獎器,如圖4-13所示,按動抽獎按鈕時,抽獎器自動產(chǎn)生4位隨機(jī)數(shù),當(dāng)再一次按抽獎按鈕時,表示抽獎停止,產(chǎn)生中獎號碼抽獎器電路對應(yīng)的程序如下:

#include"reg51.h" /*8051單片機(jī)資源說明*/#include<stdlib.h> /*包含rand()函數(shù)*/#defineucharunsignedchar#defineuintunsignedintucharcodeBitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};ucharcodeDispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x8

溫馨提示

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

評論

0/150

提交評論