红外避障电动小车C51程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档