#include"reg51.h"
#include<intrins.h>
#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不能大于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;i<ListLength;i++){ if (X <= 0x0F) //X坐标应小于0xF{   DisplayOneChar(X, Y, DData[i]); //显示单个字符if(n==true)Delay400Ms();X++;}}
}
/****************************红外线接收子程序,利用了中断的下降沿触发方式
****************************/
void infrared_ray()interrupt 0  using 3
{  uchar i=90;flage=0x01;             //接受标志位while(i--);            //减小灵敏度EX0=0;               //关掉中断,等到发射方波后才开启,处于别动
}
// 延时子程序
void delay(uint n)
{while(--n);
}
//中断初始化
void Init0(void)
{  EA=1;IT0=1;}
/***************************************
/*原理是把中断打开并 发射方波,
当有中断时就转到中断产生中断位为下一步转向做准备,
当没有是关闭中断
****************************************/
void seng_wave(uchar timer,bit n)//timer通过载波发射信号的时间,n->左右发射管的选择
{  uchar i;P1 |= 0X04;      //ledcs=1为74ls573为11脚为高电平时数据直接输出,为低时把数据锁存住,即保持IE |= 0X01;P0 |=0x0c;   //04for(i=timer;i>0;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
}
//电机和灯光的控制部分
void  control(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;i>0;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(5,dj_state2,right_light ); temp =0x00;}       }
void main(void)
{  Init0();       //中断初始化P1 |= 0X04;    //开锁存器的控制位P0 = 0xFf;     //数据口的清零P1&=0XFB;      //关锁存器的控制位LCDInit();     //LCD初始化WriteCommandLCD(0x01,1);   //显示清屏delay(100);P2=dj_state1;DisplayListChar(0,0,8,talk2,false);while(1){    move_car();  //主要控制部分delay(200000);//延时}}

51单片机:自动避障红外小车代码相关推荐

  1. 35、基于51单片机自动灭火避障智能小车 消防灭火小车系统设计

    摘要 智能作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途.智能小车就是其中的一个体现,本次设计的多功能智能灭火避障小车 ...

  2. 51单片机小车的立项书_毕业论文:基于51单片机智能避障小车的设计报告(范文1)...

    <毕业论文:基于51单片机智能避障小车的设计报告.doc>由会员分享,可免费在线阅读全文,更多与<毕业论文:基于51单片机智能避障小车的设计报告>相关文档资源请在帮帮文库(ww ...

  3. arduino麦轮转弯程序_Arduino 自动避障智能小车制作教程

    Arduino 自动避障智能小车制作教程 材料: Arduino UNO r3 L298N电机驱动模块 小车底盘一个,万向轮一个 2个电机及匹配的车轮 9V电池盒及6个1.5V电池 超声波测距模块及其 ...

  4. 写一段51单片机的避障小车代码

    以下是一段使用51单片机编写的避障小车代码: #include <reg51.h>sbit LeftSensor = P3^0; sbit RightSensor = P3^1; sbit ...

  5. 智行小车(基于51单片机)——避障+循迹+停

    讲道理,这辆小车是我们参加校赛所制作的,在这次的小车制作过程之中存在的很多的不足和时间的浪费情况. 队员的选择和分工也都存在着一定的问题(这应该是我最头疼的问题) 但是总得来说还算是取得了一个不错的结 ...

  6. 基于51单片机的红外自动避障小车(lunwen+任务书+开题+文献综述+翻译及原文+避障程序)

    目 录 1 绪论 1 1.1 课题研究背景及意义 1 1.2 国内外研究现状 1 1.2.1国外智能车辆研究现状 2 1.2.2发展前景 3 1.3 课题主要研究内容 4 2 工作原理及总体设计 5 ...

  7. 基于arduino单片机智能避障小车

    基于arduino单片机智能避障小车 思路简介 本文简要介绍了基于arduino单片机智能小车可以通过手机端蓝牙助手对其进行遥控操作'可以切换手动操作和自动避障两个模式,避障基于蝙蝠超声波测距的原理, ...

  8. 将循迹小车改为蓝牙控制自动避障小车#arduino

    演示视频:https://www.bilibili.com/video/BV1CM41187oh/?share_source=copy_web&vd_source=d43eaf7cae2ed3 ...

  9. 树莓派+二自由度云台制作智能小车(三)——小车运动+简单的自动避障

    配合传感器实现小车运动+自动避障 小车与避障原理 一.小车运动模块 二.避障原理 三.实现 (1)将传感器整合. (2)小车的运动代码 小车与避障原理 一.小车运动模块 小车主要是分为动力模块和控制模 ...

最新文章

  1. 原来腾讯面试题也不难,面试官:给我说一下你理解的分布式架构?
  2. python中ret是什么意思_数据结构图在python中的应用
  3. android111 java中调用c代码
  4. 当CV遇上联邦学习,一起聊聊视觉联邦技术
  5. shell脚本详解(四)——循环语句之while循环和until循环(附加例题及解析)
  6. adf可以自定义溶剂吗_ADF Faces。 立即的自定义客户端事件
  7. 更多核心、更大内存、更低成本 AMD皓龙6000欲成云计算基石
  8. Educational Codeforces Round 24
  9. sqlyog 64位linux版本,linux安装mysql+sqlyog可视化(示例代码)
  10. 2020年数模美赛参赛心得总结
  11. 全面系统学习机房精密空调设计、选型、安装、维保
  12. 天轰穿结束了,结束了浮躁的生活
  13. Linux安全模块(LSM)
  14. 东北大学计算机考研专业842包括什么,东北大学2019年计算机考研842计算机专业基础考试大纲...
  15. Ubuntu查看当前IP地址
  16. 熊猫压缩怎么使用_记录随时间变化的PagerDuty事件(使用熊猫)
  17. win10内存占用过高
  18. u盘启动安装xp/win7系统详解
  19. RFID电子标签未来发展三大趋势分析
  20. 个人网站已备案,更换服务器后需要重新备案嘛?

热门文章

  1. 工业机器的编程技术介绍
  2. zigbee 的BDB
  3. 浪潮n系列服务器指示灯_浪潮服务器系统故障指示灯按键做什么用的
  4. 李开复博客透露大学生活 曾做过很多无聊事
  5. 我的世界mod开发(3番外)自定义方块/物品模型
  6. ABAP基础知识 内表汇总数据的方式
  7. 【sqlite】联查Join更新
  8. LPC2148的UART0初始化
  9. 美团大众点评服务框架Pigeon
  10. python创建excel表格_python使用VBA:Excel创建图表(转)