超声波测距汇编程序.docx

上传人:b****2 文档编号:24537352 上传时间:2023-05-28 格式:DOCX 页数:29 大小:58.34KB
下载 相关 举报
超声波测距汇编程序.docx_第1页
第1页 / 共29页
超声波测距汇编程序.docx_第2页
第2页 / 共29页
超声波测距汇编程序.docx_第3页
第3页 / 共29页
超声波测距汇编程序.docx_第4页
第4页 / 共29页
超声波测距汇编程序.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

超声波测距汇编程序.docx

《超声波测距汇编程序.docx》由会员分享,可在线阅读,更多相关《超声波测距汇编程序.docx(29页珍藏版)》请在冰豆网上搜索。

超声波测距汇编程序.docx

超声波测距汇编程序

超声波测距仪的软件设计

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 设计艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1