说明:在做温度检测并由数码管显示的时候由于一个温度对应一个 AD值,而我们的 AD 值是在一段时间的平均值,很大一部分 AD 在表中是不能够一对一对应的,所以我们只能取隔他最近的 AD,此为 AD 转换后用于查表的顺序程序,这样查表很容易理解,但是也存在很不不足,比如 CPU 在此程序运行周期长等等,当然我会在以后会添加
输入:高位 AD_Data_high,低位 AD_Data_low,
输出:数码管显示的数值 b_room_temp
.data//把 AD 值转换成数值,
ad_new_tab ds 1 ;查表的地址给A(如 0 1 2 74 99 105之类的,比如99就对应的是99度)
ad_old_tab ds 1 ;旧
ad_old_h ds 1 ;旧值的高位
ad_old_l ds 1 ;旧值的低位
ad_new_h ds 1 ;新值的高位
ad_new_l ds 1 ;新值的低位
ad_mean_h ds 1 ;平均值的高位
ad_mean_l ds 1 ;平均值的低位
b_room_temp ds 1 ;显示的数值,是十进制的
////////////////////////////////////////////////////////
.code
ad_change:
////////////////////////////////////////////////////////;;这里可以单独检查其他程序的错误性
/* MOV a, #0x0f ;;
B0MOV AD_Data_High, a ;;ad数据存放
MOV a, #0x00b ;;
B0MOV AD_Data_low, a ;;ad数据存放 */
MOV_ ad_old_tab, #0
check_tab:
b0mov y,#temp_tab$m ;
b0mov z,#temp_tab$l ;
mov a,ad_old_tab ;查表的地址给A(如 0 1 2 74 99 105之类的,比如99就对应的是99度)
b0add z,a ;
b0bts0 fc ;
incms y ;
nop ;
movc ;
mov ad_old_l,a ;低8位存放在temp_l中
mov a,r ;高4位存放在temp_h中
mov ad_old_h,a ;
////////////////////////////////////////////////////////;把旧值赋给新值,这里是为平均那里作准备
mov a, ad_old_l
mov ad_new_l, a
mov a, ad_old_h
mov ad_new_h, a
mov a, ad_old_tab
mov ad_new_tab, a
////////////////////////////////////////////////////////
cjne_ AD_Data_high, ad_new_h, ad_change10;判断高位是否相等,不等跳转到 ad_change10 继续查找
cjne_ AD_Data_low, ad_new_l, ad_change10;如果高位相等,那比较低位,如果不等,跳转到ad_change10
mov_ b_room_temp, ad_new_tab
jmp ad_change_exit ;如果刚好 等于 则把 b_ad_tab 给 b_room_temp, 然后跳出程序
///////////////////////////////////////////////////////// ;如果不等
ad_change10:
cjae2 AD_Data_High,AD_Data_Low,ad_new_h,ad_new_l,ad_change30
///////////////////////////////////////////////////////// 当小
ad_change20:
incms ad_old_tab
jmp check_tab
///////////////////////////////////////////////////////// 当大
ad_change30: ;先判断是否超出范围(00-99),如果在的话查出上一次的值
cjae2 AD_Data_High,AD_Data_Low,#0x0f,#0x17,ad_change70 ;0度的 AD 值为0xf16,防止下于 0度
cjbe2 AD_Data_High,AD_Data_Low,#0x3,#0xd2,ad_change80 ;100 度的AD 值为0x3d3,防止超过 99度
decms ad_old_tab
b0mov y,#temp_tab$m ;
b0mov z,#temp_tab$l ;
mov a,ad_old_tab ;查表的地址给A(如 0 1 2 74 99 105之类的,比如99就对应的是99度)
b0add z,a ;
b0bts0 fc ;
incms y ;
nop ;
movc ;
mov ad_old_l,a ;低8位存放在temp_l中
mov a,r ;高4位存放在temp_h中
mov ad_old_h,a
/////////////////////////////////////////////////////////上次(大)的减去这次(小)的值,得的值再平均一下,再加上现在 Ad 的低位
mov a, ad_old_h ;平均值的高位
sub a, ad_new_h
mov x, a
b0bclr fc
rrcm x
add_ x, ad_new_h
mov_ ad_mean_h, x
mov a, ad_old_l ;平均值的低位
sub a, ad_new_l
mov x, a
b0bclr fc
rrcm x
add_ x, ad_new_l
mov_ ad_mean_l, x
/////////////////////////////////////////////////////////看采样的 AD 值更靠那一边,那个距离短 就取那个值
cjae2 AD_Data_High,AD_Data_Low,ad_mean_h,ad_mean_l,ad_change60
/////////////////////////////////////////////////////////取新值,,比如一个AD为86,80和90的平均值为85,86>85,则选择90
ad_change50: ;(AD大的,温度小的)
mov_ b_room_temp, ad_new_tab
jmp ad_change_exit
/////////////////////////////////////////////////////////取旧值
ad_change60: ;(AD大的,温度小的)
mov_ b_room_temp, ad_old_tab
jmp ad_change_exit
/////////////////////////////////////////////////////////// 小于 00
ad_change70:
mov_ b_room_temp, #0
jmp ad_change_exit
/////////////////////////////////////////////////////////// 大于 99
ad_change80:
mov_ b_room_temp, #99
jmp ad_change_exit
/////////////////////////////////////////////////////////
ad_change_exit:
ret