[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);
}
}
/*******************************************************************************************/