《2022年智能小车循迹避障红外遥控C语言代码.pdf》由会员分享,可在线阅读,更多相关《2022年智能小车循迹避障红外遥控C语言代码.pdf(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、/ 智能小车避障、循迹、红外遥控C语言代码/ 实现功能有超声波避障,红外遥控智能小车,红外传感器实现小车自动循迹,1602 显示小车的工作状态,另有三个独立按键分别控制三种状态的转换/ 注:每个小车的引脚配置都不一样,要注意引脚的配置,但是我的代码注释比较多,看起来比较容易一点#include #include #include #include #define uchar unsigned char #define uint unsigned int uchar ENCHAR_PuZh18= run ;/1602 显示数组uchar ENCHAR_PuZh28= back ; uchar E
2、NCHAR_PuZh38= stop ; uchar ENCHAR_PuZh48= left ; uchar ENCHAR_PuZh58= right ; uchar ENCHAR_PuZh68= xunji ; uchar ENCHAR_PuZh78= bizhang; uchar ENCHAR_PuZh88= yaokong; #define HW P2 / 红外传感器引脚配置P2k 口#define PWM P1 /* L298N 管脚定义*/ /* 超声波引脚控制*/ sbit ECHO=P32; / 超声波接收引脚定义兼红外遥控按键state_total =2 sbit TRIG=P
3、33; / 超声波发送引脚定义/红外控制引脚配置sbit KEY2=P37; / 红外接收器数据线兼循迹按键state_total= 0 sbit KEY1=P34; / 独立按键控制自动避障state_total=1 uchar state_total=3,state_2=0;/ 总状态控制全局变量0为自动循迹模块1为自动避障模块2 为红外遥控uchar state_1,DAT; / 红外扫描标志位uchar time_1=0,time_2=0;/定时器1 中断全局变量time_ 2 控制PWM脉冲计数time_1 控制转弯延时计数也做延时一次uchar time,timeH,timeL,s
4、tate=0;/超声波测量缓冲变量state 为超声波状态检测控制全局变量uint count=0; /1602 显示计数/*/ unsigned char IRCOM7; / 红外接收头接收数据缓存IRCOM2存放的为数据unsigned char Number,distance4,date_data8=0,0,0,0,0,0,0,0; / 红外接收缓存变量/*/ void IRdelay(char x); /x* 红外头专用delay void run(); void back(); 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - -
5、 - - - - - - -第 1 页,共 13 页 - - - - - - - - - - void stop(); void left_90(); void left_180(); void right_90(); void delay(uint dat); / void init_test(); void delay_100ms(uint ms) ; void display(uchar temp); / 超声波显示驱动void bizhang_test(); void xunji_test(); void hongwai_test(); void Delay10ms(void); vo
6、id init_test()/ 定时器 0 1 外部中断0 1 延时初始化 TMOD=0 x11; / 设置定时器0 1 工作方式1 16 位初值定时器TH1=0Xfe; / 装入初值定时一次为2000hz TL1=0 x0c; TF0=0; / 定时器 0 方式 1 计数溢出标志TF1=0; / 定时器 1 方式 1 计数溢出标志ET0=1; / 允许定时器0 中断溢出ET1=1; / 允许定时器1 中断溢出EA=1; / 开总中断if(state_total=1)/ 为超声波模块时初始化 TRIG=0; / 发射引脚低电平ECHO=0; / 接收引脚低电平EX0=0; / 关闭外部中断IT
7、0=1; / 由高电平变低电平,触发外部中断0 if(state_total=2) / 红外遥控初始化 IT1=1; / 外部中断1 为负跳变触发EX1=1; / 允许外部中断1 TRIG=1; / 为高电平I/O 口初始化 delay(60); / 等待硬件操作 void main() uint i; delay(50); init_test(); TR1=1; / 开启定时器1 LCD1602_Init() ; delay(50); while(state_2=0) 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - -
8、- - -第 2 页,共 13 页 - - - - - - - - - - if(KEY1=0) / 检测按键s1 是否按下 Delay10ms(); / 消除抖动if(KEY1=0) state_total=0; / 总状态定义0 为自动循迹模块1 为自动避障模块2 为红外遥控while(i30)&(KEY1=0) / 检测按键是否松开 Delay10ms(); i+; i=0; if(TRIG=0) / 检测按键s2 是否按下 Delay10ms(); / 消除抖动if(TRIG=0) state_total=1; / 总状态定义0 为自动循迹模块1 为自动避障模块2 为红外遥控while
9、(i30)&(TRIG=0) / 检测按键是否松开 Delay10ms(); i+; i=0; if(KEY2=0) / 检测按键s3 是否按下 Delay10ms(); / 消除抖动if(KEY2=0) state_total=2; / 总状态定义0 为自动循迹模块1 为自动避障模块2 为红外遥控while(i30)&(KEY2=0) / 检测按键是否松开 Delay10ms(); i+; i=0; 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 3 页,共 13 页 - - - - - - - - -
10、 - init_test(); delay(50); / 等待硬件操作50us TR1=0; / 关闭定时器1 if(state_total=1) /SPEED=90; / 自动循迹速度控制高电平持续次数占空比为 10 的低电平bizhang_test(); if(state_total=0) / SPEED=98; / 自动循迹速度控制高电平持续次数占空比为 40 的低电平xunji_test(); if(state_total=2) /SPEED=98; / 自动循迹速度控制高电平持续次数占空比为 40 的低电平hongwai_test(); void init0_suspend(void
11、) interrupt 0 /3 为定时器 1 的中断号1 定时器 0的中断号0 外部中断 1 2 外部中断0 4 串口中断 timeH=TH0; / 记录高电平次数timeL=TL0; / state=1; / 标志状态为1,表示已接收到返回信号EX0=0; / 关闭外部中断0 void time0_suspend0(void) interrupt 1 /3 为定时器1 的中断号1 定时器 0 的中断号0 外部中断 1 2 外部中断0 4 串口中断 if(state_total=1) / 自动避障初值装入 TH0=0X00; / 装入初值TL0=0 x00; if(state_total=0
12、) / 自动循迹初值装入 TH0=0Xec; / 装入初值定时一次200hz TL0=0 x78; time_1+; / 控制转弯延时计数精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 4 页,共 13 页 - - - - - - - - - - void IR_IN(void) interrupt 2 unsigned char j,k,N=0; EX1 = 0; IRdelay(5); if (TRIG=1) EX1 =1; return; / 确认 IR信号出现while (!TRIG) / 等 I
13、R 变为高电平,跳过9ms 的前导低电平信号。IRdelay(1); for (j=0;j4;j+) / 收集四组数据 for (k=0;k=30) EX1=1; return; / 计数过长自动离开。 / 高电平计数完毕IRCOMj=IRCOMj 1; / 数据最高位补“0”if (N=8) IRCOMj = IRCOMj | 0 x80; / 数据最高位补“1”N=0; /end for k /end for j if(IRCOM2!=IRCOM3) / 判断数据码与数据反码是否正确真确返回 EX1=1; return; EX1 = 1; 精品资料 - - - 欢迎下载 - - - - -
14、 - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 5 页,共 13 页 - - - - - - - - - - void time1_suspend1(void) interrupt 3 /3 为定时器1 的中断号1 定时器 0 的中断号0 外部中断1 2 外部中断 0 4 串口中断 TH1=0Xec; / 装入初值定时一次为2000hz TL1=0 x78; time_2+; / 控制 PWM 脉冲计数if(state_total!=3) / 判断进入按键是否按下进入状态 1 避障或者0 循迹 state_2=1; / 退出按键判断 /* if(time
15、_2100) time_2=0; else if(time_2=SPEED) PWM_g; / 频率为 2000hz 的占空比为高电平的方波 else PWM_l; / 为低电平 */ void IRdelay(unsigned char x) /x* 用于红外遥控 unsigned char i; while(x-) for (i = 0; i0;c-) for(b=38;b0;b-) for(a=130;a0;a-); void delay(uint dat) / 延时函数用于初始化 uint i; for(i=dat;i0;i-) 精品资料 - - - 欢迎下载 - - - - - -
16、- - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 6 页,共 13 页 - - - - - - - - - - _nop_(); void delay_100ms(uint ms) / 延时函数用于超声波 uint i,j; for(i=ms;i0;i-) for(j=200;j0;j-) _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); / 小车前进void run(void) PWM=0X56; / 小车后退void back(void) PWM=0XA9; TR1=1; time_2=0; while(time_2=
17、100); / 延时TR1=0; / 小车停止void stop(void) PWM=0X00; / 小车左转180 void left_180() /PWM=0X59; / 左两轮反转,右两轮正转PWM=0X50; / 右两轮正转TR1=1; time_2=0; while(time_2=150); / 延时time_2=0; 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 7 页,共 13 页 - - - - - - - - - - while(time_2=150); / 延时 / 小车左转90 v
18、oid left_90(void) PWM=0X59; / 左两轮反转,右两轮正转/PWM=0X50; / 右两轮正转TR0=1; time_1=0; while(time_1=20); / 延时TR0=0; / 小车左转120 void left_120(void) PWM=0X59; / 左两轮反转,右两轮正转/ PWM=0X50; / 右两轮正转TR0=1; time_1=0; while(time_1=60); / 延时TR0=0; / 小车右转90 void right_90(void) PWM=0XA6; / 左两轮正转右两轮反转/PWM=0X06; / 左两轮正转TR0=1; t
19、ime_1=0; while(time_1=20); / 延时TR0=0; / 小车右转120 void right_120(void) PWM=0XA6; / 左两轮正转右两轮反转/ PWM=0X06; / 左两轮正转TR0=1; time_1=0; while(time_1=60); / 延时TR0=0; 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 8 页,共 13 页 - - - - - - - - - - /* 自动避障模块*/ void display(uchar temp) / 判断障碍距
20、离小车的距离,左转180,前进,峰呤器报警 1602 显示 uint ge,shi,bai,i; if(temp2) / 小于 15 厘米小车后退再左转 back(); left_180(); if(count=20) bai=temp/100; /1602 显示数据date_data5=bai; shi=(temp%100)/10; date_data 6=shi; ge=temp%100%10; date_data7=ge; for(i=0;i8;i+) LCD1602_WriteCom(0 x80+i); LCD1602_WriteData(date_datai+48); count=0
21、; void bizhang_test() int i,j=0; uchar distance_dat; delay(50); for(i=0;idistance1) else distance0=distance1; if(distance0distance2) else distance0=distance2; if(distance0distance3) else distance0=distance3; 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 10 页,共 13 页 - - - - - -
22、 - - - - distance_dat=distance0; j=0; display(distance_dat); count+; void xunji_test() int i; delay(50); for(i=0;i8;i+) LCD1602_WriteCom(0 x80+i); LCD1602_WriteData(ENCHAR_PuZh6i); while(1) / delay(10); state_1=HW; DAT=state_1&(0 x0f); / 判断低 4 位的状态每隔 5ms 检测一次switch(DAT) case 0 x00: run(); break; cas
23、e 0 x01: right_120(); break; case 0 x02: right_90(); break; case 0 x04: left_90(); break; case 0 x06: run(); break; case 0 x03: right_120(); break; case 0 x08: left_120(); break; 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 11 页,共 13 页 - - - - - - - - - - case 0 x0c: left_120
24、(); break; default: run(); break; void hongwai_test() int i; delay(60); for(i=0;i8;i+) LCD1602_WriteCom(0 x80+i); LCD1602_WriteData(ENCHAR_PuZh8i); / TR1=1; while(1) Number=IRCOM2; switch(Number) case 0 x18: PWM=0X56; / 前进for(i=0;i8;i+) LCD1602_WriteCom(0 x80+i); LCD1602_WriteData(ENCHAR_PuZh1i); br
25、eak; case 0 x08: PWM=0X50; / 右两轮正转左转for(i=0;i8;i+) LCD1602_WriteCom(0 x80+i); LCD1602_WriteData(ENCHAR_PuZh4i); break; case 0 x1c: PWM=0X00; for(i=0;i8;i+) 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 12 页,共 13 页 - - - - - - - - - - LCD1602_WriteCom(0 x80+i); LCD1602_WriteDat
26、a(ENCHAR_PuZh3i); break; case 0 x5a: PWM=0X06; / 左两轮正转右转for(i=0;i8;i+) LCD1602_WriteCom(0 x80+i); LCD1602_WriteData(ENCHAR_PuZh5i); break; case 0 x52: PWM=0XA9; / 后退for(i=0;i8;i+) LCD1602_WriteCom(0 x80+i); LCD1602_WriteData(ENCHAR_PuZh2i); break; default:break; /display(IRCOM2); 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 13 页,共 13 页 - - - - - - - - - -