超声波程序.docx
- 文档编号:4149748
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:24
- 大小:206.96KB
超声波程序.docx
《超声波程序.docx》由会员分享,可在线阅读,更多相关《超声波程序.docx(24页珍藏版)》请在冰豆网上搜索。
超声波程序
本人收藏的的一些超声波程序,希望对大家
有用(还有原理图,需要的话去我空间去
):
程序一:
#include
#defineucharunsignedchar
#defineuintunsignedint
#definecount4
uchardataIRcode[4];//定义一个4字节的数组用来存储代码uchartable[4];
ucharenled[4]={0x1f,0x2f,0x4f,0x8f};
ucharCodeTemp,temp,tt;//编码字节缓存变量uchar
i,j,k,temp,timeH,timeL,succeed_flag,flag,h,h1,h2,a,key,key1,key2;
//延时用的循环变量
uintdistance,distance1,time;//
sbitIRsignal=P3T;//HS0038
sbitcome=P3A3;
sbitd=P1A1;//发送码
sbitBZ=P1A0;
sbits=P3A7;//38k
sbitss=P3A6;//38k
ucharm;//开关控制
//sbitn=P2;//电机反转code
距离,time
接收头OUT端直接连P3.2(INT0)
unsigned
seg7code[10]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28};
显示段码
char
//
/****************************
voidtimer0()interrupt1
{
TH0=(65536-count)/256;
TL0=(65536-count)%256;s=~s;//产生38K信号ss=~ss;//
tt++;//发送超声波个数}/****************************************************/
voidDelay0_9ms(void)
定时器0中断
***********************
*/
延时0.9ms子程序
{
ucharj,k;
for(j=18;j>0;j--)for(k=20;k>0;k--);
}
/***************************
voidDelay1ms(void)
{
uchari,j;
for(i=2;i>0;i--)for(j=230;j>0;j--);
}
/***************************
voidDelay4_5ms(void)
{
uchari,j;
for(i=10;i>0;i--)for(j=225;j>0;j--);
}
/****************************
************************/
延日寸1ms了稈,序**********************/
延时4.5ms子程序*********************
程序
voidDelay(void)
{
uchari,j,k;
for(i=100;i>0;i--)for(j=100;j>0;j--)
for(k=3;k>0;k--);
}
/****************************
************************/
程序
//
延时程序
voidledDelay(unsignedinttc)
{unsignedinti,j;for(i=0;i<10;i++)for(j=0;j } /****************************************************************/ //定寸器1中断,用做超声波测距无回波 voidtimer1()interrupt3 { TR1=0; ET1=0; EX1=0; TH1=0; TL1=0; date=0; for(i=0;i<120;i++) { P2=enled[i%4]&m;//P2口高四位控制数码管,低位陪分控制继电器 P0=seg7code[table[i%4]];//取出千位数,查表,输出。 ledDelay(15); } //外部中断1,用做判断超声波回波电平说明测试成功voidint1()interrupt2//外部中断1是0号{ EX1=0;//关闭外部中断1 TR1=0; ET1=0; succeed_flag=1;//测试成功标志 voidsound() {ET0=1;TR0=1;//开38K超声波输入端while(tt! =1);//发送几个脉冲的超声tt=0;//清零重新计数 ET0=0;TR0=0; tt=0;//清零重新计数 TF1=0;//计数溢出标志 TH1=0;//定时器1清零 TL1=0;//定时器1清零 ET1=1;//开定时器1 TR1=1;//启动定时器1 EX1=1;//打开外部中断1succeed_flag=0; while(EX1==1);//等待回波标志if(succeed_flag==1)//测试成功 {time=TH1*256+TL1;//回波响应时间distance=time*1.72/100;//换算成路程 Led(distance);//显示测到的距离 EX1=1;//开中断1 } if(succeed_flag==0)//测试不成功或超出时间 { Led(3333);//表示测不到回波 } } voidint0(void)interrupt0using2{ EA=0;//? ? ? 的读取for(k=0;k<10;k++){ Delay0_9ms();if(IRsignal==1)// {k=10;break;}elseif(k==9)//明是引导码 {while(IRsignal==0);Delay4_5ms();//for(i=0;i<4;i++)// {for(j=1;j<=8;j++)//{ while(IRsignal==0);//0.56ms的低电平(接收时)是代码 Delay0_9ms();// 为0.9介于0.56(=1.125-0.56)与1.69(=2.25-0.56)之间),再判断IRsignalif(IRsignal==1)//如果IRsignal是"1",高位置"1",并向 右移一位 { Delay1ms();//为什么要延时1ms呢? 因为要使IRsignal 跳至低电平(即0.56ms的0与1相同部分上) CodeTemp=CodeTemp|0x80;//此处的算法很好 if(j<8)CodeTemp=CodeTemp>>1; } elseif(j<8) {CodeTemp=CodeTemp>>1;}//如果IRsignal是"0",则直接向右移一位,自动补"0" { case69: m=0xfe;break;//电机上升 case70: m=0xff;break;//电机停止 case71: m=0xfc;break;//电机下降 case22: a=0;break; case25: key=1;break;//功能键 case12: a=1;;break; case24: a=2;;break;case94: a=3;;break;case8: a=4;;break;case28: a=5;;break;case90: a=6;;break;case66: a=7;;break;case82: a=8;;break;case74: a=9;;break; } EA=1;//开总中断 } I***************************************************************** voidinitUart(void) { TMOD|=0x11;//定时器T1,TO都用方式1,16位PCON|=0x80; TH1=0;//定时器T1高位初始化 TL1=0;//定时器T1低位初始化 ET1=1;//开定时器1 TR1=1;//用时才启动 //TMOD=0x01; TH0=(65536-count)/256;//定时器T0初值 TL0=(65536-count)%256;// EA=1;//开总中断 ETO=O;〃先关上38KHz用到的时候再开 TRO=O;//先关上38KHz用到的时候再开 } ]*****************************************************************' //设置电机到达的高度 voidscankey() { while(IRcode[2]==25) {Led(1111);//显示1111表示进入了功能菜单while(IRcode[2]! =25) {BZ=1;//开掉蜂鸣器 h仁10*a;〃设置10位 IRcode[2]=1;//进入个位标志 Led(h1);//显示设置多少十 while(IRcode[2]! =1) {h=h1+a;//十位加个位 Led(h);//显示设置到达的高度 key1=1;//作用用于退出死循环 if(IRcode[2]==25)//再次按功能键则完成设置{break;} } } if(key1==1)//退出死循环 {key1=O; IRcode[2]=O; break; } voidhigh() { if(95<=distance||((h-5)<=distance&&distance<=(h+5)))//提前停电机 IRcode[2]=0;//清零红外接收的数据 m=0xff;//关电机 BZ=0;//开蜂鸣器 Delay(); BZ=1;//关 } } I***************************************************************** 主程序 voidmain() { P2=0xFF;//数码管测试ledDelay (1); P2=0xff; initUart(); IT1=1; IT0=1;//INT0为负边沿触发,(1: 负边沿触发,0: 低电平触发) EX0=1;//外部中断INT0开,(1: 开,0: 关) EA=1;//开所有中断 CodeTemp=0;//初始化红外编码字节缓存变量temp=0; tt=0; m=0xff; h=1; while (1) {sound();//调超声测距函数测距 SBUF=P3;//P3口信息返回 if(! TI) {TI=0; } high();//高度判断 scankey();//如果按的功能键则进入此函数 } } 程序二: //超声波模块程序 //超声波模块程序 //Trig=P2A0 //Echo=卩3八2 #include #defineucharunsignedchar #defineuintunsignedint // voiddelay(uintz) { uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--); } // voiddelay_20us() {uchara;for(a=0;a<100;a++); } //***************************************************************//显示数据转换程序voiddisplay(uinttemp) {ucharge,shi,bai;bai=temp/100;shi=(temp%100)/10;ge=temp%10; wela=1; P0=0xf7;wela=0;dula=1;P0=table[bai]; dula=0;delay (1); dula=1; P0=0x00;//关位码dula=0; wela=1;P0=0xef; wela=0;dula=1;P0=table[shi]; dula=0;delay (1);dula=1; P0=0x00;//关位码dula=0; dula=1; P0=table[ge]; dula=0; wela=1; P0=0xdf; wela=0; delay (1); dula=1; P0=0x00;//关位码 dula=0; time=timeH*256+timeL; distance=time*0.172;//厘米display(distance); if(succeed_flag==0) { distance=0; //没有回波则清零 // test=! test; 测试灯变化 } } } //外部中断0,用做判断回波电平 //定时器1中断,用做超声波测距计时voidtimer1()interrupt3// { TH1=0; TL1=0; } 程序三: #include #defineucharunsignedchar #defineuintunsignedintunsignedinttime; unsignedintS,s_false; unsignedlongnum1; bitflag; sbitTrig=P3A6;// 定义引脚 sbitEcho=P3A7; sbitlcdrs=P2A0;// 命令数据 sbitlcdrw=P2A1;// 读写 sbitlcde=P2A2;// 能 sbitled=P3A5; voiddelay(uintz) { uintx,y; for(x=z;x>0;x--)for(y=110;y>0;y--); } /*voiddelay_20us() { uchara; for(a=0;a<100;a++); } */voidwrite_com(unsignedcharcom) lcdrs=0; P0=com; delay(5); lcde=1; delay(5); lcde=0; } voidwrite_data(unsignedcharzifu) { lcdrs=1; P0=zifu; delay(5); lcde=1; delay(5); lcde=0; } voidwrite_temp(uintt_emp) { ucharqian,bai,shi,ge;qian=t_emp/1000;bai=(t_emp%1000)/100;shi=(t_emp%100)/10; ge=t_emp%10; write_com(0x80); write_data(0x30+qian); delay (1); write_data(0x30+bai); delay (1); write_data(0x30+shi); delay (1); write_data(0x30+ge); delay (1); delay(100); } /********************************************************/ voidT0_time()interrupt1//T0中断用来计数器溢出,超过测距范围 { flag=0;//中断溢出标志,失败 TH0=0; TL0=0; TR0=0;//关闭计数 } /********************************************************/ voidT1_timer()interrupt3//中断 TH1=(65536-50000)/256; TL1=(65536-50000)%256; num1++; if(num1==20) { num1=0; led=~led; } } 启动一次模块 voidStartModule()//启动模块{ Trig=1;// _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); Trig=0; } /********************************************************/ voidCount(void) { time=TH0*256+TL0; TH0=0; TL0=0; //超出测量范围显示“- S=(time*1.7)/100;//算出来是CM if(((S<8)||(S>=600))||flag==0) 失败 { //flag=1; s_false=1000; write_com(0x80); write_data('e'); delay(5); write_data('r'); delay(5); write_data('r'); delay(5); write_data('o'); delay(5); write_data('r'); delay(5); //write_temp(s_false); } else { write_temp(S); } } /******************************************************* /******************************************************* voidinit() lcde=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01);lcdrw=0; } //*************************************************************** voidmain() { //unsignedcharTempCyc; delay(500);//启动等待,等LCM讲入工作状态 lcdrw=0; init();//LCM初始化 delay(500);//延时片刻(可不要) while (1) { TMOD=0x11;//设T0为方式1,GATE=;1 TH0=0; TL0=0; ET0=1; ET1=1; TR1=1; EA=1;//开启总中断 Trig=0; Echo=0; while (1) { StartModule(); 当echo为零时等待当echo为零时等待,中 开启计数 当echo为1计数并等待 关闭计数 计算 flag=1; //while(! Echo);//while((! Echo)&&flag);// 断flag跳出等待 TR0=1;//while(Echo&&flag);// TR0=0;// Count();//delay(120);//80MS } } } 程序四: #include #defineucharunsignedchar#defineuintunsignedintunsignedinttime; unsignedintS,s_false;unsignedlongnum1; bitflag; sbitTrig=P3A6;//定义引脚 sbitEcho=P3A7; sbitlcdrs=P2A0;//命令数据 sbitlcdrw=P2A1;//读写 sbitlcde=P2A2;//能 sbitled=P3A5; voiddelay(uintz) { uintx,y; for(x=z;x>0;x--)for(y=110;y>0;y--); } /*voiddelay_20us() { uchara; for(a=0;a<100;a++); } */ //*************************************************************** voidwrite_com(unsignedcharcom) { lcdrs=0; P0=com; delay(5); lcde=1; delay(5); lcde=0; } voidwrite_data(unsignedcharzifu) { lcdrs=1; P0=zifu; delay(5); lcde=1; delay(5); lcde=0; voidwrite_temp(uintt_emp) {ucharqian,bai,shi,ge;qian=t_emp/1000;bai=(t_emp%1000)/100;shi=(t_emp%100)/10;ge=t_emp%10;write_com(0x80);write_data(0x30+qian);delay (1);write_data(0x30+bai);delay (1);write_data(0x30+shi);delay (1);write_data(0x30+ge);delay (1);delay(100); } 中断用来计数器溢出,超 关闭计数 /*******************************************************voidT0_time()interrupt1//T0过测距范围 { flag=0;//中断溢出标志,失败 TH0=0; TL0=0; TR0=0;// } /***************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 超声波 程序