20120801-51 微控制器計數器T1計數外部脈衝
阿新 • • 發佈:2019-02-01
/********************************************** 方法1:延時法 硬體:11.0592MHz晶振,STC89C52,RXD P1.0 TXD P1.1 T1 P3.5 波特率:9600 描述:T0用於定時,方式1,定時時間50ms,中斷方式;T1用於計數,10s定時時間到後,將計數的脈衝利用模擬串列埠傳送出去 外部的脈衝是用STM8L101產生的頻率為1Hz的方波。1s 來1個下降沿 **********************************************/ #include "reg52.h" #define uchar unsigned char sbit P1_0 = 0x90; sbit P1_1 = 0x91; sbit P1_2 = 0x92; #define RXD P1_0 #define TXD P1_1 #define WRDYN 44 //寫延時 #define RDDYN 43 //讀延時 void Delay2cp(unsigned char i); unsigned char num=0; //往串列埠寫一個位元組 void WByte(uchar input) { uchar i=8; TXD=(bit)0; //傳送啟始位 Delay2cp(39); //傳送8位資料位 while(i--) { TXD=(bit)(input&0x01); //先傳低位 Delay2cp(36); input=input>>1; } //傳送校驗位(無) TXD=(bit)1; //傳送結束位 Delay2cp(46); } //從串列埠讀一個位元組 uchar RByte(void) { uchar Output=0; uchar i=8; uchar temp=RDDYN; //傳送8位資料位 Delay2cp(RDDYN*1.5); //此處注意,等過起始位 while(i--) { Output >>=1; if(RXD) Output |=0x80; //先收低位 Delay2cp(35); //(96-26)/2,迴圈共佔用26個指令周 } while(--temp) //在指定的時間內搜尋結束位。 { Delay2cp(1); if(RXD)break; //收到結束位便退 } return Output; } //延時程式* void Delay2cp(unsigned char i) { while(--i); //剛好兩個指令週期。 } void TimerInit() { TMOD=0x41; //T1,計數模式,T0,定時模式,方式1 TH0=0x4C; //T0,50ms定時初值 TL0=0x00; //T0,50ms定時初值 TH1=0x00; //計數初值清0 TL1=0x00; //計數初值清0 TR0=1; //開定時器T0 TR1=1; //開計數器T1 ET0=1; //開定時器T0中斷 EA=1; //開總中斷 } void main() { uchar ccc; TimerInit(); while(1){} } void timer0(void) interrupt 1 { TH0=0x4C; //重新設定定時初值 TL0=0x00; //重新設定定時初值 num++; if(num==200) //數10s內數到的脈衝 { WByte(TH1); WByte(TL1); num=0; //清0 TH1=0; TL1=0; } TF0=0; //軟體清中斷標誌位 }
10秒鐘數到10個脈衝,1秒1個下降沿。