zhangzhao2423 发表于 2019-3-9 20:44 教科书的例题只是假定某一特定条件的应用。在这里假定脉冲宽度小于255个机器时钟周期,只计算TL0当然可以。如果脉冲宽度小于65536、大于255个机器时钟周期就要计算(TH0<<8)|TL0,如果脉冲宽度大于65535就要计算x=(count<<16)|(TH0<<8)|TL0; |
wulin 发表于 2019-3-8 22:50 关键这题他没有加溢出次数累加器啊,怎么知道他溢出多少次呢 |
| 只看书,不动手,真是死脑筋。假如脉冲很长,定时器寄存器计满溢出会重复计数,只要把溢出次数保存起来,最后加上TH0、TL0的数不就成了,你这个脉冲再怎么宽,呵呵,只要不断电,几年都行。 |
|
1、假设你的定时时间<256,TL0的读书就是你的定时时间。(TL0初值=0)这里的TH0=0;不需要计算。 2、256<假设你的定时时间<65535,TH0*256+TL0就是你的定时时间(TH0,TL0的初值都为0) 3、假设你的定时时间>65535; 你可以设置初值TH0=(65535-50000)/256; TL0=(65535-50000)%256; 设置累加计算器count=0; 设置定时器0溢出中断,每一次溢出中断一次count加1,并重新装载TH0,TL0初值。 你所的测量时间是50000*count+(TH0*256+TL0); |
|
哥们为何如此的执着于看别人的程序呢?这汇编,你自己不动手是不可能学会的了,看得懂和自己能写,这是完全不同的一回事呀! “作者懒呀!” 我是这么告诉你了吧?他只管把TL1的值送去显示了,为了不管TH1了呢?就算是TH1和TL1一块算也才65535,这万一脉冲超过65535了呢? 8051是一个8位单片机,它只能处理256以下的数据。如果脉冲的时间超过了256,比如是:1234,那么与之对应的16进制就是:04D2H,高8位地址存放04H,低8位地址存放0D2H,如果你想把1234在数码管或者是在12864上显示出来,你得先把1234分解成“1”,“2”,“3”,“4”分别存放在四个地址,这得用到除法运算,超过8位的8051没有除法的汇编指令,只能用减法运算来实现。且得是高低两个地址参与运算,一共就是四个地址。 这前前后后加显示一块,至少得是一百行代码以上,到时候会越扯越多,所以“将数据送显示缓存区并转换成可显示的代码”,很显然比我前面所说的简单多了 |
| 很长,你就增加一个计数器,数TH计满的次数不就行了吗? |