范興文,張 姝
(阜新高等專科學(xué)校,遼寧 阜新 123000)
單片機(jī)應(yīng)用時(shí)會(huì)遇到判別一組數(shù)值中的最小數(shù)值所在組的問題,例如制作搶答器時(shí)單片機(jī)收到并儲(chǔ)存各組所用的搶答反應(yīng)時(shí)間,將其中用時(shí)最短的組篩選出來,以便顯示搶到答題權(quán)的組及更改該組得分。受限于單片機(jī)存儲(chǔ)單元的位數(shù),當(dāng)搶答反應(yīng)時(shí)間較長時(shí)每組搶答反應(yīng)時(shí)間需要存儲(chǔ)于多個(gè)單元。例如單片機(jī)頻率為12 MHz時(shí),采用定時(shí)器T0工作在方式2時(shí),TH0和TL0能夠存儲(chǔ)的最大時(shí)間約為0.065s[1],即搶答反應(yīng)時(shí)間不能超過0.065 s,否則時(shí)間無法記錄。若采用一個(gè)存儲(chǔ)單元記錄搶答反應(yīng)時(shí)間,TH0溢出中斷時(shí)使時(shí)間存儲(chǔ)器加一,則能夠記錄的最長時(shí)間為16.8s,某些情況下不夠用。若采用兩個(gè)存儲(chǔ)單元記錄高位時(shí)間和低位時(shí)間,TH0溢出中斷時(shí)使低位時(shí)間存儲(chǔ)器加一,低位時(shí)間存儲(chǔ)器溢出時(shí)使高位時(shí)間存儲(chǔ)器加一,這樣允許的最長搶答反應(yīng)時(shí)間為為4 295 s≈71.6 min[2];若比較高位時(shí)間存儲(chǔ)器、低位時(shí)間存儲(chǔ)器和TH0三個(gè)單元的數(shù)值,時(shí)間分辨精度能達(dá)到0.000256 s。晶振的頻率誤差該精度已足夠。接下來的問題是找出各組中用時(shí)最短的那組,相當(dāng)于每組提供一個(gè)3字節(jié)數(shù)值,篩選出數(shù)組最小的組別。
規(guī)劃好數(shù)值存儲(chǔ)單元,用存儲(chǔ)地址代表組別,利用單片機(jī)指令篩選出數(shù)值最小組的存儲(chǔ)地址。
數(shù)值存儲(chǔ)單元設(shè)計(jì)如下:將各組的高位時(shí)間數(shù)值順序存放,各組低位時(shí)間數(shù)值順序存放,各組TH0時(shí)間數(shù)值順序存放,且使“同組的高位時(shí)間數(shù)值存儲(chǔ)地址+10=低位時(shí)間數(shù)值存儲(chǔ)地址”、“低位時(shí)間數(shù)值存儲(chǔ)地址+10=TH0時(shí)間數(shù)值存儲(chǔ)地址”。例如,共有6組,將各組高位時(shí)間數(shù)值順序存放于51H~56H單元中,各組高位時(shí)間數(shù)值順序存放于5BH~60H單元中,各組 TH0數(shù)值順序存放于65H~6AH單元中。這樣第一組的時(shí)間數(shù)值從高位至低位存儲(chǔ)于51H、5BH、65H中。
將較大數(shù)的低一級(jí)數(shù)值設(shè)置為最大,確保低一級(jí)數(shù)值比較時(shí)高一級(jí)數(shù)值的較小者有效。
記錄最小數(shù)值的相等次數(shù)和相等數(shù)值的最小地址,只有相等次數(shù)不為零時(shí)才進(jìn)行下一級(jí)比較,且從相等數(shù)值的最小地址所在組開始比較。
單片機(jī)指令采用CJNE指令,利用CY的數(shù)值鑒別兩數(shù)值的大小關(guān)系[3]。利用Rn的相對(duì)尋址功能實(shí)現(xiàn)循環(huán)算法,優(yōu)化程序結(jié)構(gòu)。
最高位數(shù)值比較程序流程見圖1。
數(shù)值比較子程序流程圖見圖2。
低位數(shù)值比較程序流程圖見圖3。
圖1 最高位數(shù)值比較程序流程圖
圖2 數(shù)值比較子程序流程圖
bijiao:
d0:mov a,@r0
cjne a,31h,d1[4]
inc r0[5]
inc 70h ;記錄相等次數(shù)
ljmp d11
d1:jb cy,d2
mov a,r0
add a,#10
mov r1,a[6]
mov@r1,#0ffh;該組下級(jí)數(shù)值設(shè)為最大
inc r0
ljmp d11
d2:
clr cy[7]
mov 70h,#0 ;相等次數(shù)歸零
mov a,32h
add a,#10
mov r1,a
mov@r1,#0ffh;該組下級(jí)數(shù)值設(shè)為最大
mov 31h,@r0 ;最小數(shù)存31H
mov 32h,r0;32H內(nèi)記錄最小數(shù)開始地址,也是相等開始地址
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$
運(yùn)算數(shù)組見表1。
表 1 運(yùn)算示例1數(shù)組
從數(shù)組數(shù)值可以看出,第二組、第三組和第五組的高位數(shù)值最小且相同,這三組的低位數(shù)值第二組小,因此數(shù)值最小的組是第二組,該組高位數(shù)值存儲(chǔ)地址為52H。
程序運(yùn)行結(jié)果數(shù)組賦值如圖4所示、運(yùn)算結(jié)果如圖5所示。
表4 數(shù)組賦值
圖5 運(yùn)算結(jié)果
從程序運(yùn)行結(jié)果看最小組高位數(shù)值存儲(chǔ)地址存放單元32H存放的數(shù)值是52H,程序成功地篩選出了最小組。
數(shù)組見表2。
表2 運(yùn)算示例2數(shù)組
從數(shù)組數(shù)值可以看出,第一組和第二組的高位數(shù)值相同為19H,第四組和第六組的高位數(shù)值相同為12H,最小組應(yīng)為第四組和第六組,二者低位數(shù)值是第四組25H和第六組20H,因此最小數(shù)值應(yīng)為第六組,其高位字節(jié)存儲(chǔ)地址為56H。
程序運(yùn)行結(jié)果,數(shù)組賦值如圖6所示,運(yùn)算結(jié)果如圖7所示。
圖6 數(shù)組賦值
圖7 運(yùn)算結(jié)果
從程序運(yùn)行結(jié)果看,最小組高位數(shù)值存儲(chǔ)地址存放單元32H存放的數(shù)值是56H,程序成功地篩選出了最小組。
本文采用合理的編程思路提出了篩選多字節(jié)數(shù)值最小組別的算法,經(jīng)過實(shí)際運(yùn)行驗(yàn)證了該算法在雙字節(jié)數(shù)組的最小組別篩選應(yīng)用的可行性。按照本文提出的算法規(guī)律,可以方便地將該算法推廣應(yīng)用到多組、多字節(jié)數(shù)值的最小組別篩選工作中去,也可以利用本文的方法解決16位單片機(jī)的同類問題。