1. 51单片机超声波测距原理图及程序资料 送我一份好吗
图在下面
输出用单片机输出个40Mhz的信号,接收回来的接单片机中断.
程序很简单
我没有单独的程序
voidtimer1(void)interrupt3//超声波发射,12M晶振
{
TH1=(65536-5)/256;
TL1=(65536-5)%256;
chao=~chao;
}40MHZ发射子程序
(没分给个好评吧^_^)
2. 51单片机超声波测距设计一文中protues仿真图是怎么画的,求完整版 找仿真设计而不是实物设计
超声波测距是没法仿真的,想做只能做实物
3. 51单片机超声波测距仪 流程图 及 程序 急求50分
#include<at89x52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define nop _nop_()
uchar code WE0[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80};//0x40-不带点
//unsigned char code WE1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xf0,0xef,0x80}; //0-9 带点
uchar code W[]={0xfe,0xfd,0xfb,0xf7} ;
unsigned char temp[3];
sbit RX=P3^4; //接受端,ECHO
sbit TX=P3^5; //控制端,TRIG
sbit wei=P2^7;
sbit an=P2^6;
bit flag=0;
uint time=0;
uint s=0;
void delay(int xms)//延时大概x毫秒
{
int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void start() //给至少10us的高电平,启动模块
{
TX=1;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
TX=0;
}
uchar count()
{
time=TH0*256+TL0;
TH0=0;
TL0=0; //清零
s=(time*1.7)/100;//厘米
return s;
}
void dispros()//数据分割
{
temp[0]=s/100%10;//百位
temp[1]=s/10%10; //十位
temp[2]=s%10; //个位
}
void display() //显示函数
{
if(s>=500||s<=2) //进入盲区,溢?
{
uchar i;
s=0;
TH0=0;
TL0=0; //清零
P0=0x40;
an=1;
an=0;
for(i=0;i<3;i++)
{
P0=W[i];
wei=1;
wei=0;
}
}
else //正常显示
{
wei=1;
P0=0xfe;
wei=0;
an=1;
P0= WE0[temp[0]];
delay(3);
an=0;
wei=1;
P0=0xfd;
wei=0;
an=1;
P0= WE0[temp[1]];
delay(2);
an=0;
wei=1;
P0=0xfb;
wei=0;
an=1;
P0= WE0[temp[2]];
delay(1);
}
}
void main()
{
TMOD=0X01; //定时器工作方式0
TH0=0;
TL0=0;
EA=1; //开总中断
ET0=1;//开定时器中断
while(1)
{
start();//启动模块
while(!RX); //当RX为零时等待
TR0=1; //启动计数
while(RX); //当RX为1时计数并等待
TR0=0; //关闭计数器
count(); //计数
dispros(); //处理,分割数据
display(); //显示
delay(1);
}
}
4. 求一个51单片机的超声波测距proteus仿真
这样的仿真,电子乐屋上就有好几款,可以去看看。
5. 怎么用51单片机做超声波测距实验
设计软件时传感器在发射超声波时输出高电平,在接收到反射信号后,将输出复位成低电平。这个高电平时间就是超声波在某块与障碍物之间往返一次所需的时间。当无障碍物时,高电平会无限期延续下去,可这样就无法启动下一个超声波发送,你可以在一段合适的时间后,用软件将其强制复位。这个时间决定这个模块的最大检测距离。
超声波测距我也没用过,我在网上查了下,感觉也不是太难,你用的什么型号的超声波传感器的质料找到,硬件连接应该在网上也能找的到。自己多动手学的会快点。我也是新手,呵呵。
6. 哪位高手有51单片机超声波模块测距LCD1602显示的电路图和C程序,跪求!!!!(超声波模块是买好的那种)
#include"reg52.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={
'0','1','2','3','4','5','6','7','8','9'
};// 显示段码值0123456789
sbit LCD_EN=P3^4; //定义LCD使能端
sbit LCD_RS=P3^5; //定义LCD读写端
sbit la=P2^6; //数码管段先端
sbit wela=P2^7; //数码管位先端
/***********************************************/
/**********超声波检测引脚和变量定义*******************************/
sbit Trig=P2^4;// 定义HC-SR04发送端
sbit Echo=P2^5;//定义HC-SR04接收端
uint gewei='0'; //测量距离的个位
uint shiwei='0'; // 测量距离的十位
uint wei='0'; //测量距离的百位
uint qianwei='0';
uint s,time,flag;
/***********************************************/
/**********延时MS函数*******************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/***********************************************/
/**********延时uS函数*******************************/
void delay_uS(uint z)
{
while(z--);
}
/**********************************************8/
/**********写命令*******************************/
void write_com(uchar com)
{
LCD_RS=0;
LCD_EN=0;
delay(5);
P0=com;
LCD_EN=1;
delay(5);
LCD_EN=0;
}
void write_data(uchar date)
{
LCD_RS=1;
LCD_EN=0;
delay(5);
P0=date;
LCD_EN=1;
delay(5);
LCD_EN=0;
}
/**********************************************/
/***********************************************/
/**********LCD1602初始化函数*******************************/
void init()
{
la=0;
wela=0;
LCD_EN=0;
write_com(0x38); //设置16X2显示,5X7点阵显示
write_com(0x0c); //开显示,不显光标
write_com(0x06); //显示一个字符后,地址指针加1且光标加1
write_com(0x01); //清屏
delay(5);
write_com(0x80+1); //从第一行0X10地址位开始显示
}
/***********************************************/
/**********计算距离函数*******************************/
void count(void)
{
time=TH0*256+TL0; //检测 所需时间
TH0=0;
TL0=0;
s=time*0.17*1.136*0.9674;// 计算距离,算出来的单位是CM
gewei=table[s%10];
shiwei=table[s/10%10];
wei=table[s/100%10];
qianwei=table[s/1000];
}
/***********************************************/
/**********T0中断函数*******************************/
void Time0() interrupt 1 //T0中断用作计数器溢出,超出测距范围
{
flag=1; //中断溢出标志
}
/***********************************************/
/**********启动模块函数*******************************/
void startmodle(void) //启动检测模块
{
uchar i;
// for(i=0;i<10;i++)
// {
Trig=1; //启动一次检测模块
delay_uS(20);
Trig=0; //停止向检测模块Trig端发送高电平
}
//}
/***********************************************/
/**********中断初始化函数*******************************/
void InterruptInit(void) //中断初始化
{
TMOD=0x01; //高T0工作方式为方式1,GATE=1
TH0=0;
TL0=0;
ET0=1; //允许T0中断
EA=1; // 开启总中断
}
/***********************************************/
/**********显示函数*******************************/
void Display(void)
{
write_com(0x80+1);
write_data(qianwei);
write_com(0x80+2);
write_data('.');
write_com(0x80+3);
write_data(wei);
write_com(0x80+4);
write_data(shiwei);
write_com(0x80+5);
write_data(gewei);
write_com(0x80+6);
write_data('M');
}
/***********************************************/
/**********主函数*******************************/
void main(void)
{
init(); //初始化LCD1602
while(1)
{
Display(); // 显示 距离,以M为单位
InterruptInit(); //中断初始化
startmodle(); // 启动检测模块
while(!Echo); //当接收为零时等待
TR0=1; //开启计数
while(Echo); //当接收为1计数并等待
TR0=0; //关闭计数
count(); //计算距离
Display(); // 显示 距离,以M为单位
delay(500); //延时80MS
}
}
7. 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();
}
}
}
8. 1602显示超声波测距的C语言程序和Proteus仿真图
#include"reg52.h"
#include"intrins.h"
#define uchar unsigned char //无符号8位
#define uint unsigned int //无符号16位
#define ulong unsigned long //无符号32位
sbit K1=P1^0; //按下K1后,开始测距
sbit LEDRed=P1^1; //测距指示灯,亮表示正在测距,灭表示测距完成
//sbit BEEP=P1^2; //报警测量超出范围
sbit Trig=P2^5; //HC-SR04触发信号输入
sbit Echo=P2^6; //HC-SR04回响信号输出
float xdata DistanceValue=0.0; //测量的距离值
float xdata SPEEDSOUND; //声速
float xdata XTALTIME; //单片机计数周期
uchar xdata stringBuf[6]; //数值转字符串缓冲
//LCD1602提示信息
uchar code Prompts[][16]=
{
{"Measure Distance"}, //测量距离
{"- Out of Range -"}, //超出测量范围
{"MAX range 400cm "}, //测距最大值400cm
{"MIN range 2cm "}, //测距最小值2cm
{" "}, //清屏
{" Press K1 Start "} //按键开始测量
};
uchar xdata DistanceText[]="Range: "; //测量结果字符串
uchar xdata TemperatureText[]="Temperature: ";//测量温度值
extern void LCD_Initialize(); //LCD初始化
extern void LCD_Display_String(uchar *, uchar); //字符串显示
extern void ReadTemperatureFromDS18B20(); //从DS18B20读取温度值
extern int xdata CurTempInteger;
//毫秒延时函数
void DelayMS(uint ms);
//20微秒延时函数
void Delay20us();
//HCSR04初始化
void HCSR04_Initialize();
//测量距离
float MeasuringDistance();
//测距的数值排序求平均
float DistanceStatistics();
//输出距离值到LCD1602上
void DisplayDistanceValue(float dat);
//将无符号的整数转成字符串,返回字符串长度,不包括'\0'结束符
uchar UnsigedIntToString(uint value);
//蜂鸣器
//void Beep(uchar time);
//显示温度值
void DisplayTemperatureValue();
void main()
{
LCD_Initialize();//LCD1602初始化
LCD_Display_String(Prompts[0],0x00);
LCD_Display_String(Prompts[5],0x40);
ReadTemperatureFromDS18B20(); //测温度
HCSR04_Initialize(); //HC-SR04初始化
while(1)
{
if(K1==0)
{
DelayMS(5);
if(K1==0)
{
//Beep(1);
while(K1==0);
LEDRed=0;
ReadTemperatureFromDS18B20();//测温度
DisplayTemperatureValue();
if(CurTempInteger<14)
CurTempInteger=14;
else if(CurTempInteger>26)
CurTempInteger=26;
SPEEDSOUND=334.1+CurTempInteger*0.61;//计算声速
DistanceValue=DistanceStatistics(); //测距并返回距离值
DisplayDistanceValue(DistanceValue); //显示距离值
LEDRed=1;
}
}
}
}
//测距的数值排序求平均
float DistanceStatistics()
{
uchar i,j;
float disData[7],t;
//连续测距
for(i=0;i<7;i++)
{
disData=MeasuringDistance();
DelayMS(80);
}
//排序
for(j=0;j<=6;j++)
{
for(i=0;i<7-j;i++)
{
if(disData>disData[i+1])
{
t=disData;
disData=disData[i+1];
disData[i+1]=t;
}
}
}
return (disData[2]+disData[3]+disData[4])/3;
}
//测量距离
float MeasuringDistance()
{
//最大定时时间约65ms
TH0=0;
TL0=0;
//生成20us的脉冲宽度的触发信号
Trig=1;
Delay20us();
Trig=0;
//等待回响信号变高电平
while(!Echo);
TR0=1; //启动定时器0
//等待回响信号变低电平
while(Echo);
TR0=0; //关闭定时器0
//返回距离值(mm)
return (SPEEDSOUND*XTALTIME*((float)TH0*256+(float)TL0))/2000;
}
//HCSR04初始化
void HCSR04_Initialize()
{
//计算单片机计数周期 晶振=11.953M 单位us
XTALTIME=12/11.953;
//温度25度时声速的值
SPEEDSOUND=334.1+25*0.61;
Trig=0;
Echo=0;
TMOD=0x01;
}
//输出距离值到LCD1602上
void DisplayDistanceValue(float dat)
{
uchar i=0,j=0,len;
uint value;
value=(uint)dat;
//范围检查大于4000mm和小于20mm都为超出测量范围
if(value>4000)
{
LCD_Display_String(Prompts[1],0x00);
LCD_Display_String(Prompts[2],0x40);
//Beep(2);
}
else if(value<20)
{
LCD_Display_String(Prompts[1],0x00);
LCD_Display_String(Prompts[3],0x40);
//Beep(2);
}
else
{
//将数值转换成字符串
len=UnsigedIntToString(value);
//保留1位小数
while(stringBuf!='\0')
{
if(len-j==1)
{
DistanceText[6+j]='.';
j++;
}else
{
DistanceText[6+j]=stringBuf;
i++;
j++;
}
}
DistanceText[6+j]='c';
j++;
DistanceText[6+j]='m';
i=7+j;
//剩余位置补空格
while(i<16)
{
DistanceText=' ';
i++;
}
//LCD_Display_String(Prompts[0],0x00);
LCD_Display_String(DistanceText,0x40);
}
}
//显示温度值
void DisplayTemperatureValue()
{
TemperatureText[13]=CurTempInteger/10+'0';
TemperatureText[14]=CurTempInteger+'0';
TemperatureText[15]='C';
LCD_Display_String(TemperatureText,0x00);
}
//将无符号的整数转成字符串,返回字符串长度
uchar UnsigedIntToString(uint value)
{
uchar i=0,t,length;
//从个位开始转换
do
{
stringBuf='0'+value;
value=value/10;
i++;
}while(value!=0);
length=i;
//将字符串颠倒顺序
for(i=0;i<(length/2);i++)
{
t=stringBuf;
stringBuf=stringBuf[length-i-1];
stringBuf[length-i-1]=t;
}
stringBuf[length]='\0';
return length;
}
//蜂鸣器
//延时函数 毫秒 @12.000MHz
void DelayMS(uint ms)
{
uchar i, j;
while(ms--)
{
_nop_();
i = 2;
j = 239;
do
{
while (--j);
}while (--i);
}
}
//延时函数 20微秒 @12.000MHz
void Delay20us()
{
uchar i;
_nop_();
i = 7;
while (--i);
}
//定时器0中断
void Timer0() interrupt 1
{
}
//DS18B20代码:
#include
#include
#define uchar unsigned char //无符号8位
#define uint unsigned int //无符号16位
//定义DS18B20端口DS18B20_DQ
sbit DS18B20_DQ = P2^7;
//当前采集的温度值整数部分
int xdata CurTempInteger;
//当前采集的温度值小数部分
int xdata CurTempDecimal;
void Delayus(uint count)
{
while (--count);
}
uchar Reset_DS18B20()
{
uchar status;
DS18B20_DQ=1;
Delayus(1);
//开始复位过程
DS18B20_DQ=0; //数据线拉低
Delayus(100); //延时480us-960us
DS18B20_DQ=1; //数据线拉高
Delayus(10); //延时15us-60us
status=DS18B20_DQ; //读取数据线上的状态
Delayus(120);
return status;
}
void WriteByteToDS18B20(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DS18B20_DQ=0;
DS18B20_DQ=dat&0x01; //发送1位数据
Delayus(15); //延时60us以上
DS18B20_DQ=1; //释放总线,等待总线恢复
dat>>=1; //准备下一位数据
}
}
uchar ReadByteFromDS18B20()
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
DS18B20_DQ=0; //拉低总线,产生读信号
dat>>=1;
DS18B20_DQ=1; //释放总线,准备读1位数据
Delayus(2); //延时4us
if(DS18B20_DQ) dat|=0x80; //合并每位数据
Delayus(15); //延时60us
DS18B20_DQ=1; //拉高总线,准备读下1位数据
}
return dat;
}
void ReadTemperatureFromDS18B20()
{
uchar flag=0;//正负符号标志
//存储当前采集的温度值
uchar TempValue[]={0,0};
if(Reset_DS18B20())
{
CurTempInteger=255;
CurTempDecimal=0;
}
else
{
WriteByteToDS18B20(0xCC);//跳过ROM命令
WriteByteToDS18B20(0x44);//温度转换命令
Reset_DS18B20();//复位
WriteByteToDS18B20(0xCC);//跳过ROM命令
WriteByteToDS18B20(0xBE);//读取温度暂存器命令
TempValue[0]=ReadByteFromDS18B20();//先读低字节温度值
TempValue[1]=ReadByteFromDS18B20();//后读高字节温度值
Reset_DS18B20();//复位
//计算温度值
//先进行正温度与负温度判断,高5位全为1(0xF8)则为负数
if((TempValue[1]&0xF8)==0xF8)
{
//负温度计算:取反加1,低字节为0时,高字节取反加1,否则不需要。
TempValue[1]=~TempValue[1];
TempValue[0]=~TempValue[0]+1;
if(TempValue[0]==0x00) TempValue[1]++;
flag=1;//负数标志
}
//将温度值分为整数和小数两部分存储(默认为12位精度)
CurTempInteger=((TempValue[1]&0x07)<<4)|((TempValue[0]&0xF0)>>4); if(flag) CurTempInteger=-CurTempInteger;
CurTempDecimal=(TempValue[0]&0x0F)*625;
}
}
//LCD1602程序代码:
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define Delay4us(){_nop_();_nop_();_nop_();_nop_();}
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^2;
void LCDDelay(uint ms)
{
uchar i, j;
while(ms--)
{
_nop_();
i = 2;
j = 239;
do
{
while (--j);
}while (--i);
}
}
bit LCD_Busy_Check()
{
bit result;
LCD_RS=0; LCD_RW=1; LCD_EN=1;
Delay4us();
result=(bit)(P0&0x80);
LCD_EN=0;
return result;
}
void Write_LCD_Command(uchar cmd)
{
while(LCD_Busy_Check());
LCD_RS=0; LCD_RW=0; LCD_EN=0; _nop_(); _nop_();
P0=cmd; Delay4us();
LCD_EN=1; Delay4us(); LCD_EN=0;
}
void Write_LCD_Data(uchar dat)
{
while(LCD_Busy_Check());
LCD_RS=1;LCD_RW=0;LCD_EN=0;
P0=dat;Delay4us();
LCD_EN=1;Delay4us();LCD_EN=0;
}
void LCD_Set_POS(uchar pos)
{
Write_LCD_Command(pos|0x80);
}
void LCD_Initialize()
{
Write_LCD_Command(0x01); LCDDelay(5);
Write_LCD_Command(0x38); LCDDelay(5);
Write_LCD_Command(0x0C); LCDDelay(5);
Write_LCD_Command(0x06); LCDDelay(5);
}
void LCD_Display_String(uchar *str, uchar LineNo)
{
uchar k;
LCD_Set_POS(LineNo);
for(k=0;k<16;k++)
{
Write_LCD_Data(str[k]);
}
}
void LCD_Display_OneChar(uchar Dat, uchar X, uchar Y)
{
Y &= 0x01; //限制Y不能大于1(2行,0-1)
X &= 0x0F; //限制X不能大于15(16个字符,0-15)
if(Y) {X |= 0x40;} //当要在第二行显示时地址码+0x40;
X |= 0x80; //算出指令码
Write_LCD_Command(X);
Write_LCD_Data(Dat);
}
9. 求一个51单片机超声波测距仪protues仿真图,跪谢
你网络一下"超声波测距仿真" 可以找到的。这文章很好解决了超声波测距仿真的问题。或是找一下:1602显示带温度补偿的超声波测距仿真与实物,有很好的参考价值。
10. 51单片机控制超声波测距,大家看看我的程序为什么不对,详细注释
你好:
这时我用51单片机写的HC_SR04超声波测距程序。
其实很简单的,程序一目了然。
希望我的回答能帮助到你。
很抱歉,回答者上传的附件已失效