您的位置 首页 新能源

51单片机定时器量程的硬件扩展方法

51单片机工作模式2自动装载定时值,按教科书的描述定时能力显得相对精准,但是此时的为8位定时器:当晶振为12MHz时,只能定时0.256ms。…

51单片机作业形式2主动装载守时值,按教科书的描绘守时才能显得相对精准,可是此刻的为8位守时器:当晶振为12MHz时,只能守时0.256ms。

升个级,精准性不要了,使守时器作业在形式1,16位守时器:当晶振为12MHz时现已能守时到65.56ms,稍微牛逼不少。假如还要守时更长的数,或许会用软件方法

来扩展计数规模。软件方法扩展的大约思路是:在守时器中止服务程序中对守时器中止请求进行计数,当中止请求的次数到达要求的值时才进行相应的处理。例如,某事情的处理周期为1s,但由于遭到最大守时时刻的约束,无法一次完结守时,此刻能够将守时器的守时时刻设为以10ms为一个单位,发动守时器后的每一次守时器溢出中止发生10ms的守时,进入中止服务程序后,对守时器的中止次数进行计算,每100次守时器溢出中止进行一次事情的处理。

这篇文章的标题是硬件扩展,所以软件扩展的详细完成这儿就省掉了。以下首要环绕硬件方法打开。

硬件方法扩展的思路是:

1)T0设置为16位守时器方法,当T0溢出时,碑文T0的中止服务程序。在T0的中止服务程序中将P1.0取反。这样在P1.0将输出一个方波,其周期为T0守时时刻的2倍。设T0的守时时刻为TIME,则由P1.0输出的方波的周期为2×TIME。
2)T1设置为16位计数器方法,将P1.0输出的方波接到T1的守时器外部输入端T1(P3.5),作为守时/计数器1的外部计数脉冲,其每个周期的下降沿使T1加1。设计数器T1的计数脉冲数为COUNT,则当T1溢出时,总守时时刻T为:T = 2×TIME×COUNT。
下面罗列代码,守时器T0 T1全都作业在形式2

#include  #include sbit P1_0 = P1^0;sbit P1_1 = P1^1;#define MakeByte(target, Hi,Lo) \do{ \target |= (((Hi)<<4)|(Lo)); \	}while(0); \#define SetTH(n,val) \do{ \TH##n = val; \}while(0); \#define SetTL(n,val)  \do{ \TL##n = val; \}while(0); \#define EnableET(n) \do{ \ET##n = 0x01; \IE |= 0x80; \}while(0); \#define StartTn(n) \do{ \TR##n = 0x01; \}while(0);	\unsigned char FetchData=0;unsigned int OnePeriod=0;int main(){//T0守时器 方法2 主动装载 //T1计数器 方法2 主动装载 MakeByte(TMOD, 0x06,0x02);//T0 0.2ms中止一次,P1.0翻转周期0.4msSetTH(0,0x38);SetTL(0,0x38);	    EnableET(0);EnableET(1);//计满50次发生中止//50*0.4ms=20msSetTH(1,0xCE);SetTL(1,0xCE);StartTn(0);StartTn(1);while(1){while(!FetchData);	FetchData = 0;}}void IsrT0() interrupt 1{P1_0 = ~P1_0;}void IsrT1() interrupt 3{  	//20MS elapsedOnePeriod++;//这个用于软件守时//每通过20Ms,OnePeriod加一,//然后在main函数里经行计算P1_1 = ~P1_1;}

下面上图:P1.0的输出接P3.5

最后上仿真成果:

第一张示波器的时基为2MS,第二张示波器的时基为0.2MS

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/xinnengyuan/263844.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部