欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
關(guān)于單片機超聲波測距,大佬們幫忙看看該加點啥,或者怎么改
[打印本頁]
作者:
蕭薰兒的小迷弟
時間:
2021-4-22 20:05
標(biāo)題:
關(guān)于單片機超聲波測距,大佬們幫忙看看該加點啥,或者怎么改
我在讀大學(xué),學(xué)習(xí)過單片機原理與應(yīng)用,但是感覺不怎么懂這個東西,但對單片機是很感興趣的。
現(xiàn)在有打算弄一個超聲波測距顯示模塊,網(wǎng)上也買了一些硬件設(shè)備。
超聲波測距模塊是US-015,現(xiàn)在將一塊1602顯示屏裝在一個單片機開發(fā)板上。
在本論壇也搜了資料,找了找相關(guān)的編程資料。想請問現(xiàn)在怎么弄,能讓距離顯示出來。程序該加點什么條件。
硬件方面超聲波的四根線該接在開發(fā)板的哪里。
小白是真不太懂,希望有大佬能幫幫,感激不盡!
這是程序,大佬們幫忙看看該加點啥,或者怎么改,
單片機源程序如下:
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define comm 0
#define dat 1
sbit RS=P2^6; //高電平數(shù)據(jù),低電平命令
sbit RW=P2^5; //讀寫控制腳,高電平讀,低電平寫
sbit E=P2^7; //輸入使能
sbit busy=P0^7; //忙信號檢測
sbit SDA=P1^0; //I2C數(shù)據(jù)線
sbit SCL=P1^1; //I2C時鐘線
sbit Buzz=P1^2; //蜂鳴器控制腳
sbit LED_G=P1^3; //綠色指示燈控制腳
sbit LED_R=P1^4; //紅色指示燈控制腳
uchar buf[6],dis_buf[6]; //數(shù)據(jù)緩沖區(qū)
uint buffer[3]; //測量距離存儲區(qū)
uint dis; //最小距離存儲器
uchar code tab1[]={"距離障礙物:"}; //顯示字符
uchar code tab2[]={"無障礙物"};
uchar code tab[]={"0123456789cm"};
/*****************函數(shù)聲明*****************/
void start_bit(void); //I2C起始函數(shù)
void stop_bit(void); //I2C停止函數(shù)
void mast_ack(void); //主答函數(shù)
bit write_8bit(uchar ch); //I2C總線寫8位數(shù)據(jù)函數(shù)
bit page_rd(uchar device,uint fir_ad,uint count,uchar *firw_ad);//I2C總線頁面讀函數(shù)
uint measure(uchar device); //啟動測距函數(shù)
uint get_distance(void); //讀測距值函數(shù)
void judge(void); //判斷距離函數(shù)
void init_lcd (void); //LCD初始化函數(shù)
void wr_lcd(uchar dat_comm,uchar content);//LCD寫數(shù)據(jù)函數(shù)
void chk_busy (void); //忙信號檢測
void chn_disp(uchar code *chn,uchar pos,uchar n);//顯示提示漢字函數(shù)
uchar dat_adj(uint dat1); //顯示數(shù)據(jù)調(diào)整函數(shù)
void disp_dist(uchar dat1); //顯示距離函數(shù)
void disp(void); //顯示函數(shù)
void delay (uint us); //延時函數(shù)
void delay1 (uint ms); //延時函數(shù)
/*********************主程序***********************/
void main ()
{
init_lcd (); //初始化LCD
while (1)
{
judge(); //判斷障礙物距離
disp(); //顯示提示信息
}
}
/********************I2C起始函數(shù)*******************/
void start_bit(void)
{
SCL=1;_nop_();
SDA=1;_nop_();
SDA=0;_nop_();
SCL=0;_nop_();
}
/*******************I2C停止函數(shù)********************/
void stop_bit(void)
{
SDA=0;_nop_();
SCL=1;_nop_();
SDA=1;_nop_();
}
/****************I2C總線寫8位數(shù)據(jù)函數(shù)**************/
bit write_8bit(uchar ch)
{
uchar i=8;
bit fan_w;
SCL=0;_nop_();
while (i--)
{
SDA=(bit)(ch&0x80);_nop_(); //獲取發(fā)送位數(shù)據(jù)
ch<<=1;
SCL=1;_nop_();
SCL=0;_nop_();
}
SDA=1;_nop_();
SCL=1;_nop_();
fan_w=SDA; //應(yīng)答位
SCL=0;_nop_();
return(fan_w); //返回應(yīng)答位
}
/*****************I2C總線頁面讀函數(shù)****************/
bit page_rd(uchar device,uint fir_ad,uint count,uchar *firw_ad)
{
uchar j=8;
uchar data *ufirstwr_ad;
ufirstwr_ad=firw_ad;
start_bit();
if(write_8bit(device)!=0){stop_bit();return(0);}//送器件地址,寫數(shù)據(jù)
if(write_8bit(fir_ad)!=0){stop_bit();return(0);}//送讀數(shù)據(jù)寄存器首地址
start_bit();
if(write_8bit(device|0x01)!=0){stop_bit();return(0);}//準(zhǔn)備讀數(shù)據(jù)
while(count--)
{
uchar i=8;
while(i--) //讀入數(shù)據(jù)
{
(*ufirstwr_ad)<<=1;
SCL=1;_nop_();
if(SDA) (*ufirstwr_ad)|=0x01;
SCL=0; _nop_();
}
ufirstwr_ad++;
mast_ack(); //主機產(chǎn)生應(yīng)答位
}
while(j--)
{
(*ufirstwr_ad)<<=1;
SCL=0;_nop_();_nop_();SCL=1;
if(SDA) (*ufirstwr_ad)|=0x01;
}
stop_bit(); //停止I2C數(shù)據(jù)傳送
return(1);
}
/*********************主答函數(shù)*********************/
void mast_ack(void)
{
SCL=0;_nop_();
SDA=0;_nop_();
SCL=1;_nop_();
SCL=0;_nop_();
SDA=1;_nop_();
}
/********************測距函數(shù)******************/
uint measure(uchar device)
{
uint temp;
start_bit(); //啟動I2C
while(!write_8bit(device)); //發(fā)器件地址
while(!write_8bit(0x00)); //命令寄存器
while(!write_8bit(0x51)); //以厘米為單位返回距離
stop_bit(); //停止I2C
delay1(100);
while(!page_rd(device,0x02,2,buf)); //讀距離值
temp=(buf[0]<<8)|buf[1];
return(buffer); //返回距離值
}
/*******************求最小測距值函數(shù)*****************/
uint get_distance(void)
{
uint mix;
buffer[0]=measure(0xe0); //讀左側(cè)測距值
buffer[1]=measure(0xe2); //讀中間測距值
buffer[2]=measure(0xe4); //讀右側(cè)測距值
if(buffer[0]<buffer[1])
mix=buffer[0];
else
mix=buffer[1];
if(mix>buffer[2])mix=buffer[2]; //合并為一個16位數(shù)據(jù)
return(mix);
}
/*******************判斷距離函數(shù)*******************/
void judge(void)
{
dis=get_distance(); //讀取測量距離最小值
if(dis<5000)
{
LED_R=0; //紅色報警燈亮
LED_G=1; //綠色報警燈滅
}
else
{
LED_R=1; //紅色報警燈滅
LED_G=0; //綠色報警燈亮
}
if(dis<3000)
Buzz=0; //蜂鳴器報警
else
Buzz=1; //蜂鳴器停止報警
}
/******************LCD初始化函數(shù)*******************/
void init_lcd (void)
{
wr_lcd (comm,0x30); //基本指令動作
wr_lcd (comm,0x01); //清屏
wr_lcd (comm,0x06); //光標(biāo)的移動方向
wr_lcd (comm,0x0c); //開顯示,關(guān)游標(biāo)
}
/*******************LCD寫數(shù)據(jù)函數(shù)*****************/
void wr_lcd (uchar dat_comm,uchar content)
{
chk_busy ();
if(dat_comm)
{
RS=1; //數(shù)據(jù)
RW=0; //寫入
}
else
{
RS=0; //命令
RW=0; //寫入
}
P0=content; //輸出數(shù)據(jù)或命令
E=1;
E=0;
}
/********************忙信號檢測********************/
void chk_busy (void)
{
P0=0xff;
RS=0;
RW=1;
E=1;
while(busy==1); //檢驗LCD是否處于忙狀態(tài)
E=0;
}
/****************顯示提示漢字函數(shù)******************/
void chn_disp(uchar code *chn,uchar pos,uchar n)
{
uchar i;
wr_lcd (comm,0x30); //基本指令動作
wr_lcd (comm,pos); //顯示位置
for (i=0;i<n;i++)
wr_lcd (dat,chn[i]);
}
/****************顯示數(shù)據(jù)調(diào)整函數(shù)******************/
uchar dat_adj(uint dat1)
{
uchar i;
dis_buf[0]=(uchar)(dat1/1000); //高度千位
dis_buf[1]=(uchar)((dat1%1000)/100); //高度百位
dis_buf[2]=(uchar)((dat1%100)/10); //高度十位
dis_buf[3]=(uchar)(dat1%10); //高度個位
dis_buf[4]=10;
for(i=0;i<3;i++)
{
if(dis_buf[i]!=0)break; //確定顯示位數(shù)
}
return(i);
}
/******************顯示距離函數(shù)********************/
void disp_dist(uchar dat1)
{
uchar temp,i;
if(dat1>5000)
{
chn_disp(tab2,0x92,4); //無障礙顯示
}
else
{
temp=dat_adj(dat1);
wr_lcd(comm,0x30); //基本指令
wr_lcd(comm,temp+0x92); //設(shè)置顯示起始位置
for (i=temp;i<6;i++) //送顯示數(shù)據(jù)
wr_lcd(dat,tab[dis_buf[i]]);
}
}
/********************顯示函數(shù)**********************/
void disp(void)
{
chn_disp(tab1,0x80,11); //顯示提示漢字
disp_dist(dis); //顯示距離值
}
/********************延時函數(shù)**********************/
void delay (uint us)
{
while(us--);
}
/********************延時函數(shù)**********************/
void delay1 (uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<15;j++)
delay(1);
}
復(fù)制代碼
這是硬件設(shè)備,接線問題也求助一下下。
7C40D95133CA35F763DC54F68DE1D2A5.jpg
(186.56 KB, 下載次數(shù): 64)
下載附件
2021-4-22 20:03 上傳
感激不盡感激不盡!!!!!!!!!!!!
作者:
家星
時間:
2021-4-23 07:58
/*
接線方式:超聲波模塊trig接單片機P2^0 ,超聲波模塊echo接單片機P2^1
P3^2接P2^1
*/
#include "reg52.h"
typedef unsigned char uchar;
typedef unsigned int uint;
sbit trig=P2^0;
sbit echo=P2^1;
sbit beep=P1^5;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uint num=0; //計時
float distance; //距離
float cm_per_num=3.40; //按照我的定時器初始化設(shè)定,1個num是100us
uchar DisplayData[6];
uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};//顯示0~9的值
void delay1ms(uchar xms)
{
uchar a,b,c;
for(c=xms;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
/*
設(shè)置工作方式為方式1,GATE=1,當(dāng)中斷0口輸入1且TR0=1 時定時器工作
因為超聲波模塊的工作原理就是在接收回波時,從開始到結(jié)束,ech0=1
所以在單片機上用杜邦線將ech0的P21口和 中斷0口 P32口鏈接
使得在回波期間,定時器工作,計算回波的時間,進而s=vt算出距離
*/
void TimerInit() //初始化,定時10us
{
TMOD = 0x09;
TH0 = 0xFF;
TL0 = 0x9C;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Timer0() interrupt 1 //中斷 每過100us,num+1
{
TH0 = 0xFF;
TL0 = 0x9C;
num++;
}
void value_distance()
{
trig=0;
echo=0;
delay1ms(1);
trig=1;
delay1ms(11); //給trig一個10us以上的高電平信號
trig=0;
if(echo==1) //如果有反射回的超聲波,echo腳會在這期間持續(xù)輸入高電平
{
delay1ms(300); //接收超聲波期間不做任何動作。
}
distance=num*cm_per_num/2; //計算距離,單位CM
num=0;
}
void datapros() //對取得的距離進行處理
{
float a= distance*100;
DisplayData[0]=smgduan[(int)a%10];
DisplayData[1]=smgduan[(int)a%100/10];
DisplayData[2]=smgduan[(int)a%1000/100]+0x80; //數(shù)字+小數(shù)點
DisplayData[3]=smgduan[(int)a%10000/1000];
DisplayData[4]=smgduan[(int)a/10000];
}
void DigDisplay() //數(shù)碼管顯示
{
uchar i;
for(i=0;i<6;i++)
{
switch(i) //位選,選擇點亮的數(shù)碼管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//顯示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//顯示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//顯示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//顯示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//顯示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//顯示第5位
}
P0=DisplayData[i];//發(fā)送段碼
delay1ms(1); //間隔一段時間掃描
P0=0x00;//消隱
}
}
void main()
{
while(1)
{
TimerInit();
value_distance();
datapros();
DigDisplay();
}
}
復(fù)制代碼
這是我以前寫的,測試過,是可以正常工作,并顯示距離的。
作者:
雷歐庫珀
時間:
2021-4-23 08:02
gnd接地,vcc接高電平的。剩下兩個看程序端口定義接
作者:
glinfei
時間:
2021-4-23 09:25
你主要不是接線問題,用的超聲測距模塊US-015,不是IIC設(shè)備,不能按你的程序使用,二樓的是正確的。
作者:
魚文韻
時間:
2021-11-29 17:06
Trig Echo腳接好就行
作者:
18520649817
時間:
2021-12-12 23:43
你那個超聲波模塊不是IIC協(xié)議的好像
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1