• 赞助网站
  • 您的位置:  首页 >> 技术交流区 >> MCU技术 >> US-100超声波模块串口测距
    US-100超声波模块串口测距
    2012年03月03日 点击: 编辑: lbq691477940
    [audio09]
    /*******************************************************************************************
                        US-100超声波模块串口测距
    模式选择跳线的间距为2.54mm,当插上跳线帽时为UART(串口)模式只需要在Trig/TX=p3.1 管脚输入0X55
    (波特率9600),系统便启动对当前距离进行测量,然后将距离值通过Echo/RX=p3.0 管脚输出测量输出的
    距离值共两个字节,第一个字节是距离的高8位(HDate),第二个字节为距离的低8位(LData),单位为
    毫米。即距离值为 (HData*256 +LData)mm。                 如果大于4.5米,显示 "-"
      cpu 89c52   11.0592MHZ   lbq691477940                             3-3-2012
    *******************************************************************************************/
    #include "REG52.h"
    #define uchar unsigned char
    #define uint unsigned   int
    void UART_ISR(void);
    void UARTSnd(unsigned char dat);
    void UART_init();
    void MeterTempByUART();
    /*******************************************************************************************/
    sbit   dula = P2^6;       //显示段选锁存控制端
    sbit   wela = P2^7;       //显示位选锁存控制端
    sbit   led0 = P1^0;     //接收指示灯
    sbit   led1 = P1^7;     //发送指示灯
    uchar   dispbuf[4];         //显示缓冲区
    uchar idata GLengthLoh[2];   //接收缓冲区

    /************************共阳数码管显示位码+数码管0-9段码**********************************
    uchar code dispbit[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//共阳极数码管显示位码
    /************************************数码管0-9段码****************************************
    uchar code SEG7[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xbf};//共阳极数码管0-9 -
    /*******************************************************************************************/

    /************************共阴数码管显示位码+数码管0-9段码**********************************/
    uchar code dispbit[]={/* 0xfe,0xfd,0xfb,0xf7, */0xef,0xdf,0xbf,0x7f};//共阴极数码管显示位码
    /************************************数码管0-9段码****************************************/
    uchar code SEG7[]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40};//共阴极数码管0-9 -
    /*******************************************************************************************/
    void UART_ISR(void) interrupt 4
    {
      uchar temp ,k;
      ES = 0;       // 关中断        
      if(RI)
      {
        RI = 0;       // 清接收标志
        temp = SBUF;
        GLengthLoh[k] = temp;
        k++;
        if(k == 2) // k = 数据长度
        k = 0;
        led0 = ~led0;
      }  
      ES = 1;     //开中
    }
    /*******************************************************************************************/
    void UARTSnd(unsigned char dat)//向串口发送一个字符
    {
      TI = 0;         // 清发送标志
      SBUF = dat;     //如果TI为0等待
      while (!TI);   // wait until sent
      led1 = ~led1;
    }
    /*******************************************************************************************/
    void UART_init()
    {  
      TH1 = 0xFD;
      TL1 = 0xFD;
      TMOD = 0x21;         //设置定时器1为模式2;定时器0为模式1    
      TH0 =(65536-2500)/256; //约2.50MS定时器初值
      TL0 =(65536-2500)%256; //约2.50MS定时器初值
      ET0 = 1;
      TR0 = 1;           //启动定时器
      TR1 = 1;           //启动定时器     SM0 SM1
      SM0 = 0;           //串口通信模式设置   0     0 = 0
      SM1 = 1;                     //   0     1 = 1
                                //   1     0 = 2
                                //   1     1 = 3
      REN = 1;   //串口允许接收数据
      ES = 1;     //开串中断
      EA = 1;
    }
    /*******************************************************************************************/
    //定时器0中断,用做显示
    timer0() interrupt 1 // 定时器0中断是1号
    {
      uchar dispcount; //自定义寄存器
      static unsigned char count=0;
      TH0 =(65536-2500)/256; //约2.50MS定时器初值
      TL0 =(65536-2500)%256; //约2.50MS定时器初值   TH0 = 0xef;   TL0 = 0x94;   //写入定时器0初始值
      dula = 0; dula = 1;
      P0 = SEG7[dispbuf[dispcount]];   //根据dispcount当前计算值到dispbuf
                            //显示缓冲存储区取待显示值作为参数到
                            //SEG7段码存储区取显示段码赋给P0口  
      dula = 0; wela = 0; wela = 1;
      P0 = dispbit[dispcount];   //根据dispcount当前计算值到dispbit位选存储区
                        //取显示位码赋给P0口
      wela = 0;  
      dispcount++;
      if(dispcount == 4)         //共4位显示位
      {
        dispcount = 0;
      }
      count++;
      if(count == 100)     //约25MS读取一次
      {
        count = 0;
        MeterTempByUART();
      }    
    }
    /*******************************************************************************************/
    void DisplayLength(unsigned long number)
    {
      if(number > 4500)     //如果大于4.5米,显示 "-"
      {
        dispbuf[0] = 10;   //显示 "-"
        dispbuf[1] = 10;   //显示 "-"
        dispbuf[2] = 10;   //显示 "-"
        dispbuf[3] = 10;   //显示 "-"
      }
      else if(number < 4500)
      {
        dispbuf[0] = number / 1000;
        dispbuf[1] = number % 1000 / 100;
        dispbuf[2] = number % 100 / 10;
        dispbuf[3] = number % 10;
      }
     
    }  
    /*******************************************************************************************/
    void MeterTempByUART()
    {
      UARTSnd(0X55);
    }
    /*******************************************************************************************/
    void main(void)
    {
      unsigned long PreLength = 0;
      UART_init();
      while(1)
      {    
        PreLength = GLengthLoh[0] * 256 + GLengthLoh[1];
        DisplayLength(PreLength);  
        //DisplayLength(1234);  
      }
    }
    /*******************************************************************************************/
    赞助网站 | 关于我们 | 版权声明 | 站点导航 | 收藏本站 | 设为首页