導航:首頁 > 操作系統 > 超聲波感測器與單片機

超聲波感測器與單片機

發布時間:2024-07-15 15:43:45

㈠ CD4049為什麼能把單片機輸出方波的電壓放大並且產生諧振來驅動超聲波感測器

CD4049,六反相器。
單片機輸出信號先經過一個反相器,分兩路,一路過一級反相到超聲波超感器1腳,另一路兩級反相到2腳。單片機輸出高電平時,1腳高電平2腳低電平,反之2高1低。無論單片機輸出電平高低,發射器兩端都將產生電壓,只是電壓方向不同而已。所以單片輸出方波,在超聲波發射器兩端就產生了交流電壓。

㈡ 51單片機如何控制超聲波感測器 求C語言程序(一定要能用)100追加

//超聲波模塊ME007顯示程序
//晶振=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 code SEG7[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()
{ uchar bt ;
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;} /*交換值
}
*/

我的一個超聲波程序
有問題,請問~~

//超聲波模塊顯示程序
#include <reg52.h> //包括一個52標准內核的頭文件
#include<intrins.h> //包含_nop_()函數定義的頭文件
#define uchar unsigned char //定義一下方便使用
#define uint unsigned int
#define ulong unsigned long
sbit Tx = P3^3; //產生脈沖引腳
sbit Rx = P3^2; //回波引腳
sbit RS=P2^0; //寄存器選擇位,將RS位定義為P2.0引腳
sbit RW=P2^1; //讀寫選擇位,將RW位定義為P2.1引腳
sbit E=P2^2; //使能信號位,將E位定義為P2.2引腳
sbit BF=P0^7; //忙碌標志位,,將BF位定義為P0.7引腳
unsigned char code string[ ]= {"CHAO SHENG BO"};
//unsigned char code string1[ ]={"QUICK STUDY MCU"};
unsigned char code digit[ ]={"0123456789"}; //定義字元數組顯示數字
//uchar code SEG7[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();

/*****************************************************
函數功能:延時1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函數功能:延時若干毫秒
入口參數:n
***************************************************/
void delay(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/*****************************************************
函數功能:判斷液晶模塊的忙碌狀態
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
unsigned char BusyTest(void)
{
bit result;
RS=0; //根據規定,RS為低電平,RW為高電平時,可以讀狀態
RW=1;
E=1; //E=1,才允許讀寫
_nop_(); //空操作
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
result=BF; //將忙碌標志電平賦給result
E=0; //將E恢復低電平
return result;
}
/*****************************************************
函數功能:將模式設置指令或顯示地址寫入液晶模塊
入口參數:dictate
***************************************************/
void WriteInstruction (unsigned char dictate)
{
while(BusyTest()==1); //如果忙就等待
RS=0; //根據規定,RS和R/W同時為低電平時,可以寫入指令
RW=0;
E=0; //E置低電平(根據表8-6,寫指令時,E為高脈沖,
// 就是讓E從0到1發生正跳變,所以應先置"0"
_nop_();
_nop_(); //空操作兩個機器周期,給硬體反應時間
P0=dictate; //將數據送入P0口,即寫入指令或地址
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
E=1; //E置高電平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
E=0; //當E由高電平跳變成低電平時,液晶模塊開始執行命令
}
/*****************************************************
函數功能:指定字元顯示的實際地址
入口參數:x
***************************************************/
void WriteAddress(unsigned char x)
{
WriteInstruction(x|0x80); //顯示位置的確定方法規定為"80H+地址碼x"
}
/*****************************************************
函數功能:將數據(字元的標准ASCII碼)寫入液晶模塊
入口參數:y(為字元常量)
***************************************************/
void WriteData(unsigned char y)
{
while(BusyTest()==1);
RS=1; //RS為高電平,RW為低電平時,可以寫入數據
RW=0;
E=0; //E置低電平(根據表8-6,寫指令時,E為高脈沖,
// 就是讓E從0到1發生正跳變,所以應先置"0"
P0=y; //將數據送入P0口,即將數據寫入液晶模塊
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
E=1; //E置高電平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
E=0; //當E由高電平跳變成低電平時,液晶模塊開始執行命令
}
/*****************************************************
函數功能:對LCD的顯示模式進行初始化設置
***************************************************/
void LcdInitiate(void)
{
delay(15); //延時15ms,首次寫指令時應給LCD一段較長的反應時間
WriteInstruction(0x38); //顯示模式設置:16×2顯示,5×7點陣,8位數據介面
delay(5); //延時5ms,給硬體一點反應時間
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x38); //連續三次,確保初始化成功
delay(5);
WriteInstruction(0x0c); //顯示模式設置:顯示開,無游標,游標不閃爍
delay(5);
WriteInstruction(0x06); //顯示模式設置:游標右移,字元不移
delay(5);
WriteInstruction(0x01); //清屏幕指令,將以前的顯示內容清除
delay(5);
}

void main(void) // 主程序
{ uint distance_data,a,b;
uchar CONT_1;
uchar k; //定義變數i指向字元串數組元素
LcdInitiate(); //調用LCD初始化函數
delay(10); //延時10ms,給硬體一點反應時間
WriteAddress(0x01); // 從第1行第3列開始顯示
k = 0; //指向字元數組的第1個元素
while(string[k] != '\0')
{
WriteData(string[k]);
k++; //指向下字元數組一個元素
}
i=0;

flag=0;
Tx=0; //首先拉低脈沖輸入引腳
TMOD=0x10; //定時器0,定時器1,16位工作方式
// TR0=1; //啟動定時器0
IT0=0; //由高電平變低電平,觸發外部中斷
//ET0=1; //打開定時器0中斷
EX0=0; //關閉外部中斷
EA=1; //打開總中斷0

while(1) //程序循環
{
WriteAddress(0x41); // 從第2行第6列開始顯示
WriteData('J'); //將萬位數字的字元常量寫入LCD
WriteData('U'); //將萬位數字的字元常量寫入LCD
WriteData('L'); //將萬位數字的字元常量寫入LCD
WriteData('I'); //將萬位數字的字元常量寫入LCD
WriteData(':'); //將萬位數字的字元常量寫入LCD
WriteData(digit[]); //將萬位數字的字元常量寫入LCD
WriteData(digit[shi]); //將千位數字的字元常量寫入LCD
WriteData('.'); //將萬位數字的字元常量寫入LCD
WriteData(digit[ge]); //將百位數字的字元常量寫入LCD
WriteData(' '); //將百位數字的字元常量寫入LCD
WriteData('C'); //將萬位數字的字元常量寫入LCD
WriteData('M'); //將萬位數字的字元常量寫入LCD
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;

}

//顯示數據轉換程序
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]&0x7f;
//ge_data =SEG7[ge_data];

EA=0;
= _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;}
}

第一個需要修改,你還是試試這個吧!這個你先理解下,修改引腳……顯示為1602

㈢ 您好,如果想用單片機驅動超聲波感測器,驅動電路選擇什麼好

用單片機驅動一個開關管。
在初級階段,建議用NPN達林頓三極體,例如TIP142之類,電路比較簡單:在NPN達林頓管的集電極與電源之間,接一個脈沖變壓器(初級)。脈沖變壓器的次級接超聲波的發射頭。用於驅動的電源電壓不要太高,也盡量別用5V的單片機電源,建議用5V-12V的獨立電源供電,與單片機共地。
以上實驗成功以後,還需要進一步增加一些原件,用來提高電路的穩定性、可靠性,並減少餘震,當然那是後話了,一步一步來吧。

㈣ 基於單片機的超聲波測距儀畢業論文

相關範文:

基於單片機的超聲波測距儀設計及其應用分析

[摘要] 本文利用超聲波傳輸中距離與時間的關系,採用AT89C51單片機進行控制及數據處理,設計出了能精確測量兩點間距離的超聲波測距儀。該測距儀主要由超聲波發射器電路、超聲波接收器電路、單片機控制電路、環境溫度檢測電路及顯示電路構成。利用所設計出的超聲波測距儀,對不同距離進行了測試,並進行了詳盡的誤差分析。

[關鍵詞] 超聲波測距 單片機 溫度感測器

隨著社會的發展,人們對距離或長度測量的要求越來越高。超聲波測距由於其能進行非接觸測量和相對較高的精度,越來越被人們所重視。本設計的超聲波測距儀,可以對不同距離進行測試,並可以進行詳盡的誤差分析。

一、設計原理

超聲測距儀是根據超聲波遇到障礙物反射回來的特性進行測量的。超聲波發射器向某一方向發射超聲波,在發射同時開始計時,超聲波在空氣中傳播,途中碰到障礙物就立即返回來,超聲波接收器收到反射波就立即中斷停止計時。 通過不斷檢測產生波發射後遇到障礙物所反射的回波,從而測出發射超聲波和接收到回波的時間差T,然後求出距離L。基本的測距公式為:L=(△t/2)*C
式中 L——要測的距離
T——發射波和反射波之間的時間間隔
C——超聲波在空氣中的聲速,常溫下取為340m/s
聲速確定後,只要測出超聲波往返的時間,即可求得L。

二、超聲波測距儀設計目標

測量距離: 5米的范圍之內;通過LED能夠正確顯示出兩點間的距離;誤差小於5%。

三、數據測量和分析

1.數據測量與分析
由於實際測量工作的局限性,最後在測量中選取了一米以下的30cm、50cm、70cm、80cm、90cm、100cm 六個距離進行測量,每個距離連續測量七次,得出測量數據(溫度:29℃),如表所示。從表中的數據可以看出,測量值一般都比實際值要大幾厘米,但對於連續測量的准確性還是比較高的。
對所測的每組數據去掉一個最大值和最小值,再求其平均值,用來作為最終的測量數據,最後進行比較分析。這樣處理數據也具有一定的科學性和合理性。從表中的數據來看,雖然對超聲波進行了溫度補償,但在比較近的距離的測量中其相對誤差也比較大。特別是對30cm和50cm的距離測量上,相對誤差分別達到了5%和4.8%。但從全部測量結果看,本設計的絕對誤差都比較小,也比較穩定。本設計盲區在22.6cm左右,基本滿足設計要求。
2.誤差分析
測距誤差主要來源於以下幾個方面:
(1)超聲波發射與接收探頭與被測點存在一定的角度,這個角度直接影響到測量距離的精確值;(2)超聲波回波聲強與待測距離的遠近有直接關系,所以實際測量時,不一定是第一個回波的過零點觸發;(3)由於工具簡陋,實際測量距離也有誤差。影響測量誤差的因素很多,還包括現場環境干擾、時基脈沖頻率等等。

四、應用分析

採用超聲波測量大氣中的地面距離,是近代電子技術發展才獲得正式應用的技術,由於超聲測距是一種非接觸檢測技術,不受光線、被測對象顏色等的影響,在較惡劣的環境(如含粉塵)具有一定的適應能力。因此,用途極度廣泛。例如:測繪地形圖,建造房屋、橋梁、道路、開挖礦山、油井等,利用超聲波測量地面距離的方法,是利用光電技術實現的,超聲測距儀的優點是:儀器造價比光波測距儀低,省力、操作方便。
超聲測距儀在先進的機器人技術上也有應用,把超聲波源安裝在機器人身上,由它不斷向周圍發射超聲波並且同時接收由障礙物反射回波來確定機器人的自身位置,用它作為感測器控制機器人的電腦等等。由於超聲波易於定向發射,方向性好,強度好控制,它的應用價值己被普遍重視。
總之,由以上分析可看出:利用超聲波測距,在許多方面有很多優勢。因此,本課題的研究是非常有實用和商業價值。

五、結論

本設計的測量距離符合市場要求,測量的盲區也控制在23cm以內。針對市場需求,本設計還可以加大發射功率,讓測量的距離更加的遠。在顯示方面,也可以對程序做適當改動,使開始發射超聲波時LED顯示出溫度值,到超聲波回波接收到以後通過計算得出距離值時,LED自動切換顯示距離值,這樣在視覺效果上得到更加直觀的了解。

參考文獻:

[1]孫涵芳徐愛卿:MCS一51/96系列單片機原理及應用(修訂版)[M].北京:北京航空航天大學出版社.2002.46-170
[2]金篆芷王明時:現代感測器技術[M].電子工業出版社.1995.331—335
[3]孫涵芳徐愛卿:MCS一51/96系列單片機原理及應用(修訂版)[M].北京:北京航空航天大學出版社.2002.46-170
[4]路錦正王建勤楊紹國趙珂趙太飛:超聲波測距儀的設計[J].感測器技術.2002

僅供參考,請自借鑒

希望對您有幫助

㈤ 使用超聲波感測器HY-SRF05時,VCC端接在STM32F103C8T6單片機的5V引腳

STM32F103的電源是3.3V的,而一般這個3.3V的電源都是從5V電源得來的;
如果你板上沒有5V電源,如是直接從鋰電池供電的,只需要加個小小的電源轉換模塊,3.3-->5V,便可得到5V電源,而感測器的耗電很小容易滿足;

㈥ 超聲波感測器測距,直接把感測器與單片機連接行不

如果你買的是帶輸出的模擬信號或者數字信號輸出的感測器是可以的,不過大部分說的感測器,是一個超聲波換能器,是不可以的,要增加發射接收電路才行.你說的幾塊錢一個的感測器,其實是倒車雷達或者民用的測距感測器,這種就是一個超聲波換能器.是很便宜.

㈦ 單片機如何接收超聲波感測器的信號

單片機和超聲換能器之間,應該是有發射電路和小信號放大電路。單片機控制發射電路發射,小信號放大電路接收到超聲換能器的信號,進行放大後接入單片機。至於要怎麼採集,採集的時間,要看你具體要實現的功能。

閱讀全文

與超聲波感測器與單片機相關的資料

熱點內容
服從命令圖片動畫片 瀏覽:191
Web與雲伺服器的區別 瀏覽:996
linux沒有rz 瀏覽:305
理正勘察加密鎖 瀏覽:698
安卓程序結構是什麼 瀏覽:297
活塞式壓縮機檢修規程 瀏覽:762
伺服器未響怎麼辦 瀏覽:698
超短指標公式源碼 瀏覽:708
什麼是opc的客戶端和伺服器 瀏覽:33
ug編程指令軟體自學網 瀏覽:290
android板子 瀏覽:751
單機版ERP系統怎麼用伺服器 瀏覽:472
編程序實現兩個變數值的交換 瀏覽:501
qt移植到linux 瀏覽:998
php常用數據結構 瀏覽:879
泰拉瑞亞伺服器為什麼別人進不來 瀏覽:743
app鎖定怎麼解開 瀏覽:464
怎麼查看郵件源碼 瀏覽:880
小說推薦網源碼 瀏覽:201
怎麼樣搞垮別人的app軟體 瀏覽:519