C51里,向定时器装添定里值的问题!

来源:百度知道 编辑:UC知道 时间:2024/06/20 17:45:51
TH0=-(50000/256)
TL0=-(50000%256)
书里的意思 是向定时器里装入50000做为定时值,但我不太明白的是,50000/256为198,TH0是一个8位的寄存器,如里存入带符号的数那将存不下,因为只能存到127,如果不带符号,那前面的负号是做什么用的?
就算是带负号存进出了,寄存器里存负数是用补码形式存的,那50000/256整数部分存入高位,余数部分放入低部,那当低位的余数部分计完后,高位就会加一,这样算下来,定里器里应该是少计一个256的,但书中说是向定时器里装入的50000,我觉的不太对,请帮我想一下?
还有一点,就是我可不可以在定里器里只接装入计数值?就像是65535-50000把这个数的高位直接装入定时器,还有什么更好的办法没有?

你可以仿真一下嘛,确实差256

每隔x个机器周期,触发中断
我一般这样写:
#define T_HIGH(x) ((65536-(x))/256)
#define T_LOW(x) ((65536-(x))%256)
...
TH0=T_HIGH(50000);
TL0=T_LOW(50000);

我从来没有这么写过(-号)。
我的理解是这样的,-X等于100H-X,比如-1其实就是FF

别想了,尽信书不如无书,现在的社会,是个人就会出书,好多书都是误人子弟的!
TH0=-(50000/256)
TL0=-(50000%256)
这个表达式没有考虑到整体借位的影响,所以定时不准。如果你调试过,应该看到它比协奏曲提供的表达式的高位多了1个单位数值0x3D(应该为0x3C)

完全可以直接给定时器赋值,不需要那么多预处理,预处理如果不注意数据类型还会出错。如果你打算直接赋值,推荐一个好用的工具:定时器计算器(5K),下载地址:http://pickup.mofile.com/3372110969014992