|
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計滿的次數不就行了嗎? |