我按照网上的方法写的超声波程序,按照程序:如果大天于400cm或是有中断溢出,应该显示---,但现实情况是,我拔掉超声波模块的vcc/ecoh/trig三个线中的一个的话,屏上会显示拔掉前测到的距离,拔掉gnd线会显示一个10多的数字,求高手给看看程序那里错了
#include<reg52.h>
#define uint8 unsigned char
[color=[/img]Blue]#define uint16 unsigned int
long s;
sbit RS = P2^1; //定义端口
sbit RW = P1^5;
sbit EN = P1^6;
sbit echo = P3^2 ;
sbit trig = P3^4;
uint8 table[3]; //距离接收缓存
bit flag;
void DelayMS(uint16 dly) //ms延时
{
uint16 x,y;
for(x=dly;x>0;x--)
for(y=124;y>0;y--);
}
bit BUSY(void) //最高位为忙信号位
{
bit Bit;
RS = 0;
RW = 1;
EN = 1;
DelayMS(1);
Bit = (bit)(P0 & 0x80);
EN = 0;
return Bit;
}
void Write_cmd(uint8 cmd) // 写命令
{
while(BUSY()); //测忙
RS = 0;
RW = 0;
EN = 0;
P0 = cmd;
EN = 1;
DelayMS(1);
EN = 0;
}
void Write_dat(uint8 dat) //写数据
{
while(BUSY()); //测忙
RS = 1;
RW = 0;
EN = 0;
P0 = dat;
EN = 1;
DelayMS(1);
EN = 0;
}
void LCD_Init(void) //初始化液晶
{
Write_cmd(0x38); //功能设置
DelayMS(1);
Write_cmd(0x0c); //显示开关控制
DelayMS(1);
Write_cmd(0x06); //输入方式设置
DelayMS(1);
Write_cmd(0x01); //清除LCD的显示内容
DelayMS(1);
}
void juli() //距离计算
{
uint8 timeout; //测超时 用
TH0=0;
TL0=0;
trig =1;
DelayMS(1/10);
trig =0;
flag=0;
while((echo==0)&&(++timeout<50000)); //timeout 超时退出
TR0=1;
while((echo==1)&&(++timeout<50000)); //timeout 超时退出
TR0=0;
s=(TH0*256+TL0)/58;
table[0]= s/100;
table[1]=s%100/10;
table[2]= s%100%10;
}
void main ()
{
trig =0;
LCD_Init() ;
TMOD=0x01;
TL0=0; //设置定时器0初值低8位
TH0=0; //设置定时器0初值高8位
TR0=0; //停止定时器0
ET0=1; //Timer0中断允许
EA=1;
while(1)
{ uint8 i;
juli() ;
Write_cmd(0x80+0x45);
if(s>400||flag==1) //大于400cm
{
for(i=0;i<=2;i++)
{
Write_dat( '_');
}
}
else if(s<5) //小于5cm
{
for(i=0;i<=2;i++)
{
Write_dat( '^');
}
}
else
{
for(i=0;i<=2;i++)
{
Write_dat( table+'0');
}
Write_dat( 'C');
Write_dat( 'M');
DelayMS(200) ;
}
}
}
void timer0(void) interrupt 1
{
flag=1;
} |