20120801-51 单片机计数器T1计数外部脉冲

来源:互联网 发布:js拖动滑块验证条 编辑:程序博客网 时间:2024/06/05 16:53
/**********************************************方法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 charsbit 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,定时模式,方式1TH0=0x4C;//T0,50ms定时初值TL0=0x00;//T0,50ms定时初值TH1=0x00;//计数初值清0TL1=0x00;//计数初值清0TR0=1;//开定时器T0TR1=1;//开计数器T1ET0=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;//清0TH1=0;TL1=0;}TF0=0;//软件清中断标志位}

 

10秒钟数到10个脉冲,1秒1个下降沿。

原创粉丝点击