#include
#include
#include"1602.h"
#include"delay.h"
***it trig = P2^0; // 产生脉冲引脚 tx
***it echo = P2^1; // 回波引脚 rx
unsigned char flag;
unsigned int s,s1,s2,s3,time;
unsigned char code dofly_code[]={'0','1','2','3','4','5','6','7','8','9'};//转换成液晶显示的字符
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
//s=(time*1.56672)/100; //晶振11.0592算出来是CM
s=(time*1.9)/100;//用的时候根据实际反求的
s1=dofly_code[s/100];
s2=dofly_code[(s%100)/10];
s3=dofly_code[(s%100)%10];
//S=(time*1.7)/100; //晶振12M算出来是CM
if((s>=700)||flag==1) //超出测量范围显示“
{
flag=0;
LCD_Write_String(1,2," S:--- CM XX ");
delay(500);
LCD_Write_String(1,2," S: CM ");
}
else
{
LCD_Write_String(1,2," S: CM OK ");
LCD_Write_Char(6,2,s1) ;
LCD_Write_Char(7,2,s2) ;
LCD_Write_Char(8,2,s3) ;
// LCD_Write_Char(6,2,s1) ;
}
}
void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
}
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_();
trig=0;
}
void main(void)
{
LCD_Init() ;
LCD_Write_String(1,1," Csheng bo test ");
LCD_Write_String(1,2," S: CM OK ");
while(1)
{
TMOD=0x01; //设T0为方式1,GATE=1;
TH0=0;
TL0=0;
ET0=1; //允许T0中断
EA=1; //开启总中断
while(1)
{
StartModule();
while(!echo); //当Echo为零时为真
TR0=1; //开启计数
while(echo); //当Echo为1为真
TR0=0; //关闭计数
Conut(); //计算
delay(80); //80MS
}
}
}
这上面是主函数,1602函数和延时函数放在附件里面吧
|