找回密码
 注册
关于网站域名变更的通知
查看: 191|回复: 1
打印 上一主题 下一主题

多路超声波单片机程序和资料

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-11-9 09:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 Zedd 于 2018-11-9 09:38 编辑
6 j, I' g$ @5 d5 M2 y" }/ m  t% N0 F, y! Y6 ?
多路超声波的程序,让超声波模块避免相互干扰,实现避障小车、跟随小车灯。。
单片机源程序如下:
  /**************************************************************/
  //使用时将US100跳帽拔下,使其设置为电平触发模式
  /***************************************************************/
        #include   <reg52.h>
        #include   <intrins.h>        
    //引脚定义
    sbit     Trig1    =  P1 ^ 0;   //
    sbit     Ecno1    =  P1 ^ 1;   //
        sbit     Trig2    =  P3 ^ 2;        //
    sbit     Ecno2    =  P3 ^ 3;        //
        sbit     Trig3    =  P1 ^ 2;   //
    sbit     Ecno3    =  P1 ^ 3;   //
        sbit     Trig4    =  P1 ^ 4;        //
    sbit     Ecno4    =  P1 ^ 5;        //
        
    sbit     CS    =  P0 ^ 5;        //片选 高电平有效 单片LCD使用时可固定高电平
    sbit     SID   =  P0 ^ 6;        //数据
    sbit     SCLK  =  P0 ^ 7;        //时钟
    // 函数声明
void Write_char(bit start, unsigned char ddata);
void Send_byte(unsigned char bbyte);
void Delaynms(unsigned int di);
void Lcd_init(void);
void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s);
void LCD_set_xy( unsigned char x, unsigned char y );
void  StartModule() ;
void Clr_Scr();
unsigned char code num[]={"0123456789 :."};
unsigned char code table1[]={"  前方距离:"};
unsigned char code table2[] ={"后方距离:"};
unsigned char code table3[] ={"左方距离:"};
unsigned char code table4[] ={"右方距离:"};
unsigned char code M[] =  {"CM"};
unsigned int  time1=0;
unsigned int  time2=0;
unsigned int  time3=0;
unsigned int  time4=0;
         long S1=0;
                 long S2=0;
                 long S3=0;
                 long S4=0;
         bit  flag =0;
                 
unsigned char disbuff[4]           ={ 0,0,0,0,};
/******************************************************************************/
void Lcd_init(void)        //初始化LCD
{
        Delaynms(10); //启动等待,等LCM讲入工作状态
          CS=1;
          Write_char(0,0x30);  //8 位介面,基本指令集
          Write_char(0,0x0c);  //显示打开,光标关,反白关
          Write_char(0,0x01);  //清屏,将DDRAM的地址计数器归零  
}
/******************************************************************************/
void Write_char(bit start, unsigned char ddata) //写指令或数据
{
        unsigned char start_data,Hdata,Ldata;
          if(start==0)
                start_data=0xf8;         //写指令
    else   
            start_data=0xfa;     //写数据
  
          Hdata=ddata&0xf0;                  //取高四位
          Ldata=(ddata<<4)&0xf0;    //取低四位
          Send_byte(start_data);          //发送起始信号
          Delaynms(5);              //延时
          Send_byte(Hdata);              //发送高四位
          Delaynms(1);              //延时
          Send_byte(Ldata);                  //发送低四位
          Delaynms(1);              //延时
}
/******************************************************************************/
void Send_byte(unsigned char bbyte) //发送一个字节
{
        unsigned char i;
         for(i=0;i<8;i++)
           {
                   SID=bbyte&0x80; //取出最高位
                 SCLK=1;
                   SCLK=0;
                   bbyte<<=1; //左移
           }  
}
/******************************************************************************/
void Delaynms(unsigned int di) //延时
{
        unsigned int da,db;
         for(da=0;da<di;da++)
                   for(db=0;db<10;db++);
}
/******************************************************************************/
void Clr_Scr(void)//清屏函数
{
        Write_char(0,0x01);
}
/******************************************************************************/
void LCD_set_xy( unsigned char x, unsigned char y )//设置LCD显示的起始位置,X为行,Y为列
{        
    unsigned char address;
        switch(x)
        {
                case 0: address = 0x80 + y; break;   
            case 1: address = 0x80 + y; break;
                case 2: address = 0x90 + y; break;
                    case 3: address = 0x88 + y; break;
                case 4: address = 0x98 + y; break;
                default:address = 0x80 + y; break;
        }
    Write_char(0, address);
}
/******************************************************************************/
void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s)
{        
        LCD_set_xy( X, Y );
   
    while (*s)
    {
                Write_char( 1, *s );
            s ++;
                Delaynms(1);
        }
}
/******************************************************************************/
void LCD_Write_number(unsigned char s)//        数字显示函数
{        
        Write_char(1,num);
        Delaynms(1);
}
/******************************************************************************/
void Lcd_Mark2(void)
{
        Clr_Scr();//清屏
        LCD_Write_string(1,0,table1);//
        LCD_Write_string(1,7,M);
        LCD_Write_string(2,0,table2);
        LCD_Write_string(2,7,M);//        
        LCD_Write_string(3,0,table3);//
        LCD_Write_string(3,7,M);
        LCD_Write_string(4,0,table4);//
        LCD_Write_string(4,7,M);
}
/********************************************************/
    void Conut1(void)
        {
           time1=TH0*256+TL0;
           TH0=0x00;
           TL0=0x00;
           S1=time1*1.87/100;       //          11.0592M晶振
           if(flag==1)                      //超出测量
          {         
           flag=0;
           LCD_set_xy( 1, 5 );
           LCD_Write_number(13);
           LCD_Write_number(12);
           LCD_set_xy( 1, 6 );
           LCD_Write_number(13);
           LCD_Write_number(13);
         
           }
         else
          {
           disbuff[1]=S1%1000/100;
           disbuff[2]=S1%1000%100/10;
           disbuff[3]=S1%1000%100%10;
           LCD_set_xy( 1, 5 );
           LCD_Write_number(disbuff[1]);
           LCD_Write_number(disbuff[2]);
           LCD_set_xy( 1, 6 );
           LCD_Write_number(disbuff[3]);
          }
        }
        
        /****************************************************/
void Conut2(void)
        {
           time2=TH0*256+TL0;
           TH0=0x00;
           TL0=0x00;
           S2=time2*1.87/100;       //          11.0592M晶振
           if(flag==1)                      //超出测量
          {         
           flag=0;
           LCD_set_xy( 2, 5 );
           LCD_Write_number(13);
           LCD_Write_number(12);
           LCD_set_xy( 2, 6 );
           LCD_Write_number(13);
           LCD_Write_number(13);
         
           }
         else
          {
           disbuff[1]=S2%1000/100;
           disbuff[2]=S2%1000%100/10;
           disbuff[3]=S2%1000%100%10;
           LCD_set_xy( 2, 5 );
           LCD_Write_number(disbuff[1]);
           LCD_Write_number(disbuff[2]);
           LCD_set_xy( 2, 6 );
           LCD_Write_number(disbuff[3]);
          }
        }
        /****************************************************/
void Conut4(void)
        {
           time4=TH0*256+TL0;
           TH0=0x00;
           TL0=0x00;
           S4=time4*1.87/100;       //          11.0592M晶振
           if(flag==1)                      //超出测量
          {         
           flag=0;
           LCD_set_xy( 2, 5 );
           LCD_Write_number(13);
           LCD_Write_number(12);
           LCD_set_xy( 2, 6 );
           LCD_Write_number(13);
           LCD_Write_number(13);
         
           }
         else
          {
           disbuff[1]=S4%1000/100;
           disbuff[2]=S4%1000%100/10;
           disbuff[3]=S4%1000%100%10;
           LCD_set_xy( 4, 5 );
           LCD_Write_number(disbuff[1]);
           LCD_Write_number(disbuff[2]);
           LCD_set_xy( 4, 6 );
           LCD_Write_number(disbuff[3]);
          }
        }
        /****************************************************/
void Conut3(void)
        {
           time3=TH0*256+TL0;
           TH0=0x00;
           TL0=0x00;
           S3=time3*1.87/100;       //          11.0592M晶振
           if(flag==1)                      //超出测量
          {         
           flag=0;
           LCD_set_xy( 3, 5 );
           LCD_Write_number(13);
           LCD_Write_number(12);
           LCD_set_xy( 3, 6 );
           LCD_Write_number(13);
           LCD_Write_number(13);
         
           }
         else
          {
           disbuff[1]=S3%1000/100;
           disbuff[2]=S3%1000%100/10;
           disbuff[3]=S3%1000%100%10;
           LCD_set_xy( 3, 5 );
           LCD_Write_number(disbuff[1]);
           LCD_Write_number(disbuff[2]);
           LCD_set_xy( 3, 6 );
           LCD_Write_number(disbuff[3]);
          }
        }
/********************************************************/
void delay20us(void)   //误差 -0.016637731481us
{
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=52;a>0;a--);
     //if Keil,require use intrins.h
}
void Delay5ms()                //@11.0592MHz
{
        unsigned char i, j;
        i = 54;
        j = 199;
        do
        {
                while (--j);
        } while (--i);
}
void Delay50ms()                //@11.0592MHz
{
        unsigned char i, j, k;
        i = 3;
        j = 26;
        k = 223;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
        
        
        
        void Delay300ms()                //@11.0592MHz
{
        unsigned char i, j, k;
        i = 13;
        j = 156;
        k = 83;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
/********************************************************/
     void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  {
    flag=1;                                                         //中断溢出标志
  }
/********************************************************/
   void  StartModule1()                          //超声波触发函数
  {   Trig1=0;
         delay20us();
          Trig1=1;
          delay20us();                                                //发射一个大于10us的脉冲,触发超声波发射
          Trig1=0;
  }
  /******************************************************/
  void  StartModule2()                          //超声波触发函数
  {   Trig2=0;
         delay20us();
          Trig2=1;
          delay20us();                                                //发射一个大于10us的脉冲,触发超声波发射
          Trig2=0;
  }
  /******************************************************/
  void  StartModule3()                          //超声波触发函数
  {   Trig3=0;
         delay20us();
          Trig3=1;
          delay20us();                                                //发射一个大于10us的脉冲,触发超声波发射
          Trig3=0;
  }
  /******************************************************/
  void  StartModule4()                          //超声波触发函数
  {   Trig4=0;
         delay20us();
          Trig4=1;
          delay20us();                                                //发射一个大于10us的脉冲,触发超声波发射
          Trig4=0;
  }
/********************************************************/
void main(void)
{  
    TMOD=0x01;                   //T0为方式1
        TH0=0x00;
        TL0=0x00;
        TR0=1;
        ET0=1;             //允许T0中断
        EA=1;                           //开启总中断        
        Lcd_init();       //设置液晶显示器
        Clr_Scr();        //清屏        
……………………
…………限于本文篇幅 余下代码请从论坛下载附件…………
游客,如果您要查看本帖隐藏内容请回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-10 17:50 , Processed in 0.093750 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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