|
我在讀大學(xué),學(xué)習(xí)過(guò)單片機(jī)原理與應(yīng)用,但是感覺(jué)不怎么懂這個(gè)東西,但對(duì)單片機(jī)是很感興趣的。
現(xiàn)在有打算弄一個(gè)超聲波測(cè)距顯示模塊,網(wǎng)上也買(mǎi)了一些硬件設(shè)備。
超聲波測(cè)距模塊是US-015,現(xiàn)在將一塊1602顯示屏裝在一個(gè)單片機(jī)開(kāi)發(fā)板上。
在本論壇也搜了資料,找了找相關(guān)的編程資料。想請(qǐng)問(wèn)現(xiàn)在怎么弄,能讓距離顯示出來(lái)。程序該加點(diǎn)什么條件。
硬件方面超聲波的四根線(xiàn)該接在開(kāi)發(fā)板的哪里。
小白是真不太懂,希望有大佬能幫幫,感激不盡!
這是程序,大佬們幫忙看看該加點(diǎn)啥,或者怎么改,
單片機(jī)源程序如下:
- #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; //讀寫(xiě)控制腳,高電平讀,低電平寫(xiě)
- sbit E=P2^7; //輸入使能
- sbit busy=P0^7; //忙信號(hào)檢測(cè)
- sbit SDA=P1^0; //I2C數(shù)據(jù)線(xiàn)
- sbit SCL=P1^1; //I2C時(shí)鐘線(xiàn)
- 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]; //測(cè)量距離存儲(chǔ)區(qū)
- uint dis; //最小距離存儲(chǔ)器
- uchar code tab1[]={"距離障礙物:"}; //顯示字符
- uchar code tab2[]={"無(wú)障礙物"};
- 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總線(xiàn)寫(xiě)8位數(shù)據(jù)函數(shù)
- bit page_rd(uchar device,uint fir_ad,uint count,uchar *firw_ad);//I2C總線(xiàn)頁(yè)面讀函數(shù)
- uint measure(uchar device); //啟動(dòng)測(cè)距函數(shù)
- uint get_distance(void); //讀測(cè)距值函數(shù)
- void judge(void); //判斷距離函數(shù)
- void init_lcd (void); //LCD初始化函數(shù)
- void wr_lcd(uchar dat_comm,uchar content);//LCD寫(xiě)數(shù)據(jù)函數(shù)
- void chk_busy (void); //忙信號(hào)檢測(cè)
- 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í)函數(shù)
- void delay1 (uint ms); //延時(shí)函數(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總線(xiàn)寫(xiě)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總線(xiàn)頁(yè)面讀函數(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);}//送器件地址,寫(xiě)數(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(); //主機(jī)產(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_();
- }
- /********************測(cè)距函數(shù)******************/
- uint measure(uchar device)
- {
- uint temp;
- start_bit(); //啟動(dòng)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); //返回距離值
- }
- /*******************求最小測(cè)距值函數(shù)*****************/
- uint get_distance(void)
- {
- uint mix;
- buffer[0]=measure(0xe0); //讀左側(cè)測(cè)距值
- buffer[1]=measure(0xe2); //讀中間測(cè)距值
- buffer[2]=measure(0xe4); //讀右側(cè)測(cè)距值
- if(buffer[0]<buffer[1])
- mix=buffer[0];
- else
- mix=buffer[1];
- if(mix>buffer[2])mix=buffer[2]; //合并為一個(gè)16位數(shù)據(jù)
- return(mix);
- }
- /*******************判斷距離函數(shù)*******************/
- void judge(void)
- {
- dis=get_distance(); //讀取測(cè)量距離最小值
- if(dis<5000)
- {
- LED_R=0; //紅色報(bào)警燈亮
- LED_G=1; //綠色報(bào)警燈滅
- }
- else
- {
- LED_R=1; //紅色報(bào)警燈滅
- LED_G=0; //綠色報(bào)警燈亮
- }
- if(dis<3000)
- Buzz=0; //蜂鳴器報(bào)警
- else
- Buzz=1; //蜂鳴器停止報(bào)警
- }
- /******************LCD初始化函數(shù)*******************/
- void init_lcd (void)
- {
- wr_lcd (comm,0x30); //基本指令動(dòng)作
- wr_lcd (comm,0x01); //清屏
- wr_lcd (comm,0x06); //光標(biāo)的移動(dòng)方向
- wr_lcd (comm,0x0c); //開(kāi)顯示,關(guān)游標(biāo)
- }
- /*******************LCD寫(xiě)數(shù)據(jù)函數(shù)*****************/
- void wr_lcd (uchar dat_comm,uchar content)
- {
- chk_busy ();
- if(dat_comm)
- {
- RS=1; //數(shù)據(jù)
- RW=0; //寫(xiě)入
- }
- else
- {
- RS=0; //命令
- RW=0; //寫(xiě)入
- }
- P0=content; //輸出數(shù)據(jù)或命令
- E=1;
- E=0;
- }
- /********************忙信號(hào)檢測(cè)********************/
- void chk_busy (void)
- {
- P0=0xff;
- RS=0;
- RW=1;
- E=1;
- while(busy==1); //檢驗(yàn)LCD是否處于忙狀態(tài)
- E=0;
- }
- /****************顯示提示漢字函數(shù)******************/
- void chn_disp(uchar code *chn,uchar pos,uchar n)
- {
- uchar i;
- wr_lcd (comm,0x30); //基本指令動(dòng)作
- 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); //高度個(gè)位
- 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); //無(wú)障礙顯示
- }
- 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í)函數(shù)**********************/
- void delay (uint us)
- {
- while(us--);
- }
- /********************延時(shí)函數(shù)**********************/
- void delay1 (uint ms)
- {
- uint i,j;
- for(i=0;i<ms;i++)
- for(j=0;j<15;j++)
- delay(1);
- }
復(fù)制代碼
這是硬件設(shè)備,接線(xiàn)問(wèn)題也求助一下下。
感激不盡感激不盡。。。。。。。。。。!
|
|