|
1602有显示但显示距离不准求大神指点
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit RX_Echo=P3^2;//超声波接收端口 外部中断0
sbit TX_Trig=P2^3;//超声波发端口
sbit rs=P2^0;
sbit rw=P2^1;
sbit E=P2^2;
uchar tab1[]="Distance:0000mm ";
uchar tab2[]="NO SIGNAL ! ";
uchar timeL,timeH,timer,distance_data;
void delay() //延时子函数用于产生波形 15us
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();
}
//*****************************
//12MHz的晶振下大约50us延时
//*****************************
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
//******LCD1602写命令
void write_com(uchar com)
{
E=0;
rs=0;
rw=0;
P1=com;
delay_50us(10);
E=1;
delay_50us(20);
E=0;
}
//**********LCD1602写数据
void write_data(uchar dat)
{
E=0;
rs=1;
rw=0;
P1=dat;
delay_50us(10);
E=1;
delay_50us(20);
E=0;
}
//***********lcd1602初始化
void init(void)
{
delay_50us(300);
write_com(0x38);
delay_50us(100);
write_com(0x38);
delay_50us(100);
write_com(0x38);
write_com(0x38);
write_com(0x08);
write_com(0x01);
write_com(0x06);
write_com(0x0c);
}
//*******************
//lcd第一行显示
//*******************
void lcd_show1(uchar addr1)
{
uchar j;
write_com(0x80+addr1);
for(j=0;j<16;j++)
{
write_data(tab1[j]);
delay_50us(10);
}
}
//*******************
//lcd第二行显示
//*******************
void lcd_show2(uchar addr2)
{
uchar j;
write_com(0x80+addr2);
for(j=0;j<16;j++)
{
write_data(tab2[j]);
delay_50us(10);
}
}
//*****超声波初始化*******
void SRFinit()
{
RX_Echo=0;
TX_Trig=0; //发射口初始化
TMOD=0x19; //定时器0工作方式1,GATE=1(受外部中断影响) 定时器1工作方式1 16位
TH1=0xf8; //T1装初值,延时2ms
TL1=0x30;
ET1=1; //允许定时器1中断
TR1=1; //启动定时器1
EA=1; //开总中断
}
//********定时器0初始化*******
void timer0init()
{
TH0=0;
TL0=0;
TF0=0;
}
void work()
{
while(1)
{
TH0=0; TL0=0; TR0=1; //开启定时器0
while(RX_Echo==0); //等待RX为高电平
// TR0=1; //开启定时器0
while(RX_Echo==1);
TR0=0; //关定时器0
timeH=TH0; timeL=TL0;
distance_data=(timeH*256+timeL)*0.0172; //单位CM
if(distance_data<=200)
{
tab1[9]=(distance_data/1000)+48;
tab1[10]=((distance_data%1000)/100)+48; //1602显示总是0~40然后又是0~40而且撤出的距离很不准问题2
tab1[11]=((distance_data%100)/10)+48;
tab1[12]=(distance_data%10)+48; write_com(0x01); //清屏
lcd_show1(0x00);
}
else {
write_com(0x01); //清屏
lcd_show2(0x40);
}
}
}
//*********************** //求大神帮忙啊
//*******主函数**********
void main()
{
SRFinit(); //超声波初始化
init();
timer0init();
work();
}
/**********外部中断的一些函数******/
//*************定时器0中断函数**********
void timer0() interrupt 1
{
TH0=0; TL0=0; TF0=0;
}
//***********定时器1中断函数用于*********
//****用于每隔60ms启动一次超声波模块*****
void timer1() interrupt 3
{
TH1=0xf8;
TL1=0x30; //延时2ms
timer++;
if(timer>40)//每隔80ms启动一次超声波模块
{
timer=0;
TX_Trig=1;
delay(); //10us以上延时
TX_Trig=0;
}
} |
|
|
|
|