找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3580|回复: 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, 下载次数: 87)

评分

参与人数 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 单片机教程网

快速回复 返回顶部 返回列表