钻石会员 
 
主题
回帖0
积分11931
阅读权限50
注册时间2009-7-18
最后登录1970-1-1
在线时间 小时
 
 
 
 
 | 
 
 
 
 
 
 
 
/******************************************************************************************* 
        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            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);  
 } 
} 
/*******************************************************************************************/ 
 
US100产品介绍V2.01.doc
(1.26 MB, 下载次数: 704)
 |   
 
评分
- 
查看全部评分
 
 
 
 
 
 |