标题: 单片机定时器初始化写法 [打印本页]

作者: 时间煮雨我煮鱼    时间: 2023-7-1 09:27
标题: 单片机定时器初始化写法
请问TL1 = 0XDB
TH1 =0XFE


TL1 = (65535-800)》8
TH1 = (65535-800)
第一种写法怎么理解,请大伙给我讲讲,我目前只会第二种

作者: wulin    时间: 2023-7-1 11:34
常见10进制赋值写法
TH1 =(65536-800)/256;
TL1 =(65536-800)%256;

转换16进制
65536-800=64736=0xFCE0

用16进制赋值写法
TH1 = 0xFC;//高8位
TL1 = 0xE0;//低8位
作者: Hephaestus    时间: 2023-7-1 13:19
第一种写法是人算的。

第二种写法是让编译器去算。

两种写法生成的机器码完全一样,第二种对于人类来说,可读性更高。
作者: man1234567    时间: 2023-7-5 08:31
综合一下楼上:
1、用10进写喜闻乐见:
高八位:TH1 = ( 65536 - 800 ) / 256 ;
低八位:TL1 = ( 65536 - 800 ) % 256;
2、利用高位溢出可写成:
高八位:TH1 = ( 65536 - 800 )  / 256  ;
低八位:TL1 = ( 65536 - 800 ) ;
3、换个写法就是:
高八位:TH1 = ( 65536 - 800 ) >> 8 ;
低八位:TL1 = ( 65536 - 800 ) ;
4:跳过减法运算写成:
高八位:TH1 = 64736 >> 8;
低八位:TL1 = 64736;
5、换成16进制就是:
高八位:TH1 = 0xFCE0 >> 8 ;
低八位:TL1 = 0xFCE0 ;
5、减少运算直接赋值:
高八位:TH1 = 0xFC ;
低八位:TL1 = 0xE0 ;  
怎么写结果都一样。感觉用1比较清楚,用5比较清爽
作者: zhuls    时间: 2023-7-5 09:10
man1234567 发表于 2023-7-5 08:31
综合一下楼上:
1、用10进写喜闻乐见:
高八位:TH1 = ( 65536 - 800 ) / 256 ;

把1做成宏,在5中直接调用。两全齐美!
作者: real8799190    时间: 2023-7-5 10:47
TL1 = 0xDB 和 TH1 = 0xFE 是十六进制表示的数值,它们对应着特定的寄存器 TL1 和 TH1 的值。这些寄存器通常用于定时器操作。

第一种写法 TL1 = 0xDB 使用了直接赋值的方式,将 TL1 寄存器的值设置为十六进制数 0xDB,即十进制的 219。同样地,TH1 = 0xFE 将 TH1 寄存器的值设置为十六进制数 0xFE,即十进制的 254。

而第二种写法 TL1 = (65535-800) >> 8 和 TH1 = (65535-800) 则是利用了十进制数进行计算并赋值。

首先,(65535-800) 会得到 64735,这是一个十进制的数值。然后,(65535-800) >> 8 将这个数值右移 8 位,相当于除以 256(2的8次方),丢弃了低 8 位的数值。这样得到的结果是 253,即十进制的 253。最后,该值被赋给 TL1 寄存器。

同样地,(65535-800) 的结果作为十进制数直接赋值给 TH1 寄存器,得到的结果是 64735,即十进制的 64735。

需要注意的是,这两种写法实际上设置了相同的数值到 TL1 和 TH1 寄存器中,只是表达方式不同。第一种写法直接使用十六进制数赋值,而第二种写法基于一个计算式来设置值。这两种写法在功能上是等效的
作者: 王秋冬    时间: 2023-8-3 07:34
到底是65536-800还是65535-800,迷惑。
作者: iotor    时间: 2023-8-3 09:17
王秋冬 发表于 2023-8-3 07:34
到底是65536-800还是65535-800,迷惑。

65535,不过两个基本没区别
作者: univers    时间: 2023-8-3 17:02
找一个学习板最快




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1