超声波程序.docx
- 文档编号:372108
- 上传时间:2022-10-09
- 格式:DOCX
- 页数:25
- 大小:20.06KB
超声波程序.docx
《超声波程序.docx》由会员分享,可在线阅读,更多相关《超声波程序.docx(25页珍藏版)》请在冰豆网上搜索。
超声波程序
本人收藏的的一些超声波程序,希望对大家有用(还有原理图,需要的话去我空间去下):
程序一:
#include
#defineucharunsignedchar
#defineuintunsignedint
#definecount4
uchardataIRcode[4];//定义一个4字节的数组用来存储代码
uchartable[4];
ucharenled[4]={0x1f,0x2f,0x4f,0x8f};
ucharCodeTemp,temp,tt;//编码字节缓存变量
uchari,j,k,temp,timeH,timeL,succeed_flag,flag,h,h1,h2,a,key,key1,key2;//延时用的循环变量
uintdistance,distance1,time;//距离,time
sbitIRsignal=P3^2;//HS0038接收头OUT端直接连P3.2(INT0)
sbitcome=P3^3;
sbitd=P1^1;//发送码
sbitBZ=P1^0;
sbits=P3^7;//38k
sbitss=P3^6;//38k
ucharm;//开关控制
//sbitn=P2;//电机反转
codeunsignedcharseg7code[10]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28};//显示段码
/****************************定时器0中断************************/
voidtimer0()interrupt1
{
TH0=(65536-count)/256;
TL0=(65536-count)%256;
s=~s;//产生38K信号
ss=~ss;//
tt++;//发送超声波个数
}
/****************************延时0.9ms子程序************************/
voidDelay0_9ms(void)
{
ucharj,k;
for(j=18;j>0;j--)
for(k=20;k>0;k--);
}
/***************************延时1ms子程序**********************/
voidDelay1ms(void)
{
uchari,j;
for(i=2;i>0;i--)
for(j=230;j>0;j--);
}
/***************************延时4.5ms子程序**********************/
voidDelay4_5ms(void)
{
uchari,j;
for(i=10;i>0;i--)
for(j=225;j>0;j--);
}
/****************************解码延时子程序************************/
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; } /***********************显示程序*********************/ voidLed(intdate)//显示函数 {inti; table[0]=date/1000; table[1]=date/100%10; table[2]=date/10%10; table[3]=date%10; 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;//打开外部中断1 succeed_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);//表示测不到回波 } } /****************************红外解码******************************/ /********************中断0解码服务子程序********************/ voidint0(void)interrupt0using2 { EA=0;//? ? ? 可以这样,跳入中断,但仍可对P3.2(INT0)进行电平变化的读取 for(k=0;k<10;k++) { Delay0_9ms(); if(IRsignal==1)//如果0.9ms后IRsignal=1,说明不是引导码 { k=10; break; } elseif(k==9)//如果持续了10×0.9ms=9ms的低电平,说明是引导码 { while(IRsignal==0); Delay4_5ms();//跳过持续4.5ms的高电平 for(i=0;i<4;i++)//分别读取4个字节 { for(j=1;j<=8;j++)//每个字节8个bit的判断 { while(IRsignal==0);//等待上升沿此处用得很好: 因为0.56ms的低电平(接收时)是代码0与1的相同部分 Delay0_9ms();//从上升沿那一时刻开始延时0.9ms(因为0.9介于0.56(=1.125-0.56)与1.69(=2.25-0.56)之间),再判断IRsignal if(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" } IRcode[i]=CodeTemp; CodeTemp=0; } for(i=0;i<4;i++)//通过串口将代码发出 { SBUF=IRcode[i];//引导码地址码数据码数据反码 while(! TI);//等待一个字节发送完毕 TI=0; } Delay(); } } switch(IRcode[2])//数据位 { 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;//开总中断 } /*******************************************************************/ /***********************初始化程序*********************/ voidinitUart(void) { TMOD|=0x11;//定时器T1,T0都用方式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;//开总中断 ET0=0;//先关上38KHz,用到的时候再开 TR0=0;//先关上38KHz,用到的时候再开 } /*******************************************************************/ /*******************************************************************/ //设置电机到达的高度 voidscankey() { while(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 超声波 程序