C51單片機(jī)04(定時(shí)器)講解課件_第1頁(yè)
C51單片機(jī)04(定時(shí)器)講解課件_第2頁(yè)
C51單片機(jī)04(定時(shí)器)講解課件_第3頁(yè)
C51單片機(jī)04(定時(shí)器)講解課件_第4頁(yè)
C51單片機(jī)04(定時(shí)器)講解課件_第5頁(yè)
已閱讀5頁(yè),還剩40頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4講定時(shí)器/計(jì)數(shù)器AtmelAT89C51AtmelAT89C52定時(shí)器/計(jì)數(shù)器的主要特性C51系列有2個(gè)定時(shí)/計(jì)數(shù)器(T0、T1)C52系列有3個(gè)定時(shí)/計(jì)數(shù)器(T0、T1、T2)通過編程設(shè)置,每個(gè)定時(shí)器/計(jì)數(shù)器可以根據(jù)系統(tǒng)時(shí)鐘實(shí)現(xiàn)定時(shí),也可以對(duì)外部信號(hào)計(jì)數(shù)(T0/P3.4、T1/P3.5)每個(gè)定時(shí)器/計(jì)數(shù)器都有多種工作方式每個(gè)定時(shí)器/計(jì)數(shù)器都會(huì)在預(yù)設(shè)定時(shí)計(jì)數(shù)時(shí)間到時(shí)產(chǎn)生溢出,可以通過查詢或中斷方式處理使用定時(shí)/計(jì)數(shù)器的步驟方式選擇——TMOD初值設(shè)置——TH0、TL0(TH1、TL1)中斷允許——EA、ET0(ET1)啟動(dòng)操作——TR0(TR1)定時(shí)/計(jì)數(shù)器的方式寄存器TMOD 可以一次定義兩個(gè)定時(shí)/計(jì)數(shù)器的工作方式GATEC/TM1M0GATEC/TM1M0D7D6D5D4D3D2D1D0定時(shí)器1定時(shí)器0M1M0工作方式方式說明00013位定時(shí)/計(jì)數(shù)器01116位定時(shí)/計(jì)數(shù)器1028位自動(dòng)重置定時(shí)/計(jì)數(shù)器113兩個(gè)8位定時(shí)/計(jì)數(shù)器(僅T0有此方式)定時(shí)/計(jì)數(shù)器的方式寄存器TMODC/T=1計(jì)數(shù)方式C/T=0定時(shí)方式GATE——控制定時(shí)/計(jì)數(shù)器的啟動(dòng)是否受外部中斷請(qǐng)求信號(hào)的影響GATE=1——外部中斷請(qǐng)求高電平啟動(dòng)計(jì)數(shù)GATE=0——定時(shí)/計(jì)數(shù)器啟動(dòng)與外部中斷請(qǐng)求無關(guān)一般情況下GATE=0定時(shí)/計(jì)數(shù)器的控制寄存器TCON用于控制定時(shí)/計(jì)數(shù)器的啟動(dòng)與溢出TF1——溢出標(biāo)志TR1——啟動(dòng)位(=1:?jiǎn)?dòng)=0:停止)TF0——溢出標(biāo)志TR0——啟動(dòng)位(=1:?jiǎn)?dòng)=0:停止)TF1TR1TF0TR0IE1IT1IE0IT0D7D6D5D4D3D2D1D0外部中斷控制方式2——自動(dòng)重置8位計(jì)數(shù)M1M0=10TL0——計(jì)數(shù)(最大定時(shí)256μs)TH0——保存初值,便于自動(dòng)重置例:TH0=0x06TL0=0x06TL0計(jì)數(shù)到256發(fā)生溢出,計(jì)數(shù)值為250然后重新置入0x06,繼續(xù)計(jì)數(shù)在P1.0端口輸出周期為500μs的方波//查詢方式(晶振頻率12MHz)#include<reg52.h>sbitP1_0=P1^0;voidmain(){ TMOD=0x02; //定時(shí)器T0設(shè)置為方式2 TH0=0x06; //256-6=250,定時(shí)250μs TL0=0x06; TR0=1; //啟動(dòng)定時(shí)器T0 while(1) { if(TF0==1) //如果檢測(cè)到溢出,意味著定時(shí)時(shí)間到

{ TF0=0; //取消溢出標(biāo)志

P1_0=!P1_0; //輸出高/低電平轉(zhuǎn)換

} }}250μs250μs說明晶振頻率12MHz,作為定時(shí)/計(jì)數(shù)器的基準(zhǔn)信號(hào)定時(shí)/計(jì)數(shù)器進(jìn)行12分頻,定時(shí)工作頻率1MHz,定時(shí)工作周期1usTMOD=0x02(00000010B)T0工作于方式2(8位自動(dòng)重置定時(shí))定時(shí)器方式GATEC/TM1M0GATEC/TM1M0D7D6D5D4D3D2D1D0定時(shí)器1定時(shí)器0說明TL0=0x06TH0=0x06計(jì)數(shù)從6開始,每個(gè)工作周期(1us)加1,經(jīng)過250us之后產(chǎn)生溢出,TF0==1方式2為自動(dòng)重置,將TH0的值再次裝入TL0,繼續(xù)計(jì)數(shù)每次檢測(cè)到TF0==1,就使P1^0的狀態(tài)改變一次,從而產(chǎn)生了周期為500us的對(duì)稱方波思考設(shè)單片機(jī)晶振頻率為12MHz,對(duì)于前例,如果要求T0輸出的方波周期為200μs,計(jì)數(shù)初值應(yīng)該怎樣設(shè)置?機(jī)器周期=時(shí)鐘周期*12

=12/晶振頻率

=1μs計(jì)數(shù)初值=256-200/2

=156(0x9c)TH0=0x9c;TL0=0x9c;在P1.0端口輸出周期為500μs的方波//中斷方式#include<reg52.h>sbitP1_0=P1^0;voidmain(){ TMOD=0x02; //T0設(shè)置為方式2 TH0=0x06; TL0=0x06; EA=1; //中斷允許總控

ET0=1; //允許定時(shí)器T0中斷

TR0=1; //啟動(dòng)定時(shí)器

while(1); //等待中斷的發(fā)生}voidtime0_int(void)interrupt1 //定時(shí)器T0對(duì)應(yīng)interrupt1{ P1_0=!P1_0;}LED0以200ms間隔閃爍(方法一)#include<reg52.h>sbitLED0=P0^0; //LED0接在P0^0端口chari;voidmain(){ TMOD=0x01; //方式1,16位定時(shí)/計(jì)數(shù)

TH0=0xd8; TL0=0xf0; //0xd8f0=55536計(jì)數(shù)初值,定時(shí)10ms EA=1; ET0=1; //定時(shí)器T0允許中斷

i=0; TR0=1; //啟動(dòng)定時(shí)器T0 while(1);}voidtime0_int(void)interrupt1 //定時(shí)器T0對(duì)應(yīng)的就是interrupt1{ TH0=0xd8; TL0=0xf0; //恢復(fù)計(jì)數(shù)初值,繼續(xù)延時(shí)

i++; //每計(jì)數(shù)一次,延時(shí)10ms

if(i==20) //若滿足200ms { LED0=!LED0; //LED0閃爍一次

i=0; //恢復(fù)初始狀態(tài)

}}LED0以200ms間隔閃爍(方法二)#include<reg52.h>sbitLED0=P0^0;chari;voidmain(){ TMOD=0x01; //方式1,16位定時(shí)/計(jì)數(shù)

TH0=0x3c; TL0=0xb0; //0x3cb0=15536計(jì)數(shù)初值,定時(shí)50ms EA=1; ET0=1; i=0; TR0=1; while(1);}voidtime0_int(void)interrupt1 //定時(shí)器T0對(duì)應(yīng)的就是interrupt1{ TH0=0x3c; TL0=0xb0; //恢復(fù)計(jì)數(shù)初值,繼續(xù)延時(shí)

i++; //每計(jì)數(shù)一次,延時(shí)50ms

if(i==4) //若滿足200ms { LED0=!LED0; //LED0閃爍一次

i=0; //恢復(fù)初始狀態(tài)

}}思考方法一:定時(shí)10ms,i計(jì)數(shù)20次方法二:定時(shí)50ms,i計(jì)數(shù)4次這兩種做法,哪種更好些?方法二更好些,因?yàn)槌浞掷昧硕〞r(shí)器的最大定時(shí)能力,減少了對(duì)CPU時(shí)間的占用練習(xí)利用定時(shí)器T1產(chǎn)生定時(shí)時(shí)鐘,由P0口控制8個(gè)LED依次逐個(gè)閃動(dòng),頻率為10次/秒,循環(huán)重復(fù)程序代碼(主程序部分)#include<reg52.h>#include<intrins.h>unsignedcharLED,i;voidmain(){ i=0; LED=0xfe; //LED0首先發(fā)光

P0=LED; TMOD=0x01; //定時(shí)器方式1(16位定時(shí))

TH1=0x3c; //定時(shí)初值0x3cb0=15536 TL1=0xb0; EA=1; //中斷總控允許

ET1=1; //定時(shí)器1中斷允許

TR1=1; //啟動(dòng)定時(shí)器1 while(1); //等待中斷發(fā)生}程序代碼(中斷服務(wù)程序部分)voidtime1_int(void)interrupt3//定時(shí)器1允許{ TH1=0x3c; //重置定時(shí)50ms的初值

TL1=0xb0; i++;

if(i==20) //定時(shí)時(shí)間到,閃動(dòng)一次

{ LED=_cror_(LED,1); P0=LED; i=0; //恢復(fù)初始狀態(tài)

}}練習(xí)利用定時(shí)器產(chǎn)生定時(shí)控制信號(hào),在8個(gè)LED上穩(wěn)定地顯示“01234567”分析:要實(shí)現(xiàn)穩(wěn)定地顯示,根據(jù)以往經(jīng)驗(yàn),切換速度要求不大于2ms定時(shí)器完全可以代替以前使用的延時(shí)程序,這樣就節(jié)省了CPU時(shí)間程序代碼#include<reg52.h>unsignedcharcodetable[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};unsignedchari;voidmain(){ i=0; TMOD=0x01; TH1=0xf8; TL1=0x30; //延時(shí)2ms,0xf830=63536 EA=1; ET1=1; //允許定時(shí)器1中斷

TR1=1; //啟動(dòng)定時(shí)器1 while(1);}voidtime1_int(void)interrupt3 //定時(shí)器1產(chǎn)生interrupt3中斷{ TH1=0xf8; TL1=0x30; P0=table[i]; //獲取段位碼

P2=i; //選擇LED i++;

if(i==8)i=0; //輪流顯示了全部8個(gè)LED之后,回歸原位}練習(xí)利用定時(shí)器實(shí)現(xiàn)的定時(shí)間隔,在8個(gè)LED上穩(wěn)定地顯示電話號(hào)碼“68752219”程序代碼#include<reg52.h>unsignedcharcodetable[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsignedcharcodeNumber[8]={6,8,7,5,2,2,1,9};unsignedchari,j;voidmain(){ i=0; TMOD=0x01; TH1=0xf8; TL1=0x30; EA=1; ET1=1; TR1=1; while(1);}voidtime1_int(void)interrupt3{ TH1=0xf8; TL1=0x30; j=Number[i]; P0=table[j]; P2=i; i++;

if(i==8)i=0;}練習(xí)在8個(gè)LED數(shù)碼管的右端從0開始顯示數(shù)字,利用定時(shí)器控制,以200ms的間隔逐次加1,到達(dá)255之后歸0,循環(huán)往復(fù)分析:本題的任務(wù)最好使用兩個(gè)定時(shí)器來完成T1的定時(shí)間隔為200ms,用來修正計(jì)數(shù)T0的定時(shí)間隔為2ms,用來刷新LED主程序#include<reg52.h>#defineucharunsignedcharucharcodetable[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};ucharmydata[3]={0,0,0};uchari,number,d0;voidmain(){ i=0; number=0; TMOD=0x01; TH1=0x3c; TL1=0xb0; EA=1; ET1=1; TR1=1; TH0=0xf8; TL0=0x30; ET0=1; TR0=1; d0=0; while(1);}定時(shí)器1的中斷服務(wù)程序voidtime1_int(void)interrupt3{ TH1=0x3c; TL1=0xb0; i++;

if(i==40) //定時(shí)間隔5ms,乘以40倍

{ number++; mydata[2]=number/100; mydata[1]=number/10%10; mydata[0]=number%10; i=0; }}定時(shí)器0的中斷服務(wù)程序voidtimer0_int(void)interrupt1{ TH0=0xf8; TL0=0xf0; P0=table[mydata[d0]]; //獲取段位碼

if(d0==2) P2=5; //百位數(shù)顯示在LED5 else P2=(d0==1)?6:7; //十位數(shù)顯示在LED6 d0=(d0+1)%3;}練習(xí)在8個(gè)LED數(shù)碼管上按右對(duì)齊的方式從0開始顯示數(shù)字,利用定時(shí)器控制,以200ms的間隔逐次加1,到達(dá)255之后歸0,循環(huán)往復(fù)練習(xí)LED0的亮度分為0~9共10檔可調(diào),每按一次獨(dú)立開關(guān)S17(連接到P34),LED0亮度增加一個(gè)檔次,增加到10時(shí)則回到最低亮度數(shù)據(jù)定義與準(zhǔn)備#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitLED0=P0^0; //要控制的LED燈sbitK1=P3^4; //控制亮度,每按一次增加一檔亮度ucharscale=5; //占空比的低電平時(shí)間份額,總共10份uintn=0;定時(shí)器初始化voidtimer0_init(){ TMOD=0x02; //T0為方式2,自動(dòng)重置8位計(jì)數(shù)

TH0=0x06; //晶振頻率12MHz,定時(shí)250μs TL0=0x06; TR0=1; //啟動(dòng)定時(shí)器0 ET0=1; //開放定時(shí)器0中斷

EA=1; //開放總控中斷 }定時(shí)器中斷timer0()interrupt1 //定時(shí)器T0中斷服務(wù)程序{ //每10次中斷,LED0發(fā)光保持scale次

staticuchar

tt; //保存當(dāng)前時(shí)間在一秒中的比例位置

TF0=0; //清除溢出標(biāo)志,迎接下次中斷

tt++; //統(tǒng)計(jì)中斷發(fā)生的次數(shù)

if(tt==10) //每發(fā)生10次中斷,開始LED0發(fā)光

{

tt=0;

if(scale!=0) //加這句為了消除滅燈狀態(tài)產(chǎn)生的鬼影

LED0=0; }

if(scale==tt) //按照當(dāng)前占空比切換輸出高電平

LED0=1; //LED0熄滅}主函數(shù)voidmain(void){ Timer0_init(); while(1) { if(!K1) //如果檢測(cè)到K1按下

{

for(n=0;n<1000;n++); //等待K1穩(wěn)定按下

while(!K1); //等待K1松開

for(n=0;n<1000;n++); //等待K1穩(wěn)定松開

scale++; //亮度增加一檔

if(scale==10)scale=0; //亮度增加到10則回歸最暗狀態(tài)

} }}Atmel89C52定時(shí)器/計(jì)數(shù)器2編程定時(shí)器2的工作方式:16位重裝載方式16位捕獲方式16位波特率發(fā)生器方式工作方式由T2CON寄存器決定TF2EXF2RCLKTCLKEXEN2TR2C/T2CP/RL2D7D6D5D4D3D2D1D0T2CON寄存器各位功能符號(hào)功能TF2定時(shí)器2溢出標(biāo)志。溢出時(shí),又由硬件置位,必須由軟件清0。當(dāng)RCLK或TCLK=1時(shí),定時(shí)器2溢出,不對(duì)TF2置位EXF2外部標(biāo)志。RCLK接收時(shí)鐘允許。=1,用定時(shí)器2溢出脈沖作為串口接收時(shí)鐘;=0,用定時(shí)器1的溢出脈沖作為接收時(shí)鐘TCLK發(fā)送時(shí)鐘允許。=1,用定時(shí)器2溢出脈沖作為串口發(fā)送時(shí)鐘;=0,用定時(shí)器1的溢出脈沖作為發(fā)送時(shí)鐘EXEN2外部允許標(biāo)志。=1,若定時(shí)器2未用作串行口的波特率發(fā)生器,T2EX端出現(xiàn)負(fù)跳變時(shí),激活定時(shí)器2捕獲或重裝載TR2啟動(dòng)/停止控制。=1,啟動(dòng)定時(shí)器2C/T2定時(shí)器/計(jì)數(shù)器方式控制。=0,定時(shí)器方式;=1,對(duì)外部事件計(jì)數(shù)方式(下降沿觸發(fā))CP/RL2捕獲/重裝載選擇。=1,若EXEN2=1,且T2EN端出現(xiàn)負(fù)跳變時(shí)發(fā)生捕獲操作;=0,若溢出或EXEN2=1,T2EN出現(xiàn)負(fù)跳變時(shí)自動(dòng)重裝載在數(shù)碼管中顯示多個(gè)浮點(diǎn)數(shù)要求:第0位顯示溫度傳感器編號(hào)第2~5位顯示溫度值(2位小數(shù),帶小數(shù)點(diǎn))第6~7位顯示°C原始溫度數(shù)據(jù)由float類型數(shù)組提供每個(gè)溫度數(shù)據(jù)顯示2秒,依次輪換數(shù)據(jù)定義與準(zhǔn)備#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintfloattempfloat[8]={37.65,33.28,36.10,32.39,33.57,36.40,34.66,35.17};ucharcodetable[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x63,0x00}; //0123456789ABCDEF度空ucharLED[8]={0,17,0,0,0,0

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論