当前位置:文档之家› stc89c52超声波测距程序

stc89c52超声波测距程序

#include<reg52.h>
#include<intrins.h>
sbit RX=P2^7; //rx对应trig
sbit TX=P2^6; //tx对应echo
#define uint unsigned int
#define uchar unsigned char
sbit rs=P2^0; //lcd管脚连接
sbit lcden=P2^2;
sbit rw=P2^1;
void write_com(uchar com);//lcd写命令和数据声明函数void write_date(uchar date);
unsigned int time=0;
unsigned long S=0 , flag=0; //s表距离
unsigned char disbuff[4] ={ 0,0,0,0,};
void delay(uint z)//1ms延时
{ uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void Conut(void) //计算距离
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100; //算出来是CM
if((S>=700)||flag==1) //超出测量范围显示“-”
{
flag=0;
write_com(0x80);
for(i=0;i<3;i++)
{write_date(0x30+disbuff[i]);//0x30是0的地址
delay(5);
}
}
else
{
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
write_com(0x80);
for(i=0;i<3;i++)
{write_date(0x30+disbuff[i]);
delay(5);
}
}
}
void write_com(uchar com) //lcd写命令
{ rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date) //lcd写数据
{ rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void StartModule() //启动模块
{
TX=1;//启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
void init()//初始化函数
{ lcden=0;
rw=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80+0x40);
for(i=0;i<15;i++);
write_com(0x80);
for(i=0;i<3;i++)
{write_date('a');
delay(5);}
TMOD=0X01; //设T0为方式1,GATE=1;
TH0=0;
TL0=0;
EA=1; //开启总中断
ET0=1; //允许T0中断
TR0=0;
}
void main()
{ init();
while(1)
{
TH0=0;
TL0=0;
while(1)
{
StartModule();
while(!RX);//当RX为零时等待
TR0=1;//开启计数
while(RX);//当RX为1计数并等待
TR0=0;//关闭计数
Conut();//计算
delay(80);//80MS
}
}
}
void exter() interrupt 1
{
flag=1;
}。

相关主题