利用T0作为定时器,T1作为计数器;
主要思路:
1、T1计数,工作模式:方式2;T0计时,工作模式:方式1
2、T1八位计数,赋初值0xFF,打开中断,开始计数(P3.5口输入被测量方波信号)
3、进入T1中断:若TR0=0,则开始计时TR0=1,TH/L1=0xF6(测量十个周期);若TR0=1,则停止计时TR0=0并停止计数TR1=0;记录当前T0计时结果,得方波周期。
注意:
- TH/L1=0xF6为测量十个周期,目的是增大测量值,减小测量误差占比。若之间删去则测量一个周期的时间。
- T0工作在方式1有十六位,一次最多能够计时71ms(晶振:11.0592MHz)
- T0的结果要根据单片机的晶振频率换算成时间,若晶振为11.0592M,则需要×12/11.0592(us)
C51定时器设置
//定时器设置
void Init_T(){
TMOD=0x61; //T1计数工作在2模式;T0计时工作在1模式
TL0=0x00;
TH0=0x00; //T0初始值0,一共可计时71ms
TL1=0xFF;
TH1=0xFF; //T1初始值255,计数1次触发中断;
EA=1;
ET1=1;//开启T1中断
ET0=1;//开启T0中断
TR1=1;
TR0=0;
}
//定时器中断设置
void timer1() interrupt 3 using 2{
if(!TR0){
TH0=0x00;
TL0=0x00;
TH1=0xF6;
TL1=0xF6;
TR0=1;
}
else{
TR0=0;
TR1=0;
time=0;
time=TH0;
time=time<<8;
time=time|TL0;
}
}
如果感觉本文有用就点个赞鼓励一下吧@~@
如果有其他精确测量周期的方法或者认为本文有误,欢迎评论区或者私信讨论交流~