范兴文,张 姝
(阜新高等专科学校,辽宁 阜新 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位单片机的同类问题。