我在讀大學,學習過單片機原理與應用,但是感覺不怎么懂這個東西,但對單片機是很感興趣的。
現在有打算弄一個超聲波測距顯示模塊,網上也買了一些硬件設備。
超聲波測距模塊是US-015,現在將一塊1602顯示屏裝在一個單片機開發板上。
在本論壇也搜了資料,找了找相關的編程資料。想請問現在怎么弄,能讓距離顯示出來。程序該加點什么條件。
硬件方面超聲波的四根線該接在開發板的哪里。
小白是真不太懂,希望有大佬能幫幫,感激不盡!
這是程序,大佬們幫忙看看該加點啥,或者怎么改,
單片機源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define comm 0
- #define dat 1
- sbit RS=P2^6; //高電平數據,低電平命令
- sbit RW=P2^5; //讀寫控制腳,高電平讀,低電平寫
- sbit E=P2^7; //輸入使能
- sbit busy=P0^7; //忙信號檢測
- sbit SDA=P1^0; //I2C數據線
- 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]; //數據緩沖區
- uint buffer[3]; //測量距離存儲區
- uint dis; //最小距離存儲器
- uchar code tab1[]={"距離障礙物:"}; //顯示字符
- uchar code tab2[]={"無障礙物"};
- uchar code tab[]={"0123456789cm"};
- /*****************函數聲明*****************/
- void start_bit(void); //I2C起始函數
- void stop_bit(void); //I2C停止函數
- void mast_ack(void); //主答函數
- bit write_8bit(uchar ch); //I2C總線寫8位數據函數
- bit page_rd(uchar device,uint fir_ad,uint count,uchar *firw_ad);//I2C總線頁面讀函數
- uint measure(uchar device); //啟動測距函數
- uint get_distance(void); //讀測距值函數
- void judge(void); //判斷距離函數
- void init_lcd (void); //LCD初始化函數
- void wr_lcd(uchar dat_comm,uchar content);//LCD寫數據函數
- void chk_busy (void); //忙信號檢測
- void chn_disp(uchar code *chn,uchar pos,uchar n);//顯示提示漢字函數
- uchar dat_adj(uint dat1); //顯示數據調整函數
- void disp_dist(uchar dat1); //顯示距離函數
- void disp(void); //顯示函數
- void delay (uint us); //延時函數
- void delay1 (uint ms); //延時函數
- /*********************主程序***********************/
- void main ()
- {
- init_lcd (); //初始化LCD
- while (1)
- {
- judge(); //判斷障礙物距離
- disp(); //顯示提示信息
- }
- }
- /********************I2C起始函數*******************/
- void start_bit(void)
- {
- SCL=1;_nop_();
- SDA=1;_nop_();
- SDA=0;_nop_();
- SCL=0;_nop_();
- }
- /*******************I2C停止函數********************/
- void stop_bit(void)
- {
- SDA=0;_nop_();
- SCL=1;_nop_();
- SDA=1;_nop_();
- }
- /****************I2C總線寫8位數據函數**************/
- bit write_8bit(uchar ch)
- {
- uchar i=8;
- bit fan_w;
- SCL=0;_nop_();
- while (i--)
- {
- SDA=(bit)(ch&0x80);_nop_(); //獲取發送位數據
- ch<<=1;
- SCL=1;_nop_();
- SCL=0;_nop_();
- }
- SDA=1;_nop_();
- SCL=1;_nop_();
- fan_w=SDA; //應答位
- SCL=0;_nop_();
- return(fan_w); //返回應答位
- }
- /*****************I2C總線頁面讀函數****************/
- 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);}//送器件地址,寫數據
- if(write_8bit(fir_ad)!=0){stop_bit();return(0);}//送讀數據寄存器首地址
- start_bit();
- if(write_8bit(device|0x01)!=0){stop_bit();return(0);}//準備讀數據
- while(count--)
- {
- uchar i=8;
- while(i--) //讀入數據
- {
- (*ufirstwr_ad)<<=1;
- SCL=1;_nop_();
- if(SDA) (*ufirstwr_ad)|=0x01;
- SCL=0; _nop_();
- }
- ufirstwr_ad++;
- mast_ack(); //主機產生應答位
- }
- while(j--)
- {
- (*ufirstwr_ad)<<=1;
- SCL=0;_nop_();_nop_();SCL=1;
- if(SDA) (*ufirstwr_ad)|=0x01;
- }
- stop_bit(); //停止I2C數據傳送
- return(1);
- }
- /*********************主答函數*********************/
- void mast_ack(void)
- {
- SCL=0;_nop_();
- SDA=0;_nop_();
- SCL=1;_nop_();
- SCL=0;_nop_();
- SDA=1;_nop_();
- }
- /********************測距函數******************/
- uint measure(uchar device)
- {
- uint temp;
- start_bit(); //啟動I2C
- while(!write_8bit(device)); //發器件地址
- 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); //返回距離值
- }
- /*******************求最小測距值函數*****************/
- uint get_distance(void)
- {
- uint mix;
- buffer[0]=measure(0xe0); //讀左側測距值
- buffer[1]=measure(0xe2); //讀中間測距值
- buffer[2]=measure(0xe4); //讀右側測距值
- if(buffer[0]<buffer[1])
- mix=buffer[0];
- else
- mix=buffer[1];
- if(mix>buffer[2])mix=buffer[2]; //合并為一個16位數據
- return(mix);
- }
- /*******************判斷距離函數*******************/
- 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初始化函數*******************/
- void init_lcd (void)
- {
- wr_lcd (comm,0x30); //基本指令動作
- wr_lcd (comm,0x01); //清屏
- wr_lcd (comm,0x06); //光標的移動方向
- wr_lcd (comm,0x0c); //開顯示,關游標
- }
- /*******************LCD寫數據函數*****************/
- void wr_lcd (uchar dat_comm,uchar content)
- {
- chk_busy ();
- if(dat_comm)
- {
- RS=1; //數據
- RW=0; //寫入
- }
- else
- {
- RS=0; //命令
- RW=0; //寫入
- }
- P0=content; //輸出數據或命令
- E=1;
- E=0;
- }
- /********************忙信號檢測********************/
- void chk_busy (void)
- {
- P0=0xff;
- RS=0;
- RW=1;
- E=1;
- while(busy==1); //檢驗LCD是否處于忙狀態
- E=0;
- }
- /****************顯示提示漢字函數******************/
- 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]);
- }
- /****************顯示數據調整函數******************/
- 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; //確定顯示位數
- }
- return(i);
- }
- /******************顯示距離函數********************/
- 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); //設置顯示起始位置
- for (i=temp;i<6;i++) //送顯示數據
- wr_lcd(dat,tab[dis_buf[i]]);
- }
- }
- /********************顯示函數**********************/
- void disp(void)
- {
- chn_disp(tab1,0x80,11); //顯示提示漢字
- disp_dist(dis); //顯示距離值
- }
- /********************延時函數**********************/
- void delay (uint us)
- {
- while(us--);
- }
- /********************延時函數**********************/
- void delay1 (uint ms)
- {
- uint i,j;
- for(i=0;i<ms;i++)
- for(j=0;j<15;j++)
- delay(1);
- }
復制代碼
這是硬件設備,接線問題也求助一下下。
7C40D95133CA35F763DC54F68DE1D2A5.jpg (186.56 KB, 下載次數: 64)
下載附件
2021-4-22 20:03 上傳
感激不盡感激不盡。。。。。。。。。。。
|