#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcd_rs=P2^5;
sbit lcd_rw=P2^6;
sbit lcd_en=P2^7;
sbit Tx=P2^0;
sbit Rx=P3^2;
sbit test=P0^7;
sbit T_1=P0^0;
sbit T_2=P0^1;
sbit R_1=P0^2;
sbit R_2=P0^3;
uchar code lcd[]="distance is:";
uchar code lcd1[]=" CM";
uchar lcd2[5];
uchar num;
uchar time_low=0,time_high=0;
long temp=0;
long dis=0;
void qianjin();
void turn_left();
void turn_right();
void houtui();
/********************延时*************************************/
void delayms(uint z) //延时ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay()
{
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
}
/****************lcd写指令控制命令****************************/
void write_com(uchar com)//lcd写指令控制命令
{
delayms(5);
lcd_rs=0;
lcd_rw=0;
P1=com;
lcd_en=1;
delay();
lcd_en=0;
delay();
}
/**************lcd写数据命令**********************************/
void write_data(uchar date)//lcd写数据命令
{
delayms(5);
lcd_rs=1;
lcd_rw=0;
P1=date;
delay();
lcd_en=1;
delay();
lcd_en=0;
}
/********************lcd初始化*******************************/
void lcd_init()
{
lcd_en=0;
write_com(0x38);
write_com(0x0c); //设置光标的显示/闪烁
write_com(0x06); //设置显示后指针加1,并且光标移一位
write_com(0x01); //清屏设置
write_com(0x80); //设置字符从地址为10的位置开始显示
}
/*************初始化显示子程序**************************************/
void init_display()
{
write_com(0x80+0x00);
for(num=0;num<12;num++)
{
write_data(lcd[num]);
delayms(10);
}
write_com(0x80+0x40);
for(num=0;num<9;num++)
{
write_data(lcd1[num]);
delayms(10);
}
}
/******初始化*****************/
void init_time()
{
TMOD=0X09;//设置定时器0/1工作方式1
EA=1;
IT0=1;
TH0=0;//设置定时器初值。
TL0=0;
}
/******发送超声波******************/
void send()
{
Tx=1;
delay();
delay();
EX0=1;
TR0=1;
Tx=0;
}
/*******************************/
void count()
{
dis=0.017*temp;
}
void show()
{
count();
lcd2[0]=(uint)dis/1000+0x30;
lcd2[1]=(uint)dis/100%10+0x30;
lcd2[2]=(uint)dis/10%10+0x30;
lcd2[3]=(uint)dis%10+0x30;
if(lcd2[0]==0x30) //如果第一位为0则不显示
{
lcd2[0]=0x20;
}
write_com(0xc1);
write_data(lcd2[0]);
write_com(0xc2);
write_data(lcd2[1]);
write_com(0xc3);
write_data(lcd2[2]);
// write_com(0xc4); //显示小数点
// write_data(0x2e);
write_com(0xc4);
write_data(lcd2[3]);
}
/************转弯选择********************/
void choise(uchar d)
{
switch(d)
{
case 0:qianjin();delayms(200);break;
case 1:turn_left();delayms(200);break;
case 2:houtui();delayms(200);break;
default:break;
}
}
/************************/
uchar panduan()
{
uchar c;
//jisuan();
if(dis<100&&dis>50)
{
c=0; //直走
}
else if(dis<50&&dis>10)
{
c=1; //左转
}
else if(dis<10)
{
c=2; //后退
}
else
c=0;
return c;
}
/*******主函数**************************/
void main()
{ qianjin();
lcd_init();
init_display();
init_time();
while(1)
{
send();
show();
test=!test;
choise(panduan());
delayms(10);
}
}
/********************************/
void qianjin() //前进
{
T_1=1;
T_2=0;
R_1=1;
R_2=0;
}
/*************************/
void turn_left() //左转
{
T_1=0;
T_2=0;
R_1=1;
R_2=0;
}
/***************************/
/*
void turn_right() //右转
{
T_1=1;
T_2=0;
R_1=0;
R_2=0;
}
*/
/****************************/
void houtui() //后退
{
T_1=0;
T_2=1;
R_1=0;
R_2=1;
}
/********中断函数************************/
void int0() interrupt 0
{
temp=(TH0*256+TL0);
TL0=0;//重赋定时器0的初值。
TH0=0;
}
这是我自己写的超声波壁障小车的程序,没有PWM控制,只有简单的高低电平控制小车电机的转动,但是在调试的时候小车只能后退,而不能前进,不知道是为什么,请大家帮忙解答!! |