超声波测距汇编程序.docx
《超声波测距汇编程序.docx》由会员分享,可在线阅读,更多相关《超声波测距汇编程序.docx(29页珍藏版)》请在冰豆网上搜索。
超声波测距汇编程序
超声波测距仪的软件设计
1超声波测距仪的软件规划
超声波测距仪的程序主要包括以下功能模块:
(1)DS18B20温度传感器接口模块,分为初始化子程序、写入子程序及读取子程序等部分;
(2)基于MAX7219的显示模块,分为MAX7219初始化子程序、写入子程序及显示子程序等部分;
(3)温度补偿与距离计算模块,分为超声波发射控制程序、接收处理子程序、温度补偿子程序及距离计算子程序等部分;
(4)主模块,分为系统的初始化、按键处理及各子程序的调度管理等部分。
系统流程图4-1形象地描述了各模块功能及相互之间的关系。
DS18B20初始化
温度检测
温度补偿
超声波发射
显示模块
距离计算
超声波接收
按键处理
图4-1系统流程图
2DS18B20的接口程序设计
DS18B20的一线工作协议流程是,初始化→ROM操作指令→存储器操作指令→数据传输。
其工作时序包括:
初始化时序、写时序和读时序。
每种工作时序都有相应的要求,这在进行DS18B20接口程序设计时必须足够重视。
2.1DS18B20的初始化
DS18B20初始化的实质是使DS18B20复位,主要是通过判断存在脉冲的形式来实现的。
首先,主机发复位脉冲,即宽度范围为480us≤t≤960us的负脉冲,拉高15~90us以延时等待,然后通过输入/输出线读出存在脉冲,为低则说明存在,复位成功;
否则说明不存在,复位失败,必须对DS18B20重新初始化。
;************************************************************
;DS18B20初始化(复位)子程序
;如果存在,则EXIST=1,否则=0
;************************************************************
DS18B20_RST:
CLRWDIO
MOVR7,#32
LCALLDELAY15US
SETBWDIO
MOVR7,#4
LCALLDELAY15US
CLREXIST
JBWDOP,DS18B20_RST_0
SETBEXIST
MOVR7,#28
LCALLDELAY15US
DS18B20_RST_0:
RST
2.2字节写DS18B20程序
字节写的时序是拉低输入/输出线至少15us以作为起始信号,按从低位到高位顺序取出预写字节中的1位数据,写入输入/输出线,延时等待15us后将输入/输出线拉高作为停止信号,以等待下一位的写入。
字节写DS18B20的程序设计只要严格按照上述时序即可,程序如下。
;*******************************************************
;DS18B20写字节子程序
;待写字节数据在A中
;*******************************************************
DS18B20_WRITE:
CLRC
MOVR1,#8
DS18B20_WR_1:
CLRWDIO
MOVR7,#1
LCALLDELAY15US
RRCA
MOVWDIO,C
LCALLDELAY15US
MOVR7,#1
LCALLDELAY15US
SETBWDIO
NOP
DJNZR1,DS18B20_WR_1
SETBWDIO
RET
4.2.3读DS18B20程序
字读DS18B20的程序设计思想结合程序代码进行阐述,以下为字读DS18B20的接口程序:
;******************************************************
;DS18B20连续2字节子程序
;读出值储存在全局变量:
TEMP,TEMP+1
;******************************************************
DS18B20_READ:
CLRC
MOVR1,#2
MOVR0,#TEMP
DS18B20_RD_1:
MOVR2,#8
DS18B20_RD_2:
SETBWDIO
NOP
NOP
CLRWDIO
NOP
NOP
SETBWDIO
MOVR7,#1
LCALLDELAY15US
MOVC,WDIO
RRCA
DJNZR2,DS18B20_RD_2
MOV@R0,A
INCR0
DJNZR1,DE18B20_RD_1
RET
在上述程序中可以看出,16位数据同样也是从低位到高位被逐一读出并存储的。
而且,由于读出的温度值是补码形式,在使用前必须进行补码转换。
;*************************************************************
;启动DS18B20转换子程序
;默认12位精度的转换时间为750ms,即要等到750ms后才能读到新温度值
;*************************************************************
DS18B20_START:
LCALLDS18B20_RST
JNBEXIST,DS18B20_ST_0
MOVA,#0CCH
LCALLDS18B20_WRITE
MOVA,#44H
LCALLDS18B20_WRITE
DS18B20_ST_0:
RET
;**********************************************************
;读取DS18B20温度子程序
;**********************************************************
DS18B20_GET:
LCALLDS18B20_RST
MOVA,#0CCH
LCALLDS18B20_WRITE
LCALLDS18B20_READ
RET
对DS18B20进行温度读取操作的流程可用图4-2描述。
启动温度转换
复位DS18B20
启动DS18B20子程序
读取温度子程序
读取16位温度值
求补子程序
对温度值求补码得到原码
图4-2温度读取操作流程图
4.3显示程序设计
基于MAX7219的6位数码管显示程序实际上包括以下几个部分:
(1)对MAX7219初始化部分;
(2)对MAX7219的字写入操作部分;
(3)显示子程序部分(也即写MAX7219的8字节显示RAM的部分)。
前两个为低层接口子程序,后一个为应用层子程序。
4.3.1MAX7219初始化
对于MAX7219的初始化,实际上就是指对MAX7219的扫描限制寄存器(扫描数码管个数)、亮度寄存器、译码模式寄存器及工作寄存器进行正确设置。
在进行程序前,必须清楚一点,那就是MAX7219采用16位数据包的形式,也就是说对MAX7219写入时是以16位数作为一个整体进行的,也即两个字节,高字节为寄存器地址或显示RAM地址,低字节为命令或数据。
地址字节的高4位为无关位,通常全取为1,由此得到各功能寄存器地址为:
空操作寄存器:
0F0H
第1位数码管显示RAM:
0F1H
第2位数码管显示RAM:
0F2H
第3位数码管显示RAM:
0F3H
第4位数码管显示RAM:
0F4H
第5位数码管显示RAM:
0F5H
第6位数码管显示RAM:
0F6H
第7位数码管显示RAM:
0F7H
第8位数码管显示RAM:
0F8H
译码模式寄存器:
0F9H
亮度调节寄存器:
0FAH
扫描限制寄存器:
0FBH
关断模式寄存器:
0FCH
显示测试寄存器:
0FFH
;***************************************************************
;MAX7219初始化程序
;***************************************************************
INIT_7219:
MOVR3,#0CH
MOVR4,#0
LCALLWRITE7219
LCALLDELAY1MS
LCALLDELAY1MS
LCALLDELAY1MS
MOVR3,#0BH
MOVR4,#07
LCALLWRITE7219
MOVR3,#0AH
MOVR4,#0DH
LCALLWRITE7219
MOVR3,#09H
MOVR4,#0FFH
LCALLWRITE7219
MOVR3,#0CH
MOVR4,#01H
RET
4.3.2字写MAX7219程序
字写MAX7219也就是将16位数据包写入MAX7219,其程序设计只要遵循MAX7219的时序要求即可,简要描述为:
在时钟的上升沿数据被锁入片内16位移位寄存器;16位数据的输出顺序必须是从高到低。
对于微处理器来说,一般均自然满足MAX7219对串行时钟不能高于10MHz的要求。
16位写入完成后,必须通过12脚(LOAD)正跳变(即上升沿)将数据锁入,从而使新数据(命令)有效。
;*****************************************************************
;MAX7219有关引脚定义
;*****************************************************************
CLK7219EQUP2.0
DIN7219EQUP2.2
LOAD7219EQUP2.1
;******************************************************************
;MAX7219写入程序
;入口参数:
R3寄存器地址,R4为命令数据
;*******************************************************************
WRITE7219:
MOVR2,#8
MOVA,R3
SETBLOAD7219
W7219_1:
RLCA
MOVDIN7219,C
NOP
NOP
NOP
CLRCLK7219
NOP
NOP
NOP
SETBCLK7219
DJNZR2,W7219_1
MOVA,R4
MOVR2,#8
W7219_2:
RLCA
MOVDIN7219,C
NOP
NOP
NOP
CLRCLK7219
NOP
NOP
NOP
SETBCLK7219
DJNZR2,W7219_2
CLRLOAD7219
NOP
NOP
NOP
NOP
SETBLOAD7219
RET
4.3.3显示子程序
显示子程序的作用是将非压缩BCD码形式的显示代码写入对应的数码管显示RAM寄存器,常用的0~9和A~F的显示代码对应为00H~09H和0AH~0FH。
如果在对应位上显示小数点,只要将对应的显示代码的最高位置为1即可。
例如,要显示“0.”,其显示代码应为80H。
;****************************************************************
;MAX7219的显示RAM首地址定义
;****************************************************************
MAX7219STAEQU01H
;****************************************************************
;显示子程序
;入口:
显示内容在dispbuf中(BCD码形式)
;****************************************************************
DISPLAY:
MOVR0,#DISPBUF
MOVR1,#08H
MOVR3,#MAX7219TA
DISPLAY_1:
MOVA,@R0
DISPLAY_3:
MOVR4,A
LCALLWRITE7219
INCR0
INCR3
DJNZR1,DISPLAY1
RET
4.4距离计算及其程序实现
距离计算程序设计中设计到温度补偿问题、声速计算问题、数制转换(十六进制数转换为BCD码)与数据标定问题,以及多字节十六进制数大小比较问题等。
以下主要讨论温度补偿、数制转换于数据标定处理及距离计算等问题。
4.4.1温度补偿
温度补偿是在求取声速过程中的一个必要环节,因此将它结合在声速求取子程序设计中加以阐述。
为简化程序设计,本测距仪采用查表法进行温度补偿,其主要目的是为了避开复杂的浮点数运算及浮点结果中各字节的提取操作。
这样,既保证了一定的精度要求,又可以避免浮点运算,在基于微处理器的系统中通常可将浮点运算改为定点运算。
查表法的前提是,必须事先得到温度与声速的二维关系表,表格的密度可根据精度的需要和微处理器资源的分配来决定。
由于表格中的典型温度点有限而且是离散分布的,为提高精度可以采取小区间插值计算法。
例如,测得温度为23,而表格中与之最接近的特征温度点为20和30,对应的声速分别为344和349,即温度变化10,声速变化5,也即每2度声速增加1,于是进行最简便的线性插补得到声速为345。
表格设计见表4-1。
表4-1温度与声速的二维关系表
温度℃
声速(m/s)
折合后的声速
对应的十六进制数
-30
313
8492
212CH
-20
319
8654
21CEH
-10
325
8817
2271H
0
332
9007
232FH
10
338
9170
23D2H
20
344
9333
2475H
30
349
9468
24FCH
40
355
9631
259FH
50
361
9794
2642H
计算得到的温度进行取整处理,然后判断所在区间,这里提供的程序没有进行插值计算,只简单地取温度区间内温度值对应的声速值。
为距离计算方便起见,在表格中的声速值乘以机器周期1us再乘以100得到折合后的声速值。
因为机器周期为常数,因此将乘法运算直接设计在表格中,避免了程序中的乘法运算。
这里乘以100是从精度和计算复杂性两者结合起来考虑,既保证2位精度,同时又能进行2字节与2字节的乘法运算(由MULD子程序实现)。
这样,虽然引入了一定的误差,但大大简化了程序的复杂程度,在微处理器汇编语言程序设计中,不失为一种解决此类问题的有效途径。
;***********************************************************
;求取声速子程序
;比较结果要与温度符号FUHAO结合才能得到速度SPEED
;************************************************************
GETSPEED:
MOVA,TEMP
MOVR2,A
MOVA,TEMP+1
MOVR3,A
MOVR4,#03H
MOVR5,#20H
LCALLCOMPARE
JCGETSPEED_01
MOVSPEED,#42H
JBFUHAO,GETSPEED_01
MOVSPEED+1,#42H
RET
GETSPEED_01:
MOVSPEED,#1FH
MOVSPEED+1,#0E6H
RET
GETSPEED_1:
MOVR4,#02H
MOVR5,#80H
LCALLCOMPARE
JCGETSPEED_2
JBGUHAO,GETSPEED_11
MOVSPEED,#25H
MOVSPEED+1,#9FH
RET
GETSPEED_11:
MOVSPEED,#20H
MOVSPEED+1,#89H
RET
GETSPEED_2:
MOVR4,#01H
MOVR5,#0E0H
LCALLCOMPARE
JCGETSPEED_3
JBFUHAO,GETSPEED_21
MOVSPEED,#24H
MOVSPEED+1,#0FCH
RET
GETSPEED_21:
MOVSPEED,#21H
MOVSPEED+1,#2CH
RET
GETSPEED_3:
MOVR4,#01H
MOVR5,#40H
LCALLCOMPARE
JCGETSPEED_4
JBFUHAO,GETSPEED_31
MOVSPEED,#24H
MOVSPEED+1,#75H
RET
GETSPEED_31:
MOVSPEED,#21H
MOVSPEED+1,#0CEH
RET
GETSPEED_4:
MOVR4,#00H
MOVR5,#0A0H
LCALLCOMPARE
JCGETSPEED_5
JBFUHAO,GETSPEED_41
MOVSPEED,#23H
MOVSPEED+1,#0D2H
RET
GETSPEED_41:
MOVSPEED,#22H
MOVSPEED+1,#71H
RET
GETSPEED_31:
MOVSPEED,#23H
MOVSPEED+1,#2FH
RET
4.4.2距离计算
距离计算式见式(1-1),程序设计的关键在于根据温度值进行声速的温度补偿,得到声速,以及超声波的发送与接收的时间差的获取。
温度补偿及声速计算已在上面进行了介绍,时间差的获取则是通过定时器1的计数,得到第1回波信号停止计数。
假定时间值为2字节(单位:
us),高字节在JSH中,低字节在JSL中,则距离计算的程序设计如下。
计数值为两字节整数值,由于定时器的计数对象为机器周期,其折合为时间还必须乘以机器周期,考虑运算的复杂性和为常数的特点,该乘法运算已在声速的温度补偿过程中事先进行,不需要在程序中进行处理了。
;*****************************************************************
;距离计算函数(带温度补偿)
;*****************************************************************
COMPUTER:
MOVA,TEMP
CLRC
CLRFUHAO
SUBBA,#80H
JCCOMPUTER_1
SETBFUHAO
LCALLBM
COMPUTER:
LCALLGETSPEED
MOVR2,SPEED
MOVR3,SPEED+1
MOVR6,JSH
MOVR7,JSL
LCALLMULD
CLRC
MOVA,R2
RRCA
MOVR2,A
MOVA,R3
RRCA
MOVR3,A
MOVA,R4
RRCA
MOVR4,A
MOVA,R5
RRCA
MOVR5,A,
MOVR0,#DISTANCE
MOVA,R2
MOV@R0,A
INCR0
MOVA,R4
MOV@R0,A
INCR0
MOVA,R5
MOV@R0,A
RET
4.4.3数制转换与数据标定处理
数制转换的原因在于:
经过求补得到的16位的原码为十六进制数,无法直接进行显示,必须转换为能为MAX7219所接收的BCD显示代码。
数据标定的原因在于:
在温度补偿和距离计算过程中没有考虑小数的存在,而实际显示结果必须考虑小数和有效位,这样势必要对计算得到的结果进行取舍,取舍的过程就是标定的过程。
就本系统而言,标定的依据是:
(1)温度标定处理依据
温度只能以2位方式进行显示,而DS18B20的测量温度范围为-55~125℃,因此取常用的温度部分,不考虑小数部分,即-55~99℃。
据前所述,16位原码中的最高5位为扩展符号位,0表示正数,1表示负数,最低4位为小数部分,其余7位为整数部分。
例如,温度值018CH对应的温度是+24.75℃,而FF5EH对应的二进制为111111*********0,首先从扩展符号位可知,其为负温度,求补操作后得到原码为0000000010100001,显然其整数部分为10,即10℃,而精度温度为-10.125℃。
(2)距离标定处理依据
距离只能显示4位整数,不考虑小数部分。
由于在距离计算过程中没有考虑物理单位,标定时通常采用从高到低取前4位即可。
以下数据转换程序包括温度转换和距离转换。
其中,温度具有正负属性,可直接从16位数据的扩展符号位得到正负符号通过设置FUHAO位标志传递给显示子程序。
十六进制数转换为十进制数显示代码的原理以两字节十六进制数53A1H(十进制数为21049)为例如加以说明:
两字节无符号数的最大值为65535,因此转换的过程就是余数依次除以10000、1000、100、10的过程。
首次是53A1H除以10000,其商2即为对应的最高位BCD码,余数为1409,除以1000,得千位BCD码为1,余数409除以100,得百位BCD码为4,依次完成转换。
;******************************************************************
;数据转换子程序
;将转换后的数据存入显示缓冲区以供显示
;待转换的数据有:
温度值,距离值
;******************************************************************
HEX2BBCD:
MOVA,TEMP
CLRC
CLRFUHAO
SUBBA,#80H
JCHEX2BCD_1
SETBFUHAO
LCALLBM
HEX2BCD_1:
MOVR2,TEMP
MOVR3,TEMP+1
MOVA,R2
ANLA,#00000111B
RLA
RLA
RLA
RLA
MOVR2,A
MOVA,R3
ANLA,#11110000B
SWAPA
ORLA,R2
MOVB,#100
DIVAB
MOVA,B
MOVB,#10
DIVAB
MOVR0,#DISPBUF+5
JNBFUHFAO,HEX2BCD_2
ORLA,#80H
HEX2BCD_2:
MOV@R0,A
MOVA,B
DECR0
MOV@R0,A
MOVR0,#DISTANCE
MOVA,@R0
MOVR6,A
INCR0
MOVA,@R0
MOVR7,A
LCALLHB2
MOVA,R3
ANLA,#0F0H