版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
定時(shí)器/計(jì)數(shù)器06介紹單片機(jī)片內(nèi)3個(gè)定時(shí)器/計(jì)數(shù)器的結(jié)構(gòu)與基本原理、4種工作方式以及應(yīng)用。06定時(shí)器/計(jì)數(shù)器01T0與T1工作原理0203計(jì)數(shù)器的仿真實(shí)例定時(shí)器的仿真實(shí)例04T2結(jié)構(gòu)與工作方式6.1T0與T1的結(jié)構(gòu)與工作方式一、T0與T1的內(nèi)部結(jié)構(gòu)T0定時(shí)/計(jì)數(shù)器4種工作方式T1定時(shí)/計(jì)數(shù)器3種工作方式方式0:13位定時(shí)/計(jì)數(shù)器方式1:16位定時(shí)/計(jì)數(shù)器方式2:8位自動(dòng)重載初值定時(shí)/計(jì)數(shù)器方式3:T0變成2個(gè)8位定時(shí)器T0/T1工作模式T0組成:SFR:TH0TL0T1組成:SFR:TH1TL1定時(shí)器計(jì)數(shù)器6.1T0與T1的結(jié)構(gòu)與工作方式二、定時(shí)器/計(jì)數(shù)器的寄存器工作方式控制寄存器TMOD1位序號(hào)D7D6D5D4D3D2D1D0符號(hào)GATE
M1
M0GATE
M1
M0工作方式控制寄存器TMOD(字節(jié)地址89H,不可位尋址)設(shè)置T0設(shè)置T16.1T0與T1的結(jié)構(gòu)與工作方式二、定時(shí)器/計(jì)數(shù)器的寄存器工作方式控制寄存器TMOD1位序號(hào)D7D6D5D4D3D2D1D0符號(hào)GATE
M1
M0GATE
M1
M0工作方式控制寄存器TMOD(字節(jié)地址89H,不可位尋址)設(shè)置T0設(shè)置T16.1T0與T1的結(jié)構(gòu)與工作方式二、定時(shí)器/計(jì)數(shù)器的寄存器定時(shí)器/計(jì)數(shù)器控制寄存器TCON2定時(shí)器/計(jì)數(shù)器控制寄存器TCON(字節(jié)地址88H,可位尋址)6.1T0與T1的結(jié)構(gòu)與工作方式三、定時(shí)器/計(jì)數(shù)器的工作方式方式0方式1方式2方式36.1T0與T1的結(jié)構(gòu)與工作方式三、定時(shí)器/計(jì)數(shù)器的工作方式方式0(13位定時(shí)器/計(jì)數(shù)器方式)1兼容48系列單片機(jī)初值計(jì)算麻煩,不常用6.1T0與T1的結(jié)構(gòu)與工作方式三、定時(shí)器/計(jì)數(shù)器的工作方式方式1(16位定時(shí)器/計(jì)數(shù)器方式)2方式1:M1M0=01工作模式:
軟啟動(dòng)GATE=0;TR0=1;硬啟動(dòng)GATE=1;TR1=1;INT0=1;計(jì)數(shù)初值:計(jì)數(shù)個(gè)數(shù)=最大計(jì)數(shù)個(gè)數(shù)-初值定時(shí)時(shí)間=(最大計(jì)數(shù)個(gè)數(shù)-初值)*機(jī)器周期啟動(dòng)方式:溢出處理:TH0TL0硬件自動(dòng)清0TF0硬件自動(dòng)置1查詢TF0TF0中斷65536(88H)(89H)6.1T0與T1的結(jié)構(gòu)與工作方式三、定時(shí)器/計(jì)數(shù)器的工作方式計(jì)數(shù)初值:計(jì)數(shù)器初值:計(jì)數(shù)個(gè)數(shù)=最大計(jì)數(shù)個(gè)數(shù)-初值定時(shí)器初值:定時(shí)時(shí)間=(最大計(jì)數(shù)個(gè)數(shù)-初值)*機(jī)器周期例:每計(jì)100個(gè)脈沖溢出,計(jì)算初值。TH0=0xFF;TL0=0x9C;方法1方法2TH0=(65536-100)/256;TL0=(65536-100)%256;例:50ms定時(shí),晶振12MHz。TH0=0x3C;TL0=0xB0;方法1方法2TH0=(65536-50000)/256;TL0=(65536-50000)%256;【解】TC=65536-100=65436=0xFF9C【解】50ms=(65536-TC)*1usTC=15536=3CB0H
6.1T0與T1的結(jié)構(gòu)與工作方式三、定時(shí)器/計(jì)數(shù)器的工作方式方式1(16位定時(shí)器/計(jì)數(shù)器方式)2void函數(shù)名()interrupt1
T0:void函數(shù)名()interrupt3
T1:{TH0=初值;TL0=初值;……}{TH1=初值;TL1=初值;……}6.1T0與T1的結(jié)構(gòu)與工作方式三、定時(shí)器/計(jì)數(shù)器的工作方式方式2(8位自動(dòng)重載初值定時(shí)器/計(jì)數(shù)器方式)3方式2:M1M0=10溢出處理:TL0自動(dòng)清0TF0硬件自動(dòng)置1查詢TF0TF0中斷TH0自動(dòng)裝載TL0計(jì)數(shù)初值:計(jì)數(shù)器初值:計(jì)數(shù)個(gè)數(shù)=最大計(jì)數(shù)個(gè)數(shù)-初值定時(shí)器初值:定時(shí)時(shí)間=(最大計(jì)數(shù)個(gè)數(shù)-初值)*機(jī)器周期最大計(jì)數(shù)個(gè)數(shù):2566.1T0與T1的結(jié)構(gòu)與工作方式三、定時(shí)器/計(jì)數(shù)器的工作方式方式3(2個(gè)8位定時(shí)器/計(jì)數(shù)器方式,T0有)4方式3:M1M0=11TH0+TR1+TF1定時(shí)器:8位,不能自動(dòng)重載初值TL0+TR0+TF0定時(shí)器/計(jì)數(shù)器:8位,不能自動(dòng)重載初值6.1T0與T1的結(jié)構(gòu)與工作方式三、定時(shí)器/計(jì)數(shù)器的工作方式方式3(2個(gè)8位定時(shí)器/計(jì)數(shù)器方式,T0有)4TH0+TR1+TF1定時(shí)器:8位,不能自動(dòng)重載初值TL0+TR0+TF0定時(shí)器/計(jì)數(shù)器:8位,不能自動(dòng)重載初值T0方式3時(shí)T1的工作方式示意圖T1作波特率發(fā)生器使用!常用方式2T1方式0T1方式1T1方式26.1T0與T1的結(jié)構(gòu)與工作方式16位“加1”計(jì)數(shù)器,最大計(jì)數(shù)個(gè)數(shù)65536個(gè)。當(dāng)計(jì)滿時(shí)再來一個(gè)計(jì)數(shù)脈沖,計(jì)數(shù)器就會(huì)產(chǎn)生“溢出”即TF=1,計(jì)數(shù)器則清零。需要重復(fù)定時(shí)或計(jì)數(shù),需要在每一次計(jì)數(shù)前不斷的由軟件重新預(yù)裝初值,稱之為“軟件重裝初值”。方式2:8位計(jì)數(shù)器的模式。TH0為8位定時(shí)器,溢出TF1=1,TH0清零,軟件重裝初值。TL0為8位定時(shí)/計(jì)數(shù)器,溢出TF0=1,TL0清零,軟件重裝初值。T0具有工作方式3,T1沒有工作方式3。方式1:16位的計(jì)數(shù)器模式。8位“加1”計(jì)數(shù)器,最大計(jì)數(shù)個(gè)數(shù)256個(gè),計(jì)滿TF=1,計(jì)數(shù)器則清零。需要重復(fù)定時(shí)或計(jì)數(shù),具備“硬件自動(dòng)重裝”初值功能。TL做計(jì)數(shù)器,TH做初值寄存器,TL,TH分別預(yù)置相同的初值。方式3:拆分、組合模式。四、定時(shí)器/計(jì)數(shù)器的應(yīng)用步驟1、定時(shí)/計(jì)數(shù)器初始化(1)設(shè)置TMOD寄存器:4種工作方式,定時(shí)/計(jì)數(shù),門控位(2)計(jì)算定時(shí)/計(jì)數(shù)的初值,裝入TH0TL0或TH1TL1(3)設(shè)置TCON寄存器:啟動(dòng)或停止定時(shí)/計(jì)數(shù)(需要時(shí)加人)
T0啟動(dòng):TR0=1;
停止:TR0=0;
T1啟動(dòng):TR1=1;
停止:TR1=0;2、T0/T1中斷初始化
T0中斷:EA=1;ET0=1;PT0=1/0;
T1中斷:EA=1;ET1=1;PT1=1/0;3、編寫中斷服務(wù)函數(shù)T0中斷函數(shù):void函數(shù)名(void)interrupt
1
usingm{......}
T1中斷函數(shù):void函數(shù)名(void)interrupt
3
usingm{......}
使用T0/T1中斷的設(shè)計(jì)步驟四、定時(shí)器/計(jì)數(shù)器的應(yīng)用步驟使用T0/T1查詢的設(shè)計(jì)步驟1、定時(shí)/計(jì)數(shù)器初始化(1)設(shè)置TMOD寄存器:4種工作方式,定時(shí)/計(jì)數(shù),門控位(2)計(jì)算定時(shí)/計(jì)數(shù)的初值,裝入TH0TL0或TH1TL1(3)設(shè)置TCON寄存器:啟動(dòng)或停止定時(shí)/計(jì)數(shù)(需要時(shí)加人)
T0啟動(dòng):TR0=1;
停止:TR0=0;
T1啟動(dòng):TR1=1;
停止:TR1=0;2、查詢標(biāo)志位:TF0或TF1T0標(biāo)志位查詢:while(TF0==0);或
while(!TF0);T1標(biāo)志位查詢:while(TF0==0);或while(!TF1);3、清除標(biāo)志位:TF0=0;
TF1=0;06定時(shí)器/計(jì)數(shù)器01T0與T1工作原理0203計(jì)數(shù)器的仿真實(shí)例定時(shí)器的仿真實(shí)例04T2結(jié)構(gòu)與工作方式6.2定時(shí)器的仿真實(shí)例一、方波信號(hào)發(fā)生器仿真實(shí)例任務(wù)要求:產(chǎn)生頻率為50Hz的的方波信號(hào),系統(tǒng)晶振為12MHz。1硬件電路設(shè)計(jì)2軟件設(shè)計(jì)T0方式1產(chǎn)生10msP2.0取反①TMOD初始化②計(jì)算初值TMOD=00000001B=0x01TH0=(65536-10000)/256;TL0=(65536-10000)%256;③查詢TF0或中斷6.2定時(shí)器的仿真實(shí)例一、方波信號(hào)發(fā)生器仿真實(shí)例任務(wù)要求:產(chǎn)生頻率為50Hz的的方波信號(hào),系統(tǒng)晶振為12MHz。2軟件設(shè)計(jì)#include<reg52.h> sbitP20=P2^0; voidT0_init();/*************主函數(shù)************/voidmain(void) {
T0_init();while(1) {while(TF0==0);
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
P20=!P20; TF0=0;
}}voidT0_init(){
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TR0=1;
}(查詢方式編程)①TMOD初始化②計(jì)算初值TMOD=00000001B=0x01TH0=(65536-10000)/256;TL0=(65536-10000)%256;③查詢TF0或中斷6.2定時(shí)器的仿真實(shí)例一、方波信號(hào)發(fā)生器仿真實(shí)例任務(wù)要求:產(chǎn)生頻率為50Hz的的方波信號(hào),系統(tǒng)晶振為12MHz。2軟件設(shè)計(jì)#include<reg52.h> sbitP20=P2^0; voidT0_init();//定時(shí)器T0初始化voidmain(void) {T0_init();while(1); }voidT0_init(){TMOD=0x01; TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TR0=1;
ET0=1;//開T0中斷
EA=1; //開總中斷}(中斷方式編程)voidT0_int()interrupt1{TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
P20=!P20; }6.2定時(shí)器的仿真實(shí)例一、方波信號(hào)發(fā)生器仿真實(shí)例任務(wù)要求:產(chǎn)生頻率為50Hz的的方波信號(hào),系統(tǒng)晶振為12MHz。3仿真運(yùn)行周期為20ms6.1T0與T1的結(jié)構(gòu)與工作方式定時(shí)器初值:定時(shí)時(shí)間=(最大計(jì)數(shù)個(gè)數(shù)-初值)*機(jī)器周期任務(wù)要求:產(chǎn)生頻率為50Hz的的方波信號(hào),系統(tǒng)晶振為12MHz。【編程小技巧】帶參數(shù)的定時(shí)器初始化函數(shù)編寫voidT0_init(unsignedintxus){unsignedlongtemp;//臨時(shí)變量
TMOD&=0xf0;//清T0控制位,保留T1控制位
TMOD|=0x01;//設(shè)置T0為方式1定時(shí)
temp=12000000/12;//機(jī)器周期的頻率1MHztemp=(temp*xus)/1000000;//定時(shí)xus的計(jì)數(shù)值
temp=65536-temp;//定時(shí)器初值
TH0_temp=(unsignedchar)(temp>>8);//計(jì)算高8位初值
TL0_temp=(unsignedchar)(temp);//計(jì)算低8位初值
TH0=TH0_temp;//置T0高8位初值
TL0=TL0_temp;//置T0低8位初值
TR0=1;//啟動(dòng)T0ET0=1;//開T0中斷
EA=1; //開總中斷}6.2定時(shí)器的仿真實(shí)例二、I/O口輸出PWM波形仿真實(shí)例任務(wù)要求:按鍵控制輸出PWM波形,頻率50Hz,占空比為25%、50%、75%的。晶振12MHz。1硬件電路設(shè)計(jì)T1,方式2,定時(shí)100us中斷一次T=20msHigh_num=50占空比為25%High_num=100占空比為50%High_num=150占空比為75%進(jìn)入中斷次數(shù):count++PWM波:count≤High_numP2.0=1Count>High_numP2.0=0High_num獲得:KEY1:High_num=50KEY2:High_num=100KEY3:High_num=150T=2006.2定時(shí)器的仿真實(shí)例任務(wù)要求:按鍵控制輸出PWM波形,頻率50Hz,占空比為25%、50%、75%的。2軟件設(shè)計(jì)#include"reg52.h"#defineucharunsignedchar#defineuintunsignedintsbitPWM=P2^0;//輸出PWMsbitkey1=P2^3;//占空比25%sbitkey2=P2^4;//占空比50%sbitkey3=P2^5;//占空比75%voidT1_init();//T1初始化ucharkeyscan();//設(shè)置占空比閾值ucharcount=0,High_num=0;voidmain(){
T1_init();while(1){
keyscan();}}voidT1_init()
{TMOD=0x20TH1=256-100
TL1=256-100;TR1=1;//啟動(dòng)T1 ET1=1;//開啟T1中斷
EA=1;//開總中斷
}二、I/O口輸出PWM波形仿真實(shí)例voidT1_int()interrupt3{
count++;//累計(jì)中斷次數(shù)
if(count>=200)count=0;if(count<High_num)PWM=1;elsePWM=0;}6.2定時(shí)器的仿真實(shí)例2軟件設(shè)計(jì)ucharkeyscan(){if(key1==0){delay(5);if(key1==0)
High_num=50;//KEY1=25%while(!key1);}if(key2==0){delay(5);if(key2==0)High_num=100;//KEY2=50%while(!key2);}二、I/O口輸出PWM波形仿真實(shí)例
if(key3==0){delay(5);if(key3==0)
High_num=150;
while(!key3);}returnHigh_num;}任務(wù)要求:按鍵控制輸出PWM波形,頻率50Hz,占空比為25%、50%、75%的。6.2定時(shí)器的仿真實(shí)例三、基于數(shù)碼管的秒表仿真實(shí)例任務(wù)要求:按鍵1啟動(dòng)秒表,數(shù)碼管(共陽)顯示;
按鍵2停止秒表,顯示當(dāng)前值。
再按下按鍵1則從0開始計(jì)時(shí),重復(fù)上述過程。
計(jì)時(shí)范圍00~59s,如果計(jì)時(shí)到59s,將從0計(jì)時(shí)。晶振12MHz。1硬件電路設(shè)計(jì)T0方式1,定時(shí)50ms中斷一次進(jìn)入中斷20為1s,sec累計(jì)秒次數(shù)數(shù)碼管顯示sec分離出十位、個(gè)位按鍵處理KEY1:TR0=1KEY2:TR0=01s的獲得shi=sec/10;ge=sec%10;6.2定時(shí)器的仿真實(shí)例2軟件設(shè)計(jì)voidT0_init(){ TMOD=0x01;
TH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;PT0=0;EA=1;}voidEx_init(){IT0=1;
EX0=1;
PX0=1;
IT1=1;
EX1=1;PX1=1;
EA=1;}三、基于數(shù)碼管的秒表仿真實(shí)例voidT0_it()interrupt1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;
count++;
if(count>=20){count=0;sec++;}if(sec>=60)sec=0;}voidkey1_int()interrupt0{
TR0=1;//啟動(dòng)T0sec=0x00;IE0=0;//清INT0中斷標(biāo)志位}voidkey2_int()interrupt2{TR0=0;//停止T0IE1=0;//清INT1中斷標(biāo)志位}6.2定時(shí)器的仿真實(shí)例2軟件設(shè)計(jì)voiddisplay(ucharz){uintshi,ge;
shi=z/10;ge=z%10;c1=1;//選中第一個(gè)數(shù)碼管
P2=seg[ge];//顯示千位
delay(1);P2=0xff;//消隱
c1=0;c2=1;//選中第二個(gè)數(shù)碼管
P2=seg[shi];//顯示百位
delay(1);P2=0xff;//消隱
c2=0;}三、基于LED數(shù)碼管的秒表仿真實(shí)例#include"reg52.h"#defineucharunsignedchar#defineuintunsignedintsbitc1=P1^0;//數(shù)碼管位選端sbitc2=P1^1;//數(shù)碼管位選端ucharcodeseg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
voidT0_init();//T0初始化voidEx_init();//外部中斷初始化voiddelay(uintdat);//延時(shí)程序voiddisplay(uchardate);//顯示程序ucharsec=0,count=0;voidmain(){
T0_init();
Ex_init();while(1){display(sec);}}6.2定時(shí)器的仿真實(shí)例【編程小技巧】定時(shí)刷新數(shù)碼管顯示器問題:刷新采用延時(shí)函數(shù)delay。執(zhí)行延時(shí)占用CPU時(shí)間,效率不高。數(shù)碼管動(dòng)態(tài)顯示時(shí),多個(gè)數(shù)碼管整體的動(dòng)態(tài)刷新時(shí)間小于10ms,數(shù)碼管才不會(huì)閃爍。
動(dòng)態(tài)掃描的過程為“送位選碼送段碼延時(shí)消隱”定時(shí)器T1每隔1ms刷新一位數(shù)碼管c1=1;//選中第一個(gè)數(shù)碼管
P2=seg[ge];//顯示千位
delay(1);P2=0xff;//消隱
c1=0;定時(shí)器T1初始化函數(shù):用帶參數(shù)的定時(shí)初始化函數(shù)T1_init(1000);//T1定時(shí)1ms中斷服務(wù)函數(shù):刷新顯示
display(sec);//1ms顯示刷新6.2定時(shí)器的仿真實(shí)例voiddisplay(ucharz){uintshi,ge;shi=z/10;ge=z%10;
c1=1;//選中第一個(gè)數(shù)碼管
P2=seg[ge];//顯示千位
delay(1);P2=0xff;//消隱
c1=0;c2=1;//選中第二個(gè)數(shù)碼管
P2=seg[shi];//顯示百位
delay(1);P2=0xff;//消隱
c2=0;}【編程小技巧】定時(shí)刷新數(shù)碼管源代碼voiddisplay_Time(uintz){staticuchari=0;//數(shù)碼管位選索引
uintshi,ge;shi=z/10;ge=z%10;switch(i){
case0:P2=0xff;//消隱
c1=1;c2=0;//選第一個(gè)數(shù)碼管
//P1=(P1&0xfC)|0x01;//選第一個(gè)數(shù)碼管
P2=seg[ge];//送段碼
i++;break;
case1:P2=0xff;//消隱
c2=1;c1=0;//選第二個(gè)數(shù)碼管
//P1=(P1&0xfC)|0x02;//選第二個(gè)數(shù)碼管
P2=seg[shi];//送段碼
i=0;break;default:break;}}定時(shí)刷新代碼6.2定時(shí)器的仿真實(shí)例2軟件設(shè)計(jì)(定時(shí)刷新)#include"reg52.h"#defineucharunsignedchar#defineuintunsignedintucharcodeseg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共陽數(shù)碼voidT0_init();//T0初始化voidT1_init(uintxus);//T1初始化voidEx_init();//外部中斷初始化voiddisplay_Time(uintz);//顯示程序ucharsec=0,count=0;//秒中斷進(jìn)入次數(shù)ucharTH1_temp,TL1_temp;//T1定時(shí)初值voidmain(){T0_init();//T0定時(shí)50msT1_init(1000);//T1定時(shí)1msEx_init();//中斷初始化
while(1);}voidT1_int()interrupt3{
TR1=0; //關(guān)閉T1
display(sec);//1ms顯示刷新
TH1=TH1_temp;//置T1高8位初值
TL1=TL1_temp;//置T1低8位初值
TR1=1;//啟動(dòng)T1}三、基于LED數(shù)碼管的秒表仿真實(shí)例T0_init()、T1_init(uintxus)、EX_init()以及T0、外部中斷0、1的中斷函數(shù)與上同6.2定時(shí)器的仿真實(shí)例四、基于LCD的時(shí)鐘仿真實(shí)例任務(wù)要求:key1啟動(dòng)秒表,key2停止秒表,key3增1,key4減1;在LCD1602上顯示。計(jì)時(shí)范圍00~59s,如果計(jì)時(shí)到59s,將從0計(jì)時(shí)。系統(tǒng)晶振為12MHz。1硬件電路設(shè)計(jì)T0方式1,定時(shí)50ms中斷一次進(jìn)入中斷20為1s,sec累計(jì)秒次數(shù)LCD顯示sec分離出十位、個(gè)位按鍵處理KEY1:TR0=1KEY2:TR0=01s的獲得shi=sec/10;ge=sec%10;KEY3:sec++KEY4:sec--6.2定時(shí)器的仿真實(shí)例2軟件設(shè)計(jì)#include"reg52.h"#defineucharunsignedchar#defineuintunsignedintsbitlcdrs=P1^0; sbitlcdrw=P1^1; sbitlcden=P1^2;
sbitkey1=P1^3;//啟動(dòng)sbitkey2=P1^4;//停止sbitkey3=P1^5;//增一sbitkey4=P1^6;//減一voidT0_init();//T0初始化voidkeyscan();voiddelay(uintdat);//延時(shí)程序voidlcd_init();//lcd初始化voidwrite_cmd(charcmd);voidwrite_data(uchardat);voidwrite_str(uchar*strvoiddisplay(uchardate);ucharflag=0,sec=0,count=0;voidmain(){T0_init();
lcd_init();write_cmd(0x82);write_str("sec:");while(1){
keyscan();
display(sec);}}四、基于LCD的時(shí)鐘仿真實(shí)例voidT0_init(){TMOD=0x01;//定時(shí)器T0方式1,定時(shí)50msTH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;EA=1;}6.2定時(shí)器的仿真實(shí)例2軟件設(shè)計(jì)voidT0_it()interrupt1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;if(count>=20){count=0;sec++;}if(sec>=60){sec=0;flag=1;}}voidkeyscan(){if(key1==0)TR0=1;if(key2==0)TR0=0;if(key3==0){
sec++;if(sec==60)sec=60;}if(key4==0){sec--;if(sec<=0)sec=0;}}四、基于LCD的時(shí)鐘仿真實(shí)例voiddisplay(uchardate){write_cmd(0x88);write_data(date/10+0x30);//顯示十位
write_cmd(0x89);write_data(date%10+0x30);//顯示個(gè)位}6.2定時(shí)器的仿真實(shí)例五、脈沖寬度測(cè)量仿真實(shí)例任務(wù)要求:測(cè)量信號(hào)的正脈沖寬度,并在LCD上顯示。系統(tǒng)晶振為12MHz。測(cè)量原理①T1方式1,定時(shí),累計(jì)機(jī)器周期的個(gè)數(shù),1個(gè)機(jī)器周期1us利用T0/T1的硬啟動(dòng)方式,當(dāng)門控位GATE=1,TR1=1,只有當(dāng)(INT1)引腳輸入高電平時(shí),T1才啟動(dòng),開始計(jì)數(shù),累計(jì)機(jī)器周期的個(gè)數(shù)。脈沖信號(hào)②P3.3引腳上升沿(高電平)啟動(dòng)T1定時(shí),下降沿(低電平)停止定時(shí)③讀出T1的數(shù)值④測(cè)量范圍:0~65535us6.2定時(shí)器的仿真實(shí)例二、脈沖寬度測(cè)量仿真實(shí)例任務(wù)要求:測(cè)量信號(hào)的正脈沖寬度,并在LCD上顯示。系統(tǒng)晶振為12MHz。1硬件電路設(shè)計(jì)6.2定時(shí)器的仿真實(shí)例2軟件設(shè)計(jì)#include<reg52.h>#defineuintunsignedint#defineucharunsignedcharsbitlcdrs=P1^0;//LCD1602液晶顯示器數(shù)據(jù)/命令選擇端口sbitlcdrw=P1^1;//LCD1602液晶顯示器讀/寫選擇端口sbitlcden=P1^2;//LCD1602液晶顯示器使能端口 sbitP3_3=P3^3; //INT1測(cè)量脈沖輸入引腳定義voiddelay(uintdat);//延時(shí)程序voidlcd_init();//lcd初始化voidwrite_cmd(charcmd);//寫指令函數(shù)voidwrite_data(uchardat);//寫數(shù)據(jù)函數(shù)voidwrite_str(uchar*str);//寫字符串函數(shù)voiddisplay(uintdate);//顯示uintWidth_num;//脈沖的寬度,T1的計(jì)數(shù)值任務(wù)要求:測(cè)量信號(hào)的正脈沖寬度,并在LCD上顯示。系統(tǒng)晶振為12MHz。6.2定時(shí)器的仿真實(shí)例2軟件設(shè)計(jì)voidmain(){ lcd_init();//LCD初始化
write_cmd(0x82);
write_str("PulseWidth:");while(1){TMOD=0x90;TH1=0; TL1=0;
while(P3_3==1);
TR1=1;//如果INT1為低,TR1=1,等待INT1變高啟動(dòng)T1
while(P3_3==0);//等待INT1變高,硬啟動(dòng)條件滿足,T1計(jì)數(shù)
while(P3_3==1);//等待INT1變低,變低后T1停止計(jì)數(shù)
TR1=0; //復(fù)位TR1Width_num=TH1*256+TL1;//計(jì)算T1計(jì)數(shù)值,即脈沖寬度
display(Width_num); //顯示脈沖寬度(機(jī)器周期個(gè)數(shù))
}}6.2定時(shí)器的仿真實(shí)例2軟件設(shè)計(jì)voiddisplay(uintdate){ucharwidth[7];//定義字符數(shù)組,存放脈沖寬度每一位的ASCIIwidth[0]=date/10000+0x30;//分離十萬位,轉(zhuǎn)換為ASCIIwidth[1]=date%100000/10000+0x30;//分離萬位,轉(zhuǎn)換為ASCIIwidth[2]=date%10000/1000+0x30;//分離千位,轉(zhuǎn)換為ASCIIwidth[3]=date%1000/100+0x30;//分離百位,轉(zhuǎn)換為ASCIIwidth[4]=date%100/10+0x30;//分離十位,轉(zhuǎn)換為ASCIIwidth[5]=date%10+0x30; //分離個(gè)萬位,轉(zhuǎn)換為ASCIIwidth[6]='\0'; //數(shù)組末尾填加字符串結(jié)束的標(biāo)志
write_cmd(0xc5);//在LCD第2行第5個(gè)位置寫入
write_str(width);//將脈沖寬度轉(zhuǎn)換為字符數(shù)組寫入LCD}6.3計(jì)數(shù)器的仿真實(shí)例【知識(shí)點(diǎn)】計(jì)數(shù)器模式對(duì)外部輸入信號(hào)頻率的要求計(jì)數(shù)器模式時(shí),計(jì)數(shù)脈沖來自外部輸入引腳T0或T1。當(dāng)輸入信號(hào)產(chǎn)生負(fù)跳變時(shí),計(jì)數(shù)值增1。
每個(gè)機(jī)器周期S5P2期間,都對(duì)外部輸入引腳T0或T1進(jìn)行采樣。如在第1個(gè)機(jī)器周期中采得值為1,而在下一個(gè)機(jī)器周期中采得的值為0,則在緊跟著的再下一個(gè)機(jī)器周期S3P1期間,計(jì)數(shù)器加1。由于確認(rèn)一次負(fù)跳變要花2個(gè)機(jī)器周期,即24個(gè)振蕩周期,因此外部輸入的計(jì)數(shù)脈沖的最高頻率為系統(tǒng)振蕩器頻率1/24。
對(duì)外輸入信號(hào)占空比沒有限制,但為確保某一給定電平在變化前能被采樣1次,則該電平至少保持1個(gè)機(jī)器周期。問題:選用12MHz頻率晶體,則可輸入外部脈沖信號(hào)的最高頻率為多少?可輸入外部脈沖信號(hào)的最高頻率為500kHz。6.3計(jì)數(shù)器的仿真實(shí)例-頻率計(jì)任務(wù)要求:測(cè)量脈沖信號(hào)的頻率,并在數(shù)碼管上顯示,測(cè)量頻率范圍為0~9999Hz。系統(tǒng)晶振為12MHz。1硬件電路設(shè)計(jì)6.3計(jì)數(shù)器的仿真實(shí)例-頻率計(jì)任務(wù)要求:測(cè)量脈沖信號(hào)的頻率,并在數(shù)碼管上顯示,測(cè)量頻率范圍為0~9999Hz。系統(tǒng)晶振為12MHz。T0方式1,定時(shí)25ms中斷一次,進(jìn)入中斷40次為1s①需要1s的定時(shí)測(cè)量信號(hào)的頻率原理測(cè)量信號(hào)的頻率就是測(cè)量每秒的脈沖個(gè)數(shù)頻率是指是單位時(shí)間內(nèi)完成振動(dòng)的次數(shù)②需要累計(jì)脈沖個(gè)數(shù)T1方式1,計(jì)數(shù),TH1=TL1=0③二者關(guān)聯(lián)T0定時(shí)1s,讀出T1的值T0定時(shí)25s讀出一次T1的數(shù)值,放在數(shù)組fre[count]中,T0中斷40次也就是1s,這時(shí)把讀出的40次值,即fre數(shù)組的值累加就是頻率值fresum。2軟件設(shè)計(jì)問題:頻率高,T1可能溢出6.3計(jì)數(shù)器的仿真實(shí)例2軟件設(shè)計(jì)voidT0T1_init(){
TMOD=0x51;//T0方式1,
25ms,T1計(jì)數(shù)TH0=(65536-25000)/256;//T0賦初值
TL0=(65536-25000)%256;ET0=1;//開T0中斷允許
TR0=1;//啟動(dòng)T0TR1=1;//啟動(dòng)T1EA=1;//開總中斷
}voidT0_it()interrupt1{TR0=0;//停止T0TR1=0;//停止T1
fre[count]=(TH1<<8)|TL1;
count++;//T0累計(jì)40次為1s
TH1=0;//T125ms清0TL1=0;TH0=(65536-25000)/256;
TL0=(65536-25000)%256;TR0=1;//啟動(dòng)T0TR1=1;//啟動(dòng)T1 }6.3計(jì)數(shù)器的仿真實(shí)例2軟件設(shè)計(jì)voiddisplay(u16z){u16qian,bai,shi,ge;
qian=z/1000;//分離千位
bai=z%1000/100;//分離百位
shi=z%100/10;//分離十位
ge=z%10;//分離個(gè)位
c1=0;c2=0;c3=0;c4=0;
//清位選端
c1=1;//選中第一個(gè)數(shù)碼管
P0=seg[ge];//顯示個(gè)位
delay(1);P0=0xff;//消隱
c1=0;c2=1;//選中第二個(gè)數(shù)碼管
P0=seg[shi];//顯示十位
delay(1);P0=0xff;//消隱
c2=0;c3=1;//選中第三個(gè)數(shù)碼管
P0=seg[bai];//顯示百位
delay(1);P0=0xff;//消隱
c3=0;
c4=1;//選中第四個(gè)數(shù)碼管
P0=seg[qian];//顯示千位
delay(1);P0=0xff;//消隱
c4=0;}6.3計(jì)數(shù)器的仿真實(shí)例2軟件設(shè)計(jì)#include"reg52.h"#defineu8unsignedchar#defineu16unsignedintsbitc1=P2^0;//數(shù)碼管位選端sbitc2=P2^1;//數(shù)碼管位選端sbitc3=P2^2;//數(shù)碼管位選端sbitc4=P2^3;//數(shù)碼管位選端u8codeseg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90;}voiddelay(u16dat);//延時(shí)程序voidT0T1_init();//T0初始化voiddisplay(u16z);//顯示u16fre[40];//存放25ms讀出的T1值u16fresum=0;//計(jì)算的頻率值u8count=0;//T0累計(jì)40次的變量voidmain(){
T0T1_init();//T0、T1初始化while(1){u8i=0;if(count==40)//1s時(shí)間到{TR0=0; TR1=0; count=0; fresum=0; for(i=0;i<40;i++) {
fresum=fresum+fre[i] } TR0=1;TR1=1;}display(fresum);//顯示}}6.4T2的結(jié)構(gòu)與工作方式T2有2個(gè)8位計(jì)數(shù)器寄存器:TH2和TL2,用于存放當(dāng)前計(jì)數(shù)值T2有2個(gè)陷阱寄存器:RCAP2L和RCAP2H,用于存放備用初值或捕捉值。T2有計(jì)數(shù)和定時(shí)2種工作模式T2有捕捉、自動(dòng)重新裝載(遞增或遞減)和波特率發(fā)生器3種工作方式,6.4.2T2的捕捉方式16位計(jì)數(shù)/定時(shí)(加1計(jì)數(shù))或捕捉(同時(shí)具有計(jì)數(shù)/定時(shí))。計(jì)數(shù)/定時(shí)工作狀態(tài)(加1計(jì)數(shù))1
溢出:硬件使TF2=1,TL2=0,TH2=0,不能自動(dòng)重裝初值,軟件使TF2=0溢出后處理:可查詢TF2=1,TF2=1也可用于產(chǎn)生中斷6.4.2T2的捕捉方式16位計(jì)數(shù)/定時(shí)(加1計(jì)數(shù))或捕捉(同時(shí)具有計(jì)數(shù)/定時(shí))。捕捉(同時(shí)具有計(jì)數(shù)/定時(shí))2設(shè)置:捕捉:T2EX(P1.1)發(fā)生負(fù)跳變時(shí),把TH2和TL2中的當(dāng)前計(jì)數(shù)值分別“捕捉”進(jìn)陷阱寄存器RCAP2L和RCAP2H中,同時(shí)T2EX(P1.1)上的負(fù)跳變將使T2CON的外部中斷請(qǐng)求標(biāo)志位EXF2=1,向CPU請(qǐng)求中斷。溢出后處理:可查詢TF2=1,EXF2=1,也都可用于產(chǎn)生中斷6.4.2T2的捕捉方式16位計(jì)數(shù)/定時(shí)(加1計(jì)數(shù))或捕捉(同時(shí)具有計(jì)數(shù)/定時(shí))。捕捉(同時(shí)具有計(jì)數(shù)/定時(shí))2設(shè)置:捕捉:T2EX(P1.1)發(fā)生負(fù)跳變時(shí),把TH2和TL2中的當(dāng)前計(jì)數(shù)值分別“捕捉”進(jìn)陷阱寄存器RCAP2L和RCAP2H中,同時(shí)T2EX(P1.1)上的負(fù)跳變將使T2CON的外部中斷請(qǐng)求標(biāo)志位EXF2=1,向CPU請(qǐng)求中斷。溢出后處理:可查詢TF2=1,EXF2=1,也都可用于產(chǎn)生中斷捕捉編程思路:
當(dāng)T2EX引腳(P1.1)上的信號(hào)發(fā)生負(fù)跳變時(shí),計(jì)數(shù)器TH2和TL2中的當(dāng)前計(jì)數(shù)值分別“捕捉”進(jìn)陷阱寄存器RCAP2L和RCAP2H中,并使EXF2=1,觸發(fā)中斷,在中斷服務(wù)函數(shù)中,讀出RCAP2L和RCAP2H的值,外部T2EX引腳的下一個(gè)負(fù)跳變,會(huì)產(chǎn)生另一個(gè)捕捉過程,再次進(jìn)入中斷,讀出RCAP2L和RCAP2H的值,根據(jù)這2次的值,就可以計(jì)算出T2EX引腳(P1.1)上的脈沖周期。這時(shí)T2工作在定時(shí)模式下。6.4.3T2的16位自動(dòng)重裝載方式T2自動(dòng)重新裝載方式結(jié)構(gòu)示意圖T2遞增/遞減結(jié)構(gòu)示意圖6.4.3T2的16位自動(dòng)重裝載方式當(dāng)EXEN2=0時(shí)的自動(dòng)重新裝載方式(T2計(jì)滿溢出觸發(fā))1①T2增1計(jì)滿溢出觸發(fā)的自動(dòng)重新裝載方式設(shè)置:
②T2增1計(jì)滿溢出觸發(fā)的自動(dòng)重新裝載方式設(shè)置:
③T2減1溢出觸發(fā)的自動(dòng)重新裝載方式設(shè)置:
當(dāng)EXEN2=1的自動(dòng)重新裝載方式(T2計(jì)滿溢出觸發(fā)或T2EX引腳負(fù)跳變觸發(fā))2①T2增1計(jì)滿溢出觸發(fā)的自動(dòng)重新裝載方式設(shè)置:
T2EX引腳負(fù)跳變觸發(fā)的增1自動(dòng)重新裝載方式設(shè)置:
DCEN=0;6.4.4T2的波特率發(fā)生器方式及可編程時(shí)鐘輸出波特率發(fā)生器方式1(1)T1用作串行口波特率發(fā)生器RCLK=0或TCLK=0時(shí),定時(shí)器T1作為串行口波特率發(fā)生器使用。(2)T2用作串行口波特率發(fā)生器RCLK=1或TCLK=1時(shí),定時(shí)器T2作為串行口波特率發(fā)生器使用。(3)附加的外部中斷源RCLK=1或TCLK=1;EXEN2=16.4.4T2的波特率發(fā)生器方式及可編程時(shí)鐘輸出波特率發(fā)生器方式1(2)T2用作串行口波特率發(fā)生器①工作方式設(shè)置:
16位自動(dòng)重裝初值的加1定時(shí)模式②T2的波特率設(shè)置
計(jì)算出初值X,裝入陷阱寄存器RCAP2H和RCAP2L中【例】串口方式1,波特率9600bps,晶振為11.0592MHz,
T2作波特率發(fā)生器使用,計(jì)算初值。
X=(65536-36)=65500RCAP2H=65500/256;RCAP2L=65500%256;③T2溢出說明TH2和TL2從初值的基礎(chǔ)上進(jìn)行加1計(jì)數(shù),計(jì)滿溢出,硬件自動(dòng)將RCAP2H和RCAP2L寄存器中預(yù)置的初值重裝入TH2和TL2中。但不會(huì)置位TF2向CPU請(qǐng)求中斷。6.4.4T2的波特率發(fā)生器方式及可編程時(shí)鐘輸出可編程時(shí)鐘信號(hào)輸出2①設(shè)置工作方式:
②啟動(dòng)和停止:TR2=1
啟動(dòng);TR2=0
停止③時(shí)鐘信號(hào)輸出頻率
6.4.5T2捕捉方式測(cè)量脈沖寬度仿真實(shí)例任務(wù)要求:測(cè)量信號(hào)的脈沖寬度,并在LCD上顯示。系統(tǒng)晶振為12MHz。硬件電路設(shè)計(jì)16.4.5T2捕捉方式測(cè)量脈沖寬度仿真實(shí)例任務(wù)要求:測(cè)量信號(hào)的脈沖寬度,并在LCD上顯示。系統(tǒng)晶振為12MHz。軟件設(shè)計(jì)2開放T2中斷和總中斷,T2溢出和T2EX引腳的負(fù)跳變都會(huì)觸發(fā)中斷,進(jìn)入同一個(gè)中斷程序,所以在中斷服務(wù)程序中判斷是EXF2中斷,根據(jù)進(jìn)入次數(shù)讀出RCAP2L和RCAP2H的捕捉值,根據(jù)2次捕捉值計(jì)算脈沖寬度。①T2設(shè)置為捕捉(同時(shí)具有計(jì)數(shù)/定時(shí)):
T2設(shè)為16位定時(shí)器,從0開始計(jì)數(shù),TH2=TL2=0;②計(jì)數(shù)初值:③T2中斷:6.4.5T2捕捉方式測(cè)量脈沖寬度仿真實(shí)例2軟件設(shè)計(jì)#include<reg52.h>#defineuintunsignedint#defineucharunsignedcharsfrT2MOD=0xc9sbitlcdrs=P3^5;sbitlcdrw=P3^6;sbitlcden=P3^7;voiddelay(uintdat);//延時(shí)程序voidT2_init();//T2初始化voidlcd_init();//lcd初始化voidwrite_cmd(charcmd);voidwrite_data(uchardat);//寫數(shù)據(jù)函數(shù)voidwrite_str(uchar*strvoiddisplay(uintdate);//顯示uintnum1;//第一次捕捉值uintnum2;//第二次捕捉值uintnum;ucharcount;voidmain(){ T2_init();//T2初始化
lcd_init();//LCD初始化
write_cmd(0x82;
write_str("PulseWidth:"); while(1){display(num);
}}任務(wù)要求:測(cè)量信號(hào)的脈沖寬度,并在LCD上顯示。系統(tǒng)晶振為12MHz。6.4.5T2捕捉方式測(cè)量脈沖寬度仿真實(shí)例2軟件設(shè)計(jì)voidT2_init(){RCLK=0;//T2不用作波特率發(fā)生器TCLK=0;//T2不用作波特率發(fā)生器CP_RL2=1;//
(捕捉)EXEN2=1;//=0(T2溢出自動(dòng)重裝)C_T2=0;//定時(shí)T2MOD=0x00;//DCEN=0(增1計(jì)數(shù))TH2=0x00;//從0開始計(jì)數(shù)
TL2=0x00;//置T2低8位初值0TR2=1;//啟動(dòng)T2ET2=1;//開T2中斷
EA=1; //開總中斷}voidT2_int()interrupt5{if(EXF2==1)//T2EX負(fù)跳變觸發(fā)中斷
{count++;//累計(jì)進(jìn)入中斷次數(shù)
if(count==1)//第1次負(fù)跳變
num1=RCAP2H*256+RCAP2L;if(count==2)//第2次負(fù)跳變{ num2=RCAP2H*256+RCAP2L;
count=0; num=num2-num1;
}}EXF2=0; //EXF2標(biāo)志清零}任務(wù)要求:測(cè)量信號(hào)的脈沖寬度,并在LCD上顯示。系統(tǒng)晶振為12MHz。6.4.5T2捕捉方式測(cè)量脈沖寬度仿真實(shí)例2軟件設(shè)計(jì)voiddisplay(uintdate){ucharwidth[7];width[0]=date/10000+0x30;//分離十萬位,轉(zhuǎn)換為ASCIIwidth[1]=date%100000/10000+0x30;//分離萬位,轉(zhuǎn)換為ASCIIwidth[2]=date%10000/1000+0x30;//分離千位,轉(zhuǎn)換為ASCIIwidth[3]=date%1000/100+0x30;//分離百
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 航運(yùn)行業(yè)保安工作總結(jié)
- 北京市安全管理工作總結(jié)
- 銀行工作總結(jié)團(tuán)結(jié)合作追求卓越
- 2023-2024學(xué)年北京市101中學(xué)高一(下)期中語文試卷
- 家具行業(yè)招聘成功案例
- 娛樂設(shè)施行業(yè)推廣計(jì)劃總結(jié)
- 醫(yī)療話務(wù)員工作總結(jié)
- 醫(yī)學(xué)美容診所前臺(tái)工作總結(jié)
- 2024年認(rèn)識(shí)安全標(biāo)志的教案
- 涼亭制定安裝協(xié)議書(2篇)
- 2024-2030年中國紀(jì)錄片行業(yè)前景動(dòng)態(tài)及發(fā)展趨勢(shì)預(yù)測(cè)報(bào)告
- 小學(xué)數(shù)學(xué)教師培訓(xùn)完整方案
- 山東省濟(jì)南市2023-2024學(xué)年高一年級(jí)上冊(cè)1月期末考試物理試題(含解析)
- 2024年吉林省高職高專單獨(dú)招生考試數(shù)學(xué)試卷真題(含答案)
- DGTJ08-9-2023 建筑抗震設(shè)計(jì)標(biāo)準(zhǔn)
- 《幼兒園入學(xué)準(zhǔn)備教育指導(dǎo)要點(diǎn)》
- 2024年防災(zāi)科技學(xué)院漢語言文學(xué)專業(yè)《現(xiàn)代漢語》期末試卷A(有答案)
- 2024-2030年中國釬焊板式換熱器行業(yè)市場(chǎng)發(fā)展趨勢(shì)與前景展望戰(zhàn)略分析報(bào)告
- 駕駛證吊銷附議申請(qǐng)書
- 水務(wù)集團(tuán)定崗定員方案范文
- 2023-2024學(xué)年河北省高二上學(xué)期期末考試生物試題(解析版)
評(píng)論
0/150
提交評(píng)論