仪器网(yiqi.com)欢迎您!

| 注册2 登录
网站首页-资讯-专题- 微头条-话题-产品- 品牌库-搜索-供应商- 展会-招标-采购- 社区-知识-技术-资料库-方案-产品库- 视频

问答社区

求个51单片机超声波测距(距离+报警)的c程序

Carman_888 2017-05-19 03:18:16 419  浏览
  • 求个51单片机超声波测距(距离+报警)的c程序

参与评论

全部评论(1条)

  • 285008723 2017-05-19 15:20:44
    //晶振=8M //MCU=STC10F04XE //P0.0-P0.6共阳数码管引脚 //Trig = P1^0 //Echo = P3^2 #include <reg52.h> //包括一个52标准内核的头文件 #define uchar unsigned char //定义一下方便使用 #define uint unsigned int #define ulong unsigned long //*********************************************** sfr CLK_DIV = 0x97; //为STC单片机定义,系统时钟分频 //为STC单片机的IO口设置地址定义 sfr P0M1 = 0X93; sfr P0M0 = 0X94; sfr P1M1 = 0X91; sfr P1M0 = 0X92; sfr P2M1 = 0X95; sfr P2M0 = 0X96; //*********************************************** sbit Trig = P1^0; //产生脉冲引脚 sbit Echo = P3^2; //回波引脚 sbit test = P1^1; //测SY引脚 uchar codeSEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9 uint distance[4]; //测距接收缓冲区 uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i; //自定义寄存器 bit succeed_flag; //测量成功标志 //********函数声明 void conversion(uint temp_data); void delay_20us(); //void pai_xu(); void main(void) // 主程序 { uint distance_data,a,b; uchar CONT_1; CLK_DIV=0X03; //系统时钟为1/8晶振(pdf-45页) P0M1 = 0; //将io口设置为推挽输出 P1M1 = 0; P2M1 = 0; P0M0 = 0XFF; P1M0 = 0XFF; P2M0 = 0XFF; i=0; flag=0; test=0; Trig=0; //首先拉低脉冲输入引脚 TMOD=0x11; //定时器0,定时器1,16位工作方式 TR0=1; //启动定时器0 IT0=0; //由高电平变低电平,触发外部中断 ET0=1; //打开定时器0中断 //ET1=1; //打开定时器1中断 EX0=0; //关闭外部中断 EA=1; //打开总中断0 while(1) //程序循环 { EA=0; Trig=1; delay_20us(); Trig=0; //产生一个20us的脉冲,在Trig引脚 while(Echo==0); //等待Echo回波引脚变高电平 succeed_flag=0; //清测量成功标志 EX0=1; //打开外部中断 TH1=0; //定时器1清零 TL1=0; //定时器1清零 TF1=0; // TR1=1; //启动定时器1 EA=1; while(TH1 < 30);//等待测量的结果,周期65.535毫秒(可用中断实现) TR1=0; //关闭定时器1 EX0=0; //关闭外部中断 if(succeed_flag==1) { distance_data=outcomeH; //测量结果的高8位 distance_data<<=8; //放入16位的高8位 distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据 distance_data*=12; //因为定时器默认为12分频 distance_data/=58; //微秒的单位除以58等于厘米 } //为什么除以58等于厘米, Y米=(X秒*344)/2 // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58 if(succeed_flag==0) { distance_data=0; //没有回波则清零 test= !test; //测试灯变化 } /// distance[i]=distance_data; //将测量结果的数据放入缓冲区 /// i++; /// if(i==3) /// { /// distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4; /// pai_xu(); /// distance_data=distance[1]; a=distance_data; if(b==a) CONT_1=0; if(b!=a) CONT_1++; if(CONT_1>=3) { CONT_1=0; b=a; conversion(b); } /// i=0; /// } } } //*************************************************************** //外部中断0,用做判断回波电平 INTO_() interrupt 0 // 外部中断是0号 { outcomeH =TH1; //取出定时器的值 outcomeL =TL1; //取出定时器的值 succeed_flag=1; //至成功测量的标志 EX0=0; //关闭外部中断 } //**************************************************************** //定时器0中断,用做显示 timer0() interrupt 1 // 定时器0中断是1号 { TH0=0xfd; //写入定时器0初始值 TL0=0x77; switch(flag) {case 0x00:P0=ge; P2=0xfd;flag++;break;
    case 0x01:P0=shi;P2=0xfe;flag++;break;
    case 0x02:P0=bai;P2=0xfb;flag=0;break;
    } } //***************************************************************** /* //定时器1中断,用做超声波测距计时 timer1() interrupt 3 // 定时器0中断是1号 { TH1=0; TL1=0; } */ //****************************************************************** //显示数据转换程序 void conversion(uint temp_data) { uchar ge_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; //取余运算 ge_data=temp_data; bai_data=SEG7[bai_data]; shi_data=SEG7[shi_data]; ge_data =SEG7[ge_data]; EA=0; bai = bai_data; shi = shi_data; ge = ge_data ; EA=1; } //****************************************************************** void delay_20us() { ucharbt ; for(bt=0;bt<100;bt++); } /* void pai_xu() { uint t; if(distance[0]>distance[1]) {t=distance[0];distance[0]=distance[1];distance[1]=t;} /*交换值 if(distance[0]>distance[2]) {t=distance[2];distance[2]=distance[0];distance[0]=t;} /*交换值 if(distance[1]>distance[2]) {t=distance[1];distance[1]=distance[2];distance[2]=t;} /*交换值 } */

    赞(1)

    回复(0)

    评论

热门问答

求个51单片机超声波测距(距离+报警)的c程序
求个51单片机超声波测距(距离+报警)的c程序
2017-05-19 03:18:16 419 1
求51单片机超声波测距代码
 
2011-08-20 06:16:46 459 2
求US-100(模块)超声波测距的C语言程序,基于51单片机的,3Q哦~
求基于51单片机的US-100超声波测距C语言程序。需要详细点的具体设计程序,O(∩_∩)O~ US-100模块参考资料:http://wenku.baidu.com/view/65e63e35a32d7375a41780ce.html 性能要求:实现2--150cm的测距,测得结果保留4位有效数字(取整数),单位:mm。 哪... 求基于51单片机的US-100超声波测距C语言程序。需要详细点的具体设计程序,O(∩_∩)O~ US-100模块参考资料:http://wenku.baidu.com/view/65e63e35a32d7375a41780ce.html 性能要求:实现2--150cm的测距,测得结果保留4位有效数字(取整数),单位:mm。 哪位大神帮帮忙喽,急啊!!!真心谢谢大神了~ 展开
2017-05-17 15:16:00 552 1
这个51单片机HC-SR04超声波测距程序哪里错了
//晶振11.0592MHz #include #define uchar unsigned char #define uint unsigned int sbit trig=P0^2; sbit echo=P3^3; float dis=0; uint irtime=0; void delay_20us() { uchar bt ; for(bt=0;bt<100;bt++); } void TI... //晶振11.0592MHz #include #define uchar unsigned char #define uint unsigned int sbit trig=P0^2; sbit echo=P3^3; float dis=0; uint irtime=0; void delay_20us() { uchar bt ; for(bt=0;bt<100;bt++); } void TIM1init(void)//定时器1初始化 { TMOD=0x22;//定时器1工作方式2,TH1是重装值,TL1是初值 TH1=0xd2; //重载值 溢出一次约50us TL1=0xd2; //初始化值 ET1=1; //开中断 } void EX1init(void) //外部中断1初始化 { IT1 = 1; //指定外部中断0下降沿触发,INT1 (P3.3) EA = 1; //开总中断 } /*------------------------------------------------ 定时器1中断处理 ------------------------------------------------*/ void tim1_isr (void) interrupt 3 { irtime++; //用于计数2个下降沿之间的时间 } /*------------------------------------------------ 外部中断1中断处理 ------------------------------------------------*/ void EX1_ISR (void) interrupt 2 //外部中断1服务函数 { dis=340*(irtime/2.0)*50/10000; irtime=0; TR1=0; EX1=0; } void test(void) { trig=1; delay_20us(); trig=0; EX1=1; while(!echo); TR1=1; } void main(void) { TIM1init(); EX1init(); while(1) { test(); display(dis); } } 主函数调用test,然后在数码管上显示(显示函数略过),测试的时候,在数码管上显示的距离明显不对,还各种不稳定,有时就个位数上显示一个1或2,不知道怎么回事 展开
2016-01-25 09:17:10 369 2
求一段汇编程序,利用51单片机控制3个超声波传感器测距的C语言程序
 
2017-07-25 22:41:03 307 1
51单片机超声波测距模块代码
****************************************************************************************这是代码原文 我想问一下主函数下的while循环里面 为什么等到echo回波回来了 才打开定时器1和外部中断呢 这时候回波已经回来了啊 不是测不出超声波回波的时间了... ****************************************************************************************这是代码原文 我想问一下主函数下的while循环里面 为什么等到echo回波回来了 才打开定时器1和外部中断呢 这时候回波已经回来了啊 不是测不出超声波回波的时间了吗还有就是 为什么在whlie循环前先打开了总中断 然后进入whlie又立刻关闭 再重新打开 那diyi次打开不是很多余吗 麻烦大神解答一下 展开
2018-06-26 20:47:55 527 1
求一段汇编程序,利用51单片机控制超声波传感器测距的程序。
 
2012-04-18 20:35:53 284 2
51单片机 HC-SR04超声波测距 我写的C语言代码,请问
/* HC-SR04使用方法:给触发端子trig一个10us以上的高电平即可触发,触发后echo端子将接受到高电平,高电平的持续时间就是测距的往返时间。 下面是我写的代码:我想测试自己使用该模块是否正确,于是就想实现如果echo端接受到了高电平,蜂鸣器BEEP就响。但... /* HC-SR04使用方法:给触发端子trig一个10us以上的高电平即可触发,触发后echo端子将接受到高电平,高电平的持续时间就是测距的往返时间。 下面是我写的代码:我想测试自己使用该模块是否正确,于是就想实现如果echo端接受到了高电平,蜂鸣器BEEP就响。但是实际使用的时候发现并非预期结果,情高人帮忙看看下面的代码有何问题。代码不长,望大神赐教! */ #include #define uchar unsigned char #define uint unsigned int /*位定义*/ sbit CHUFA=P0^1; //位定义超声波触发端(10us以上高电平触发) sbit JIESHOU=P0^3; //接收端(接受高电平) sbit BEEP=P2^0; //蜂鸣器 sbit OUT0=P3^2; //外部中断0 uchar JS_FLAG; //接收标志 uint CF_TIME,t0,t1,shu; /*函数声明*/ void timer0(); void int0(); void display(uint); main(){ CHUFA=0; //初始化拉低触发端和接收端电平 JIESHOU=0; JS_FLAG=0; CF_TIME=15; //初始化触发时间(大于10us) TMOD=0x11; //定时器方式选择 EA=1; //开总中断 ET0=1; //开定时器0中断 EX0=1; //开外部中断0 IT0=0; //外部中断选择下降沿触发 //JIESHOU=1; while(1){ OUT0=JIESHOU; //外部中断0被赋值为接收端信号,当出现下降沿是触发外部中断0 if(JS_FLAG==0){ //如果没有接收到高电平则触发 CHUFA=1; while(CF_TIME--); //10us以上高电平触发传感器 } if(JIESHOU==1){ TR0=1; //如果接收端收到高电平则启动定时器 JS_FLAG=1; //并且标志位置1 BEEP=0; //蜂鸣器响 } display(t1); //显示测量时间(秒) } } /*定时器0中断程序*/ void timer0() interrupt 1{ TH0=(65536-10000)/256; //装初值 10ms TL0=(65536-10000)%256; t0++; //每进入一次中断t0加1 } /*外部中断0中断程序*/ void int0() interrupt 0{ TR0=0; //一旦进入外部中断0,说明接收端收到下降沿信号。关闭定时器0 JS_FLAG=0; //接收标志位置0 BEEP=1; //关闭蜂鸣器 t1=t0*10/1000; //测量时间为 进入定时器中断次数t0乘以每次时间10ms,除以1000化为秒为单位 t0=0; //t0清零 } /*数码管显数函数*/ void display(uint shu){ //数码管显示函数 } 展开
2013-05-11 19:12:16 534 2
51单片机温度控制系统的C语言程序
设计基于单片计算机的温度控制器。用于控制电加热炉的温度。具体要求如下1.温度连续可调,范围为30℃~150℃2.超调量σ%≤20%3.温度误差≤±0.5℃4.人-机对话方便5.控制算法采用PID或改... 设计基于单片计算机的温度控制器。用于控制电加热炉的温度。具体要求如下 1. 温度连续可调,范围为30℃~150℃ 2. 超调量σ%≤20% 3. 温度误差≤±0.5℃ 4. 人-机对话方便 5. 控制算法采用PID或改进的PID或其他算法 .请发至3166109374@qq.com 谢谢帮忙 具体见http://wenku.baidu.com/view/e0feacf0f121dd36a22d822c 展开
2015-06-07 00:06:30 471 3
51单片机超声波测距用lcd显示
51单片机超声波测距用lcd显示1602显示屏
2018-11-24 01:55:06 342 0
求一份如图 基于单片机超声波倒车测距的程序
2016-08-01 00:14:58 618 1
求用51单片机与DS18B20测温的C程序。完整的。
 
2016-05-21 11:08:36 405 1
求一个正确的基于51单片机的函数信号发生器的C程序
要自己调试成功的,不要在网上找的,波形产生是用DAC0832,频率显示用数码管也行,LCD1602也行,多谢大神帮忙,小弟不胜感激... 要自己调试成功的,不要在网上找的,波形产生是用DAC0832,频率显示用数码管也行,LCD1602也行,多谢大神帮忙,小弟不胜感激 展开
2014-05-13 10:50:43 449 3
51单片机 超声波测距 控制直流电机正反转
通过超声波传感器测距,当距离大于设定值A时,直流电机反转;当距离等于设定值A时,直流电机停止;当距离小于设定值A时,直流电机正转。具体要求:1)设定值A能够通过键盘设定;2)电机所处的各个状态(正转、反转和停止)及超声波传感器检测的距离值能够在液... 通过超声波传感器测距,当距离大于设定值A时,直流电机反转;当距离等于设定值A时,直流电机停止;当距离小于设定值A时,直流电机正转。具体要求:1)设定值A能够通过键盘设定;2)电机所处的各个状态(正转、反转和停止)及超声波传感器检测的距离值能够在液晶上实时显示。 展开
2015-07-12 14:27:24 756 1
做一个51单片机超声波测距需要哪些器材
 
2017-02-28 00:10:01 409 1
求一份verilog的超声波测距程序
基本要求: 1) 测量距离不低于0.5m,测量精度优于0.1m。 2) 数字显示测量结果,并能动态更新,更新周期约为0.5s。 拓展要求: 1) 测量距离大于1m,测量精度优于0.05m,显示精度为0.01m,显示要求同上。 2) 数字显示测量结果的更新周期可调,显示... 基本要求: 1) 测量距离不低于0.5m,测量精度优于0.1m。 2) 数字显示测量结果,并能动态更新,更新周期约为0.5s。 拓展要求: 1) 测量距离大于1m,测量精度优于0.05m,显示精度为0.01m,显示要求同上。 2) 数字显示测量结果的更新周期可调,显示稳定。当距离小于0.5m时,通过蜂鸣器给出间歇式的“滴-滴”声响告警;当距离小于0.3m时,告警声响变得更加急促。 3) 其它功能(如使用多个超声波传感器实现汽车倒车雷达的功能)。 拓展要求可要可不要,求做过的大佬给份程序谢谢。 展开
2018-07-02 06:15:24 270 1
基于51单片机,ADC0804,光敏电阻,湿度传感器,求程序!!!!
我用的51单片机,采集光强度和空气湿度,利用了两个ADC0804进行转换(光敏电阻和电阻式湿度传感器),但是没有相应程序,哪位大哥能帮忙弄一个程序啊?如果是可行的程序,我账号里剩下... 我用的51单片机,采集光强度和空气湿度,利用了两个ADC0804进行转换(光敏电阻和电阻式湿度传感器),但是没有相应程序,哪位大哥能帮忙弄一个程序啊?如果是可行的程序,我账号里剩下的分全给你,虽然不多... 展开
2011-06-01 01:20:26 310 4
求一个51单片机控制的温度计显示程序
stc98c51控制2个4位数码管,温度传感器为DS18B20。数码管的a,b,c,d,e,f,g,dp端接在P0口... stc98c51控制2个4位数码管,温度传感器为DS18B20。数码管的a,b,c,d,e,f,g,dp端接在P0口 展开
2012-05-03 04:58:40 415 2
想学下51单片机的超声波测距,有几个疑问。
想学下51单片机的超声波测距,有几个疑问。 在百度上看到的超声波模块工作原理:单片机供给超声波信号端Trig一个Z少10us长的高电平信号,模块自动发射8个40khz的方波,自动检测到信号是否返回,有信号返回,Echo端输出一个高电平,高电平持续的实践就是超... 想学下51单片机的超声波测距,有几个疑问。 在百度上看到的超声波模块工作原理:单片机供给超声波信号端Trig一个Z少10us长的高电平信号,模块自动发射8个40khz的方波,自动检测到信号是否返回,有信号返回,Echo端输出一个高电平,高电平持续的实践就是超声波从发射到返回的时间。 我的理解是给Trig一个10微秒以上高电平信号,模块会发射超声波,这个时候Echo应该是低电平,等有声波信号返回时Echo会变高电平,声波从发射到返回用了多长时间,Echo的高电平就持续多长时间。不知道理解的对不对? 这里有个疑问,百度了一下发现都是检测Echo收到返回声波后高电平持续时间来计算距离,为什么不检测从模块发射声波到Echo收到返回声波的时间呢?这样不是可以节约一半的时间吗? 还有一个问题,我在学习板上试了一下程序,给Trig一个20微秒的高电平信号,然后等待Echo变高电平开启定时器,但直到定时器溢出Echo一直都是高电平,超声波模块离墙面只有80厘米左右,模块换了2个都是这样。 第三个问题,百度上说计算测量距离等于定时器记录的时间乘以340除以2,但定时器记录的时间单位不是纳秒吗?还要除以一百万才能乘以340吧?这样得到的距离单位是米。 求教各位答疑解惑。 展开
2018-01-19 02:56:05 418 2
基于89C52单片机的HC-SR04超声波测距系统程序
 
2018-12-09 01:37:42 331 0

12月突出贡献榜

推荐主页

最新话题