您的位置 首页 知识

51单片机加HC—SR04超声波测距仪用LCD1602显现

includereg51H>includeintrinsh>defineucharunsignedchardefineuintunsignedintsbitlcden=P1^2;sbitl

#include

#include
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P1^2;
sbit lcdrs=P1^0;
sbit lcdrw=P1^1;
sbit RX=P2^1;
sbit TX=P2^0;

uint time=0;
unsignedlongS=0;
bitflag=0;
uchar disdat[4]={ 0,0,0,0,};
void delay(uint z) //延时子程序
{
uint x,y;
for(x=z;x>0;x–)
for(y=110;y>0;y–);
}
void write_com(uchar com)//界说一个带参数的写指令子程序
{
lcdrs=0; //1602的rs为0时,接纳指令,为1时接纳数据
P0=com;//把void write_com(uchar com)中的COM中的数据给P0口
delay(5);
lcden=1;
delay(5);
lcden=0;
delay(5);
}
void write_shu(uchar shu)//界说一个带参数的写数据子程序
{
lcdrs=1; //1602的rs为0时,接纳指令,为1时接纳数据
P0=shu;//把void write_shu(uchar shu)中的COM中的数据给P0口
delay(5);
lcden=1;
delay(5);
lcden=0;
delay(5);
}
void write_1602(uchar add,uchar dat)
{
write_com(0x80+0x40+add);
write_shu(dat);
}

void zifuchuan(uchar *ch)
{
while(*ch!=0)
write_shu(*ch++);
delay(20);
}
void init()//界说一个初始化子程序
{
lcden=0;
lcdrw=0;
write_com(0x38);//调用 write_com子程序并把0x38赋给P0口,显现形式翻开
delay(2);
write_com(0x0c);//调用 write_com子程序并把“开显现,显现光标,光标不闪耀”指令码赋给P0口
write_com(0x06);//调用 write_com子程序并把“地址指针加1,整屏不移动”指令码赋给P0口
write_com(0x80);//数据指针初始化,让指针指向最左端,显现从榜首行开端
write_com(0x01);//调用 write_com子程序并把”清零指”令码赋给P0口
zifuchuan(“HHSY Zhoujiaoshi”);

}

/********************************************************/
void Conut()
{
time=TH0*256+TL0;
TH0=0;
TL0=0;

//S=(time*1.7)/100;
S=time/58; //算出来是CM
disdat[0]=S%1000/100;
disdat[1]=S%1000%100/10;
disdat[2]=S%1000%10 %10;
write_1602(1, disdat[0]+0x30);
write_1602(2, disdat[1]+0x30);
write_1602(3, disdat[2]+0x30);
write_1602(4,.);
write_1602(5, disdat[3]+0x30);
write_1602(6, C);
write_1602(7, m);

}
/********************************************************/
void zd0() interrupt 1 //T0中止用来计数器溢出,超越测距规模
{
flag=1;//中止溢出标志
}
/********************************************************/
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 main(void)
{
delay(400); //发动等候,等LCD讲入作业状况
init(); //LCD初始化
TMOD=0x01;//设T0为方法1,GATE=1;
TH0=0;
TL0=0;
ET0=1; //答应T0中止
EA=1;//敞开总中止

while(1)
{
StartModule();
while(!RX); //当RX为零时等候
TR0=1; //敞开计数
while(RX); //当RX为1计数并等候
TR0=0; //封闭计数
Conut(); //核算
delay(20);

}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/254076.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部