《單片機(jī)應(yīng)用技術(shù) 》中職配套PPT課件,單片機(jī)應(yīng)用技術(shù) ,《單片機(jī)應(yīng)用技術(shù),》中職配套PPT課件,單片機(jī),應(yīng)用技術(shù),配套,PPT,課件
定時(shí)計(jì)數(shù)器T0作定時(shí)應(yīng)用技術(shù)(一)
1. 實(shí)驗(yàn)任務(wù)
用AT89S51單片機(jī)的定時(shí)/計(jì)數(shù)器T0產(chǎn)生一秒的定時(shí)時(shí)間,作為秒計(jì)數(shù)時(shí)間,當(dāng)一秒產(chǎn)生時(shí),秒計(jì)數(shù)加1,秒計(jì)數(shù)到60時(shí),自動(dòng)從0開始。
2. 電路原理圖
3. 系統(tǒng)板上硬件連線
(1). 把“單片機(jī)系統(tǒng)”區(qū)域中的P0.0/AD0-P0.7/AD7端口用8芯排線連接到“四路靜態(tài)數(shù)碼顯示模塊”區(qū)域中的任一個(gè)a-h(huán)端口上;要求:P0.0/AD0對應(yīng)著a,P0.1/AD1對應(yīng)著b,??,P0.7/AD7對應(yīng)著h。(2). 把“單片機(jī)系統(tǒng)”區(qū)域中的P2.0/A8-P2.7/A15端口用8芯排線連接到“四路靜態(tài)數(shù)碼顯示模塊”區(qū)域中的任一個(gè)a-h(huán)端口上;要求:P2.0/A8對應(yīng)著a,P2.1/A9對應(yīng)著b,??,P2.7/A15對應(yīng)著h。
4. 程序設(shè)計(jì)內(nèi)容
AT89S51單片機(jī)的內(nèi)部16位定時(shí)/計(jì)數(shù)器是一個(gè)可編程定時(shí)/計(jì)數(shù)器,它既可以工作在13位定時(shí)方式,也可以工作在16位定時(shí)方式和8位定時(shí)方式。只要通過設(shè)置特殊功能寄存器TMOD,即可完成。定時(shí)/計(jì)數(shù)器何時(shí)工作也是通過軟件來設(shè)定TCON特殊功能寄存器來完成的。
現(xiàn)在我們選擇16位定時(shí)工作方式,對于T0來說,最大定時(shí)也只有65536us,即65.536ms,無法達(dá)到我們所需要的1秒的定時(shí),因此,我們必須通過軟件來處理這個(gè)問題,假設(shè)我們?nèi)0的最大定時(shí)為50ms,即要定時(shí)1秒需要經(jīng)過20次的50ms的定時(shí)。對于這20次我們就可以采用軟件的方法來統(tǒng)計(jì)了。
因此,我們設(shè)定TMOD=00000001B,即TMOD=01H
下面我們要給T0定時(shí)/計(jì)數(shù)器的TH0,TL0裝入預(yù)置初值,通過下面的公式可以計(jì)算出
TH0=(216-50000) / 256 TL0=(216-50000) MOD 256
當(dāng)T0在工作的時(shí)候,我們?nèi)绾蔚弥?0ms的定時(shí)時(shí)間已到,這回我們通過檢測TCON特殊功能寄存器中的TF0標(biāo)志位,如果TF0=1表示定時(shí)時(shí)間已到。
5. 程序框圖
6. 匯編源程序(查詢法)
SECOND EQU 30H TCOUNT EQU 31H ORG 00H
START: MOV SECOND,#00H MOV TCOUNT,#00H MOV TMOD,#01H
MOV TH0,#(65536-50000) / 256 MOV TL0,#(65536-50000) MOD 256 SETB TR0
DISP: MOV A,SECOND MOV B,#10 DIV AB
MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A MOV A,B
MOVC A,@A+DPTR MOV P2,A
WAIT: JNB TF0,WAIT CLR TF0
MOV TH0,#(65536-50000) / 256 MOV TL0,#(65536-50000) MOD 256 INC TCOUNT MOV A,TCOUNT CJNE A,#20,NEXT MOV TCOUNT,#00H INC SECOND MOV A,SECOND CJNE A,#60,NEX MOV SECOND,#00H NEX: LJMP DISP NEXT: LJMP WAIT
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END
7. C語言源程序(查詢法)
#include
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00}; unsigned char second; unsigned char tcount;
void main(void) {
TMOD=0x01;
TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; tcount=0; second=0;
P0=dispcode[second/10]; P2=dispcode[second%10]; while(1) {
if(TF0==1) {
tcount++;
if(tcount==20) { tcount=0; second++;
if(second==60) {
second=0; }
P0=dispcode[second/10]; P2=dispcode[second%10]; }
TF0=0;
TH0=(65536-50000)/256; TL0=(65536-50000)%256; } } }