赞助论坛
  • 7137阅读
  • 0回复

US-100超声波模块串口测距 [复制链接]

楼层直达
发帖
20
精华
0
金币
79
威望
3
贡献
0
好评
0
注册
2008-06-02
楼主    lbq691477940 发表于: 2012-03-03 19:02:28 
[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);  
  }
}
/*******************************************************************************************/