微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 超声波程序LCD1602显示

超声波程序LCD1602显示

时间:10-02 整理:3721RD 点击:
        #include<reg51.h>
        #include<intrins.h>
        sbit Echo=P1^1;
        sbit Trig=P1^2;
        sbit RS=P1^0;
        sbit RW=P1^1;
        sbit LCDEN=P2^5;
        unsigned int time=0;
        unsigned int timer=0;
        unsigned int S=0;
        bit flag=0;
        unsigned char table[]={'0','1','2','3','4','5','6','7','8','9'};
        unsigned char disbuff[4]={0,0,0,0};
        //延时函数
        void delay_1ms(unsigned int z)
        {
                 unsigned int x,y;
                 for(x=z;x>0;x--)
                 for(y=110;y>0;y--);
        }
        //延时函数
        void delay_50us(unsigned int t)
        {
                 unsigned char i;
                 for(;t>0;t--)
                 for(i=19;i>0;i--);
        }
        void write_byte(unsigned char date,bit i)                //写入数据或者是指令,i就是这个参数
        {
                 RW=0;
                 LCDEN=0;
                 RS=i;
                 P0=date;
                 delay_50us(20);
                 LCDEN=1;
                 delay_50us(20);
                 LCDEN=0;
        }
//液晶的初始化
void init_1602()
{
         delay_1ms(15);
         write_byte(0x38,0);
         delay_1ms(5);
         write_byte(0x38,0);
         delay_1ms(5);
         write_byte(0x38,0);
         write_byte(0x38,0);
         write_byte(0x0c,0);
         write_byte(0x06,0);
         write_byte(0x01,0);
}

void display_1602(unsigned char y,unsigned char x,unsigned char value)
{
         y=y&0x01;           //确定是在那个行,这个语句使得y为0或者是1
         x=x&0x0f;                         //确定是行的第几个,这个语句使得为0~15
         if(y)
                        {
                                 x=0x80+0x40+x;
                        }
                else
                x=0x80+x;
                write_byte(x,0);
                write_byte(value,1);
}

void Conut(void)
{
         time=TH0*256+TL0;
         TH0=0;
         TL0=0;
         S=(time*1.7)/100;
         if((S>=400)||(flag==1))
         {
                         flag=0;
                         disbuff[0]='_';
                         disbuff[1]='_';
                         disbuff[2]='_';
        }
        else
        {
                 disbuff[0]=table[S/100];
                 disbuff[1]=table[S/10%10];
                 disbuff[2]=table[S%10];
        }
}
void main(void)
{
         init_1602();
         display_1602(0,0,'D');
         display_1602(0,1,'E');
         display_1602(0,2,'S');
         display_1602(0,3,':');
         TMOD=0x11;
         TH0=0;
         TL0=0;
         TH1=(65536-50000)/256;
         TL1=(65536-50000)%256;
         ET0=1;
         ET1=1;
         TR1=1;
         EA=1;
         Trig=0;
         Echo=0;
         while(1)
                {
                  while(!Echo);
                  TR0=1;
                  while(Echo);
                  TR0=0;
                  Conut();
                                display_1602(0,4,disbuff[0]);
    display_1602(0,5,disbuff[1]);
    display_1602(0,6,disbuff[2]);
                }
}
void T0_timer() interrupt 1
{
   flag=1;
}
void T1_timer() interrupt 3
{
         TH1=(65536-50000)/256;
         TL1=(65536-50000)%256;
         timer++;
         if(timer>=5)
         {
                  TR1=0;
                  TH1=(65536-50000)/256;
                  TL1=(65536-50000)%256;
                  timer=0;
                  Trig=1;
                  _nop_();
                  _nop_();
                  _nop_();
                  _nop_();
                  _nop_();
                  _nop_();
                  _nop_();
                  _nop_();
                  _nop_();
                  _nop_();
                                _nop_();
                  Trig=0;
                  TR1=1;
        }
}



已经实践过了,可以直接用的。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top