/**********************************包含头文件**********************************/
#include <reg52.h>
#include "lcd1602.h"
/***********************************宏定义************************************/
#define VELOCITY_30C 3495 //30摄氏度时的声速,声速V= 331.5 + 0.6*温度;
#define VELOCITY_23C 3453 //23摄氏度时的声速,声速V= 331.5 + 0.6*温度;
/************************************位定义************************************/
sbit dula1 =P2^0; //段选信号的锁存器控制
sbit wela1 =P2^1; //位选信号的锁存器控制
sbit cs88 =P2^2; //点阵管的锁存器控制 cs88=0;//关点阵管
sbit INPUT = P3^2; //回声接收端口
sbit OUTPUT = P1^5; //超声触发端口
sbit Beep = P2^3 ; // 蜂鸣器
/********************************定义变量和数组********************************/
long int distance=0; //距离变量
uchar table[]="Distance:",dt[7],count;
void cmg88()//关数码管,点阵函数 cmg88();//关数码管,点阵函数
{
dula1=1;
P0=0x00;
dula1=0;
cs88=0x00;
P0=0x00;
cs88=1;
}
void delayt(uint x)
{
uchar j;
while(x-- > 0)
{
for(j = 0;j < 125;j++)
{
;
}
}
}
/******************************************************************************/
/* 函数名称 : Init_Parameter */
/* 函数描述 : 初始化参数和IO口函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void Init_Parameter(void)
{
OUTPUT =1;
INPUT = 1;
count = 0;
distance = 0;
}
/******************************************************************************/
/* 函数名称 : Trig_SuperSonic */
/* 函数描述 : 发出声波函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void Trig_SuperSonic(void)//出发声波
{
OUTPUT = 1;
delayt(1);
OUTPUT = 0;
}
/******************************************************************************/
/* 函数名称 : Measure_Distance */
/* 函数描述 : 计算距离函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void Measure_Distance(void)
{
uchar l;
uint h,y;
TR0 = 1;
while(INPUT)
{
;
}
TR0 = 0;
l = TL0;
h = TH0;
y = (h << 8) + l;
y = y - 0xfc66;//us部分
distance = y + 1000 * count;//计算总时间
TL0 = 0x66;
TH0 = 0xfc;
delayt(30);
distance = VELOCITY_30C * distance / 20000;
}
/******************************************************************************/
/* 函数名称 : main */
/* 函数描述 : 主函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void main(void)
{
cmg88();
LCD_Initial();
Init_Parameter();
LCD_print(0,0,table);
TMOD = 0x01; //定时器2初始化,设置为16位自动重装模式
TL0 = 0x66;
TH0 = 0xfc; //1ms
ET0 = 1; //开定时器2
EA = 1; //总中断使能
while(1)
{
Trig_SuperSonic(); //触发超声波发射
while(INPUT == 0) //等待回声
{
;
}
Measure_Distance(); //计算脉宽并转换为距离
dt[0]= (distance / 1000)+48;
dt[1]= (distance / 100) % 10+48;
dt[2]= (distance / 10) % 10+48;
dt[3]= '.';
dt[4]= distance % 10+48;
dt[5]= 'c';
dt[6]= 'm';
LCD_print(0,9,dt);
Init_Parameter(); // 参数重新初始化
delayt(100); //延时,两次发射之间要至少有10ms间隔
}
}
/******************************************************************************/
/* 函数名称 : 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;
}
}
/******************************************************************************/