#include <reg52.h>
#include <string.h>
/************************************位定义************************************/
sbit echo = P2^0; //回声接收端口
sbit trig = P2^1; //超声触发端口
sbit wei1=P2^4;
sbit wei2=P2^5;
sbit wei3=P2^6;
sbit wei4=P2^7;
/************************************宏定义************************************/
#define dula P0 //段选信号的锁存器控制
#define uchar unsigned char
#define uint unsigned int
/********************************定义变量和数组********************************/
long int distance=0; //距离变量
uchar count;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef,0x71};
unsigned char SendData[32] = {0x00}; //发送数据包
/******************************************************************************/
/* 函数名称 : delay */
/* 函数描述 : 延时函数 */
/* 输入参数 : 延时时间(ms) */
/* 返回值 : 无 */
/******************************************************************************/
void delay(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=112;j>0;j--);
}
/******************************************************************************/
/* 函数名称 : display */
/* 函数描述 : 数码管显示函数 */
/* 输入参数 : 测试距离值的十倍 */
/* 返回值 : 无 */
/******************************************************************************/
void display(long int num) //显示程序
{
uchar qian,bai,shi,ge;
if((num>5000)||(num == 0))
{
qian=15;//距离值上为百位
bai=15;
shi=10;
ge=15;
}
else
{
qian=num/1000;//距离值上为百位
bai=(num/100)%10;//距离值上为十位
shi=(num/10)%10;//距离值上为个位,并且显示时需要加小数点
ge=num%10;//距离值上为小数位,并已经四舍五入
}
wei1=1; //显示千位
wei2=0;
wei3=0;
wei4=0;
P0=table[qian];
delay(2);
wei1=0; //显示百位
wei2=1;
wei3=0;
wei4=0;
P0=table[bai];
delay(2);
wei1=0; //显示十位
wei2=0;
wei3=1;
wei4=0;
P0=table1[shi];
delay(2);
wei1=0; //显示个位
wei2=0;
wei3=0;
wei4=1;
P0=table[ge];
delay(2);
}
/******************************************************************************/
/* 函数名称 : Init_timer2 */
/* 函数描述 : 初始化单片机函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void Init_timer0(void)
{
TMOD |= 0x01; //定时器0初始化,设置为16位自动重装模式
TL0 = 0x66;
TH0 = 0xfc; //1ms
ET0 = 1; //开定时器2
EA = 1; //总中断使能
}
/******************************************************************************/
/* 函数名称 : Init_Parameter */
/* 函数描述 : 初始化参数和IO口函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void Init_Parameter(void)
{
echo = 0;
trig = 0;
count = 0;
distance = 0;
}
/******************************************************************************/
/* 函数名称 : Trig_SuperSonic */
/* 函数描述 : 发出声波函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void Trig_SuperSonic(void)//出发声波
{
trig = 1;
delay(1);
trig = 0;
}
/******************************************************************************/
/* 函数名称 : Measure_Distance */
/* 函数描述 : 计算距离函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void Measure_Distance(void)
{
uchar l;
uint h,y;
TR0 = 1;
while(echo)
{
;
}
TR0 = 0;
l = TL0;
h = TH0;
y = (h << 8) + l;
y = y - 0xfc66;//us部分
distance = y + 1000 * count;//计算总时间 (us)
TL0 = 0x66;
TH0 = 0xfc;
delay(30);
distance = 0.17 * distance;//
}
/******************************************************************************/
/* 函数名称 : init_com */
/* 函数描述 : 串口初始化函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void init_com(void)
{
EA=1; //开总中断
ES=1; //允许串口中断
ET1=1; //允许定时器T1的中断
TMOD|=0x20; //定时器T1,在方式2中断产生波特率
PCON=0x00; //SMOD=0
SCON=0x50; // 方式1 由定时器控制
TH1=0xfd; //波特率设置为9600
TL1=0xfd;
TR1=1; //开定时器T1运行控制?
}
/******************************************************************************/
/* 函数名称 : PutString */
/* 函数描述 : 串口发送函数 */
/* 输入参数 : 数组 */
/* 参数描述 : char类型字符串 */
/* 返回值 : 无 */
/******************************************************************************/
void PutString(unsigned char *TXStr)
{
ES=0;
while(*TXStr!=0)
{
SBUF=*TXStr;
while(TI==0);
TI=0;
TXStr++;
}
ES=1;
}
/******************************************************************************/
/* 函数名称 : main */
/* 函数描述 : 主函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void main(void)
{
uchar a;
init_com();
Init_timer0();
Init_Parameter();
while(1)
{
Trig_SuperSonic(); //触发超声波发射
while(echo == 0) //等待回声
{
;
}
Measure_Distance(); //计算脉宽并转换为距离
for(a=100;a>0;a--)
{
display(distance);
}
//组装发送超声波到上位机
memset(SendData, 0x00, sizeof(SendData));
memcpy(SendData, "$51,CSB", sizeof("$51,CSB"));
SendData[7] = distance / 1000 + '0';
SendData[8] = distance % 1000 / 100 + '0';
SendData[9] = distance % 100 / 10 + '0';
SendData[10] = '.';
SendData[11] = distance % 10 + '0';
SendData[12] = '#';
SendData[13] = 0x00;
PutString(SendData);
Init_Parameter(); // 参数重新初始化
}
}
/******************************************************************************/
/* 函数名称 : timer0 */
/* 函数描述 : T0中断处理函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void timer0 (void) interrupt 1
{
TF0 = 0;
TL0 = 0x66;
TH0 = 0xfc;
count++;
if(count == 18)//超声波回声脉宽最多18ms
{
TR0 =0;
TL0 = 0x66;
TH0 = 0xfc;
count = 0;
}
}
/******************************************************************************/
|