范興文,張 姝
(阜新高等專科學校,遼寧 阜新 123000)
單片機應用時會遇到判別一組數值中的最小數值所在組的問題,例如制作搶答器時單片機收到并儲存各組所用的搶答反應時間,將其中用時最短的組篩選出來,以便顯示搶到答題權的組及更改該組得分。受限于單片機存儲單元的位數,當搶答反應時間較長時每組搶答反應時間需要存儲于多個單元。例如單片機頻率為12 MHz時,采用定時器T0工作在方式2時,TH0和TL0能夠存儲的最大時間約為0.065s[1],即搶答反應時間不能超過0.065 s,否則時間無法記錄。若采用一個存儲單元記錄搶答反應時間,TH0溢出中斷時使時間存儲器加一,則能夠記錄的最長時間為16.8s,某些情況下不夠用。若采用兩個存儲單元記錄高位時間和低位時間,TH0溢出中斷時使低位時間存儲器加一,低位時間存儲器溢出時使高位時間存儲器加一,這樣允許的最長搶答反應時間為為4 295 s≈71.6 min[2];若比較高位時間存儲器、低位時間存儲器和TH0三個單元的數值,時間分辨精度能達到0.000256 s。晶振的頻率誤差該精度已足夠。接下來的問題是找出各組中用時最短的那組,相當于每組提供一個3字節數值,篩選出數組最小的組別。
規劃好數值存儲單元,用存儲地址代表組別,利用單片機指令篩選出數值最小組的存儲地址。
數值存儲單元設計如下:將各組的高位時間數值順序存放,各組低位時間數值順序存放,各組TH0時間數值順序存放,且使“同組的高位時間數值存儲地址+10=低位時間數值存儲地址”、“低位時間數值存儲地址+10=TH0時間數值存儲地址”。例如,共有6組,將各組高位時間數值順序存放于51H~56H單元中,各組高位時間數值順序存放于5BH~60H單元中,各組 TH0數值順序存放于65H~6AH單元中。這樣第一組的時間數值從高位至低位存儲于51H、5BH、65H中。
將較大數的低一級數值設置為最大,確保低一級數值比較時高一級數值的較小者有效。
記錄最小數值的相等次數和相等數值的最小地址,只有相等次數不為零時才進行下一級比較,且從相等數值的最小地址所在組開始比較。
單片機指令采用CJNE指令,利用CY的數值鑒別兩數值的大小關系[3]。利用Rn的相對尋址功能實現循環算法,優化程序結構。
最高位數值比較程序流程見圖1。
數值比較子程序流程圖見圖2。
低位數值比較程序流程圖見圖3。

圖1 最高位數值比較程序流程圖

圖2 數值比較子程序流程圖
bijiao:
d0:mov a,@r0
cjne a,31h,d1[4]
inc r0[5]
inc 70h ;記錄相等次數
ljmp d11
d1:jb cy,d2
mov a,r0
add a,#10
mov r1,a[6]
mov@r1,#0ffh;該組下級數值設為最大
inc r0
ljmp d11
d2:
clr cy[7]
mov 70h,#0 ;相等次數歸零
mov a,32h
add a,#10
mov r1,a
mov@r1,#0ffh;該組下級數值設為最大
mov 31h,@r0 ;最小數存31H
mov 32h,r0;32H內記錄最小數開始地址,也是相等開始地址
inc r0[8]
ljmp d11
d11:ret
ji2:
mov a,32h
mov r7,32h
add a,#10
mov 32h,a
mov r0,a[9]
mov 31h,@r0
inc r0
mov 70h,#0
xh2:lcall bijiao
inc r7【10】
cjne r7,#56h,xh2
mov a,32h
subb a,#10
mov 32h,a
mov a,70h
cjne a,#0,ji3
ljmp$
運算數組見表1。

表 1 運算示例1數組
從數組數值可以看出,第二組、第三組和第五組的高位數值最小且相同,這三組的低位數值第二組小,因此數值最小的組是第二組,該組高位數值存儲地址為52H。
程序運行結果數組賦值如圖4所示、運算結果如圖5所示。

表4 數組賦值

圖5 運算結果
從程序運行結果看最小組高位數值存儲地址存放單元32H存放的數值是52H,程序成功地篩選出了最小組。
數組見表2。

表2 運算示例2數組
從數組數值可以看出,第一組和第二組的高位數值相同為19H,第四組和第六組的高位數值相同為12H,最小組應為第四組和第六組,二者低位數值是第四組25H和第六組20H,因此最小數值應為第六組,其高位字節存儲地址為56H。
程序運行結果,數組賦值如圖6所示,運算結果如圖7所示。

圖6 數組賦值

圖7 運算結果
從程序運行結果看,最小組高位數值存儲地址存放單元32H存放的數值是56H,程序成功地篩選出了最小組。
本文采用合理的編程思路提出了篩選多字節數值最小組別的算法,經過實際運行驗證了該算法在雙字節數組的最小組別篩選應用的可行性。按照本文提出的算法規律,可以方便地將該算法推廣應用到多組、多字節數值的最小組別篩選工作中去,也可以利用本文的方法解決16位單片機的同類問題。