用AT89C51单片机做超声波测距
-
我的是51开发板. 数码管显示部分用段选和位选控制. 要求用C语言,C本人实在是新手,在网上找到很多程序,都只能看个皮毛. 我想控制4位数码管. 显示测距距离, 温度对声速的影响暂时不考虑,刚从网上找到个程序. 烧到板子里, 数码管没反应,求老师指点.谢谢 我的是... 我的是51开发板. 数码管显示部分用段选和位选控制. 要求用C语言,C本人实在是新手,在网上找到很多程序,都只能看个皮毛. 我想控制4位数码管. 显示测距距离, 温度对声速的影响暂时不考虑,刚从网上找到个程序. 烧到板子里, 数码管没反应,求老师指点.谢谢 我的是8位共阴数码管. HS-CR04超声波模块. 求C程序,Z好带多的注释,谢了. 展开
全部评论(3条)
-
- 838002400 2012-04-10 00:00:00
- 楼上都有了
-
赞(3)
回复(0)
-
- 门诊室味掀 2012-04-13 00:00:00
- 我在“googel"上找到“一款制作容易免调试的超声波测距板”的介绍,这款板非常容易制作,基本不需要调试。
-
赞(17)
回复(0)
-
- 捣魔臆d熬照 2017-09-11 06:39:56
- 给你贴一个吧,显示部分的代码你需要修改一下(因为这个代码里面的数码管显示用不到段选位选)
//超声波模块显示程序
#include <reg52.h> //包括一个52标准内核的头文件
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define ulong unsigned long
sbit Tx = P3^3; //产生脉冲引脚
sbit Rx = P3^2; //回波引脚
uchar code SEG7[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;
i=0;
flag=0;
Tx=0; //首先拉低脉冲输入引脚
TMOD=0x11; //定时器0,定时器1,16位工作方式
TR0=1; //启动定时器0
IT0=0; //由高电平变低电平,触发外部中断
ET0=1; //打开定时器0中断
EX0=0; //关闭外部中断
EA=1; //打开总中断0
while(1) //程序循环
{
EA=0;
Tx=1;
delay_20us();
Tx=0; //产生一个20us的脉冲,在Tx引脚
while(Rx==0); //等待Rx回波引脚变高电平
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; //没有回波则清零
}
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=0x7f;flag++;break;
case 0x01:P0=shi;P2=0xbf;flag++;break;
case 0x02:P0=bai;P2=0xdf;flag=0;break;
} } //显示数据转换程序 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]&0x7f; ge_data =SEG7[ge_data]; EA=0; bai = bai_data; shi = shi_data; ge = ge_data ; EA=1; } //****************************************************************** void delay_20us() { uchar bt ; for(bt=0;bt<60;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;} } -
赞(11)
回复(0)
热门问答
- 用AT89C51单片机做超声波测距
- 我的是51开发板. 数码管显示部分用段选和位选控制. 要求用C语言,C本人实在是新手,在网上找到很多程序,都只能看个皮毛. 我想控制4位数码管. 显示测距距离, 温度对声速的影响暂时不考虑,刚从网上找到个程序. 烧到板子里, 数码管没反应,求老师指点.谢谢 我的是... 我的是51开发板. 数码管显示部分用段选和位选控制. 要求用C语言,C本人实在是新手,在网上找到很多程序,都只能看个皮毛. 我想控制4位数码管. 显示测距距离, 温度对声速的影响暂时不考虑,刚从网上找到个程序. 烧到板子里, 数码管没反应,求老师指点.谢谢 我的是8位共阴数码管. HS-CR04超声波模块. 求C程序,Z好带多的注释,谢了. 展开
2012-04-09 16:14:45
406
3
- 用51单片机做超声波测距都需要什么元件?
- 用51单片机做超声波测距都需要什么元件(探测的距离5到10米左右)?知道的话发到我邮箱里zhanxiage1994@sina.com谢谢了
2012-03-28 03:51:02
272
1
- 51单片机超声波测距用lcd显示
- 51单片机超声波测距用lcd显示1602显示屏
2018-11-24 01:55:06
310
0
- 求51单片机超声波测距代码
2011-08-20 06:16:46
409
2
- 超声波测距和单片机的连接
- 超声波测距四个引脚vcc,gnd,trig,echo和单片机怎么连?直接连到io口就可以了吗?之间需要什么电阻之类的东西吗?谢谢各位好心人了
2013-01-21 23:41:05
450
1
- 51单片机超声波测距模块代码
- ****************************************************************************************这是代码原文 我想问一下主函数下的while循环里面 为什么等到echo回波回来了 才打开定时器1和外部中断呢 这时候回波已经回来了啊 不是测不出超声波回波的时间了... ****************************************************************************************这是代码原文 我想问一下主函数下的while循环里面 为什么等到echo回波回来了 才打开定时器1和外部中断呢 这时候回波已经回来了啊 不是测不出超声波回波的时间了吗还有就是 为什么在whlie循环前先打开了总中断 然后进入whlie又立刻关闭 再重新打开 那diyi次打开不是很多余吗 麻烦大神解答一下 展开
2018-06-26 20:47:55
482
1
- 单片机60秒计时器的程序,用AT89C51实现
2009-06-03 22:35:17
317
4
- 超声波测距或单片机的英文资料
- 我做毕业设计 要用的 关于超声波车在倒车雷达 测距 谁有相关英文文献及翻译啊 英文Z好要原版的 翻译不要简单的软件翻译的 拜托各位大哥 帮帮小弟
2010-04-27 04:04:26
403
2
- 为什么做的基于单片机的超声波测距传感器测量距离短
2017-03-24 04:05:28
310
3
- 用51单片机实现超声波测距怎样才可以测到4m?
2011-08-14 00:36:29
430
4
- 基于AT89C51单片机的数字频率计毕业设计
- AT89C51单片机 测频范围10HZ-10MHZ 多种波形 ZD是需要添加其他功能 比如测幅值 之类的 (添加功能任意 保证毕业设计的工作量不会太简单) 不支持私下交易,求淘宝链接之类的
2015-11-09 03:36:40
462
2
- 做一个51单片机超声波测距需要哪些器材
2017-02-28 00:10:01
377
1
- 单片机的超声波测距的申请理由怎么写
2018-11-25 12:56:44
287
0
- 51单片机 超声波测距 控制直流电机正反转
- 通过超声波传感器测距,当距离大于设定值A时,直流电机反转;当距离等于设定值A时,直流电机停止;当距离小于设定值A时,直流电机正转。具体要求:1)设定值A能够通过键盘设定;2)电机所处的各个状态(正转、反转和停止)及超声波传感器检测的距离值能够在液... 通过超声波传感器测距,当距离大于设定值A时,直流电机反转;当距离等于设定值A时,直流电机停止;当距离小于设定值A时,直流电机正转。具体要求:1)设定值A能够通过键盘设定;2)电机所处的各个状态(正转、反转和停止)及超声波传感器检测的距离值能够在液晶上实时显示。 展开
2015-07-12 14:27:24
716
1
- 请问适合51单片机用的50M测距用哪种超声波芯片好
2012-10-03 21:03:52
333
2
- arduino 超声波测距 怎么用
2016-10-29 11:15:09
235
1
- 基于89C52单片机的HC-SR04超声波测距系统程序
2018-12-09 01:37:42
286
0
- 这个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
334
2
- 超声波测距
- time=timeH*256+timeL; distance=time*0.0172; //厘米 0.0172怎么来的 , distance怎么来的 求具体转换过程,只要真心,一定采纳
2013-11-23 11:03:17
359
1
- 求一份如图 基于单片机超声波倒车测距的程序
2016-08-01 00:14:58
559
1
9月突出贡献榜
- 单位预算忏悔
- 饿啊地方
- 空中有牛
- 依然相信你会
- 本生(天津)健康科技有限公司
- 猫合宝
- 广东皓天检测仪器有限公司
- 武汉安德信检测设备有限公司
- 上海一科仪器有限公司
- futu888
- 牛牛麻麻2
- 东莞市皓天试验设备有限公司
推荐主页
最新话题
参与评论
登录后参与评论