射回来的这阶段时间,来对单片机超声波测距单片机系统进行模拟。或者用芯片加程序来实现接收信号经过时延后再返回信号来实现,这就是这次仿真使用的方法,在第二部分使用时延程序来实现。左边两个按键是用来控制时延程序的时延间隔(加·减),这样间接达到了测量距离的加减。还有个问题是:在protues默认的电源电压是5v,所以不用设置。 3.3.2 PCB印刷电路板图(不含发射和接收模块)
经过仿真后能实现了预定功能所以电路和程序应该没什么大问题,接下来就是印制电路版。
总的原件清单:7*9万用板、HC-SR04超声波模块、STC89C51单片机、74hc573、40P IC座、20P IC座、4p母座、四位一体共阴数码管、9012三极管*5、2.2k电阻*5、220Ω电阻*8、10k电阻、5V有源蜂鸣器、103排阻、10uf电解电容、30pf瓷片电容*2、12MHZ晶振、按键*3、自锁开关、DC电源插口、导线若干、焊锡若干、USB电源线或电池盒+DC电源插头、接收超声波换能器ucm-r40k1、发送超声波换能器ucm-t40k1,超声波接收集成CX20106A芯片,6非门(反相器)HD74LS04P 外部中断入口3.3.2软件部分:
运用keil软件进行C语言编程超
进入外部中断0声波发生子程序的作用是通过
INT1端口发送两个左右的超声波脉冲信号(频率约40KHz的方波),读取THO*256时间值+TLO脉冲宽度为12μs左右,同时把计
Y数器T0打开进行计时。
超声波测距器主程序利用外计算距离中断0检测返回超声波信号,一旦接收到返回超声波信号(即INT0
结果送显示并报警提示引脚出现低电平),立即进入超声
波接收中断程序。就立即关闭计时器T0,停止计时,并将测距成功标志字赋值1。如果当计时器溢出时开外部中断还未检测到超声波返回信号,则定 时器T0溢出中断将外中断0关闭,
返回并将测距成功标志字赋值2,
图1-10主程序流程图 以表示本次测距不成功。
图1-11 超声波子程序流程图
9 页 第
4.1超声波测距程序清单: #include
第 10 页
//正常显示 if(Mode==0) {
P0=0x00; //关闭显示
if(posit==0)//数码管的小数点 {
P0=(discode[disbuff[posit]])|0x80;//按位或,最高位变为1,显示小数点 } else {
P0=discode[disbuff[posit]]; }
P1=positon[posit];
if(++posit>=3) //每进一次显示函数,变量加1
posit=0; //加到3时清零 }
//报警显示 else {
P0=0x00;
if(posit==0)//数码管的小数点 {
P0=(discode[disbuff_BJ[posit]])|0x80;
}
else if(posit==3) {
P0=0x76; //显示字母 } else {
P0=discode[disbuff_BJ[posit]]; }
P1=positon[posit]; if(++posit>=4) posit=0; } }
/**********************************/ //计算
void Conut(void) {
time=TH0*256+TL0; //读出T0的计时数值
TH0=0;
TL0=0; //清空计时器
S=(time*1.7)/100; //算出来是CM
if(Mode==0) //非设置状态时 {
if((S>=700)||flag==1) //超出测量范围显示“-” {
Feng=0; //蜂鸣器报警 flag=0;
disbuff[0]=10; //“-” disbuff[1]=10; //“-” disbuff[2]=10; //“-” } else {
//距离小于报警距 if(S<=BJS) {
Feng=0; //报警 }
else //大于 {
Feng=1; //关闭报警 }
disbuff[0]=S00/100; //将距离数据拆成单个位赋值
disbuff[1]=S000/10; disbuff[2]=S00 ; } } else {
Feng=1;
disbuff_BJ[0]=BJS00/100;
disbuff_BJ[1]=BJS000/10;
disbuff_BJ[2]=BJS00 ; } }
/***********************************/ //定时器0
void zd0() interrupt 1 //T0中断
第 11 页
用来计数器溢出,超过测距范围 {
flag=1; //中断溢出标志 {
TMOD=0x11; //设T0为方式1,GATE=1; }
/***********************************/ //定时器1
void zd3() interrupt 3 //T1中断 用来扫描数码管和计800MS启动模块 {
TH1=0xf8;
TL1=0x30; //定时2ms Key_(); //扫描按键 Display(); //扫描显示 timer++; //变量加
if(timer>=400) //400次就是800ms {
timer=0;
TX=1; //800MS 启动一次模块 _nop_(); _nop_(); } _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TX=0; } }
/***********************************/ //主函数
void main(void)
第 12 页TH0=0;
TL0=0;
TH1=0xf8; //2MS定时 TL1=0x30;
ET0=1; //允许T0中断 ET1=1; //允许T1中断 TR1=1; //开启定时器
EA=1; //开启总中断
while(1) {
while(!RX); //当RX为零时等待 TR0=1; //开启计数 while(RX); //当RX为1计数并等待 TR0=0; //关闭计数 Conut(); //计算 }
4.2焊接电路(两人一起)
按照这个图焊接,红色的为跳线。
4.3电路调试与分析
供电电路是否正常是系统能否正常工作的前提,因此首先对电源部分进行调试,接上电源,测得电源电压输出应该是5V。并且测得外部中断1口的输出信号频率为38.46 KHz,接近40 KHz,满足实际要求。超声波测距仪制作与调试,其中,超声波发射与接收采用Φ15超声波换能器TCT40-10F1(T发射)与TCT40-10S1(R接收),中心频率是40kHz,安装的时侯应保持两换能器的中心轴线平行不变且相距4~8cm,其余的元件便无特殊要求。若是将超声波的接收电路能用金属壳屏蔽起来,便会提高其抗干扰能力。根据测量的范围要求不同,可适当调整和接收换能器并接入的滤波电容C4大小,以便获得更合适的接收灵敏度与抗干扰能力。
硬件电路制作完成并调整好后,便可将程序编译好下载到单片机运行。根据实际情况,可以修改超声波发生子程序每次发送的脉冲个数和两次测量的间隔时间,以适应不同距离的测量需要。
4.4预期达到的目标
1.实现超声波测距仪超声波放送的成功 2.实现超声波测距仪接收的功能 3.用动态扫描法实现LED数字显示
4.测距在1米内,显示变化范围小,精确度较高,大于1米后,显示变大,误差高。 5.报警系统工作正常,报警范围可以正常调节。
第 13 页
5.实习总结:
眼看为期三周的计算机辅助综合设计实习就要结束了,今天回想一下自己在这个实习中所得到的和在这过程中所解决的问题。从一开始得到实习通知,接着是分组和选题目。我这组就选了超声波测距,本以为这是别人做最多的项目,那么很容易做,但是去网上查资料时,才发现资料了是满天飞,虽然方案很多,但是这正是迷茫之处,那个方案好,那个更精准,那个更适合参考与我们的要求。当方案决定了之后,就是仿真。仿真可说是真正第一次接触,之前用的都是表面的功能。边学边做,每找个原件都是通过百度查找,不过通过几天早起晚睡,还是把它做好了。画pcb就比较容易一点了,因为之前比较熟练的用过dxp了。
问题真是在实践中才更能发现,我们是用蒸汽熨斗来印制pcb的,由于印制时间和方式不正确,导致印制效果不好。于是用纱布察干净后中新印,但是在腐蚀的时候又出了问题,有些地方的铜一早就腐蚀完了,而有些地方的铜怎么腐蚀也腐蚀不掉。分析原因:1.铜板在一直之前没有把氧化膜擦干净;2.印制时间过长,导致铜面受人过久。3.浸泡时没有不停的摇溶液。第二次是通过pdf去打印pcb,接过整体小了一点点,可是输出是按1:1比列了。第三次做的时候就成功了,焊接基本上没什么问题。难的是程序,查了很多资料并且自己也修改了好多次,才能对应上。成品所能实现的功能:距离测试,距离显示(通过数码管,单位是cm),距离小于警报范围(通过三个按键来调节大小),蜂鸣器会响。如果距离超过700cm,即超过测距范围,警报也会响。
回顾这三周实习,有优也有喜。优在成品没有想象中的那么好,精确度不高,变换较大。喜在通过十几天的努力,最终成品出来了,能实现基本功能。通过这次实习,我知道了如何对要解决的问题建立系统的分析,通过团队合作和分工来完成。现在更发现自己有太多东西不懂,以后得更加强知识的积累和实践的结合。
第 14 页