智能小车红外避障c语言程1.doc_第1页
智能小车红外避障c语言程1.doc_第2页
智能小车红外避障c语言程1.doc_第3页
智能小车红外避障c语言程1.doc_第4页
智能小车红外避障c语言程1.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

智能小车红外避障c语言程序 #include bit RandomFactor = 0 ;bit RandomFactorBuf = 0 ;#include #define FLeftMotor P0_2 = 1 ; P0_3 = 0 #define BLeftMotor P0_2 = 0 ; P0_3 = 1#define FRightMotor P0_5 = 1 ; P0_4 = 0 #define BRightMotor P0_5 = 0 ; P0_4 = 1#define LeftStop P0_2 = 0 ; P0_3 = 0 #define RightStop P0_4 = 0 ; P0_5 = 0#define CarStop P0_2 = 0 ; P0_3 = 0 ; P0_4 = 0 ; P0_5 = 0 #define RightSenser P0_0 #define LeftSenser P0_1/*/ 左转/*void TurnLeft_1()LeftStop ;FRightMotor ;/*/ 快速左转/*void TurnLeft_Fast()BLeftMotor ;FRightMotor ;/*/ 右转/*void TurnRight_1()RightStop ;FLeftMotor ;/*/ 快速右转/*void TurnRight_Fast()BRightMotor ;FLeftMotor ;/*/ 用倒退的方式进行车头右转/*void BTurnRight_1()LeftStop ;BRightMotor ; /*/ 用倒退的方式进行车头左转/*void BTurnLeft_1() RightStop ;BLeftMotor ; /*/ 前进/*void FCar()FLeftMotor ;FRightMotor ;/*/ 后退/*void BCar()BLeftMotor ;BRightMotor ;/*/ 壁障程序/*void Obstacle_Avoid(void) if(RightSenser & LeftSenser&PWM) FCar() ; if(!RightSenser) & LeftSenser&PWM) BTurnLeft_1() ;if(RightSenser & (!LeftSenser)&PWM) BTurnRight_1() ;if(!(RightSenser | LeftSenser) RandomFactorBuf = RandomFactor ; while (!(RightSenser | LeftSenser) if(RandomFactorBuf) BTurnLeft_1() ; delay (300) ; if(!RandomFactorBuf) BTurnRight_1() ; delay (300) ; if(!PWM) LeftStop ; RightStop ; /*/ 跟随程序/*void Follow(void)if(RightSenser & LeftSenser&PWM) LeftStop ; RightStop; if(!RightSenser) & LeftSenser&PWM) TurnRight_1() ;if(RightSenser & (!LeftSenser)&PWM) TurnLeft_1() ;if(!(RightSenser | LeftSenser) FCar() ;/*/*main()Timer0Setup(500) ;Timer1Setup(50) ;Obstacle_Avoid() ;/ Follow() ;智能避障小车C51程序(2010-07-21 13:00:00) 标签: 电子教育#include#include#define uchar unsigned char#define uintunsigned int#define left_infrare0#define right_infrare 1#define dj_state10X5F/前进#define dj_state20X4F/右转#define dj_state30X1F/左转#define dj_state40X0F/后退#define dj_state50XfF/停车#define light_off0x0f/关转向灯#define left_light0X5F/左转向灯两个是5f#define right_light0XaF/右转向灯0xaf,两个是0xbf#define back_light0XcF/刹车灯即后灯#define front_light0x3f/前灯#define light_on0xff/开所有灯#define true1#define false 0#define LCD_DataP0#define Busy0x80/用于检测LCD状态字中的Busy标识sbitc=P12;/转向灯使能端uchar code talk1=backward;uchar code talk2=forward;uchar code talk3=Turnleft;uchar code talk4=Turn right;uchar flage =0x00;sbitledcs=P12;/74H573的片选信号/sbitleft_led=P02;/左红外发射管/sbitright_led=P03;/右红外发射管sbitLCD_RS = P15;/LCD定义引脚sbitLCD_RW = P16;/sbitLCD_E= P17 ;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不能大于1if (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不能大于1for(i=0;iListLength;i+) if (X 左右发射管的选择uchar i;P1 |= 0X04;/ledcs=1为74ls573为11脚为高电平时数据直接输出,为低时把数据锁存住,即保持IE |= 0X01;P0 |=0x0c;/04for(i=timer;i0;i-) if(n)P0=0x08;/ 右发射管通过载波发射信号/00else P0=0x04;/ 左发射管通过载波发射信号/0cdelay(100);/这里控制着灵敏度(控制38khz的方波的多少)和距离/timer*delay(x)即为发射管得到的平均电流P1 &= 0Xfb;IE &= 0Xfe;/led转向灯指示子程序void light_control(uchar deng)ledcs=1;P0 =deng;ledcs=0;/11111011/电机和灯光的控制部分voidcontrol(uchar n,uchar dj_state,uchar light)uchar i;/ P1|=0x04;light_control(light);/led转向指示灯delay(100);P2 =dj_state;/电机的方向控制WriteCommandLCD(0x01,1); /LCD显示清屏switch(dj_state) case dj_state2 : DisplayListChar(3,1,10,talk4,false);break;case dj_state3: DisplayListChar(3,1,8,talk3,false);break;case dj_state4: DisplayListChar(3,1,7,talk1,false); break;default :break;for(i=n;i0;i-)delay(2000);P2=dj_state5;/停车light_control(light_off);/led关闭WriteCommandLCD(0x01,1); /LCD显示清屏P2=dj_state1;/前进if(dj_state1) P1|=0X04;/ledcs=1;P0=0x0f;P1&=0XFB;delay(100);DisplayListChar(0,0,7,talk2,false);void move_car(void)uchar temp =0x00;/左边红外管发射seng_wave(1,left_infrare);/向下为中断开启有关闭后,要执行的语句if(flage=0x01)temp|=0x01;flage=0x00;/右边红外管发射delay(30);seng_wave(1,right_infrare);/向下为中断开启有关闭后,要执行的语句if(flage=0x01)temp|=0x02;flage=0x00;/左边有障碍物,右转if(temp=0x01)control(2,dj_state2,left_light); temp =0x00;/右边有障碍物,左转else if(temp=0x02) control(2,dj_state3,right_light ); temp =0x00;/两个方向都有障碍物,后退,右转else if(temp=0x03) control(10,dj_state4,back_light );control(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论