资源描述:
《超声波测距课程设计.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、//超声波模块显示程序#include#defineucharunsignedchar#defineuintunsignedint#defineulongunsignedlongsbitTx=P3^3;//产生脉冲引脚sbitRx=P3^2;//回波引脚sbitfmq=P1^7;ucharcodeSEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9uintdistance[4];//测距接收缓
2、冲区ucharge,shi,bai,temp,flag,outcomeH,outcomeL,i;//自定义寄存器bitsucceed_flag;//测量成功标志voidconversion(uinttemp_data)//显示数据转换程序{ucharge_data,shi_data,bai_data;bai_data=temp_data/100;temp_data=temp_data%100;//取余运算shi_data=temp_data/10;temp_data=temp_data%10;/
3、/取余运算ge_data=temp_data;bai_data=SEG7[bai_data];shi_data=SEG7[shi_data]&0x7f;ge_data=SEG7[ge_data];EA=0;bai=bai_data;shi=shi_data;ge=ge_data;EA=1;}//20us延时函数voiddelay_20us(){ucharbt;for(bt=0;bt<22;bt++);}//1ms基准延时程序voiddelay1ms(unsignedinti){unsignedc
4、harj;while(i--){for(j=0;j<115;j++){;}}}//产生1KHZ频率声音的函数voidbeep(){fmq=0;delay1ms(500);fmq=1;delay1ms(500);}//主程序voidmain(void){uintdistance_data,a,b;ucharCONT_1;i=0;flag=0;Tx=0;//首先拉低脉冲输入引脚TMOD=0x11;//定时器0,定时器1,16位工作方式TR0=1;//启动定时器0IT0=0;//由高电平变低电平,触发
5、外部中断ET0=1;//打开定时器0中断EX0=0;//关闭外部中断EA=1;//打开总中断0while(1)//程序循环{EA=0;Tx=1;delay_20us();Tx=0;//产生一个20us的脉冲,在Tx引脚while(Rx==0);//等待Rx回波引脚变高电平succeed_flag=0;//清测量成功标志EX0=1;//打开外部中断TH1=0;//定时器1清零TL1=0;//定时器1清零TF1=0;//TR1=1;//启动定时器1EA=1;while(TH1<50);//等待测量的
6、结果,周期65.535毫秒(可用中断实现)TR1=0;//关闭定时器1EX0=0;//关闭外部中断if(succeed_flag==1){distance_data=outcomeH;//测量结果的高8位distance_data<<=8;//放入16位的高8位distance_data=distance_data
7、outcomeL;//与低8位合并成为16位结果数据distance_data*=12;//因为定时器默认为12分频distance_data/=58;//微秒的单位除以58等于厘米
8、}//为什么除以58等于厘米,Y米=(X秒*344)/2//X秒=(2*Y米)/344==》X秒=0.0058*Y米==》厘米=微秒/58if(succeed_flag==0){distance_data=0;//没有回波则清零}distance[i]=distance_data;//将测量结果的数据放入缓冲区i++;if(i==3){distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;a=distance_data
9、;if(b==a)CONT_1=0;if(b!=a)CONT_1++;if(CONT_1>=3){CONT_1=0;b=a;conversion(b);if(b>0&&b<200){fmq=0;delay1ms(100);fmq=1;}}i=0;}}}//外部中断0,用做判断回波电平INTO_()interrupt0//外部中断是0号{outcomeH=TH1;//取出定时器的值outcomeL=TL1;//取出定时器的值succeed_flag=1;//至成功测量的标志EX0=0;//关闭外部