超声波测距程序

2020-02-05 09:30发布

发个超声波测距程序,今年电子大赛想用,求高手指教改进。
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--);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。