收藏 分销(赏)

北邮基于单片机的超声波测距附源代码.doc

上传人:二*** 文档编号:4516557 上传时间:2024-09-26 格式:DOC 页数:20 大小:1.58MB 下载积分:5 金币
下载 相关 举报
北邮基于单片机的超声波测距附源代码.doc_第1页
第1页 / 共20页
本文档共20页,全文阅读请下载到手机保存,查看更方便
资源描述
2013年小学期单片机设计实验报告 题目:基于单片机的超声波测距 班 级: 班内序号: 实验组号: 学生姓名: 指导教师: 实验摘要 本次实验我们制作的超声波测距仪主要实现的功能是非接触式测距,应用于测量环境处于黑暗、有灰尘,烟雾,有毒的情况下的距离测量,利用超声波的直线传播性,较低速性,便于发射和接收,有较高的分辨率和精准度。 整个系统中,微控制器采用了Microchip公司的PIC16F877,软件设计中涉及Rc1、RB4用作超声波发射和接收管脚和LCD1602液晶显示屏用作显示测量结果。本实验用单片机RB4管脚产生高电平使发射电路使能发射超声波,并开始计时,当接收电路接收到超声波后,电平由高变低,送入到单片机Rc1管脚,发送中断请求,停止计时,计算出超声波传播距离,实现测距。 其中发射电路由NE555电路40KHz超声波发生模块和由CD4069反相器构成的信号推挽放大模块组成,接收电路由CX20106模块组成。 概括来说,本实验就是用单片机通过记录超声波发射接收时间,并以此计算出距离。 Abstract In this experiment we produce ultrasonic range finder functions of the main non-contact distance, used in the measurement environment is dark, dust, smoke, toxic case of distance measurement, using an ultrasonic wave transmission line resistance, low speed , ease of transmitting and receiving, a higher resolution and accuracy. Throughout the system, the microcontroller uses Microchip's PIC16F877, software design involves Rc1, RB4 for transmitting and receiving ultrasonic LCD1602 LCD monitor as a pin and display the measurement results. The experimental chip produces high RB4 pin enables the emission of ultrasonic transmitter circuit and start the timer, when the receiving circuit receives the ultrasonic waves, the level from high to low, Rc1 fed to the microcontroller pin interrupt request is sent, stop time, calculated from the ultrasonic wave propagation, to achieve ranging.       Wherein the transmission circuit from 40KHz ultrasonic NE555 circuit CD4069 inverter module and constituted by a push-pull signal amplification module, the receiving circuit by the CX20106 modules. In summary, the present study is to use the microcontroller through the recording ultrasonic transmitting and receiving time, and thus calculate the distance. 关键字 单片机——microcontroller 芯片——CMOS chip 超神波——Ultrasonic wave 计时计算——Timing and calculation 一. 实验论证与比较 1.超声波发射模块 超声波测距的发射电路作用是有效发生较强的超声波寻向被测物,以供接收电路接收,其由NE555电路40KHz超声波发生模块和由CD4069反相器构成的信号推挽放大模块组成。如图1所示: 图1 1.1其中控制电路和震荡电路由555基本电路组成,这基本电路能通过改变电阻和电容的值可以改变频率和占空比。如图2 图2 555多谐振荡电路的脉冲宽度TL由电容C 的放电时间来决定: TL≈0.7R2C TH由电容C 的充电时间来决定: TH≈0.7(R1+R2)C 输出振荡信号的周期为: T = TL + TH 频率为: 输出脉冲占空比为: 若调整可调电阻VR1,可改变输出矩形波的频率和占空比。 当调整VR1使得输出为40kHz时,由于(VR1+R4)>>R3,输出波形占空比约为50%,为近似理想对称方波。 555的强制复位端4脚由另一个555低频振荡器的输出取反后控制。 1.2本电路采用CMOS六反相器CD4069构成驱动电路,为了增大驱动电流,可以采用CD4069中两个甚至三个方向器并联的方式实现。 此电路结构称为桥式驱动方式,由于超声波传感器具有高阻特性,其正常工作时需要一定的驱动电流,而每个反相器的输出电流(负载能力)是一定的。两个并联,输出电流加倍,驱动能力提高 图3 2. 超声波接收模块 接收模块是通过cx20106a芯片和相应的的接收电路实现的。其电路如图4 图4 Cx20106a的各管脚功能如下图 图6 以上资料摘自cx20106a的使用资料。 在以上网上提供的电路参数基础上,我们通过使用示波器调整R的阻值,使其接收的中心频率为40KHz左右 二.系统总体设计 系统模块总体框图如下: 发射电路 接收电路 单片机系统 液晶显示 障碍物 整个系统开始工作后,发射电路向障碍物发射1ms的超声波,间歇64ms后再发射一次,如此循环发射电磁波。而接受电路一旦接收到障碍物反射回来的超声波,输出管脚7电位由高变低,单片机跳入中断,根据所计时计算出距离,并在显示屏上显示。 软件设计框图如下: N 若接收到超声波,计时停止, 寄存器将TMR0的值储存 RB4赋值为1,开始发射超声波,tmr0开始计时 Y 是否按下总开关? 数据经过乘法器和编码转换器,转换成8421BCD码送显 三.硬件连接 ⒈发射接收模块连接 整个发射接收电路在面包板上撘出,各个元器件的值起初都用电路图所示的值。然后进行调试,根据发射电路原理,利用示波器,调试R1和R2的值,使发射的超声波频率为40khz,占空比为50%。根据接收电路,利用信号发生器发射40khz信号,调测接收电路输出端由高电位变成地点位。然后进行整体调试,及发射电路发射超声波,接收电路接收,并输出低电平。 ⒉发射接收模块和单片机连接 本实验中应用单片机RB4管脚产生高电平使发射电路使能发射超声波,并开始计时,当接收电路接收到超声波后,电平由高变低,送入到单片机Rc1管脚,发送中断请求,停止计时,计算出超声波传播距离,实现测距。 整个系统连接模块如下: 单片机PIC16F877 发射模块 RB4 液晶显示 接收模块 RC1 四.调试过程 这部分是由搭档林负责,摘自他报告。 ⒈开始软仿真时RB0总是无法清0 在刚开始做软仿真时,出现了RB0无论用任何语句,在WATCHWINDOW下观察均无法使之清0的麻烦,后经过询问老师问题得到解决,原来是在设置为输入管脚的前提下,外部语句是无法对寄存器值进行修改的。 2.单片机始终无法下载 在开始阶段用单片机仿真时,总是出现OPERATION PROBLEM相关的字样,导致下载不成功。更有一次单片机不停发热,最终导致单片机损坏。后来发现是单片机与插槽接触不良,经过不断断电调整问题得到解决。 3.软仿真没问题,但硬仿真总是莫名其妙的跳到中断 这个问题困扰了我整整一上午,这个问题很难被察觉,因为在软仿真上没有出现任何逻辑错误,但在硬仿真时却连总开关的作用都没起到就跳到了中断。后来经过反复排查,发现是单片机的RB6和RB5两脚损坏,电平不稳导致单片机跳到RB中断,经过更换单片机问题得到解决。 4.在跳出中断是总是马上又回到中断 在软仿真时,出现了永远在中断中循环,无法进行后面语句的问题。后来经过排查反思,发现是中断标志位一直赋值为1,经过软件清0,问题得到解决。 5.在送往显示器时遇到了一定困扰 因为计算出的数字在寄存器内是以2进制数的形式表示的,而在液晶屏的代码中仅与相应数字的十进制有关,这对送显造成了极大的困扰。后来经过查阅资料,想到了先把二进制码转化为8421BCD码然后通过筛选前后四位来分别送显,问题得以解决。 五.参考文献: PIC单片机实用教程——基础篇 北京航空航天大学出版社 使用说明:的确是一本不可或缺的教材,本书列举了很多实用的具有实战意义的例子,单片机入门就是通过把这本书里的好例子一字一行敲进电脑去来实现的。 PIC单片机实用教程——提高篇 李学海 北京航空航天大学出版社 使用说明:继承了前面基础篇的风格,例子也具有实战意义,主要讲RA、TMR2的使用和CCP模块的PWM脉宽调制功能。 六.实验心得体会 整个实验过程历时15天左右,刚刚开始的时候,对单片机没什么概念,不得头绪,无从下手。听学长学姐们介绍说,单片机实验其实很有趣,也比较“热血”,想想自己能亲手做出一个能实现简单功能的小应用产品,对于我们以前只是从课本中得来而不常动手实践的来说,绝对是一件增长知识,锻炼能力的事。后经过老师们对实验的简单介绍,我们有了一个初步了解,也表现的信心满满。 在确定要做的实验题目时,我和我的搭档有些分歧,我坚持做这个超声波测距,而林小斐觉得做电子琴或音乐发生器什么的比较简单,容易完成,而超声波测距容易受外界干扰,不易出结果。于是我和他交流,说简单的人人都愿意做,就没有什么挑战性,并且对于这个小学期,我对自己还是很有期望的,希望能做的比较好,不能应付了事。最后我们达成一致意见,决定做这个实验。 我主要负责实验中硬件的部分,设计电路,搭电路,调试电路,焊电路。等等一体手工工作由我负责,而林小斐负责程序部分,前期我们双管齐下,很快就把电路和程序都给弄出来了,到了调试的时候,发现接收电路出现一个问题,就是通过信号发生器发生的信号加在接收电路中有正常现象出现,即能输出方波,然而整机调试时就是接收不到超声波信号,经过多次尝试,多次更换元器件,仍然没有效果。在这个问题上我们停滞了两天,由于时间的原因,我们及时改变方案,转换了思路,采用cx20106a芯片作为接收电路。虽然,我们没有找出先前的接收电路有什么问题,但我们尝试了在有问题时另辟蹊径,及时找到替代方案。我们体会到在解决问题是要多方面考虑多角度入手,只要能符合工程要求就可以,具体什么途径都是可行的,不能拘泥一条路,要综合考虑时效性,工作量,选择最佳途径。 到后期,实验进程就比较顺利了。焊电路,几乎是一次就成功了,加上单片机调试时,也更是一次就成功了,虽然结果,所测距离不太尽人意。但是还是很让我们鼓舞,我们从这里深深体会到,合作分工,每个人都要认真负责,专注做好自己的那部分,这样才能马到成功,如果两个人都很敷衍,出现问题互相指责对方,那一定得不到结果的。还有就是遇到问题要冷静,要让问题成竹于胸,如果出现问题都不知道如何入手,那就说明前面的工作都是不靠谱的,不值得信赖的,因为你压根不知道自己在做一些什么。 在这个两个礼拜里,两位老师也辛苦了,对待学生非常和蔼,非常耐心。有时候连我们自己拿着问题去问老师时,自己都要觉得老师应该要被我们问毛了,可谁知老师们态度非常好,非常耐心的给我们解决问题,而且两位老师在教学上非常专业,所以一直很钦佩两位老师。我想对你们说一句,你们辛苦了,谢谢老师。 验收时,由于操作不当,在我手上坏了一个显示屏,一个单片机。真是不应该,细心点也就不会了,不过我还在心里调侃自己,小学期嘛,不坏几个东西,也学不到什么东西,呵呵。不过还是要吸取教训,下次实践时,注意些,多留点心。 总的来讲,小学期还是学到了很多的,不仅仅是单片机的简单应用。还学会了如何合作,如何找到问题,解决问题。还亲自自己动手焊了一块像样的板子,自己感觉还是不错的。小学期,受益匪浅呐! 附汇编语言源代码 N EQU 20H ;define N M EQU 21H ;define M COUNT EQU 22H ;define COUNT tmr0 EQU 01H option_reg EQU 81H intcon EQU 0BH mulcnd equ 30h ; 8 bit multiplicand mulplr equ 31h ; 8 bit multiplier H_byte equ 32h ; High byte of the 16 bit result L_byte equ 33h ; Low byte of the 16 bit result stepcounter equ 34h ; loop counter porta EQU 05h trisa EQU 85h portb EQU 06h trisb EQU 86h portc EQU 07h trisc EQU 87h status EQU 03h rp0 EQU 5 flag EQU 23H CNT EQU 43H TEMP2 EQU 44H TEMP3 EQU 45H INDF EQU 00H FSR EQU 04H TEMP1 EQU 46H R2 EQU 47H RLT EQU 40H SOUH EQU 41H SOU EQU 42H showport1 EQU 50H showport2 EQU 51H showport3 EQU 52H showport4 EQU 53H showport5 EQU 54H showport6 EQU 55H porte equ 09h trise equ 89h portd equ 08h trisd equ 88h adcon1 equ 9fh count1 equ 60h count4 equ 61h ;**********************fuwei***************************** org 000h nop goto main ;************************zhongduan******************** org 004h btfss intcon,0 retfie bcf intcon,0 movf tmr0,0 movwf COUNT goto calculate retfie ;**********************zhuchengxu************************ org 0010h main bsf status,rp0 ;ti1 movlw 000h movwf trisb bcf status,rp0 ;ti0 movlw 000h movwf portb bsf status,rp0 ;ti1 movlw 007h movwf option_reg movlw 0FFh movwf trisb movlw 0 movwf trisc movlw 0 movwf trisd movlw 0 movwf trise bcf status,rp0 ;ti0 bcf intcon,5 bcf intcon,0 bcf intcon,4 bsf intcon,3 bcf intcon,6 movlw 000h movwf portc call init nop check btfsc portb,0 ;if rb0=0,step over goto check CLRF COUNT movlw 000h movwf tmr0 bcf intcon,0 bcf intcon,0 bsf intcon,7 bsf portc,1 a goto a ;****************************************************** calculate movf COUNT,0 movwf mulcnd movlw d'43' movwf mulplr call mpy_S ;*********************chengfa**************************** mpy_S clrf H_byte clrf L_byte movlw 8 movwf stepcounter movf mulcnd,0 bcf status,0 ; Clear the carry bit in the status Reg. loop rrf mulplr btfsc status,0 addwf H_byte,1 rrf H_byte,1 rrf L_byte,1 decfsz stepcounter goto loop goto bianhuan retlw 0 ;***************************bianhuan*********************************** bianhuan movf H_byte,0 movwf SOUH movf L_byte,0 movwf SOU DBTBCD MOVF SOU,0 MOVWF TEMP2 MOVF SOUH,0 MOVWF TEMP3 CLRF SOU CLRF SOUH CLRF RLT BCF status,0 MOVLW .16 MOVWF CNT LOOPC1 RLF TEMP2,1 RLF TEMP3,1 RLF SOU,1 RLF SOUH,1 RLF RLT,1 DECFSZ CNT,1 GOTO ADJDEC1 nop GOTO getshowport ;整个子程序结束 ADJDEC1 MOVLW SOU MOVWF FSR CALL ADJBCD1 ;调整RLT MOVLW SOUH MOVWF FSR CALL ADJBCD1 ;调整RLTH MOVLW RLT MOVWF FSR CALL ADJBCD1 ;调整TEMP1 GOTO LOOPC1 ;********************调整BCD******************** ADJBCD1 MOVLW 03H ADDWF INDF,0 ;低四位加3 MOVWF TEMP1 ;暂存 BTFSC TEMP1,3 ;结果大于7, MOVWF INDF ;则存起来 MOVLW 30H ADDWF INDF,0 ;高四位加3 MOVWF TEMP1 BTFSC TEMP1,7 ;结果大于7, MOVWF INDF ;则存起来 RETLW 0 getshowport movf RLT,0 ANDLW 00FH IORLW 030H movwf showport2 SWAPF RLT,0 ANDLW 00FH IORLW 030H movwf showport1 movf SOUH,0 ANDLW 00FH IORLW 030H movwf showport4 SWAPF SOUH,0 ANDLW 00FH IORLW 030H movwf showport3 movf SOU,0 ANDLW 00FH IORLW 030H movwf showport6 SWAPF SOU,0 ANDLW 00FH IORLW 030H movwf showport5 goto show ;****************************************************** show movlw d'8' movwf count1 movlw d'1' movwf count4 bsf status,5 clrf trisd clrf trise movlw 0x06 movwf adcon1 bcf status,5 bcf porte,0 call delay10ms call init circle1 call vshow call delay10ms call sshow call delay10ms goto circle1 ;----------------------------------------------- init bcf porte,0 call delay10ms movlw b'00110000' movwf portd call down call delay10ms movlw b'00110000' movwf portd call down call delay10ms movlw b'00110100' movwf portd call down call delay10ms movlw b'00001000' movwf portd call down call delay10ms movlw b'00000001' movwf portd call down call delay10ms movlw b'00001100' movwf portd call down call delay10ms return ;------------------------------------------------ down bsf porte,1 nop nop nop nop bcf porte,1 return ;------------------------------------------------- vshow bcf porte,0 movlw b'10000000' movwf portd call down call delay10ms bsf porte,0 movlw b'01100100' movwf portd call down call delay10ms movlw b'00111101' movwf portd call down call delay10ms movf showport1,0 movwf portd call down call delay10ms movf showport2,0 movwf portd call down call delay10ms movf showport3,0 movwf portd call down call delay10ms movlw b'00101110' movwf portd call down call delay10ms movf showport4,0 movwf portd call down call delay10ms movf showport5,0 movwf portd call down call delay10ms movf showport6,0 movwf portd call down call delay10ms movlw b'01001101' movwf portd call down call delay10ms return ;---------------------------------------------------- sshow bcf porte,0 movlw 0c0h movwf portd call down call delay10ms bsf porte,0 movlw b'00110000' movwf portd call down call delay10ms movlw b'00110000' movwf portd call down call delay10ms movlw b'01000011' movwf portd call down call delay10ms movlw b'01001101' movwf portd call down call delay10ms return ;------------------------------------------------------- delay10ms movlw 0fh movwf 30h loop2 movlw 0ffh movwf 31h loop1 decfsz 31h,f goto loop1 decfsz 30h,f goto loop2 return ;------------------------- end
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服