超声波程序

上传人:日度 文档编号:137153301 上传时间:2020-07-05 格式:DOC 页数:23 大小:68KB
返回 下载 相关 举报
超声波程序_第1页
第1页 / 共23页
超声波程序_第2页
第2页 / 共23页
超声波程序_第3页
第3页 / 共23页
超声波程序_第4页
第4页 / 共23页
超声波程序_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《超声波程序》由会员分享,可在线阅读,更多相关《超声波程序(23页珍藏版)》请在金锄头文库上搜索。

1、本人收藏的的一些超声波程序,希望对大家有用(还有原理图,需要的话去我空间去下):程序一:#include #define uchar unsigned char#define uint unsigned int#define count 4uchar data IRcode4; /定义一个4字节的数组用来存储代码uchar table4;uchar enled4=0x1f,0x2f,0x4f,0x8f;uchar CodeTemp,temp,tt; /编码字节缓存变量uchar i,j,k,temp,timeH,timeL,succeed_flag,flag,h,h1,h2,a,key,key

2、1,key2; /延时用的循环变量uint distance,distance1,time; /距离,timesbit IRsignal=P32; /HS0038接收头OUT端直接连P3.2(INT0)sbit come=P33;sbit d=P11;/发送码sbit BZ=P10;sbit s=P37;/38ksbit ss=P36;/38kuchar m;/ 开关控制/sbit n=P2;/电机反转code unsigned char seg7code10=0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28; /显示段码/* 定时器0中断 *

3、/void timer0() interrupt 1 TH0=(65536-count)/256; TL0=(65536-count)%256; s=s;/产生38K信号 ss=ss;/ tt+;/发送超声波个数 /* 延时0.9ms子程序 */void Delay0_9ms(void)uchar j,k;for(j=18;j0;j-) for(k=20;k0;k-);/*延时1ms子程序*/void Delay1ms(void)uchar i,j;for(i=2;i0;i-) for(j=230;j0;j-); /*延时4.5ms子程序*/void Delay4_5ms(void)uchar

4、 i,j;for(i=10;i0;i-) for(j=225;j0;j-);/* 解码延时子程序 */void Delay(void)uchar i,j,k;for(i=100;i0;i-) for(j=100;j0;j-) for(k=3;k0;k-);/* 显示延时子程序 */void ledDelay(unsigned int tc) /延时程序 unsigned int i,j; for(i=0;i10;i+) for(j=0;jtc;j+);/* */定时器1中断,用做超声波测距无回波 void timer1() interrupt 3 TR1=0; ET1=0; EX1=0; TH

5、1=0; TL1=0; /*显示程序*/void Led(int date) /显示函数 int i; table0=date/1000; table1=date/100%10; table2=date/10%10; table3=date%10; date=0; for(i=0;i120;i+) P2=enledi%4&m;/P2口高四位控制数码管,低位陪分控制继电器 P0=seg7codetablei%4; /取出千位数,查表,输出。 ledDelay(15); /*/外部中断1,用做判断超声波回波电平说明测试成功 void int1() interrupt 2 / 外部中断1是0号 EX

6、1=0;/关闭外部中断1 TR1=0; ET1=0; succeed_flag=1;/测试成功标志 /*超声波测路子函数*/ void sound() 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=

7、1)/测试成功 time=TH1*256+TL1;/回波响应时间 distance=time*1.72/100;/换算成路程 Led(distance);/显示测到的距离 EX1=1;/开中断1 if(succeed_flag=0)/测试不成功或超出时间 Led(3333);/表示测不到回波 /*红外解码*/* 中断0解码服务子程序 */void int0(void) interrupt 0 using 2 EA = 0;/? 可以这样,跳入中断,但仍可对P3.2(INT0)进行电平变化的读取for(k=0;k10;k+) Delay0_9ms(); if (IRsignal=1) /如果0.

8、9ms后IRsignal=1,说明不是引导码 k=10; break; else if(k=9) /如果 持续了100.9ms=9ms的低电平,说明是引导码 while(IRsignal=0); Delay4_5ms(); /跳过持续4.5ms的高电平 for(i=0;i4;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

9、)与1.69(=2.25-0.56)之间),再判断IRsignal if(IRsignal=1) /如果IRsignal是1,高位置1,并向右移一位 Delay1ms(); /为什么要延时1ms呢?因为要使IRsignal跳至低电平(即0.56ms的0与1相同部分上) CodeTemp=CodeTemp|0x80; /此处的算法很好 if(j1; else if(j1;/如果IRsignal是0,则直接向右移一位,自动补0 IRcodei=CodeTemp; CodeTemp=0; for(i=0;i4;i+) /通过串口将代码发出 SBUF=IRcodei; /引导码 地址码 数据码 数据反

10、码 while(!TI); /等待一个字节发送完毕 TI=0; Delay(); switch(IRcode2) /数据位 case 69:m=0xfe;break;/电机上升 case 70:m=0xff;break;/电机停止 case 71:m=0xfc;break;/电机下降 case 22:a=0;break; case 25:key=1;break;/功能键 case 12:a=1;break; case 24:a=2;break; case 94:a=3;break; case 8: a=4;break; case 28:a=5;break; case 90:a=6;break; case 66:a=7;break; case 82:a=8;break; case 74:a=9;break; EA = 1;/开总中

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 中学学案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号