#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;
/*
延时函数delay延时 1ms入口参数 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设初值
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显示的数字一直再增加
不知道哪里出了问题
|