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超聲波測距程序。
其實很簡單的,程序一目瞭然。
希望我的回答能幫助到你。
很抱歉,回答者上傳的附件已失效