㈠ 51單片機外圍模塊中,超聲波測距模塊上 STC11 晶元是什麼STC11、TL074和MAX232的作用都是什麼
STC11是一款STC單片機(STC單片機的一個系列,而不是一個具體的單片機型號),在這里的作用是根據收到的發送信號TRIG,發送一端超聲波波形給MAX232;還有個作用是根據接收到的超聲波波形,返回一段ECHO信號。
MAX232在這里做電平轉換,因為單片機給的波形是TTL波形,這里要轉換電平,提高發射功率。
TL074應該是對接收的超聲波波形進行濾波、放大、解調之類的
㈡ 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單片機超聲波測距代碼是多少
1602液晶顯示 的超聲波模塊程序
介面程序里邊都有、、
#include<reg52.h>
//#include<delay.h>
#include <intrins.h>
#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單片機的超聲波測距儀為什麼只能測到1m遠
這個和你的測距儀的測距電路有關。單片機只處理數據,不參與測量。
提高超聲波測試距離的辦法有三種:
1、降低超聲波的頻率;
2、加大超聲波發射功率;
3、提高超聲波接收的靈敏度,提高放大電路的增益;
如果用的是模塊,要注意它的技術文檔。
㈤ 51單片機超聲波測距的問題
關鍵這個電路是硬體設計好就可以。做一個40khz的發射電路。。。用2051的一個io控制電源。。。動態掃描led顯示
另外再做一個40khz的接收電路。。。二者頻率對准。。。接收電路接收到發射信號的時候輸出一個電壓觸發中斷,先接通40khz發射電路的工作電壓。。。單片機開始計時。。。等侍接收電路觸發中斷。當有中斷。停止計時。。。
這個時間除以2再乘以超聲波在空氣中傳播速度。應該就是等於你要測試的距離。。。
這是參考源代碼,可能不全,僅作參考!
#include
#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
=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液晶顯示 的超聲波模塊程序
介面程序里邊都有、、
#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單片機的超聲波測距,有幾個疑問。
這個是都已經把發射接收做好的。其實超聲的發射接收電路並不難,真的想學,建議你直接做。不要去用這種模塊。
㈧ 51單片機控制超聲波測距,大家看看我的程序為什麼不對,詳細注釋
你好:
這時我用51單片機寫的HC_SR04超聲波測距程序。
其實很簡單的,程序一目瞭然。
希望我的回答能幫助到你。
很抱歉,回答者上傳的附件已失效
㈨ 用51單片機實現超聲波測距怎樣才可以測到4m
輸出用並聯門電路驅動,如CD4069,以增大輸出電流。
接收採用低雜訊運放,如NE5532,放大1000倍。
採用接收,發射分開的探頭
超聲波測距系統的軟體設計,由於超聲發射感測器與超聲接收感測器相隔很近,當發射超聲波時,接收感測器會收到很強的干擾信號。為防止系統的誤測,在軟體上採用延遲接收技術,來提高系統的抗干擾能力。一旦按下起始鍵,即發送發射超聲波的指令,同時單片機控制系統開始執行程序,完成對溫度的采樣、濾波,然後獲得發送、接收超聲波的時間間隔,最後計算出距離值。
(1) 接收放大電路,可加入帶通濾波或鎖相放大(LM567)以盡可能減少干擾信號引起誤觸發,另外為防止發射信號直接進入接收端所以設置一定的延時。鎖相應用電路,調整在40KHZ上,但要考慮加入後對接收處理的延時,用軟體調整。
另一方面可採用自動增益補償技術,隨著時間的增加, AGC的放大倍數呈指數規律變化,從而保證了超聲波接收器波形的幅值不隨測量距離的變化而大幅變化,使得每次在同一個波頭觸發計時電路,提高了系統測量准確度。電路可以採用如下圖所示或者採用單片AD603實現,在這里不具體討論。
(2)發射驅動電路,為放大驅動脈沖可以再加入一級三極體放大電路,三極體要選用高頻的如9018以減少放大後波形的失真;另一方面還可以根據超聲波發生器的特點合理設計阻抗匹配,功放效率和機電轉換效率;為此可採用脈沖變壓器,脈沖變壓器是超聲換能器驅動電路中最重要的器件,它的用途是升高脈沖電壓信號,並使功率放大器的輸出阻抗與換能器的負載阻抗匹配。一般脈沖變壓器以變壓器的功率、原副邊電壓信號的幅值確定變壓器的尺寸和變比;而超聲換能器驅動用變壓器則主要以功率和原副邊電感及阻抗匹配確定變壓器的尺寸和變比。缺點是製作和測量都比較麻煩。在大量程應用場合還可以應用電容瞬間放電或電感瞬間放電產生高壓激勵脈沖。
(3)其它可改善的地方,可採用超聲波測距專用晶元SB5027;也可以採用LM1812N單片超聲波收發集成電路。