程序没有错误
/*
计算公式
我们知道声速是340m/s
根据x=vt
因为超声波发送出去和回来是测量距离的两倍,所以假设距离是L
2L=344xt
t我们用定时器测出来
一般都是us
所以就是tx172x10的-6次方=L,L单位为cm
最终的出 L= t(us) * 0.0172(cm/us)
0.0172=1/58
所以 L= t(us)/58(cm)
对于51单片机,12mhz的周期时间为1us
所以11.059200mzh的计算公式为
L = 计数 x(12/11.0592) x (1/58)
= 计数 x 0.0187
= (计数 x 1.87)/100(cm)
*/
#include "reg52.h"
#include "lcd.h"
#include "intrins.h"
#include "delay.h"
typedef unsigned int u16;
typedef unsigned char u8;
typedef unsigned long u32;
sbit Echo = P2^0;//回响信号输出
sbit Trig = P2^1;//触发信号输入
u8 di[]="Distance";//液晶显示:Distance(距离)
u8 code ASCII[13] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
u16 time = 0;
u16 s = 0;
u8 disbuff[4] = {0,0,0,0,};//提供4个数据位
u16 i = 0;
//对使用到函数进行声明定义
void StartModule();
void Timer0Init(void);
void Conut(void);
/******************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************/
void main(void)
{
Timer0Init();
LCD_Init(); //液晶初始化
LCD_Write_String(4,0,di);//液晶第一行显示字符“Distance”
while(1)//获取一次超声波测距模块的距离
{
StartModule();
while(!Echo); //当Echo为零时等待
TR0=1; //开启
while(Echo); //当Echo为1计数并等待
TR0=0; //关闭
Conut(); //计算
DelayMs(10);
}
}
/*-------------启动超声波模块------------*/
void StartModule()
{
Trig=1;//启动一次模块
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();/*可以生成10us脉冲,此处可以使用Delay10us_51();代替*/
Trig=0;
}
/*
51延时10us程序
void Delay10us_51(void)
{
u8 i=15;
_nop_();
while(--i);
}
*/
void Timer0Init(void)
{
TMOD &= 0xF0;
TMOD |= 0x01; //设T0为方式1
TH0 = 0;
TL0 = 0;
TF0 = 0; //清除TF0标志
ET0 = 1; //允许T0中断
EA = 1; //开启总中断
TR0 = 1; //开启定时器0
}
/*--------------距离计算模块------------*/
void Conut(void)
{
time=TH0*0x100+TL0; //获取时间 0x100=256 TH0*0x100+TL0=256
/*也可以写成
1、time=TH0*256+TL0;
2、time=TH0<<8|TL0;
*/
//重置初值
TH0=0;
TL0=0;
//s=(time/58.0/100.0)*1000; 与下面的一样意思
s=((u16)(time/58.0)); //获取距离——计数出来的是M
if( s>= 400 )//超出测量范围显示“-”
{
LCD_Write_Char(4, 1, ASCII[11]);//液晶第二行第4个点阵显示ASCII[]第11个数据'-',一下以此类推!!!
LCD_Write_Char(5, 1, ASCII[10]);//显示点
LCD_Write_Char(6, 1, ASCII[11]);
LCD_Write_Char(7, 1, ASCII[11]);
LCD_Write_Char(8, 1, ASCII[11]);
LCD_Write_Char(9, 1, ASCII[12]);//显示M
}
else
{
disbuff[0]=s/1000%10;
disbuff[1]=s/100%10;
disbuff[2]=s/10%10;
disbuff[3]=s/1%10;
LCD_Write_Char(4, 1, ASCII[disbuff[0]]);//显示千位
LCD_Write_Char(5, 1, ASCII[10]);//显示点
LCD_Write_Char(6, 1, ASCII[disbuff[1]]);//显示百位
LCD_Write_Char(7, 1, ASCII[disbuff[2]]);//显示十位
LCD_Write_Char(8, 1, ASCII[disbuff[3]]);//显示个位
LCD_Write_Char(9, 1, ASCII[12]);//显示M
}
}
|