#include <reg52.h>
#include <intrins.h>
#define LCD_DATA P0
sbit LCD_E=P2^7;
sbit LCD_RW=P2^5;
sbit LCD_RS=P2^6;
sbit led = P2^0;
sbit led1 = P2^1;
sbit led2 = P2^2;
sbit key = P3^1;
sbit trg = P1^2; //超聲波模塊控制端
sbit ech = P1^3; //超聲波模塊接收端
unsigned char i;
unsigned char flag = 0;
unsigned int count = 0; //超聲波模塊時間變量
unsigned long dis; //超聲波測量的距離
unsigned char num[10] = "0123456789";
unsigned char thousend,hundred,ten,unit;
/*
延時函數(shù)delay延時 1ms入口參數(shù) c
*/
void delay(unsigned int c)
{
unsigned char a,b;
for (c; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
/****10us延時****/
void Delay10us() //@12.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 27;
while (--i);
}
void Lcd_Write_Cmd(unsigned int cmd)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_DATA = cmd;
delay(5);
LCD_E = 1;
LCD_E = 0;
}
void Lcd_Write_Dat(unsigned char dat)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_DATA = dat;
delay(5);
LCD_E = 1;
LCD_E = 0;
}
void Lcd_Init()
{
Lcd_Write_Cmd(0x38);
Lcd_Write_Cmd(0x0f);
Lcd_Write_Cmd(0x06);
Lcd_Write_Cmd(0x01);
}
/****定時器初始化****/
void T0_T1_Int0_Init()
{
TMOD = 0x11; //配置定時器工作模式及方式寄存器(TCON為定時器控制寄存器)
TH0 = (65535 - 5000) / 256;
TL0 = (65535 - 5000) % 256;
TH1 = 0; //為定時器1設(shè)初值
TL1 = 0; //高八位與低八位均為0
EA = 1; //開放總中斷
ET1 = 1; //開放定時器1中斷
ET0 = 1;
}
void T0_ser() interrupt 1
{
unsigned char n;
TH0 = (65535 - 5000) / 256;
TL0 = (65535 - 5000) % 256;
n++;
if(n >= 16)
{
n = 0;
trg = 1; //向控制端
Delay10us(); //提供
Delay10us(); //20us
trg = 0;
led = ~led;
}
}
void T1_ser() interrupt 3
{
TH1 = 0;
TL1 = 0;
}
void Distance()
{
while(!ech);
TR1 = 1;
while(ech);
TR1 = 0;
}
void Dis_Count()
{
count = TH1 * 256 + TL1;
dis = (long)(count * 0.017); //計算小車到障礙物的距離(cm)
thousend = dis / 1000;
hundred = dis % 1000 / 100;
ten = dis % 100 / 10;
unit = dis % 10;
}
void main()
{
Lcd_Init();
T0_T1_Int0_Init();
Lcd_Write_Cmd(0x80);
TR0 = 1;
while(1)
{
Distance();
Dis_Count();
Lcd_Write_Dat(num[thousend]);
delay(1);
Lcd_Write_Dat(num[hundred]);
delay(1);
Lcd_Write_Dat(num[ten]);
delay(1);
Lcd_Write_Dat(num[unit]);
delay(100);
Lcd_Write_Cmd(0x01);
if(dis < 50)
{
led2 = 0;
}
if(dis > 50)
{
led2 = 1;
}
}
}
LCD1602顯示的數(shù)字一直再增加
不知道哪里出了問題
|