//display(1234); Echo=0;
while(Echo==1);
//display(2244); TR1=0;
//EX0=1;
EX0=0; //关闭外部中断
distance=MeasuringDistance(timeH,timeL); while(1) {
display(distance); } } }
四.设计中的问题及改进
部分故障分析:
1、中间调试的时候发现数码管显示符号不清楚,利用延时和消隐顺利解决。
2、电路改进:
1、在proteus中发现没有超声波传感器,因此我们选择了用一个用电容和电阻来代替和模拟,通过滑动变阻器来调节距离的远近。
2、在第一次调试的时候发现数码管上没有显示,发现是因为没有在之间加上一个电阻,调整后得到了解决。
五.总 结
6
此次设计我受益良多。首先,我懂得了查阅资料的必要性。在做本次 实习的过程中,我感触最深的当属查阅大量的设计资料了。为了让自己的 设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少 的。与此同时,在实验设计过程中,我们也学习到了很多知识,学会了如何寻找问题的思路,学会了如何发现和解决问题,这对我们以后的学习有着重要的帮助。实验设计的劳动成果,会让我们受益终身。在今后的学习过程中,我相信我们会做的更好的。 六.源代码
#include
#define uint unsigned int //定义变量类型 int i,j;
sbit Trig = P2^0; sbit Echo = P3^2; //sbit a4=P1^1; sbit a2=P1^2; sbit a1=P1^3;
sbit a3=P1^4;//数码管的位 sbit test=P1^6;//位定义
uint succeed_flag,time,timeH,timeL; uint distance; Unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //确定数码管数字
//char table[80];
void delay(uint z)//自定义延时函数 {
uint x,y;
for(x=z;x>0;x--) for(y=110;y>0;y--); }//延时函数
void delay_20us()//延时
7
{
uchar a;
for(a=0;a<16;a++); }
unsigned int MeasuringDistance(uint timeH,timeL)//计算距离 {
time=timeH*256+timeL; distance=(time*17)/1000; return distance; }
void display(uint temp)//将距离在数码管上显示 {
uchar one,two,three; one=temp/100;
two=(temp0)/10; three=temp; a1=a2=a3=1; a1=0;
P0=table[one]; delay(5); P0=0xff;
a1=a2=a3=1; a2=0;
P0=table[two]; delay(5); P0=0xff;
a1=a2=a3=1; a3=0;
P0=table[three]; delay(5); P0=0xff; }
void main() //echo输出响应 {
//test =0; Trig=0; Echo=0; EA=1;
TMOD=0x10; while(1) {
8
EA=0; Trig=1;
delay_20us();//延时等待 Trig=0;
while(Echo==0); succeed_flag=0; EA=1; //开启总中断 TH1=0; TL1=0;
EX0=1; //开启外部中断 TR1=1; TF1=0;// //delay(200); //display(1234); Echo=0;
while(Echo==1);
//display(2244); TR1=0;
//EX0=1;
EX0=0; //关闭外部中断
distance=MeasuringDistance(timeH,timeL); while(1) {
display(distance); } } }
void exter() interrupt 0 {
timeH =TH1; timeL =TL1; succeed_flag=1; EX0=0; } //外部中断
void timer1() interrupt 3 {
//TH1=0; //TL1=0;l }//定时器中断
七.电路图
9
四段数码管接线图
六、参考文献
[1] 超声波测距HC-SR04用户手册
[2].单片机原理与应用(C语言版) .北京人民邮电出版社 ,2013
10