超声波避障小车 lcd1602 显示

//触发p3.0
//接受p3.2
//超声波避障 加左右红外传感器避障 送lcd1602 显示

#include
#include
#define uchar unsigned char
#define uint unsigned int
unsigned char i;
sbit rs=P2^6; //定义引脚
sbit rw=P2^5;
sbit e=P2^7;
sbit TX=P3^0; //触发信号引脚
sbit K1=P3^4;
sbit K2=P3^5;
sbit PWM1=P3^6; //pwm信号输出
sbit PWM2=P3^7;
static char click=0;
unsigned char ZK1,ZK2;
unsigned int time=0;
unsigned int timer=0;
unsigned long S;
bit flag =0;

unsigned char code ASCII[13] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};


static unsigned char DisNum = 0; //显示用指针
unsigned long S=0;
unsigned char disbuff[4] ={ 0,0,0,0,};


void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;

S=(time*1.7)/100;
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
ASCII[disbuff[0]];
ASCII[disbuff[1]];
ASCII[disbuff[2]];

}


void delay_1(void) //误差 0us
{
unsigned char a,b;
for(b=215;b>0;b--)
for(a=45;a>0;a--);
}

void delay(uchar a)
{
uchar i;
while(a--)
{
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}

//判忙
void lcd_mang()
{
rs=0;
rw=1;
e=1;
_nop_();
_nop_();
_nop_();
_nop_();
while(P0&0x80);
e=0;
}

//1602的写
void write_lcd1602(uchar cmd,uchar i) //当i为0的时候为向1602写指令为1写数据
{
lcd_mang();
rs=i;
rw=0;
e=0;
_nop_();
_nop_();
e=1;
_nop_();
_nop_();
P0=cmd;
_nop_();
_nop_();
_nop_();
_nop_();
e=0;
}

//1602的初始化
void ini_lcd1602()
{
write_lcd1602(0x38,0);
delay(1);
write_lcd1602(0x0c,0);
delay(1);
write_lcd1602(0x06,0);
delay(1);
write_lcd1602(0x01,0);
delay(1);
}


void Timer2Interrupt()
{
RCAP2H=0x0fe;
RCAP2L=0x33;
ET2=1; // 允许T2定时器中断
EA=1; // 打开总中断
TR2=1; // 启动T2定时器
}

void zd0() interrupt 1
{
flag=1;
}

void zd3() interrupt 3 //T1中断用来扫描数码管和计800MS启动模块
{
TH1=0x0f8;
TL1=0x30;
timer++;
if(timer>=200)
{
timer=0;
TX=1; //800MS 启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
}

void Timer2(void) interrupt 5
{
TF2=0; // T2定时器发生溢出中断时,需要用户自己清除溢出标记
RCAP2H=0x0fe;
RCAP2L=0x33; /*恢复定时器初始值*/
++cl

ick;
if (click>=100) click=0;
if (click<=ZK1)
PWM1=1;
else
PWM1=0;

if (click<=ZK2)
PWM2=1;
else
PWM2=0;
}
//主函数
void main()
{
TMOD=0x19; //设T0为方式1,GATE=1;
TH0=0;
TL0=0;
TH1=0x0f8; //2MS定时
TL1=0x30;
ET0=1; //允许T0中断
ET1=1; //允许T1中断
TR1=1; //开启定时器
Timer2Interrupt();
EA=1; //开启总中断
ZK1=20;
ZK2=20;
ini_lcd1602();
while(1)
{
while(INT0==0); //当RX为零时等待
TR0=1;
while(INT0==1); //当RX为1计数并等待
TR0=0; //关闭计数
Conut(); //计算
if (S>40) //控制加速
{
ZK1=ZK1+10;
ZK2=ZK2+10;
P1=0x0a;
}
else
if((S<30)&(K1==0)&(K2==0)) //控制转向
{
ZK1=ZK1-5;
ZK2=ZK2-5;
P1=0X08;
delay_1();
}
else
if((S<30)&(K1==1)&(K2==0))
{
ZK1=ZK1-5;
ZK2=ZK2-5;
P1=0X01;
delay_1();
}
else
if((S<30)&(K1==0)&(K2==1))
{
ZK1=ZK1-5;
ZK2=ZK2-5;
P1=0X04;
delay_1();
}
else
if((S<30)&(K1==1)&(K2==1))
{
ZK1=ZK1-5;
ZK2=ZK2-5;
P1=0X05;
delay_1();
}
if (ZK1>99) ZK1=1;
if (ZK1<1) ZK1=99;
if (ZK2>99) ZK2=1;
if (ZK2<1) ZK2=99;

write_lcd1602(0x80,0);
for(i=0;i<=2;i++)
write_lcd1602(ASCII[disbuff[i]],1);

}
}

相关文档
最新文档