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

    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 <REG52.H> 
#include <INTRINS.H>

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.4ms
	SetTH(0,0x38);
	SetTL(0,0x38);	    
	EnableET(0);
	EnableET(1);
	//计满50次产生中断
	//50*0.4ms=20ms
	SetTH(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 elapsed
	OnePeriod++;//这个用于软件定时
        //每经过20Ms,OnePeriod加一,
        //然后在main函数里经行统计
	P1_1 = ~P1_1;
}

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

最后上仿真结果:

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



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值