发个超声波测距程序,今年电子大赛想用,求高手指教改进。
1602液晶显示。液晶显示没问题,发射脉冲有问题
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit enable=P2^4;
sbit wela=P2^6;//以下四个定义液晶的,不用看
sbit dula=P2^7;
sbit lcden=P3^4;
sbit lcdrs=P3^5;//
uchar length[]="00.0000m";
float time,len;
uchar flag=0,num=0,flag2=0;
void init();
void delay(uint);
void ledinit();
void write_com(uchar);
void write_date(uchar);
void lcddisplay();
void separate();
void main()
{
uchar i;
init();
while(1)
{
if(flag2==1)//外部中断收到后,显示距离
{
for(i=3;i>0;i--)
{
separate();
lcddisplay();
}
num=0;
flag=0;
flag2=0;
TR0=1;
}
}
}
void init()//初始化
{
TMOD=0x02;
TH0=224;
TL0=224;
EA=1;
ET0=1;
TR0=1;
IT0=1;
EX0=0;
enable=0;
ledinit();
}
void timer1() interrupt 1//定时器里循环发脉冲波
{
switch(flag)
{
case 0:
EX0=0;
num=0;
enable=1;
flag=1;
break;//高电平100微秒
case 1:
num++ ;
if(num==3)
{
TR0=0;
num=0;
enable=0;
flag=2;
TR0=1;
}
break;//低电平大概50微秒
case 2:
num++;
if(num==1)
{
TR0=0;
num=0;
flag=3;
TR0=1;
}
break;
case 3: EX0=1;
num++;
if(num>=188)//大于188说明接收失败,外部中断没收到,循环;收到后进入外部中断
{
TR0=0;
num=0;
flag=0;
TR0=1;
}
break;
}
}
void timer2() interrupt 0 //收到后进入外部中断,flag2置1
{
TR0=0;
time=num*12.0/11059200+0.00015;
len=346.4*time/2;//计算
flag2=1;
EX0=0;
}
/******************液晶显示子函数****************************/
void ledinit()
{
wela=0;
dula=0;
write_com(0x38);
write_com(0x0f);
write_com(0x06);
write_com(0x10);
delay(5);
}
void write_com(uchar com)
{
lcdrs=0;
delay(5);
P1=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
lcdrs=1;
}
void write_date(uchar date)
{
lcdrs=1;
delay(5);
P1=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
lcdrs=1;
}
void lcddisplay()
{
uint j;
write_com(0x80+0x01);
for(j=0;j<8;j++)
write_date(length[j]);
/*for(j=0;j<8;j++)
write_com(0x80+0x09);
write_date(' ');
write_com(0x80+0x40);
for(j=0;j<16;j++)
write_date(' '); */
}
/***************分离各位数*****************/
void separate()
{
length[6]=((int)(len*10000))%10+'0';
length[5]=((int)(len*1000))%10+'0';
length[4]=((int)(len*100))%10+'0';
length[3]=((int)(len*10))%10+'0';
length[1]=((int)len)%10+'0';
length[0]=((int)len)/10+'0';
}
/**************************************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>