导航:首页 > 操作系统 > 51单片机超声波测距

51单片机超声波测距

发布时间:2022-03-31 00:38:02

① 51单片机超声波测距1602显示

以前做了一个数码管显示的超声波测距,你可以参考一下:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9
uchar scanled,cnt1,cnt2,flasht=100;
uchar disdat[4];
uint time,alarml=588; //20cm时间为588个周期
uint ss;
bit flag=0;
sbit led=P1^4;
sbit out=P1^0;
sbit in=P1^1;
void dischg()
{
disdat[0]=ss%10;
disdat[1]=(ss/10)%10;
disdat[2]=(ss/100)%10;
disdat[3]=(ss/1000)%10;
}
void send40k(void)
{
uchar i;
for(i=0;i<10;i++)
{
out=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
out=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void t0isr() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
}
void t1isr() interrupt 3 //显示
{
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
cnt1++;
cnt2++;
if(cnt1>=100)
{
cnt1=0;
flag=1;
}
if(cnt2>=flasht)
{
cnt2=0;
led=~led;
}
switch(scanled)
{
case 0:
P2=0x01;
P0=0xff;
P0=~ledtab[disdat[3]];
break;
case 1:
P2=0x02;
P0=~ledtab[disdat[2]];
break;
case 2:
P2=0x04;
P0=~ledtab[disdat[1]];
break;
case 3:
P2=0x08;
P0=~ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=4;
}
main()
{
unsigned long int T;
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
TR1=1;
ET0=1;
ET1=1;
EA=1;
scanled=0;
time=0;
ss=9999;
dischg();
while(1)
{
if(flag)
{
flag=0;
send40k();
TR0=1;
in=1;
while(in);
TR0=0;
T=time*50000+TH0*256+TL0;
ss=T*10L/294L;
if(ss>588)flasht=100;
else flasht=20;
dischg();
}
}
}

② 用51单片机做超声波测距都需要什么元件

用51单片机做超声波测距需要什么元件这里有介绍http://blog.sina.com.cn/s/blog_68541adc0100qg9v.html 可以参考一下, 同时,这个博客上有大量的超声波测距方面的程序资料。

③ 51单片机超声波测距最远距离是多少

51单片机超声波测距最远距离是30m。

提高超声波测试距离的办法有三种:

1、降低超声波的频率;

2、加大超声波发射功率;

3、提高超声波接收的灵敏度,提高放大电路的增益;如果用的是模块,要注意它的技术文档。

51单片机的优点:

51单片机之所以成为经典,成为易上手的单片机主要有以下特点:从内部的硬件到软件有一套完整的按位操作系统,称作位处理器,处理对象不是字或字节而是位。不但能对片内某些特殊功能寄存器的某位进行处理,如传送、置位、清零、测试等,还能进行位的逻辑运算,其功能十分完备,使用起来得心应手。

④ 51单片机控制的超声波测距原理图谁有啊!

单片机测距就是能够发送接收超声波就行了,没有什么测距原理图之说,只要能够发送接收就行了,发送接收的图我画在纸上了,没法仿真啊,具体用单片机写程序接收处理显示信号。。。。(计数器和外部中断)希望能够帮助你。。。

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

//晶振=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; //测试用引脚

uchar codeSEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9
uint distance[4]; //测距接收缓冲区
uchar ge,shi,,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=;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,_data ;
_data=temp_data/100 ;
temp_data=temp_data%100; //取余运算
shi_data=temp_data/10 ;
temp_data=temp_data%10; //取余运算
ge_data=temp_data;

_data=SEG7[_data];
shi_data=SEG7[shi_data];
ge_data =SEG7[ge_data];

EA=0;
= _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;} /*交换值
}
*/

⑥ 51单片机超声波测距代码

1602液晶显示 的超声波模块程序
接口程序里边都有、、

#include
//#include
#include

#define uchar unsigned char
#define uint unsigned int

sbit lcdrs=P2^3;
sbit lcden=P2^2;
sbit trig=P2^0; //超声波发送
//sbit echo=P3^2; //超声波接受
//P0____________DB0-DB7
uchar dis[]="Disp_HC-SR04";
uchar num[]="0123456789";
uint distance;

void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=121;y>0;y--);
}

void HC_init()
{
TMOD=0x09;
TR0=1;
TH0=0;TL0=0;
}

uint HC_jisuan()
{
uint dist,timer;
timer=TH0;
timer<<=8;
timer=timer|TL0;
dist=timer/53; //晶振11.0592MHz 距离cm=微秒us/58
return dist; //1个机器周期是12个时钟周期 timer*12/(58*11.0592)=timer/53
}

void HC_run()
{
uint tempH=0x00,tempL=0x00;
TH0=0;TL0=0;
trig=0;
trig=1;
delay(1);
trig=0;
while((TH0-tempH!=0||TL0-tempL!=0)||(TH0==0&&TL0==0))
{
tempH=TH0;
tempL=TL0;
}
delay(1);
}

void lcd_write_com(uchar com) //LCD写指令
{
lcdrs=0;
P0=com;
delay(1);
lcden=1;
delay(1);
lcden=0;
}

void lcd_write_data(uchar date) //LCD写数据
{
lcdrs=1;
P0=date;
delay(1);
lcden=1;
delay(1);
lcden=0;
}

void lcd_init() //LCD初始化
{
lcden=0;
lcd_write_com(0x38);
lcd_write_com(0x0c);
lcd_write_com(0x06);
lcd_write_com(0x01);
}

void lcd_display(uchar temp)
{
uint i;

lcd_write_com(0x82);
for(i=0;i<12;i++)
{
lcd_write_data(dis[i]);
}

lcd_write_com(0x80+0x41);
lcd_write_data('D');
lcd_write_data('i');
lcd_write_data('s');
lcd_write_data('t');
lcd_write_data('a');
lcd_write_data('n');
lcd_write_data('c');
lcd_write_data('e');
lcd_write_data(':');
lcd_write_data(num[temp/100]);
lcd_write_data(num[temp/10%10]);
lcd_write_data(num[temp%10]);
lcd_write_data('c');
lcd_write_data('m');
}

void main()
{
lcd_init();
HC_init();
while(1)
{
HC_run();
distance=HC_jisuan();
lcd_display(distance);
delay(200);
}
}

⑦ 51单片机和NE555连接做了个超声波测距

555接成40KHz震荡电路,单片机的一个IO口接555的四脚,555的四脚是使能端,接高电平时555工作,接低电平时555不工作,单片机就是这样控制555的

⑧ 求51单片机超声波测距代码

关键这个电路是硬件设计好就可以。做一个40KHz的发射电路。。。用2051的一个IO控制电源。。。动态扫描LED显示
另外再做一个40KHZ的接收电路。。。二者频率对准。。。接收电路接收到发射信号的时候输出一个电压触发中断,先接通40KHZ发射电路的工作电压。。。单片机开始计时。。。等侍接收电路触发中断。当有中断。停止计时。。。
这个时间除以2再乘以超声波在空气中传播速度。应该就是等于你要测试的距离。。。
这是参考源代码,可能不全,仅作参考!
#include <AT892051.H>
#define unit unsigned int
#define uchar unsigned char
sbit fs="P3"^0; //发送端;
sbit h="P3"^7;
sbit l="P3"^5; //数码管位选端;
sbit m="P3"^4;
uchar tab[16]=\{0x28,0xEB,0x32,0xA2,0xE1,0xA4,0x24,0xEA,0x20,0xA0,0x60,0x25,0x3C,0x23,0x34,0x74};//段码;
uchar u[3]; //显示数组;
unit count,b;
void delay(unit a) //延时;
\{
unit m;
for(m=0;m<a;m++);
}
void tx() //从P3.0发出40KHz的脉冲
\{
uchar n,p;
for(n=0;n<40;n++)\{
fs=1;
for(p=0;p<3;p++);
fs=0;
for(p=0;p<2;p++);
fs=0;
}
}
void display(void) //显示;
\{
for(;;)
\{
l=1;m=1;h=1;
P1=tab[u[0]];
m=0;
delay(10);
m=1;
P1=tab[u[1]];
l=0;
delay(10);
l=1;
P1=tab[u[2]];
h=0;
delay(10);
h=1;
}
}
void rx() interrupt 0 //外部中断0,接收信号
\{
TR0=0;
count=TH0*256+TL0;
if(count<300);
if(count>=300)
\{
b=(17*count)/1000;
u[0]=b%10;
u[1]=(b/10)%10;
u[2]=(b/100)%10;
display();
}
}
void over()interrupt 1 //T0溢出为无效测量FFF;
\{
u[0]=15;
u[1]=15;
u[2]=15;
display();
}
void main()
\{
fs=0;
delay(8600);
TH0=0;
TL0=0;
TMOD=0x01;
TR0=1;
EA=1;
ET0=1;
PT0=1;
tx();
IT0=1;
IE=0x83;

}

⑨ 51单片机可不可以一起实现显示时间和超声波测距两个功能(用1602显示)

当然可以呀,不过这个程序会很麻烦,因为你的时间显示刷新1602应该是每秒一次的,这个一个定时器就能实现,剩下的超声波测距用另一个定时器就能实现的,其实最好的实现颁发并不是这样的,加一个DS1302或者是DS12C887这样你的单片机只要潜心的去处理测距就行了,时间久有一个芯片替你去搞定,年月日时分秒星期都能显示,有电池断电不对丢失数据,最方便的是DS12C887只是有点贵

⑩ 51单片机超声波测距原理图及程序资料 送我一份好吗

图在下面

输出用单片机输出个40Mhz的信号,接收回来的接单片机中断.

程序很简单

我没有单独的程序

voidtimer1(void)interrupt3//超声波发射,12M晶振

{

TH1=(65536-5)/256;

TL1=(65536-5)%256;

chao=~chao;

}40MHZ发射子程序

(没分给个好评吧^_^)

阅读全文

与51单片机超声波测距相关的资料

热点内容
cnc编程工程师自我评价 浏览:126
书本文件夹夹子怎么安 浏览:801
如何更改编译器的背景 浏览:84
linuxcp拷贝文件 浏览:608
我的世界如何屏蔽别人服务器 浏览:907
单片机烧录员 浏览:970
美国数据服务器可以部署什么业务 浏览:973
如何卸载服务器中的ie 浏览:42
单片机必须学编程吗 浏览:153
如何判断是否与服务器连接数据库 浏览:740
吃甜食会缓解压力嘛 浏览:317
pdf魔鬼 浏览:29
二维数组递归解决算法问题 浏览:382
java反射例子 浏览:670
惠普笔记本自带解压软件 浏览:840
抖音视频后台压缩 浏览:707
app里的视频广告从哪里接的 浏览:556
天翼云服务器跟腾讯云 浏览:618
cyk算法实现 浏览:191
大潘号app在哪里可以下载 浏览:109