1. 程式人生 > >LCD1602液晶顯示+超聲波測距-51微控制器

LCD1602液晶顯示+超聲波測距-51微控制器

#include <reg52.h>
#include <intrins.h>
#define unchar unsigned char
//unchar LED_D[]= {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
unsigned long time,distance;
unsigned int timer=0;
sbit reciever=P3^2;
sbit control=P3^3;
bit flag=0;
sbit RS = P1^5;
sbit RW = P1^6;
sbit E = P1^7;
sbit BF = P0^7;
void Time_init()
{
    TMOD=0x11;
    TH1=(65536-2000)/256;
    TL1=(65536-2000)%256;
    TH0=0;
    TL0=0;
    EA=1;
    ET1=1;
    ET0=1;
    TR1=1;
}
void delay1ms()
{
    unsigned char i,j;
    for(i=0; i<10; i++)
        for(j=0; j<33; j++);
}
void delay(unsigned int n)
{
    unsigned int i;
    for(i=0; i<n; i++)
        delay1ms();
}
bit busytest()
{
    bit result;
    RS=0;
    RW=1;
    E=1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    result=BF;
    E=0;
    return result;
}
void write_com(unsigned char dictate)
{
    while(busytest());
    RS=0;
    RW=0;
    E=0;
    _nop_();
    _nop_();
    P0=dictate;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    E=1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    E=0;
}
void writeaddress(unsigned char x)
{
    write_com(x|0x80);
}
void writedata(unsigned char y)
{
    while(busytest());
    RS=1;
    RW=0;
    E=0;
    P0=y;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    E=1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    E=0;
}
void Lcdinit()
{
    delay(15);
    write_com(0x38);
    delay(5);
    write_com(0x38);
    delay(5);
    write_com(0x38);
    delay(5);
    write_com(0x0F);
    delay(5);
    write_com(0x04);
    delay(5);
    write_com(0x01);
    delay(5);
}
void resolve()
{
    time=TH0*256+TL0;
    TH0=0;
    TL0=0;
    distance=time*0.17;
    Lcdinit();
    write_com(0x01);
    delay(5);
    writeaddress(0x80);
    delay(5);
    if(distance>7000||flag)
    {
        flag=0;
        writedata(0x30);
        delay(10);
    }
    else
    {
        unchar shu[8];
        unchar i=0;
        while(distance)
        {
			if(i==1)
			{
				shu[++i]=0;
				continue;
			}
            shu[++i]=distance%10;
            distance/=10;
        }
	
        while(i)
        {
			if(i==2)
			{
				writedata(0x2e);
				i--;
				delay(10);
				continue;
			}
            writedata(shu[i]+0x30);
	    	i--;
            delay(10);
         }
    }

}


void Time_inter0()interrupt 1
{
    flag=1;
}
void Time_inter1()interrupt 3
{
    TH1=(65536-2000)/256;
    TL1=(65536-2000)%256;
    timer++;
    if(timer>=400)
    {
        timer=0;
        control=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        control=0;
    }
}
void main()
{
    Time_init();
    while(1)
    {
        while(!reciever);
        TR0=1;
        while(reciever);
        TR0=0;
        resolve();
    }
}