www.ysbm.net > 51单片机定时器50ms初值

51单片机定时器50ms初值

单片机定时器的方式一是一个十六位的定时器.但51单片机是8位的,装不下十六位数据,所以,想要用单片机来装一个十六位的数怎么弄?单片机提供了两个寄存器(8位的)来装这个十六位的数.c语言中怎么实现把一个十六位的数装进两个

TMOD = 0x01;//方式1 TH0 = (65536 - 50000) /256; //12MHZ晶振,一个机器周期 1us , 50000个就是50ms TL0 = (65536 - 50000) % 256; ET0 = 1 ; //打开定时器中断, 不需要中断的话,可以略去 TR0 = 1; //启动定时器

12MHz晶振,经典51核是12分频,因此时钟周期为1μs.50ms = 50000μs,因此定时器累加至溢出需要50000个周期.因此65536 - 50000 = 15536 = 0x3CB0 因此TH0 = 0x3C,TL0 = 0xB0.0x4C00这个初值对应的不是12MHz晶振,*而是11.0592MHz晶振.你抄错了.

/*程序经调试,正确*///================== unsigned int pp1 //定义全局变量 unsigned int count=50000; //计数值,50MS#define TH_M1 (65536-count)/256;//赋值#define TL_M1 (65536-count)%256;//=============== mian() { EA=1; //开

用十六位的定时器,定时50毫秒,然后累计1200次(不能一次累计你要分段) 处初值=(65536-50000)注意最好将其化成十六进制数

首先,51单片机是加一计数,到65536溢出,所以定时时间(经过的脉冲个数,如果一个脉冲是1US,刚好延时50MS是50000个脉冲)是65536减初值 ,初值又分高8位和低8 位,高8位的1代表256,因此高8位的数值所代表的数是256的整数倍,低位最大不超过255,所以一定是除以256之后的余数,用公式是这样:初值=65536-定时脉冲个数=TH0*256+TL0 反过来看你就很明白了

1、已知单片机系统机器周期为时钟周期的12倍,故每个机器周期为12/12m=1us2、50ms=50*1000us3、16位定时器的定时时间最长为65536us,定时50us的初值为65536-50*1000=0x3cb04、0x3cb0就是初值,其中th=0x3c,tl=0xb0

这是个通用的位操作方式,实际上上面的两句和下面的这两句是一样的:TL0 = TL0 | Temp;TH0 = TH0 | (Temp >> 8); 这种操作的优点是只会对特定的位置1,而不会对其它位清零,举个例子,假设TL0此时等于0x01,Temp此时等于0x10,则运算后TL0等于0x11. 这种赋值方法一般用于每个位都有独立功能的特殊功能寄存器的操作,用在TL0、TH0里面不太常见.

TH0=(65536-50000)/256;TL0=(65536-50000)%256;或TH0=0x3C;TL0=0xB0;

上面的同志们,对定时器的用处,做了详细说明,,在此我就不做重复工作,,,补充一点吧-------对两种赋值方式不同做一下说明;前两条语句,对单片机来说2微妙(即2个机器周期),就可以执行完毕,后两条则不然().建议最好是将初值计算好,放入!!

网站地图

All rights reserved Powered by www.ysbm.net

copyright ©right 2010-2021。
www.ysbm.net内容来自网络,如有侵犯请联系客服。zhit325@qq.com