循迹、红外避障、遥控综合程序_第1页
循迹、红外避障、遥控综合程序_第2页
循迹、红外避障、遥控综合程序_第3页
循迹、红外避障、遥控综合程序_第4页
循迹、红外避障、遥控综合程序_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、循迹、红外避障、遥控综合程序/*ZYWIFI0939C-WIFI机器人实验板例程* 平台:ZYWIFI0939C-WIFI机器人 + Keil U4 + STC89C52* 名称:ZY-1智能小车参考程序* 公司:湖南智宇科教设备有限公司* 淘宝: * 网站:* 编写:智宇公司研发一部* 日期:2015-1-15* 交流:智能车QQ:261339276* 晶振:11.0592MHZ* 说明:免费开源,不提供源代码分析* 硬件设置:要有自己动手能力,才能完成实验* 使用说明:根据下面IO口自己用杜邦线连接各种模块,可以自己修改各种模块IO口* 视频教程:本小车配套学习C语言详细视频教程,资料统一

2、网盘下载 重点提示:本程序只做参考,不提供技术支持,请自己研究吸收。 */ #include<AT89x51.H> #include <intrins.h>#include<HJ-4WD_PWM.H> /包含HL-1蓝牙智能小车驱动IO口定义等函数 #define Left_1_led P3_7 /左循迹传感器 #define Right_1_led P3_6 /右循迹传感器 #define LeftIRBZ P3_5 /左避障传感器 #define RightIRBZ P3_4 /右避障传感器 sbit SB1=P23; /定义蜂鸣器端口sbit IRIN

3、=P33; /定义红外接收端口unsigned char code LedShowData=0x03,0x9F,0x25,0x0D,0x99, /定义数码管显示数据 0x49,0x41,0x1F,0x01,0x19;/0,1,2,3,4,5,6,7,8,9unsigned char code RecvData=0x19,0x46,0x15,0x43,0x44,0x40,0x0D,0x0E,0x00,0x0F;unsigned char IRCOM7;#define ShowPort P0 /定义数码管显示端口unsigned char temp = 1;void Delay1ms(unsign

4、ed int i) unsigned char j,k; do j = 10; do k = 50; do _nop_(); while(-k); while(-j); while(-i); void delay_nus(unsigned int i) /延时:i>=12 ,i的最小延时单12 us i=i/10; while(-i); void delay_nms(unsigned int n) /延时n ms n=n+1; while(-n) delay_nus(900); /延时 1ms,同时进行补偿 void delayms(unsigned char x) /0.14mS延时程

5、序 unsigned char i; /定义临时变量 while(x-) /延时时间循环 for (i = 0; i<13; i+) /14mS延时 void Delay() /定义延时子程序 unsigned int DelayTime=30000; /定义延时时间变量 while(DelayTime-); /开始进行延时循环 return; /子程序返回void ControlCar_yaokong(unsigned char ConType) /定义电机控制子程序(红外遥控单独设置一个 switch case 语句 ) stop(); switch(ConType) /判断用户设定

6、电机形式 case 1: /前进 /判断用户是否选择形式1 stop(); /进入前进之前 先停止一段时间 防止电机反向电压冲击主板 导致系统复位Delay1ms(150);/LeftLed = 0 ;run(); break; case 2: /后退 /判断用户是否选择形式2 stop(); /进入后退之前 先停止一段时间 防止电机反向电压冲击主板 导致系统复位 Delay1ms(150); / LeftLed = 1 ; back(); /M2电机反转 break; case 3: /右转 /判断用户是否选择形式3 stop(); /进入左转之前 先停止一段时间 防止电机反向电压冲击主板

7、导致系统复位 Delay1ms(150); rightrun(); /M2电机正转 break; case 4: /左转 /判断用户是否选择形式4 stop(); /进入右转之前 先停止一段时间 防止电机反向电压冲击主板 导致系统复位 Delay1ms(150); leftrun(); /M1电机正转 /M2电机反转 break; case 8: /停止 /判断用户是否选择形式8 stop();break; /退出当前选择 void Robot_Avoidance() /机器人避障子程序 if(LeftIRBZ=1&&RightIRBZ =1) /LeftIRBZ RightI

8、RBZ run(); delay_nms (10); SB1=1; else if(LeftIRBZ=1&&RightIRBZ =0) /右边检测到红外信号 rightrun(); /右转 delay_nms (300); /停止300MS 防止电机反相电压冲击 导致系统复位 if(RightIRBZ =1&&LeftIRBZ=0)/左边检测到红外信号 leftrun(); /左转 delay_nms (300); /停止300MS 防止电机反相电压冲击 导致系统复位 if(RightIRBZ=0&&LeftIRBZ=0)/两边传感器同时检测到红

9、外 SB1=0; stop(); /停止 delay_nms (300);/停止300MS 防止电机反相电压冲击 导致系统复位 back(); /调用电机后退函数 delay_nms (300);/后退50毫秒 rightrun(); /调用电机右转函数delay_nms (400); run(); /机器人循迹子程序void Robot_Traction() /机器人循迹子程序 /SB1=1; if(Left_1_led = 0 && Right_1_led = 0) /三个红外检测到黑线,就前进 Left_1_led Right_1_led run(); /左侧没有信号时,

10、开始向右转一定的角度 delay_nms (10); SB1=0; else if(Left_1_led = 0 && Right_1_led = 1) rightrun(); /右侧检测到黑线,开始向右转一定的角度 delay_nms (10); else if(Left_1_led = 1 && Right_1_led = 0) leftrun(); /左侧检测到黑线,开始向左转一定的角度 delay_nms (10); else if(Left_1_led = 1 && Right_1_led = 1) SB1=1; stop(); /左侧

11、检测到黑线,开始向左转一定的角度 delay_nms (10); /-红外遥控-void IR_IN() interrupt 2 using 0 /定义INT2外部中断函数 unsigned char j,k,N=0; /定义临时接收变量 EX1 = 0; /关闭外部中断,防止再有信号到达 delayms(15); /延时时间,进行红外消抖 if (IRIN=1) /判断红外信号是否消失 EX1 =1; /外部中断开 return; /返回 while (!IRIN) /等IR变为高电平,跳过9ms的前导低电平信号。 delayms(1); /延时等待 for (j=0;j<4;j+)

12、/采集红外遥控器数据 for (k=0;k<8;k+) /分次采集8位数据 while (IRIN) /等 IR 变为低电平,跳过4.5ms的前导高电平信号。 delayms(1); /延时等待 while (!IRIN) /等 IR 变为高电平 delayms(1); /延时等待 while (IRIN) /计算IR高电平时长 delayms(1); /延时等待 N+; /计数器加加 if (N>=30) /判断计数器累加值 EX1=1; /打开外部中断功能 return; /返回 IRCOMj=IRCOMj >> 1; /进行数据位移操作并自动补零 if (N>

13、;=8) /判断数据长度 IRCOMj = IRCOMj | 0x80; /数据最高位补1 N=0; /清零位数计录器 if (IRCOM2!=IRCOM3) /判断地址码是否相同 EX1=1; /打开外部中断 return; /返回 for(j=0;j<10;j+) /循环进行键码解析 if(IRCOM2=RecvDataj) /进行键位对应 / ControlCar(j);ControlCar_yaokong(j); /数码管显示相应数码 EX1 = 1; /外部中断开 /- void main() /主程序入口 TMOD=0X01; TH0= 0XFc; /1ms定时 TL0= 0X18; TR0= 1; ET0= 1; EA = 1; /开总中断 /EX1=1; /同意开启外部中断1 IT1=1; /设定外部中断1为低边缘触发类型 while(1) /程序主循环 if(P3_2 = 0) delay_nms(10); if(P3_2 = 0) temp+; while(!P3_2); if(temp

温馨提示

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

评论

0/150

提交评论