《单片机原理及应用》
单片机课程设计报告
超声波测距报告
目 录
第1 章 课程设计概述„„„„„„„„„„„„„„„„„„„„„„„2
1.1 课程设计选题及原理„„„„„„„„„„„„„„„„„„2
1.2 课程设计选题调研„„„„„„„„„„„„„„„„„„„2
1.2.1 选题目的与意义„„„„„„„„„„„„„„„„„„2
1.2.2 国内外研究综述„„„„„„„„„„„„„„„„„„3
第2 章 方案设计„„„„„„„„„„„„„„„„„„„„„„„„„„„„„4
2.1 主要任务„„„„„„„„„„„„„„„„„„„„„„„„„„ 4
2.2 设计框图„„„„„„„„„„„„„„„„„„„„„„„„„„ 4
2.3 设计所需元器件及简介„„„„„„„„„„„„„„„„„„„ 4
2.4 设计程序流程简图„„„„„„„„„„„„„„„„„„„„„„5
2.5 编程语言的选择
第3 章 电路及部分代码设计„„„„„„„„„„„„„„„„„„„„„„„ 6
3.1 Stc12c5a60s2最小系统„„„„„„„„„„„„„„„„„„„„6
3.2 超声波测距模块„„„„„„„„„„„„„„„„„„„„7
3.3 数码管显示模块„„„„„„„„„„„„„„„„„„„„„„„ 8
3.4 蜂鸣器报警模块„„„„„„„„„„„„„„„„„„„„„„„ 9
3.5 总仿真结果及实物测量结果„„„„„„„„„„„„„„„„„10
第4 章 课程设计心得体会和总结„„„„„„„„„„„„„„„„„„„„„11
4.1 心得体会„„„„„„„„„„„„„„„„„„„„„„„„„„ 11
4.2 总结„„„„„„„„„„„„„„„„„„„„„„„„ 11
附 1 课程设计仿真图„„„„„„„„„„„„„„„„„„„„„„ 附 2 课程设计实物图„„„„„„„„„„„„„„„„„„„„„„ 附 3 课程设计程序设计代码„„„„„„„„„„„„„„„„„„„„„„„
第1 章 课程设计概述
1.1 课程设计选题及原理
课程设计题目
超声波测距仪
设计原理
通过超声波发射装置发出超声波,根据接收器接到超声波时的时间差就可以知道距离了。这与雷达测距原理相似。 超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。
最常用的超声测距的方法是回声探测法,超声波发射器向某一方向发射超声波,在发射时刻的同时计数器开始计时,超声波在空气中传播,途中碰到障碍物面阻挡就立即反射回来,超声波接收器收到反射回的超声波就立即停止计时。超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物面的距离s,即:s=340t/2。
由于超声波也是一种声波,其声速V与温度有关。在使用时,如果传播介质温度变化不大,则可近似认为超声波速度在传播的过程中是基本不变的。如果对测距精度要求很高,则应通过温度补偿的方法对测量结果加以数值校正。声速确定后,
只要测得超声波往返的时间,即可求得距离。这就是超声波测距仪的基本原理。
1.2 课程设计选题调研
1.2.1 选题目的与意义
超声波是指频率在20KHz以上的声波,它属于机械波的范畴,可用于非接触测量,具有不受光、电磁波以及粉尘等外界因素的干扰的优点,利用计算超声波在发送端和接收端之间的传输时间和声速来测量距离,对被测目标无损害。而且超声波传播速度在很大范围内与频率无关。超声波的这些独特优点越来越受到人们的重视。
目前对于超声波精确测距的需求也越来越大,比如油库和水箱液面的精确测量和控制,汽车辅助泊位系统的应用,物体内气孔大小的检测和机械内部损伤的检测等。在机械制造,电子冶金,航海,宇航,石油化工,等工业领域也有广泛地应用。此外,在材料科学,医学,生物科学等领域中也占具重要地位。
1.2.2 国内外研究综述
历史上使用超声波来测量距离是从第二次世界大战时海军的声纳技术的发展开始。声纳是一种利用声波在水下测定目标距离和运动速度的仪器。经过几个世纪,科学家们对此反复研究,最终发现了超声波的原理。超声波测距应用于各种工业领域,如工业自动控制,建筑工程测量和机器人视觉识别等方面。
超声波作为一种检测技术,采用的是非接触式测量,由于它具有不受外界因素影响,对环境有一定的适应能力,且操作简单,测量精度高等优点而被广泛应用。这些特点可使测量仪器不受被测介质的影响,大大解决了传统测量仪器存在的问题,比如,在粉尘多的情况下对人引起的身体接触伤害,腐蚀性质的被测物对测量仪器腐蚀,触电接触不良造成的误测等。此外该技术对被测元件无磨损,使测量仪器牢固耐用,使用寿命加长,而且还降低了能量损耗,节省人力和劳动的强度。因此,利用超声波检测既迅速、方便、计算简单,又易于实时控制,在测量精度方面能达到工业实用的要求。
然而超声波测距在实际应用中也有很多局限性。由于超声波在传播过程中,声压会随距离的增大而呈指数规律衰减,远目标的回波信号幅度小,信噪比低,用固定阈值的比较器检测回波,可能导致越过门槛的时间前后移动,从而影响计时的准确性,这必然会影响到测距的准确度。此外,构成超声波传感器的压电陶瓷片在压电的双向转换过程中,存在惯性,滞后等现象,以及超声波脉冲在空气中传播本身及多重的反射路径,均导致回波信号被展宽,也会使测量产生较大的误差,影响了测距的分辨率。其它如温度,风速等也会对测量造成一定的影响。工程师针对这些误差提出的可变阈值的超声波测距方法,从回波信号处理的角度出发,分析了超声波回波曲线的特性,利用回波包络的峰值检测技术以确定回波到达的时刻,另外,利用温度补偿电路可以降低温度对声速的影响,这些改进都大大的提高了超声波测距的准确性。
计量学在制造业中越来越重要。直接在机器上测量尤其能推动制造业的发展。目前为止大部分还是采用视觉的或触觉的测量方法。但是墙的厚度就不能用这些来测量,因此德国人把超声系统结合到机器设计出了测距方法。随着超声波的发展,早在2000年时英国人就设计出了可观察,识别并测距的超声波集成系统。
第2 章 方案设计
2.1 主要任务
设计制作一个超声波测距仪,通过单片机控制超声波测距模块,计算并显示所测距离以及实现报警功能。
整体电路的控制核心为单片机STC12C5A60S2。超声波发射和接收电路中都对相应信号进行整形及放大,以保证测量结果尽可能精确。超声波探头接OUT口实现超声波的发射和接收。另外超声波发射和接受模块hc-sr04还有具有温度补偿的作用,使测量精度能够达到要求。整体结构图包括超声波发射接收电路,
单片机电路,显示电路与蜂鸣器报警电路等几部分模块组成。
2.2 设计框图
本设计主要的四个模块:超声波发射和接收模块,蜂鸣器报警模块,单片机 STC12C5A60S2,四位数码管显示模块。以下是设计框图
图1 设计框图
2.3 设计所需元器件及简介
STC12C5A60S2
增强型 8051 CPU,1T,单时钟/ 机器周期,指令代码完全兼容传统8051。工作电压5.5V-3.3V。STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。
通用I/O口(36/40/44个),复位后为:准双向口/弱上拉(普通8051传统I/O口) 可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过55mA。
本设计中用到的单片机管脚有P1,P2.0-P2.3,P3.5-P3.7。
超声波测距模块HC-SR04
超声波测距模块HC-SR04 可提供2-400cm的非接触式距离感测功能,测距精度可高达3mm。模块包括超声波发器、接收器与控制电路本模块性能稳定,测度距离精确。能和国外的SRF05,SRF02等超声波测距模块相媲美。模块高精度,盲区(2cm
)超近,稳定的测距是此产品成功走向市场的有力根据
图2 HC-SR04正面图
主要技术参数:1:使用电压:DC5V 2:静态电流:小于2mA
3:电平输出:高5V 4:电平输出:底0V 5:感应角度:不大于15度 6:高精度 可达0.2cm
7:探测距离:2cm-450cm
接线方式:VCC,trig(控制端),echo(接收端),GND
模块工作原理:(1)采用IO触发测距,给至少10us的高电平信号;
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2;
超声波发射器向某一方向发射超声波,在发射超声波的同时开始计时,超声波在空气中传播,途中碰到障碍物反射后立即返回来,超声波接收器收到反射波就立即停止计时。超声波在空气中的传播速度约为340m/s,根据计时器记录的时间t,就可以计算出超声波发射点距障碍物的距离(s),即为:s=340t/2,这就是所谓的时间差测距法。
存在4个因素限制了该系统的最大可测距离:超声波的幅度、反射的质地、反射回波和入射声波之间的夹角。
四位数码管显示模块
数码管(LED Segment Displays)是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。led数码管常用段数一般为7段有的另加一个小数点,还有一种是类似于3位“+1”型。位数有半位,1,2,3,4,5,6,8,10位等等....,led数码管根据LED的接法不同分为共阴和共阳两类。本设计用到的是共阳极,静态驱动也称直流驱动数码管。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。
共阳TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,088H
本设计还需要的元件有蜂鸣器,电阻,电容,12M晶振,按键,三极管,面包板等
设计流程图说明:本设计P3.5连接超声波发射端,P3.7口接超声波接收端。首先单片机开始工作,系统初始化后单片机向P3.5口发送40KHZ的方波,使超声波发射和接受模块开始工作,当P3.7口接收到高电平时计时器开始计时,选用的是计时器工作方式1,16位。当P3.7口接收到低电平的时候计时器关闭。此时时间存在TH0,TL0中,这是通过计算子程序把时间换算成距离四位,从高到底分别存在78H,77H,76H,75H。此时调用显示子程序把距离显示在四位数码管中。再调用报警子程序,根据距离的判断,使蜂鸣器发出不同频率的声音。延时很短的时间,继续下次的测量。
2.5 编程语言的选择
在编程语言的选择上,我们主要考虑使用我所学过的汇编语言和C语言。 汇编语言是一种面向机器的低级的程序设计语言。它直接利用机器提供的指令系统编写程序,该类程序的可执行指令是与机器语言程序的指令一一对应的。汇编语言由于是面向机器的程序设计语言,与具体的计算机硬件有着密切的关系,因此,可移植性差。但由于汇编指令与机器语言指令一一对应,即一条汇编语言的可执行指令对应着一条机器语言指令,反之亦然。因此,汇编语言可直接利用机器硬件系统的许多特性,如寄存器、标志位以及一些特殊指令等,具有执行速度快、占用内存少等优点。
在本设计中,设计程序过程相对不复杂,用汇编语言完全可以实现,所以本设计选择了使用汇编语言进行编程。
第3 章 电路及部分代码设计
3.1 Stc12c5a60s2最小系统
在电源旁接了开关控制电源。复位电路旁还接了按键,方便复位操作。
图4 单片机工作最小系统
3.2
设计思路:单片机P3.5发送40KHZ的方波,超声波接收到后开始测距,返回一段高电平到P3.7就是超声波的测量的时间,所以程序设计时P3.7接收到高电平时开启定时器,P3.7口接收到低电平时关闭定时器,这样定时器TH0,TL0里存储的就是测量的时间,根据公式s=340t/2就可以计算出距离。
流程图
超声波测距模块
图5 超声波发射和接收流程图
电路部分
图6 超声波发射和接收电路
根据超声波测距模块原理代码设计部分如下
P3.5发射,P3.7接受
MOV TMOD,#01H ;置定时器T0工作方式样3,对内部机器周期计数 CJZCX: MOV TL0,#00H ;装入定时器初值
MOV TH0,#00H
puzel:MOV 14H,#08H ;超声波发射持续200us
Here:CPL P3.5 ;输出40kHz方波
NOP ;
NOP ;
NOP ;
DJNZ 14H,Here ;
QBA:JB P3.7,QBC ;等待1跳到QBC
DJNZ R1,QBA
DJNZ R0,QBA
QBC:SETB TR0 ;测到1开始计时
SETB P3.2
QBB:JNB P3.7,QBD ;等待0跳到QBD
JMP QBB
QBD:CLR P2.3 ;测到0关闭计时
CLR TR0
3.3 数码管显示模块
设计思路:此时通过计算后四位数据分别从高到底存在78H,77H,76H,75H里,显示数据时从高到低,P1口接a-h,P2.0-P2.3口接共阳极。首先赋值P2口0FEH,让78H中的数据给高位,在左移,把77H数据给次高位,这样循环知道四位数据全部显示,此时跳到主程序。
电路部分如图6
代码部分(说明显示四位左端为高位,代码中78H,77H,76H,75H分别存了四位,P1口接a-h,P2.0-P2.3接共阳极)
DISPLAY: MOV R1,#78H ;立即数78H送寄存器中
MOV R5,#0FEH ;立即数FEH送寄存器R5中
PLAY: MOV A,R5 ;寄存器R5中的数值送累加器A中
MOV P2,A ;累加器A中的数值送P2口
MOV A,@R1 ;以寄存器R1中的数为地址单元的数值送累加器中
MOV DPTR,#TAB ;16位地址送地址寄存器中
MOVC A,@A+DPTR ;以中的地址为基地变址寻址单元中的数送累加器
MOV P1,A ;累加器A中的数值送P1口
MOV R6,#14H ;立即数据14送寄存器R6中
DL1:MOV R7,#19H ;立即数据19送寄存器R7中
DL2:DJNZ R7,DL2 ;寄存器中的数据减1,不为零时则转移 DJNZ R6,DL1 ;寄存器中的数据减1,不为零时则转移 DEC R1 ;寄存器R1中的数值减1
MOV A,R5 ;寄存器R5中的数值送累加器A中
JNB ACC.3,ENDOUT ;地址位为0则转到ENDOUT
RL A ;累加器循环右移
MOV R5,A ;累加器A中的数值送寄存器R5中
AJMP PLAY ;绝对短转移
ENDOUT: SETB P3.5 ;置P3.5口
RET ;返回
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,088H
图 7 数码管显示电路
3.4 蜂鸣器报警模块
设计思路:如图P3.6口接的是蜂鸣器电路,实现蜂鸣器不同频率报警,首先要距离分段,此程序判断的是最高位,所以是78H里的值,控制蜂鸣器报警频率不同是通过改变P3.6口0和1翻转的状态时间不同来实现的。
电路部分
图8 蜂鸣器报警电路
蜂鸣器报警分5种频率
分段为4m
距离不同设定的蜂鸣器报警的频率不同
3.5 总仿真结果及其实物测量结果
由于没有超声波发射和接收模块,用按键来给P3.7口信号。电路的仿真结果是单片机工作后,用按键给信号,四位数码管可以显示计算值出来,蜂鸣器可以正常工作。
本次设计的实物能实现的功能功能有:
(1)超声波的发射和接受控制
(2)对回波信号的检测
(3)测距时间到距离的换算
(4)距离不断测量和不断显示
(5)对距离进行判断,并且蜂鸣器报警
第4 章 课程设计心得体会和总结
4.1
心得体会
心得:这两个星期是一个不断发现问题和解决问题的过程,从调研选题背景意义,了解了超声波测距仪的工作原理及其发展,感觉上通过单片机控制是一个相对简单的过程没有什么弯路要走。确定方案,购买元件的时候就发现有很多的实际问题,由于第一次实际做一些东西出来,总觉得不知道从什么地方下手,这个时候小组合作就显得格外重要,大家一起讨论,给出不同的意见,完善各自的方案,了解更多实际电路要考虑到的问题,电阻的限流作用,单片机工作的电压电流,电阻选多大,电容选多大,这些对电路都是有影响的,选的不对很可能就把单片机烧坏。每天都会有新的问题,解决完一个就会发现那不是结束仅仅是一个开始。焊接电路是一项需要有耐心的过程,一不小心就会犯错,那是万万不允许的,所以必须检查每一个焊接点,刚开始做必然做的不太娴熟,焊接的也不太美观,但最也算是完成了。调试电路是最头疼的,一开始不知道是电路的问题还
是程序的问题。这次我们用的是汇编语言,而大部分组用的是C语言,这让我们在交流程序的时候显得有些无奈,开始我们只有一个部分一个部分的慢慢调试,先从四位数码显示部分开始,这部分知道电路连接正确应该就不会有问题。然后我们测蜂鸣器是否工作正常。最后遇到问题是发现超声波接收和发射模块不能正常工作,找了很多原因,都不行。后来恍然大悟,是我们在一开始是就把超声波发射和接收模块的时间开始和接受弄错了,所以计算的时间总是错的。完成能测距的这一基本任务让我们有了信心去做接下来的报警功能。对于我们这个超声波测距模块,要弄清楚每一个环节的工作原理,才能进行电路设计及程序编写。
4.2 总结
总结:我们使用stc12c5a60s2单片机控制,hc-sr04超声波发射和接受模块辅助测量,在四位数码显示管显示结果,蜂鸣器报警,这是整个超声波测距系统的主要四个部分。测量范围在2cm到300cm之间。由于经验不足,最后的成品能虽然实现测量和报警的功能,但是任然有很多不足的地方,电路排版焊接不美观,电路测量的有效性不够强,程序的稳定性容错性都存在问题。程序在努力改进后还需加强。本次课程设计学习到很多,对课本原理性的内容更是加深理解。对实践动手能力有了很大的锻炼和提高。
附录1
课程设计仿真图
图9 仿真电路
附录2
课程设计实物图
图10 实物图
附录3
程序设计代码
; 基于STC12C5A60S2单片机超声波测距系统
; 测量范围35-300厘米
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 中断入口程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H
ORG 000BH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 主 程 序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
START: MOV R0,#70H ;立即数70H送寄存器R0中
MOV R7,#0BH ;立即数0BH送寄存器R7中
MOV 20H,#00H ;立即数00H送20H单元中
CLEARDISP: MOV @R0,#00H ;立即数立即数00H送R0中的地址单元中 INC R0 ;寄存器R0加1
DJNZ R7,CLEARDISP;寄存器中的数值减1非零时转移
MOV TMOD,#01H ;置定时器T0工作方式样3,对内部机器周期计数
CJZCX: MOV TL0,#00H ;装入定时器初值
MOV TH0,#00H
MOV R0,#0FH
MOV R1,#5bH
puzel:MOV 14H,#08H ;超声波发射持续200us
Here:CPL P3.5 ;输出40kHz方波
NOP ;
NOP ;
NOP ;
DJNZ 14H,Here ;
QBA:JB P3.7,QBC ;等待1跳到QBC
DJNZ R1,QBA
DJNZ R0,QBA
QBC:SETB TR0 ;测到1开始计时
SETB P3.2
QBB:JNB P3.7,QBD ;等待0跳到QBD
JMP QBB
QBD:CLR P2.3 ;测到0关闭计时
CLR TR0
MOV 70H,TL0
MOV 71H,TH0
MOV R2,71H
MOV R3,70H
MOV R6,#11H
MOV R7,#0H
LCALL MULD
MOV R6,#64H
MOV R7,#0H
LCALL DIVD
MOV 73H,R2
MOV R3,#0H
MOV R4,#0H
MOV R5,#0H
MOV R6,73H
MOV R7,74H
LCALL HB2
MOV A,R4 ;分离BCD
MOV B,#10H
DIV AB
MOV 78H,A
MOV 77H,B
MOV A,R5
MOV B,#10H
DIV AB
MOV 76H,A
MOV 75H,B
MOV 7AH,#0FFH
XXX:LCALL DISPLAY
LCALL WARNING
DJNZ 7AH,XXX
AJMP CJZCX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 乘34程序(乘声速) ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MULD: MOV A,R3 ;计算R3乘R7
MOV B,R7
MUL AB
MOV R4,B ;暂存部分积
MOV R5,A
MOV A,R3 ;计算R3乘R6
MOV B,R6
MUL AB
ADD A,R4 ;累加部分积
MOV R4,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2 ;计算R2乘R7
MOV B,R7
MUL AB
ADD A,R4 ;累加部分积
MOV R4,A
ADDC A,B
MOV R3,A
CLR A
RLC A
XCH A,R2 ;计算R2乘R6
MOV B,R6
MUL AB
ADD A,R3 ;累加部分积
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 除100程序(除法) ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DIVD: CLR C ;比较被除数和除数
MOV A,R3
SUBB A,R7
MOV A,R2
SUBB A,R6
JC DVD1
SETB OV ;溢出
RET
DVD1: MOV B,#10H ;计算双字节商
DVD2: CLR C ;部分商和余数同时左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C ;保存溢出位
CLR C
SUBB A,R7 ;计算(R2R3-R6R7)
MOV R1,A
SUBB A,R6
ANL C,/F0 ;结果判断
JC DVD3
MOV R2,A ;够减,存放新的余数
MOV A,R1
MOV R3,A
INC R5 ;商的低位置一
DVD3: DJNZ B,DVD2 ;计算完十六位商(R4R5)
MOV A,R4 ;将商移到R2R3中
MOV R2,A
MOV A,R5
MOV R3,A
CLR OV ;设立成功标志
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; BCD转换 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
HB2: CLR A ;BCD码初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;转换双字节十六进制整数
HB3: MOV A,R7 ;从高端移出待转换数的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD码带进位自身相加,相当于乘2
ADDC A,R5
DA A ;十进制调整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;双字节十六进制数的万位数不超过6,不用调整
DJNZ R2,HB3 ;处理完16bit
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 报警程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WARNING: MOV R6,#10
MOV A,78H
CJNE A,#00H,B1
LJMP W1
B1: SUBB A,#01H
CJNE A,#00H,B2
LJMP W2
B2: SUBB A,#01H
CJNE A,#00H,B3
LJMP W3
B3: SUBB A,#01H
CJNE A,#00H,B4
LJMP W4
B4: LJMP W5
RET
W1: CPL P3.6 ;蜂鸣器驱动电平取反
MOV R7,#28
DE1: DJNZ R7,DE1
DEC R6
CJNE R6,#00,W1 ;反复循环
RET
W2: CPL P3.6 ;蜂鸣器驱动电平取反
MOV R7,#228
DE2: DJNZ R7,DE2
DEC R6
CJNE R6,#00,W2 ;反复循环
RET
W3: CPL P3.6 ;蜂鸣器驱动电平取反
MOV R7,#428
DE3: DJNZ R7,DE3
DEC R6
CJNE R6,#00,W3 ;反复循环
RET
W4: CPL P3.6 ;蜂鸣器驱动电平取反
MOV R7,#628
DE4: DJNZ R7,DE4
DEC R6
CJNE R6,#00,W4 ;反复循环
RET
W5: CPL P3.6 ;蜂鸣器驱动电平取反
MOV R7,#828
DE5: DJNZ R7,DE5
DEC R6
CJNE R6,#00,W5 ;反复循环
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 显示程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISPLAY: MOV R1,#78H ;立即数76H送寄存器中
MOV R5,#0FDH ;立即数FEH送寄存器R5中
PLAY: MOV A,R5 ;寄存器R5中的数值送累加器A中
MOV P2,A ;累加器A中的数值送P3口
MOV A,@R1 ;以寄存器R1中的数为地址单元的数值送累加器中
MOV DPTR,#TAB ;16位地址送地址寄存器中
MOVC A,@A+DPTR ;以中的地址为基地变址寻址单元中的数送累加器
MOV P1,A ;累加器A中的数值送P1口
MOV R6,#14H ;立即数据14送寄存器R6中
DL1:MOV R7,#19H ;立即数据19送寄存器R7中
DL2:DJNZ R7,DL2 ;寄存器中的数据减1,不为零时则转移 DJNZ R6,DL1 ;寄存器中的数据减1,不为零时则转移 DEC R1 ;寄存器R1中的数值加1
MOV A,R5 ;寄存器R5中的数值送累加器A中
JNB ACC.3,ENDOUT ;地址位为0则转到ENDOUT
RL A ;累加器循环右移
MOV R5,A ;累加器A中的数值送寄存器R5中
AJMP PLAY ;绝对短转移
ENDOUT: SETB P3.5 ;置P3.5口
RET ;返回
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,088H EEE: END ;结束
《单片机原理及应用》
单片机课程设计报告
超声波测距报告
目 录
第1 章 课程设计概述„„„„„„„„„„„„„„„„„„„„„„„2
1.1 课程设计选题及原理„„„„„„„„„„„„„„„„„„2
1.2 课程设计选题调研„„„„„„„„„„„„„„„„„„„2
1.2.1 选题目的与意义„„„„„„„„„„„„„„„„„„2
1.2.2 国内外研究综述„„„„„„„„„„„„„„„„„„3
第2 章 方案设计„„„„„„„„„„„„„„„„„„„„„„„„„„„„„4
2.1 主要任务„„„„„„„„„„„„„„„„„„„„„„„„„„ 4
2.2 设计框图„„„„„„„„„„„„„„„„„„„„„„„„„„ 4
2.3 设计所需元器件及简介„„„„„„„„„„„„„„„„„„„ 4
2.4 设计程序流程简图„„„„„„„„„„„„„„„„„„„„„„5
2.5 编程语言的选择
第3 章 电路及部分代码设计„„„„„„„„„„„„„„„„„„„„„„„ 6
3.1 Stc12c5a60s2最小系统„„„„„„„„„„„„„„„„„„„„6
3.2 超声波测距模块„„„„„„„„„„„„„„„„„„„„7
3.3 数码管显示模块„„„„„„„„„„„„„„„„„„„„„„„ 8
3.4 蜂鸣器报警模块„„„„„„„„„„„„„„„„„„„„„„„ 9
3.5 总仿真结果及实物测量结果„„„„„„„„„„„„„„„„„10
第4 章 课程设计心得体会和总结„„„„„„„„„„„„„„„„„„„„„11
4.1 心得体会„„„„„„„„„„„„„„„„„„„„„„„„„„ 11
4.2 总结„„„„„„„„„„„„„„„„„„„„„„„„ 11
附 1 课程设计仿真图„„„„„„„„„„„„„„„„„„„„„„ 附 2 课程设计实物图„„„„„„„„„„„„„„„„„„„„„„ 附 3 课程设计程序设计代码„„„„„„„„„„„„„„„„„„„„„„„
第1 章 课程设计概述
1.1 课程设计选题及原理
课程设计题目
超声波测距仪
设计原理
通过超声波发射装置发出超声波,根据接收器接到超声波时的时间差就可以知道距离了。这与雷达测距原理相似。 超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。
最常用的超声测距的方法是回声探测法,超声波发射器向某一方向发射超声波,在发射时刻的同时计数器开始计时,超声波在空气中传播,途中碰到障碍物面阻挡就立即反射回来,超声波接收器收到反射回的超声波就立即停止计时。超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物面的距离s,即:s=340t/2。
由于超声波也是一种声波,其声速V与温度有关。在使用时,如果传播介质温度变化不大,则可近似认为超声波速度在传播的过程中是基本不变的。如果对测距精度要求很高,则应通过温度补偿的方法对测量结果加以数值校正。声速确定后,
只要测得超声波往返的时间,即可求得距离。这就是超声波测距仪的基本原理。
1.2 课程设计选题调研
1.2.1 选题目的与意义
超声波是指频率在20KHz以上的声波,它属于机械波的范畴,可用于非接触测量,具有不受光、电磁波以及粉尘等外界因素的干扰的优点,利用计算超声波在发送端和接收端之间的传输时间和声速来测量距离,对被测目标无损害。而且超声波传播速度在很大范围内与频率无关。超声波的这些独特优点越来越受到人们的重视。
目前对于超声波精确测距的需求也越来越大,比如油库和水箱液面的精确测量和控制,汽车辅助泊位系统的应用,物体内气孔大小的检测和机械内部损伤的检测等。在机械制造,电子冶金,航海,宇航,石油化工,等工业领域也有广泛地应用。此外,在材料科学,医学,生物科学等领域中也占具重要地位。
1.2.2 国内外研究综述
历史上使用超声波来测量距离是从第二次世界大战时海军的声纳技术的发展开始。声纳是一种利用声波在水下测定目标距离和运动速度的仪器。经过几个世纪,科学家们对此反复研究,最终发现了超声波的原理。超声波测距应用于各种工业领域,如工业自动控制,建筑工程测量和机器人视觉识别等方面。
超声波作为一种检测技术,采用的是非接触式测量,由于它具有不受外界因素影响,对环境有一定的适应能力,且操作简单,测量精度高等优点而被广泛应用。这些特点可使测量仪器不受被测介质的影响,大大解决了传统测量仪器存在的问题,比如,在粉尘多的情况下对人引起的身体接触伤害,腐蚀性质的被测物对测量仪器腐蚀,触电接触不良造成的误测等。此外该技术对被测元件无磨损,使测量仪器牢固耐用,使用寿命加长,而且还降低了能量损耗,节省人力和劳动的强度。因此,利用超声波检测既迅速、方便、计算简单,又易于实时控制,在测量精度方面能达到工业实用的要求。
然而超声波测距在实际应用中也有很多局限性。由于超声波在传播过程中,声压会随距离的增大而呈指数规律衰减,远目标的回波信号幅度小,信噪比低,用固定阈值的比较器检测回波,可能导致越过门槛的时间前后移动,从而影响计时的准确性,这必然会影响到测距的准确度。此外,构成超声波传感器的压电陶瓷片在压电的双向转换过程中,存在惯性,滞后等现象,以及超声波脉冲在空气中传播本身及多重的反射路径,均导致回波信号被展宽,也会使测量产生较大的误差,影响了测距的分辨率。其它如温度,风速等也会对测量造成一定的影响。工程师针对这些误差提出的可变阈值的超声波测距方法,从回波信号处理的角度出发,分析了超声波回波曲线的特性,利用回波包络的峰值检测技术以确定回波到达的时刻,另外,利用温度补偿电路可以降低温度对声速的影响,这些改进都大大的提高了超声波测距的准确性。
计量学在制造业中越来越重要。直接在机器上测量尤其能推动制造业的发展。目前为止大部分还是采用视觉的或触觉的测量方法。但是墙的厚度就不能用这些来测量,因此德国人把超声系统结合到机器设计出了测距方法。随着超声波的发展,早在2000年时英国人就设计出了可观察,识别并测距的超声波集成系统。
第2 章 方案设计
2.1 主要任务
设计制作一个超声波测距仪,通过单片机控制超声波测距模块,计算并显示所测距离以及实现报警功能。
整体电路的控制核心为单片机STC12C5A60S2。超声波发射和接收电路中都对相应信号进行整形及放大,以保证测量结果尽可能精确。超声波探头接OUT口实现超声波的发射和接收。另外超声波发射和接受模块hc-sr04还有具有温度补偿的作用,使测量精度能够达到要求。整体结构图包括超声波发射接收电路,
单片机电路,显示电路与蜂鸣器报警电路等几部分模块组成。
2.2 设计框图
本设计主要的四个模块:超声波发射和接收模块,蜂鸣器报警模块,单片机 STC12C5A60S2,四位数码管显示模块。以下是设计框图
图1 设计框图
2.3 设计所需元器件及简介
STC12C5A60S2
增强型 8051 CPU,1T,单时钟/ 机器周期,指令代码完全兼容传统8051。工作电压5.5V-3.3V。STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。
通用I/O口(36/40/44个),复位后为:准双向口/弱上拉(普通8051传统I/O口) 可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过55mA。
本设计中用到的单片机管脚有P1,P2.0-P2.3,P3.5-P3.7。
超声波测距模块HC-SR04
超声波测距模块HC-SR04 可提供2-400cm的非接触式距离感测功能,测距精度可高达3mm。模块包括超声波发器、接收器与控制电路本模块性能稳定,测度距离精确。能和国外的SRF05,SRF02等超声波测距模块相媲美。模块高精度,盲区(2cm
)超近,稳定的测距是此产品成功走向市场的有力根据
图2 HC-SR04正面图
主要技术参数:1:使用电压:DC5V 2:静态电流:小于2mA
3:电平输出:高5V 4:电平输出:底0V 5:感应角度:不大于15度 6:高精度 可达0.2cm
7:探测距离:2cm-450cm
接线方式:VCC,trig(控制端),echo(接收端),GND
模块工作原理:(1)采用IO触发测距,给至少10us的高电平信号;
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2;
超声波发射器向某一方向发射超声波,在发射超声波的同时开始计时,超声波在空气中传播,途中碰到障碍物反射后立即返回来,超声波接收器收到反射波就立即停止计时。超声波在空气中的传播速度约为340m/s,根据计时器记录的时间t,就可以计算出超声波发射点距障碍物的距离(s),即为:s=340t/2,这就是所谓的时间差测距法。
存在4个因素限制了该系统的最大可测距离:超声波的幅度、反射的质地、反射回波和入射声波之间的夹角。
四位数码管显示模块
数码管(LED Segment Displays)是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。led数码管常用段数一般为7段有的另加一个小数点,还有一种是类似于3位“+1”型。位数有半位,1,2,3,4,5,6,8,10位等等....,led数码管根据LED的接法不同分为共阴和共阳两类。本设计用到的是共阳极,静态驱动也称直流驱动数码管。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。
共阳TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,088H
本设计还需要的元件有蜂鸣器,电阻,电容,12M晶振,按键,三极管,面包板等
设计流程图说明:本设计P3.5连接超声波发射端,P3.7口接超声波接收端。首先单片机开始工作,系统初始化后单片机向P3.5口发送40KHZ的方波,使超声波发射和接受模块开始工作,当P3.7口接收到高电平时计时器开始计时,选用的是计时器工作方式1,16位。当P3.7口接收到低电平的时候计时器关闭。此时时间存在TH0,TL0中,这是通过计算子程序把时间换算成距离四位,从高到底分别存在78H,77H,76H,75H。此时调用显示子程序把距离显示在四位数码管中。再调用报警子程序,根据距离的判断,使蜂鸣器发出不同频率的声音。延时很短的时间,继续下次的测量。
2.5 编程语言的选择
在编程语言的选择上,我们主要考虑使用我所学过的汇编语言和C语言。 汇编语言是一种面向机器的低级的程序设计语言。它直接利用机器提供的指令系统编写程序,该类程序的可执行指令是与机器语言程序的指令一一对应的。汇编语言由于是面向机器的程序设计语言,与具体的计算机硬件有着密切的关系,因此,可移植性差。但由于汇编指令与机器语言指令一一对应,即一条汇编语言的可执行指令对应着一条机器语言指令,反之亦然。因此,汇编语言可直接利用机器硬件系统的许多特性,如寄存器、标志位以及一些特殊指令等,具有执行速度快、占用内存少等优点。
在本设计中,设计程序过程相对不复杂,用汇编语言完全可以实现,所以本设计选择了使用汇编语言进行编程。
第3 章 电路及部分代码设计
3.1 Stc12c5a60s2最小系统
在电源旁接了开关控制电源。复位电路旁还接了按键,方便复位操作。
图4 单片机工作最小系统
3.2
设计思路:单片机P3.5发送40KHZ的方波,超声波接收到后开始测距,返回一段高电平到P3.7就是超声波的测量的时间,所以程序设计时P3.7接收到高电平时开启定时器,P3.7口接收到低电平时关闭定时器,这样定时器TH0,TL0里存储的就是测量的时间,根据公式s=340t/2就可以计算出距离。
流程图
超声波测距模块
图5 超声波发射和接收流程图
电路部分
图6 超声波发射和接收电路
根据超声波测距模块原理代码设计部分如下
P3.5发射,P3.7接受
MOV TMOD,#01H ;置定时器T0工作方式样3,对内部机器周期计数 CJZCX: MOV TL0,#00H ;装入定时器初值
MOV TH0,#00H
puzel:MOV 14H,#08H ;超声波发射持续200us
Here:CPL P3.5 ;输出40kHz方波
NOP ;
NOP ;
NOP ;
DJNZ 14H,Here ;
QBA:JB P3.7,QBC ;等待1跳到QBC
DJNZ R1,QBA
DJNZ R0,QBA
QBC:SETB TR0 ;测到1开始计时
SETB P3.2
QBB:JNB P3.7,QBD ;等待0跳到QBD
JMP QBB
QBD:CLR P2.3 ;测到0关闭计时
CLR TR0
3.3 数码管显示模块
设计思路:此时通过计算后四位数据分别从高到底存在78H,77H,76H,75H里,显示数据时从高到低,P1口接a-h,P2.0-P2.3口接共阳极。首先赋值P2口0FEH,让78H中的数据给高位,在左移,把77H数据给次高位,这样循环知道四位数据全部显示,此时跳到主程序。
电路部分如图6
代码部分(说明显示四位左端为高位,代码中78H,77H,76H,75H分别存了四位,P1口接a-h,P2.0-P2.3接共阳极)
DISPLAY: MOV R1,#78H ;立即数78H送寄存器中
MOV R5,#0FEH ;立即数FEH送寄存器R5中
PLAY: MOV A,R5 ;寄存器R5中的数值送累加器A中
MOV P2,A ;累加器A中的数值送P2口
MOV A,@R1 ;以寄存器R1中的数为地址单元的数值送累加器中
MOV DPTR,#TAB ;16位地址送地址寄存器中
MOVC A,@A+DPTR ;以中的地址为基地变址寻址单元中的数送累加器
MOV P1,A ;累加器A中的数值送P1口
MOV R6,#14H ;立即数据14送寄存器R6中
DL1:MOV R7,#19H ;立即数据19送寄存器R7中
DL2:DJNZ R7,DL2 ;寄存器中的数据减1,不为零时则转移 DJNZ R6,DL1 ;寄存器中的数据减1,不为零时则转移 DEC R1 ;寄存器R1中的数值减1
MOV A,R5 ;寄存器R5中的数值送累加器A中
JNB ACC.3,ENDOUT ;地址位为0则转到ENDOUT
RL A ;累加器循环右移
MOV R5,A ;累加器A中的数值送寄存器R5中
AJMP PLAY ;绝对短转移
ENDOUT: SETB P3.5 ;置P3.5口
RET ;返回
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,088H
图 7 数码管显示电路
3.4 蜂鸣器报警模块
设计思路:如图P3.6口接的是蜂鸣器电路,实现蜂鸣器不同频率报警,首先要距离分段,此程序判断的是最高位,所以是78H里的值,控制蜂鸣器报警频率不同是通过改变P3.6口0和1翻转的状态时间不同来实现的。
电路部分
图8 蜂鸣器报警电路
蜂鸣器报警分5种频率
分段为4m
距离不同设定的蜂鸣器报警的频率不同
3.5 总仿真结果及其实物测量结果
由于没有超声波发射和接收模块,用按键来给P3.7口信号。电路的仿真结果是单片机工作后,用按键给信号,四位数码管可以显示计算值出来,蜂鸣器可以正常工作。
本次设计的实物能实现的功能功能有:
(1)超声波的发射和接受控制
(2)对回波信号的检测
(3)测距时间到距离的换算
(4)距离不断测量和不断显示
(5)对距离进行判断,并且蜂鸣器报警
第4 章 课程设计心得体会和总结
4.1
心得体会
心得:这两个星期是一个不断发现问题和解决问题的过程,从调研选题背景意义,了解了超声波测距仪的工作原理及其发展,感觉上通过单片机控制是一个相对简单的过程没有什么弯路要走。确定方案,购买元件的时候就发现有很多的实际问题,由于第一次实际做一些东西出来,总觉得不知道从什么地方下手,这个时候小组合作就显得格外重要,大家一起讨论,给出不同的意见,完善各自的方案,了解更多实际电路要考虑到的问题,电阻的限流作用,单片机工作的电压电流,电阻选多大,电容选多大,这些对电路都是有影响的,选的不对很可能就把单片机烧坏。每天都会有新的问题,解决完一个就会发现那不是结束仅仅是一个开始。焊接电路是一项需要有耐心的过程,一不小心就会犯错,那是万万不允许的,所以必须检查每一个焊接点,刚开始做必然做的不太娴熟,焊接的也不太美观,但最也算是完成了。调试电路是最头疼的,一开始不知道是电路的问题还
是程序的问题。这次我们用的是汇编语言,而大部分组用的是C语言,这让我们在交流程序的时候显得有些无奈,开始我们只有一个部分一个部分的慢慢调试,先从四位数码显示部分开始,这部分知道电路连接正确应该就不会有问题。然后我们测蜂鸣器是否工作正常。最后遇到问题是发现超声波接收和发射模块不能正常工作,找了很多原因,都不行。后来恍然大悟,是我们在一开始是就把超声波发射和接收模块的时间开始和接受弄错了,所以计算的时间总是错的。完成能测距的这一基本任务让我们有了信心去做接下来的报警功能。对于我们这个超声波测距模块,要弄清楚每一个环节的工作原理,才能进行电路设计及程序编写。
4.2 总结
总结:我们使用stc12c5a60s2单片机控制,hc-sr04超声波发射和接受模块辅助测量,在四位数码显示管显示结果,蜂鸣器报警,这是整个超声波测距系统的主要四个部分。测量范围在2cm到300cm之间。由于经验不足,最后的成品能虽然实现测量和报警的功能,但是任然有很多不足的地方,电路排版焊接不美观,电路测量的有效性不够强,程序的稳定性容错性都存在问题。程序在努力改进后还需加强。本次课程设计学习到很多,对课本原理性的内容更是加深理解。对实践动手能力有了很大的锻炼和提高。
附录1
课程设计仿真图
图9 仿真电路
附录2
课程设计实物图
图10 实物图
附录3
程序设计代码
; 基于STC12C5A60S2单片机超声波测距系统
; 测量范围35-300厘米
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 中断入口程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H
ORG 000BH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 主 程 序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
START: MOV R0,#70H ;立即数70H送寄存器R0中
MOV R7,#0BH ;立即数0BH送寄存器R7中
MOV 20H,#00H ;立即数00H送20H单元中
CLEARDISP: MOV @R0,#00H ;立即数立即数00H送R0中的地址单元中 INC R0 ;寄存器R0加1
DJNZ R7,CLEARDISP;寄存器中的数值减1非零时转移
MOV TMOD,#01H ;置定时器T0工作方式样3,对内部机器周期计数
CJZCX: MOV TL0,#00H ;装入定时器初值
MOV TH0,#00H
MOV R0,#0FH
MOV R1,#5bH
puzel:MOV 14H,#08H ;超声波发射持续200us
Here:CPL P3.5 ;输出40kHz方波
NOP ;
NOP ;
NOP ;
DJNZ 14H,Here ;
QBA:JB P3.7,QBC ;等待1跳到QBC
DJNZ R1,QBA
DJNZ R0,QBA
QBC:SETB TR0 ;测到1开始计时
SETB P3.2
QBB:JNB P3.7,QBD ;等待0跳到QBD
JMP QBB
QBD:CLR P2.3 ;测到0关闭计时
CLR TR0
MOV 70H,TL0
MOV 71H,TH0
MOV R2,71H
MOV R3,70H
MOV R6,#11H
MOV R7,#0H
LCALL MULD
MOV R6,#64H
MOV R7,#0H
LCALL DIVD
MOV 73H,R2
MOV R3,#0H
MOV R4,#0H
MOV R5,#0H
MOV R6,73H
MOV R7,74H
LCALL HB2
MOV A,R4 ;分离BCD
MOV B,#10H
DIV AB
MOV 78H,A
MOV 77H,B
MOV A,R5
MOV B,#10H
DIV AB
MOV 76H,A
MOV 75H,B
MOV 7AH,#0FFH
XXX:LCALL DISPLAY
LCALL WARNING
DJNZ 7AH,XXX
AJMP CJZCX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 乘34程序(乘声速) ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MULD: MOV A,R3 ;计算R3乘R7
MOV B,R7
MUL AB
MOV R4,B ;暂存部分积
MOV R5,A
MOV A,R3 ;计算R3乘R6
MOV B,R6
MUL AB
ADD A,R4 ;累加部分积
MOV R4,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2 ;计算R2乘R7
MOV B,R7
MUL AB
ADD A,R4 ;累加部分积
MOV R4,A
ADDC A,B
MOV R3,A
CLR A
RLC A
XCH A,R2 ;计算R2乘R6
MOV B,R6
MUL AB
ADD A,R3 ;累加部分积
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 除100程序(除法) ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DIVD: CLR C ;比较被除数和除数
MOV A,R3
SUBB A,R7
MOV A,R2
SUBB A,R6
JC DVD1
SETB OV ;溢出
RET
DVD1: MOV B,#10H ;计算双字节商
DVD2: CLR C ;部分商和余数同时左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C ;保存溢出位
CLR C
SUBB A,R7 ;计算(R2R3-R6R7)
MOV R1,A
SUBB A,R6
ANL C,/F0 ;结果判断
JC DVD3
MOV R2,A ;够减,存放新的余数
MOV A,R1
MOV R3,A
INC R5 ;商的低位置一
DVD3: DJNZ B,DVD2 ;计算完十六位商(R4R5)
MOV A,R4 ;将商移到R2R3中
MOV R2,A
MOV A,R5
MOV R3,A
CLR OV ;设立成功标志
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; BCD转换 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
HB2: CLR A ;BCD码初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;转换双字节十六进制整数
HB3: MOV A,R7 ;从高端移出待转换数的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD码带进位自身相加,相当于乘2
ADDC A,R5
DA A ;十进制调整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;双字节十六进制数的万位数不超过6,不用调整
DJNZ R2,HB3 ;处理完16bit
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 报警程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WARNING: MOV R6,#10
MOV A,78H
CJNE A,#00H,B1
LJMP W1
B1: SUBB A,#01H
CJNE A,#00H,B2
LJMP W2
B2: SUBB A,#01H
CJNE A,#00H,B3
LJMP W3
B3: SUBB A,#01H
CJNE A,#00H,B4
LJMP W4
B4: LJMP W5
RET
W1: CPL P3.6 ;蜂鸣器驱动电平取反
MOV R7,#28
DE1: DJNZ R7,DE1
DEC R6
CJNE R6,#00,W1 ;反复循环
RET
W2: CPL P3.6 ;蜂鸣器驱动电平取反
MOV R7,#228
DE2: DJNZ R7,DE2
DEC R6
CJNE R6,#00,W2 ;反复循环
RET
W3: CPL P3.6 ;蜂鸣器驱动电平取反
MOV R7,#428
DE3: DJNZ R7,DE3
DEC R6
CJNE R6,#00,W3 ;反复循环
RET
W4: CPL P3.6 ;蜂鸣器驱动电平取反
MOV R7,#628
DE4: DJNZ R7,DE4
DEC R6
CJNE R6,#00,W4 ;反复循环
RET
W5: CPL P3.6 ;蜂鸣器驱动电平取反
MOV R7,#828
DE5: DJNZ R7,DE5
DEC R6
CJNE R6,#00,W5 ;反复循环
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 显示程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISPLAY: MOV R1,#78H ;立即数76H送寄存器中
MOV R5,#0FDH ;立即数FEH送寄存器R5中
PLAY: MOV A,R5 ;寄存器R5中的数值送累加器A中
MOV P2,A ;累加器A中的数值送P3口
MOV A,@R1 ;以寄存器R1中的数为地址单元的数值送累加器中
MOV DPTR,#TAB ;16位地址送地址寄存器中
MOVC A,@A+DPTR ;以中的地址为基地变址寻址单元中的数送累加器
MOV P1,A ;累加器A中的数值送P1口
MOV R6,#14H ;立即数据14送寄存器R6中
DL1:MOV R7,#19H ;立即数据19送寄存器R7中
DL2:DJNZ R7,DL2 ;寄存器中的数据减1,不为零时则转移 DJNZ R6,DL1 ;寄存器中的数据减1,不为零时则转移 DEC R1 ;寄存器R1中的数值加1
MOV A,R5 ;寄存器R5中的数值送累加器A中
JNB ACC.3,ENDOUT ;地址位为0则转到ENDOUT
RL A ;累加器循环右移
MOV R5,A ;累加器A中的数值送寄存器R5中
AJMP PLAY ;绝对短转移
ENDOUT: SETB P3.5 ;置P3.5口
RET ;返回
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,088H EEE: END ;结束