久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4571|回復: 12
打印 上一主題 下一主題
收起左側

多路超聲波單片機程序和資料

  [復制鏈接]
跳轉到指定樓層
樓主
多路超聲波的程序,讓超聲波模塊避免相互干擾,實現避障小車、跟隨小車燈。。


單片機源程序如下:
  1.   /**************************************************************/
  2.   //使用時將US100跳帽拔下,使其設置為電平觸發模式
  3.   /***************************************************************/
  4.         #include   <reg52.h>
  5.         #include   <intrins.h>       
  6.     //引腳定義
  7.     sbit     Trig1    =  P1 ^ 0;   //
  8.     sbit     Ecno1    =  P1 ^ 1;   //
  9.         sbit     Trig2    =  P3 ^ 2;        //
  10.     sbit     Ecno2    =  P3 ^ 3;        //
  11.         sbit     Trig3    =  P1 ^ 2;   //
  12.     sbit     Ecno3    =  P1 ^ 3;   //
  13.         sbit     Trig4    =  P1 ^ 4;        //
  14.     sbit     Ecno4    =  P1 ^ 5;        //
  15.        
  16.     sbit     CS    =  P0 ^ 5;        //片選 高電平有效 單片LCD使用時可固定高電平
  17.     sbit     SID   =  P0 ^ 6;        //數據
  18.     sbit     SCLK  =  P0 ^ 7;        //時鐘

  19.     // 函數聲明
  20. void Write_char(bit start, unsigned char ddata);
  21. void Send_byte(unsigned char bbyte);
  22. void Delaynms(unsigned int di);
  23. void Lcd_init(void);
  24. void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s);
  25. void LCD_set_xy( unsigned char x, unsigned char y );
  26. void  StartModule() ;
  27. void Clr_Scr();
  28. unsigned char code num[]={"0123456789 :."};
  29. unsigned char code table1[]={"  前方距離:"};
  30. unsigned char code table2[] ={"后方距離:"};
  31. unsigned char code table3[] ={"左方距離:"};
  32. unsigned char code table4[] ={"右方距離:"};
  33. unsigned char code M[] =  {"CM"};
  34. unsigned int  time1=0;
  35. unsigned int  time2=0;
  36. unsigned int  time3=0;
  37. unsigned int  time4=0;
  38.          long S1=0;
  39.                  long S2=0;
  40.                  long S3=0;
  41.                  long S4=0;
  42.          bit  flag =0;

  43.                  
  44. unsigned char disbuff[4]           ={ 0,0,0,0,};
  45. /******************************************************************************/
  46. void Lcd_init(void)        //初始化LCD
  47. {
  48.         Delaynms(10); //啟動等待,等LCM講入工作狀態
  49.           CS=1;
  50.           Write_char(0,0x30);  //8 位介面,基本指令集
  51.           Write_char(0,0x0c);  //顯示打開,光標關,反白關
  52.           Write_char(0,0x01);  //清屏,將DDRAM的地址計數器歸零  
  53. }

  54. /******************************************************************************/
  55. void Write_char(bit start, unsigned char ddata) //寫指令或數據
  56. {
  57.         unsigned char start_data,Hdata,Ldata;
  58.           if(start==0)
  59.                 start_data=0xf8;         //寫指令
  60.     else   
  61.             start_data=0xfa;     //寫數據
  62.   
  63.           Hdata=ddata&0xf0;                  //取高四位
  64.           Ldata=(ddata<<4)&0xf0;    //取低四位
  65.           Send_byte(start_data);          //發送起始信號
  66.           Delaynms(5);              //延時
  67.           Send_byte(Hdata);              //發送高四位
  68.           Delaynms(1);              //延時
  69.           Send_byte(Ldata);                  //發送低四位
  70.           Delaynms(1);              //延時
  71. }

  72. /******************************************************************************/
  73. void Send_byte(unsigned char bbyte) //發送一個字節
  74. {
  75.         unsigned char i;
  76.         for(i=0;i<8;i++)
  77.            {
  78.                    SID=bbyte&0x80; //取出最高位
  79.                 SCLK=1;
  80.                    SCLK=0;
  81.                    bbyte<<=1; //左移
  82.            }  
  83. }

  84. /******************************************************************************/
  85. void Delaynms(unsigned int di) //延時
  86. {
  87.         unsigned int da,db;
  88.         for(da=0;da<di;da++)
  89.                    for(db=0;db<10;db++);
  90. }

  91. /******************************************************************************/

  92. void Clr_Scr(void)//清屏函數
  93. {
  94.         Write_char(0,0x01);
  95. }

  96. /******************************************************************************/
  97. void LCD_set_xy( unsigned char x, unsigned char y )//設置LCD顯示的起始位置,X為行,Y為列
  98. {       
  99.     unsigned char address;
  100.         switch(x)
  101.         {
  102.                 case 0: address = 0x80 + y; break;   
  103.             case 1: address = 0x80 + y; break;
  104.                 case 2: address = 0x90 + y; break;
  105.                     case 3: address = 0x88 + y; break;
  106.                 case 4: address = 0x98 + y; break;
  107.                 default:address = 0x80 + y; break;
  108.         }
  109.     Write_char(0, address);
  110. }

  111. /******************************************************************************/
  112. void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s)
  113. {       
  114.         LCD_set_xy( X, Y );
  115.    
  116.     while (*s)
  117.     {
  118.                 Write_char( 1, *s );
  119.             s ++;
  120.                 Delaynms(1);
  121.         }
  122. }

  123. /******************************************************************************/
  124. void LCD_Write_number(unsigned char s)//        數字顯示函數
  125. {       
  126.         Write_char(1,num[s]);
  127.         Delaynms(1);
  128. }
  129. /******************************************************************************/
  130. void Lcd_Mark2(void)
  131. {
  132.         Clr_Scr();//清屏
  133.         LCD_Write_string(1,0,table1);//
  134.         LCD_Write_string(1,7,M);
  135.         LCD_Write_string(2,0,table2);
  136.         LCD_Write_string(2,7,M);//       
  137.         LCD_Write_string(3,0,table3);//
  138.         LCD_Write_string(3,7,M);
  139.         LCD_Write_string(4,0,table4);//
  140.         LCD_Write_string(4,7,M);
  141. }

  142. /********************************************************/
  143.     void Conut1(void)
  144.         {
  145.            time1=TH0*256+TL0;
  146.            TH0=0x00;
  147.            TL0=0x00;
  148.            S1=time1*1.87/100;       //          11.0592M晶振
  149.            if(flag==1)                      //超出測量
  150.           {         
  151.            flag=0;
  152.            LCD_set_xy( 1, 5 );
  153.            LCD_Write_number(13);
  154.            LCD_Write_number(12);
  155.            LCD_set_xy( 1, 6 );
  156.            LCD_Write_number(13);
  157.            LCD_Write_number(13);
  158.           
  159.            }
  160.          else
  161.           {
  162.            disbuff[1]=S1%1000/100;
  163.            disbuff[2]=S1%1000%100/10;
  164.            disbuff[3]=S1%1000%100%10;
  165.            LCD_set_xy( 1, 5 );
  166.            LCD_Write_number(disbuff[1]);
  167.            LCD_Write_number(disbuff[2]);
  168.            LCD_set_xy( 1, 6 );
  169.            LCD_Write_number(disbuff[3]);
  170.           }
  171.         }
  172.        
  173.         /****************************************************/
  174. void Conut2(void)
  175.         {
  176.            time2=TH0*256+TL0;
  177.            TH0=0x00;
  178.            TL0=0x00;
  179.            S2=time2*1.87/100;       //          11.0592M晶振
  180.            if(flag==1)                      //超出測量
  181.           {         
  182.            flag=0;
  183.            LCD_set_xy( 2, 5 );
  184.            LCD_Write_number(13);
  185.            LCD_Write_number(12);
  186.            LCD_set_xy( 2, 6 );
  187.            LCD_Write_number(13);
  188.            LCD_Write_number(13);
  189.           
  190.            }
  191.          else
  192.           {
  193.            disbuff[1]=S2%1000/100;
  194.            disbuff[2]=S2%1000%100/10;
  195.            disbuff[3]=S2%1000%100%10;
  196.            LCD_set_xy( 2, 5 );
  197.            LCD_Write_number(disbuff[1]);
  198.            LCD_Write_number(disbuff[2]);
  199.            LCD_set_xy( 2, 6 );
  200.            LCD_Write_number(disbuff[3]);

  201.           }
  202.         }
  203.         /****************************************************/
  204. void Conut4(void)
  205.         {
  206.            time4=TH0*256+TL0;
  207.            TH0=0x00;
  208.            TL0=0x00;
  209.            S4=time4*1.87/100;       //          11.0592M晶振
  210.            if(flag==1)                      //超出測量
  211.           {         
  212.            flag=0;
  213.            LCD_set_xy( 2, 5 );
  214.            LCD_Write_number(13);
  215.            LCD_Write_number(12);
  216.            LCD_set_xy( 2, 6 );
  217.            LCD_Write_number(13);
  218.            LCD_Write_number(13);
  219.           
  220.            }
  221.          else
  222.           {
  223.            disbuff[1]=S4%1000/100;
  224.            disbuff[2]=S4%1000%100/10;
  225.            disbuff[3]=S4%1000%100%10;
  226.            LCD_set_xy( 4, 5 );
  227.            LCD_Write_number(disbuff[1]);
  228.            LCD_Write_number(disbuff[2]);
  229.            LCD_set_xy( 4, 6 );
  230.            LCD_Write_number(disbuff[3]);

  231.           }
  232.         }
  233.         /****************************************************/
  234. void Conut3(void)
  235.         {
  236.            time3=TH0*256+TL0;
  237.            TH0=0x00;
  238.            TL0=0x00;
  239.            S3=time3*1.87/100;       //          11.0592M晶振
  240.            if(flag==1)                      //超出測量
  241.           {         
  242.            flag=0;
  243.            LCD_set_xy( 3, 5 );
  244.            LCD_Write_number(13);
  245.            LCD_Write_number(12);
  246.            LCD_set_xy( 3, 6 );
  247.            LCD_Write_number(13);
  248.            LCD_Write_number(13);
  249.           
  250.            }
  251.          else
  252.           {
  253.            disbuff[1]=S3%1000/100;
  254.            disbuff[2]=S3%1000%100/10;
  255.            disbuff[3]=S3%1000%100%10;
  256.            LCD_set_xy( 3, 5 );
  257.            LCD_Write_number(disbuff[1]);
  258.            LCD_Write_number(disbuff[2]);
  259.            LCD_set_xy( 3, 6 );
  260.            LCD_Write_number(disbuff[3]);

  261.           }
  262.         }
  263. /********************************************************/

  264. void delay20us(void)   //誤差 -0.016637731481us
  265. {
  266.     unsigned char a,b;
  267.     for(b=1;b>0;b--)
  268.         for(a=52;a>0;a--);
  269.      //if Keil,require use intrins.h
  270. }

  271. void Delay5ms()                //@11.0592MHz
  272. {
  273.         unsigned char i, j;

  274.         i = 54;
  275.         j = 199;
  276.         do
  277.         {
  278.                 while (--j);
  279.         } while (--i);
  280. }



  281. void Delay50ms()                //@11.0592MHz
  282. {
  283.         unsigned char i, j, k;

  284.         i = 3;
  285.         j = 26;
  286.         k = 223;
  287.         do
  288.         {
  289.                 do
  290.                 {
  291.                         while (--k);
  292.                 } while (--j);
  293.         } while (--i);
  294. }

  295.        
  296.        
  297.        
  298.         void Delay300ms()                //@11.0592MHz
  299. {
  300.         unsigned char i, j, k;

  301.         i = 13;
  302.         j = 156;
  303.         k = 83;
  304.         do
  305.         {
  306.                 do
  307.                 {
  308.                         while (--k);
  309.                 } while (--j);
  310.         } while (--i);
  311. }

  312. /********************************************************/
  313.      void zd0() interrupt 1                  //T0中斷用來計數器溢出,超過測距范圍
  314.   {
  315.     flag=1;                                                         //中斷溢出標志
  316.   }
  317. /********************************************************/
  318.    void  StartModule1()                          //超聲波觸發函數
  319.   {   Trig1=0;
  320.          delay20us();
  321.           Trig1=1;
  322.           delay20us();                                                //發射一個大于10us的脈沖,觸發超聲波發射
  323.           Trig1=0;
  324.   }
  325.   /******************************************************/
  326.   void  StartModule2()                          //超聲波觸發函數
  327.   {   Trig2=0;
  328.          delay20us();
  329.           Trig2=1;
  330.           delay20us();                                                //發射一個大于10us的脈沖,觸發超聲波發射
  331.           Trig2=0;
  332.   }
  333.   /******************************************************/
  334.   void  StartModule3()                          //超聲波觸發函數
  335.   {   Trig3=0;
  336.          delay20us();
  337.           Trig3=1;
  338.           delay20us();                                                //發射一個大于10us的脈沖,觸發超聲波發射
  339.           Trig3=0;
  340.   }
  341.   /******************************************************/
  342.   void  StartModule4()                          //超聲波觸發函數
  343.   {   Trig4=0;
  344.          delay20us();
  345.           Trig4=1;
  346.           delay20us();                                                //發射一個大于10us的脈沖,觸發超聲波發射
  347.           Trig4=0;
  348.   }
  349. /********************************************************/
  350. void main(void)
  351. {  
  352.     TMOD=0x01;                   //設T0為方式1
  353.         TH0=0x00;
  354.         TL0=0x00;
  355.         TR0=1;
  356.         ET0=1;             //允許T0中斷
  357.         EA=1;                           //開啟總中斷       

  358.         Lcd_init();       //設置液晶顯示器
  359.         Clr_Scr();        //清屏       
  360. ……………………

  361. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
多路超聲波測試.zip (257.93 KB, 下載次數: 88)

評分

參與人數 1黑幣 +5 收起 理由
o大少o + 5 分享資料幫助大家,謝謝!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:155211 發表于 2018-4-11 09:45 | 只看該作者
樓主可以發給小弟一份學習一下嗎?小弟郵箱810002396@qq.com,因為初學,所以希望求幫助,感謝
回復

使用道具 舉報

板凳
ID:155211 發表于 2018-4-11 09:46 | 只看該作者
樓主可以發給小弟一份嗎?最近在學超聲波測距的模塊
回復

使用道具 舉報

地板
ID:305762 發表于 2018-4-11 12:03 | 只看該作者
看起來很不錯
回復

使用道具 舉報

5#
ID:89286 發表于 2018-4-11 23:04 | 只看該作者
thanks for sharing
回復

使用道具 舉報

6#
ID:304041 發表于 2018-4-12 10:16 | 只看該作者
    sbit     CS    =  P0 ^ 5;        //片選 高電平有效 單片LCD使用時可固定高電平
    sbit     SID   =  P0 ^ 6;        //數據
    sbit     SCLK  =  P0 ^ 7;        //時鐘
請問樓主這是定義lcd液晶顯示定義端口,請問樓主這是用的1602a液晶顯示嗎?
回復

使用道具 舉報

7#
ID:319211 發表于 2018-4-30 08:22 來自觸屏版 | 只看該作者
還想要
回復

使用道具 舉報

8#
ID:140395 發表于 2018-4-30 08:30 | 只看該作者
51的數度夠不夠  我的反應慢
回復

使用道具 舉報

9#
ID:322076 發表于 2018-5-4 14:35 | 只看該作者
不錯!!!
回復

使用道具 舉報

10#
ID:333473 發表于 2018-5-19 09:56 | 只看該作者
不錯  現在正需要這個  謝謝樓主
回復

使用道具 舉報

11#
ID:323102 發表于 2018-10-23 12:53 | 只看該作者
有沒有這個程序的電路圖?
回復

使用道具 舉報

12#
ID:323102 發表于 2018-10-23 12:54 | 只看該作者
能不能把電路圖分享給我一下1527283489@qq.com
回復

使用道具 舉報

13#
ID:231648 發表于 2020-3-25 16:52 | 只看該作者
話說樓主用的啥顯示器  
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区福利视频 | 国产高清免费视频 | 中文字幕一区二区三区在线观看 | 久久33 | 在线一区二区国产 | 毛片一区二区三区 | 毛片a级毛片免费播放100 | 色在线免费视频 | 精品国产乱码久久久久久闺蜜 | 黑人成人网 | 国产不卡视频在线 | 在线精品一区二区 | 二区视频| 一区二区在线免费播放 | 欧美日韩亚洲视频 | 美女久久| 日本三级视频 | 亚洲精品乱码 | 久久不射电影网 | 亚洲欧美在线一区 | 在线资源视频 | 久久av一区二区三区 | 精品国产91亚洲一区二区三区www | 久久亚洲欧美日韩精品专区 | 在线免费观看a级片 | 亚洲电影第三页 | 韩日视频在线观看 | 欧美视频免费 | 国产精品免费一区二区 | 黄色网址大全在线观看 | 台湾佬伊人 | 不卡一二三区 | 欧美日韩精品亚洲 | 亚洲一区二区精品视频在线观看 | 国产成人精品a视频 | 欧美成人一级 | 国产精品国产精品 | 精品国产一区二区三区久久久四川 | 欧美做暖暖视频 | 精品91久久 | 国产日韩视频 |