资源描述
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
展开阅读全文