ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:27.11KB ,
资源ID:5332502      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5332502.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(超声波程序.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

超声波程序.docx

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; / 编码字节缓存变量 uchari,j,k,temp,timeH,timeL,succeed_flag,flag,h,h1,h2

2、,a,key,key1,key2;/ 延时用的循环变量uint distance,distance1,time; /sbit IRsig nal=P3T; /HS0038sbit come=P3A3;sbit d=P1A1;/ 发送码sbit BZ=P1A0;sbit s=P3A7;/38ksbit ss=P3A6;/38kuchar m;/ 开关控制/sbit n=P2;/ 电机反转 code距离 ,time接收头OUT端直接连P3.2(INT0)unsignedseg7code10=0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28;显示段码

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

4、j;for(i=10;i0;i-) for(j=225;j0;j-);/*/延日寸 1ms 了稈,序 */延时 4.5ms 子程序 *程序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

5、;EX1=0;TH1=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

6、是 0 号 EX1=0;/ 关闭外部中断 1TR1=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;/ 开定时器 1TR1=1;/ 启动定时器 1EX1=1;/ 打开外部中断 1 succeed_flag=0;while(EX1=1);/ 等待回波标志 if

7、(succeed_flag=1)/ 测试成功time=TH1*256+TL1;/ 回波响应时间 distance=time*1.72/100;/ 换算成路程Led(distance);/ 显示测到的距离EX1=1;/ 开中断 1if(succeed_flag=0)/ 测试不成功或超出时间Led(3333);/ 表示测不到回波红外解码中断 0 解码服务子程序P3.2 (INTO)进行电平变化如果0.9ms后IRsignal=1,说明不是引导码如果 持续了 10X 0.9ms=9ms的低电平,说跳过持续4.5ms的高电平分别读取 4 个字节每个字节 8 个 bit 的判断等待上升沿 此处用得很好:

8、因为 0与 1 的相同部分从上升沿那一时刻开始延时0.9ms (因void int0(void) interrupt 0 using 2 可以这样,跳入中断,但仍可对EA = 0;/? 的读取 for(k=0;k10;k+) Delay0_9ms(); if (IRsignal=1) / k=10; break; else if(k=9) / 明是引导码 while(IRsignal=0); Delay4_5ms(); / for(i=0;i4;i+) / for(j=1;j=8;j+) / while(IRsignal=0); / 0.56ms 的低电平(接收时)是代码Delay0_9ms(

9、); /为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(j1; else if(j1;/ 自动补 0IRcodei=CodeTemp;CodeTemp=0;for(i=0;i4;i+) /SBUF=IRcodei; /while(!TI); /T

10、I=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;b

11、reak; case 66:a=7;break; case 82:a=8;break; case 74:a=9;break;EA = 1;/ 开总中断I*初始化程序void initUart(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;/ 开总

12、中断ETO=O;先关上38KHz用到的时候再开TRO=O; /先关上38KHz用到的时候再开 */ 设置电机到达的高度void scankey()while(IRcode2=25) Led(1111); / 显示 1111 表示进入了功能菜单 while(IRcode2!=25) BZ=1;/ 开掉蜂鸣器h仁10*a; 设置10位IRcode2=1;/ 进入个位标志Led(h1);/ 显示设置多少十while(IRcode2!=1) h=h1+a;/ 十位加个位Led(h);/ 显示设置到达的高度key1=1;/ 作用用于退出死循环if(IRcode2=25)/ 再次按功能键则完成设置 bre

13、ak;if(key1=1)/ 退出死循环key1=O;IRcode2=O;break; void high()高度判断函数if(95=distance|(h-5)=distance & distance=(h+5)/ 提前停电机IRcode2=0;/ 清零红外接收的数据m=0xff; / 关电机BZ=0;/ 开蜂鸣器Delay();BZ=1;/ 关I*主程序void main()P2=0xFF;/ 数码管测试 ledDelay(1);P2=0xff;initUart();IT1=1;IT0 = 1;/INT0 为负边沿触发 , (1 :负边沿触发, 0:低电平触发 )EX0 = 1;/ 外部中

14、断 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 #define uchar unsigned char#define uint unsigned int /void d

15、elay(uint z)uint x,y;for(x=z;x0;x-) for(y=110;y0;y-);/void delay_20us()uchar a ; for(a=0;a100;a+); /*/ 显示数据转换程序void display(uint temp)uchar ge,shi,bai;bai=temp/100;shi=(temp%100)/10;ge=temp%10;wela=1;P0=0xf7;wela=0;dula=1;P0=tablebai;dula=0;delay(1);dula=1;P0=0x00; / 关位码 dula=0;wela=1;P0=0xef;wela=0

16、;dula=1;P0=tableshi;dula=0;delay(1);dula=1;P0=0x00; / 关位码 dula=0;dula=1; P0=tablege;dula=0; wela=1;P0=0xdf; wela=0;delay(1);关位码dula=1;P0=0x00; / dula=0;void main()uint distance;首先拉低脉冲输入引脚打开总中断 0 定时器 1,16 位工作方式test =0;Trig=0; /EA=1; /TMOD=0x10; / while(1)EA=0;/关总中断Trig=1;/超声波输入端delay_20us(); /延时 20us

17、Trig=0;/产生一个 20us 的脉冲while(Echo=0); /等待 Echo 回波引脚变高电平succeed_flag=0; /清测量成功标志EA=1;EX0=1;/打开外部中断 0TH1=0;/定时器 1 清零TL1=0;/定时器 1 清零TF1=0;/计数溢出标志TR1=1;/启动定时器 1delay(20);/等待测量的结果TR1=0;/关闭定时器 1EX0=0;/关闭外部中断 0if(succeed_flag=1)time=timeH*256+timeL;distance=time*0.172; / 厘米display(distance);if(succeed_flag=0

18、)distance=0; / 没有回波则清零 test = !test; / 测试灯变化 / 外部中断 0,用做判断回波电平void exter() interrupt 0 timeH =TH1; / timeL =TL1; / succeed_flag=1;/ EX0=0; / 外部中断 0 是 0 号取出定时器的值取出定时器的值 至成功测量的标志 关闭外部中断/*/ 定时器 1 中断,用做超声波测距计时void timer1() interrupt 3 / TH1=0;TL1=0;程序三:#include #include #define uchar unsigned char #defi

19、ne uint unsigned int unsigned int time;unsigned int S,s_false; unsigned long num1;bit flag ;sbit Trig =P3A6;/定义引脚sbit Echo=P3A7;sbit lcdrs=P2A0;/命令数据sbit lcdrw=P2A1;/读写sbit lcde=P2A2;/能sbit led=P3A5;void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);/*void delay_20us()uchar a ;for(a=0;a100;a+

20、);*/*void write_com(unsigned char com)lcdrs=0;P0=com;delay(5);lcde=1;delay(5);lcde=0;void write_data(unsigned char zifu)lcdrs=1;P0=zifu;delay(5);lcde=1;delay(5);lcde=0;void write_temp(uint t_emp)uchar qian,bai,shi,ge;qian=t_emp/1000; bai=(t_emp%1000)/100;shi=(t_emp%100)/10;ge=t_emp%10;write_com(0x80

21、);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);/*/void T0_time() interrupt 1 /T0 中断用来计数器溢出 , 超 过测距范围flag=0; / 中断溢出标志 , 失败TH0=0;TL0=0;TR0=0; / 关闭计数/*/void T1_timer() interrupt 3 / 中断TH1=(65536-50000)/256;TL1=(65536-

22、50000)%256;num1+;if (num1=20)num1=0;led=led;void StartModule() / 启动模块启动一次模块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;/*/void Count(void)time=TH0*256+TL0;TH0=0

23、;TL0=0;/ 超出测量范围显示 “-S=(time*1.7)/100; / 算出来是 CMif(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);elsewrite_temp(S);/*/*void init()lcde=0;write_com(0x38);wri

24、te_com(0x0c);write_com(0x06);write_com(0x01); lcdrw=0;void main() / unsigned char TempCyc;delay(500); / 启动等待,等LCM讲入工作状态lcdrw=0;init(); /LCM 初始化delay(500); / 延时片刻(可不要)while(1)设 T0 为方式 1 , GATE=;1TMOD=0x11; /TH0=0;TL0=0;ET0=1; / 允许 T0 中断ET1=1;TR1=1;EA=1; /开启总中断Trig=0;Echo=0;while(1)StartModule();当 echo 为零时等待 当 echo 为零时等待 , 中开启计数当 echo 为 1 计数并等待

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1