红外避障电动小车C51程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
红外避障电动小车C51程序
时间:2009-05-13 来源: 作者: 点击:1400 字体大小:【大中小】
#include"reg51.h"
#include
#define uchar unsigned char
#define uint unsigned int
#define left_infrare 0
#define right_infrare 1
#define dj_state1 0X5F //前进
#define dj_state2 0X4F //右转
#define dj_state3 0X1F //左转
#define dj_state4 0X0F //后退
#define dj_state5 0XfF //停车
#define light_off 0x0f //关转向灯
#define left_light 0X5F //左转向灯两个是5f
#define right_light 0XaF //右转向灯0xaf,两个是0xbf
#define back_light 0XcF //刹车灯即后灯
#define front_light 0x3f //前灯
#define light_on 0xff //开所有灯
#define true 1
#define false 0
#define LCD_Data P0
#define Busy 0x80 //用于检测LCD状态字中的Busy标识
sbit c=P1^2; //转向灯使能端
uchar code talk1[]={"backward"};
uchar code talk2[]={"forward"};
uchar code talk3[]={"Turnleft"};
uchar code talk4[]={"Turn right"};
uchar flage =0x00;
sbit ledcs=P1^2; //74H573的片选信号
//sbit left_led=P0^2; //左红外发射管
//sbit right_led=P0^3; //右红外发射管
sbit LCD_RS = P1^5; //LCD定义引脚
sbit LCD_RW = P1^6; //
sbit LCD_E = P1^7 ;
void Delay5Ms(void)
{
uint TempCyc = 5552;
while(TempCyc--);
}
//400ms延时
void Delay400Ms(void)
{uchar TempCycA = 5;
uint TempCycB;
while(TempCycA--)
{ TempCycB=7269;
while(TempCycB--);
}
}
//LCD读状态
unsigned char ReadStatusLCD(void)
{
LCD_Data = 0xFF;
LCD_RS = 0;
LCD_RW = 1;
LCD_E = 0;
LCD_E = 0;
LCD_E = 1;
while (LCD_Data & Busy); //检测忙信号
return(LCD_Data);
}
//LCD写数据
void WriteDataLCD(unsigned char WDLCD )
{
ReadStatusLCD(); //检测忙
LCD_Data = WDLCD;
LCD_RS=1;
LCD_RW =0;
LCD_E = 0; //若晶振速度太高可以在这后加小的延时
LCD_E = 0; //延时,为了安全
LCD_E = 0; //延时
LCD_E = 1;
}
//LCD写指令
void WriteCommandLCD(unsigned char WCLCD,BuysC)
{
if (BuysC) ReadStatusLCD(); //根据需要检测忙,BuysC为0时忽略忙检测 LCD_Data = WCLCD;
LCD_RS= 0;
LCD_RW= 0;
LCD_E = 0; //延时,为了安全
LCD_E = 0;
LCD_E = 0; //延时
LCD_E = 1;
}
void LCDInit(void) //LCD初始化
{
Delay400Ms();
LCD_Data = 0;
WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号
Delay5Ms();
WriteCommandLCD(0x38,0);
Delay5Ms();
WriteCommandLCD(0x38,0);
Delay5Ms();
WriteCommandLCD(0x38,1); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCD(0x08,1); //关闭显示
WriteCommandLCD(0x01,1); //显示清屏
WriteCommandLCD(0x06,1); // 显示光标移动设置
WriteCommandLCD(0x0C,1); // 显示开及光标设置
}
//按指定位置显示一个字符
void DisplayOneChar(uchar X, uchar Y, uchar DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y)
X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; // 算出LCD的指令码
WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码
WriteDataLCD(DData);
}
//按指定位置显示一串字符(只能写一行);
void DisplayListChar(uchar X, uchar Y,uchar ListLength, uchar *DData,uchar n) { uchar i;
Y &= 0x01;
X &= 0x0F; //限制X不能大于15,Y不能大于1
for(i=0;i { if (X <= 0x0F) //X坐标应小于0xF { DisplayOneChar(X, Y, DData[i]); //显示单个字符 if(n==true)Delay400Ms(); X++; } } } /**************************** 红外线接收子程序,利用了中断的下降沿触发方式 ****************************/ void infrared_ray()interrupt 0 using 3