版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、/智能小车避障、循迹、红外遥控C语言代码/实现功能有超声波避障,红外遥控智能小车,红外传感器实现小车自动循迹,1602显示小车的工作状态,另有三个独立按键分别控制三种状态的转换/注:每个小车的引脚配置都不一样,要注意引脚的配置,但是我的代码注释比较多,看起来比较容易一点#include <reg52.h>#include <math.h>#include"lcd.h"#include <intrins.h>#define uchar unsigned char #define uint unsigned int uchar ENCHAR_
2、PuZh18=" run "/1602显示数组uchar ENCHAR_PuZh28=" back "uchar ENCHAR_PuZh38=" stop "uchar ENCHAR_PuZh48=" left "uchar ENCHAR_PuZh58=" right "uchar ENCHAR_PuZh68=" xunji "uchar ENCHAR_PuZh78=" bizhang"uchar ENCHAR_PuZh88=" yaokong&
3、quot;#define HW P2 /红外传感器引脚配置P2k口#define PWM P1 /* L298N管脚定义 */* 超声波引脚控制*/sbit ECHO=P32; /超声波接收引脚定义 兼红外遥控按键 state_total =2sbit TRIG=P33; /超声波发送引脚定义 /红外控制引脚配置sbit KEY2=P37; /红外接收器数据线兼循迹按键state_total= 0sbit KEY1=P34; /独立按键p3.4控制 自动避障 state_total=1 uchar state_total=3,state_2=0;/总状态控制全局变量 0为自动循迹模块1为自动避
4、障模块2为红外遥控 uchar state_1,DAT; /红外扫描标志位 uchar time_1=0,time_2=0;/定时器1中断全局变量time_ 2控制PWM脉冲计数 time_1控制转弯延时计数也做延时一次0.005s uchar time,timeH,timeL,state=0;/超声波测量缓冲变量 state为超声波状态检测控制全局变量 uint count=0;/1602显示计数/*/unsigned char IRCOM7; /红外接收头接收数据缓存 IRCOM2存放的为数据unsigned char Number,distance4,date_data8=0,0,0,0
5、,0,0,0,0; /红外接收缓存变量/*/void IRdelay(char x); /x*0.14MS 红外头专用delayvoid run();void back();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_te
6、st();void Delay10ms(void); void init_test()/定时器0 1 外部中断0 1 延时初始化 TMOD=0x11; /设置定时器0 1 工作方式1 16位初值定时器 TH1=0Xfe; /装入初值定时一次为0.0005s 2000hz TL1=0x0c; TF0=0; /定时器0方式1计数溢出标志 TF1=0; /定时器1方式1计数溢出标志 ET0=1; /允许定时器0中断溢出 ET1=1; /允许定时器1中断溢出 EA=1; /开总中断 if(state_total=1)/为超声波模块时初始化 TRIG=0; /发射引脚低电平 ECHO=0; / 接收引脚
7、低电平 EX0=0; /关闭外部中断 IT0=1; /由高电平变低电平,触发外部中断0 if(state_total=2) /红外遥控初始化 IT1=1; /外部中断1为负跳变触发 EX1=1; /允许外部中断1 TRIG=1; / 3.3为高电平I/O口初始化 delay(60); /等待硬件操作 void main() uint i; delay(50); init_test(); TR1=1; /开启定时器1 LCD1602_Init() ; delay(50); while(state_2=0) if(KEY1=0)/检测按键s1是否按下Delay10ms();/消除抖动if(KEY1
8、=0) state_total=0; /总状态定义0为自动循迹模块 1为自动避障模块 2为红外遥控 while(i<30)&&(KEY1=0) /检测按键是否松开Delay10ms();i+;i=0; if(TRIG=0)/检测按键s2是否按下Delay10ms();/消除抖动if(TRIG=0) state_total=1; /总状态定义0为自动循迹模块 1为自动避障模块 2为红外遥控while(i<30)&&(TRIG=0) /检测按键是否松开Delay10ms();i+;i=0; if(KEY2=0)/检测按键s3是否按下Delay10ms()
9、;/消除抖动if(KEY2=0) state_total=2; /总状态定义0为自动循迹模块 1为自动避障模块 2为红外遥控while(i<30)&&(KEY2=0) /检测按键是否松开Delay10ms();i+;i=0; init_test(); delay(50); /等待硬件操作 50us TR1=0; /关闭定时器1 if(state_total=1) /SPEED=90; /自动循迹速度控制 高电平持续次数 占空比为10的低电平 bizhang_test(); if(state_total=0) / SPEED=98; /自动循迹速度控制 高电平持续次数 占空
10、比为40的低电平 xunji_test(); if(state_total=2) /SPEED=98; /自动循迹速度控制 高电平持续次数 占空比为40的低电平 hongwai_test(); void init0_suspend(void) 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 为
11、定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断0 4 串口中断 if(state_total=1) / 自动避障初值装入 TH0=0X00; /装入初值 TL0=0x00;if(state_total=0) /自动循迹初值装入 TH0=0Xec; /装入初值 定时一次0.005s 200hz TL0=0x78; time_1+; /控制转弯延时计数 void IR_IN(void) interrupt 2 unsigned char j,k,N=0; EX1 = 0; IRdelay(5); if (TRIG=1) EX1 =1; return; /确认IR信号出现 wh
12、ile (!TRIG) /等IR变为高电平,跳过9ms的前导低电平信号。 IRdelay(1); for (j=0;j<4;j+) /收集四组数据 for (k=0;k<8;k+) /每组数据有8位 while (TRIG) /等 IR 变为低电平,跳过4.5ms的前导高电平信号。 IRdelay(1); while (!TRIG) /等 IR 变为高电平 IRdelay(1); while (TRIG) /计算IR高电平时长 IRdelay(1); N+; if(N>=30) EX1=1; return; /0.14ms计数过长自动离开。 /高电平计数完毕 IRCOMj=I
13、RCOMj >> 1; /数据最高位补“0” if (N>=8) IRCOMj = IRCOMj | 0x80; /数据最高位补“1” N=0; /end for k /end for j if(IRCOM2!=IRCOM3) /判断数据码与数据反码是否正确 真确返回 EX1=1; return; EX1 = 1; void time1_suspend1(void) interrupt 3 /3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断0 4 串口中断 TH1=0Xec; /装入初值定时一次为0.0005s 2000hz TL1=0x78; ti
14、me_2+; /控制PWM 脉冲计数 if(state_total!=3) /判断进入按键是否按下 进入状态1 避障 或者 0 循迹 state_2=1; /退出按键判断/*if(time_2>100) time_2=0;else if(time_2<=SPEED) PWM_g; /频率为2000hz的占空比为高电平的方波else PWM_l; /为低电平 */ void IRdelay(unsigned char x) /x*0.14MS用于红外遥控 unsigned char i; while(x-) for (i = 0; i<13; i+) void Delay10m
15、s(void) /用于按键检测误差 unsigned char a,b,c; for(c=1;c>0;c-) for(b=38;b>0;b-) for(a=130;a>0;a-);void delay(uint dat) /延时函数用于初始化 uint i; for(i=dat;i>0;i-) _nop_(); void delay_100ms(uint ms) /延时函数用于超声波 uint i,j; for(i=ms;i>0;i-) for(j=200;j>0;j-) _nop_(); _nop_(); _nop_(); _nop_(); _nop_()
16、; /小车前进void run(void) PWM=0X56;/小车后退void back(void) PWM=0XA9; TR1=1; time_2=0; while(time_2<=100); /延时0.2s TR1=0;/小车停止void stop(void) PWM=0X00; /小车左转180 void left_180() /PWM=0X59; /左两轮反转,右两轮正转 PWM=0X50; /右两轮正转 TR1=1; time_2=0; while(time_2<=150); /延时0.2stime_2=0;while(time_2<=150); /延时0.2s
17、/小车左转 90void left_90(void) PWM=0X59; /左两轮反转,右两轮正转 /PWM=0X50; /右两轮正转 TR0=1; time_1=0;while(time_1<=20); /延时0.2s TR0=0;/小车左转 120void left_120(void) PWM=0X59; /左两轮反转,右两轮正转 / PWM=0X50; /右两轮正转 TR0=1; time_1=0; while(time_1<=60); /延时0.4s TR0=0;/小车右转 90void right_90(void) PWM=0XA6; /左两轮正转 右两轮反转 /PWM=
18、0X06; /左两轮正转 TR0=1; time_1=0; while(time_1<=20); /延时0.2s TR0=0;/小车右转 120void right_120(void) PWM=0XA6; /左两轮正转 右两轮反转 /PWM=0X06; /左两轮正转 TR0=1; time_1=0; while(time_1<=60); /延时0.4s TR0=0; /* 自动避障模块*/ void display(uchar temp) /判断障碍距离小车的距离,左转180,前进,峰呤器报警1602显示 uint ge,shi,bai,i; if(temp<=20)&
19、;&(temp>2) /小于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;i<8;i+) LCD1602_WriteCom(0x80+i); LCD1602_WriteData(date_datai+48); count=0; void bizhang_test() int i,j=0; uchar
20、distance_dat; delay(50); for(i=0;i<8;i+) LCD1602_WriteCom(0x80+i);LCD1602_WriteData(ENCHAR_PuZh7i); while(1) run(); EA=0; /关总中断 TRIG=1; / 发射20us脉冲信号 delay(30); TRIG=0; while(ECHO=0); /等待接收信号 state=0; /标志清零 EA=1; /开总中断 EX0=1; /打开外部中断0 P3.2外部中断0引脚 此时为高电平 TH0=0x00; /定时器0 初值 TL0=0x00; TF0=0; / 定时器0方式
21、1计数溢出标志 TR0=1; / 定时器0方式1启动定时器1 while(state!=1); EX0=0; /关闭外部中断0 TR0=0; /关闭定时器0中断 TF0=0; / 定时器1方式1计数溢出标志 if(state=1) /检测到障碍物计算离障碍物的距离 time=(timeH*4.352+timeL*0.017); /设定超声波的速度为340m/s 定时计数一次1us distance_dat=time; else /未检测到障碍物 无返回信号 distance_dat=0; distancej=distance_dat; j+; if(j=3) if(distance0>d
22、istance1) else distance0=distance1; if(distance0>distance2) else distance0=distance2; if(distance0>distance3) else distance0=distance3; distance_dat=distance0; j=0; display(distance_dat); count+; void xunji_test() int i; delay(50); for(i=0;i<8;i+) LCD1602_WriteCom(0x80+i); LCD1602_WriteData
23、(ENCHAR_PuZh6i); while(1) / delay(10); state_1=HW; DAT=state_1&(0x0f); /判断低4位的状态 每隔5ms检测一次 switch(DAT) case 0x00: run();break;case 0x01: right_120();break;case 0x02: right_90();break;case 0x04: left_90(); break;case 0x06: run(); break;case 0x03:right_120(); break;case 0x08: left_120();break;case 0x0c: left_120();break;defa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度土地使用权转让合同:商业用地购置协议3篇
- 二零二四年度旅游服务与接待协议
- 二零二四年度股权转让定价评估咨询合同
- 2024版工程项目施工分包合同2篇
- 2024版教育培训项目投资与合作合同
- 2024版股权转让后的经营管理权转移合同:个人独资企业
- 有限公司股权转让协议书
- 教育培训机构合作协议2篇
- 2024版工程设计中介合同范本3篇
- 公司员工免责的协议书 3篇
- 营养专科护士总结汇报
- 2024秋期国家开放大学专科《宪法学》一平台在线形考(形考作业1至4)试题及答案
- 乒乓球女单世界第一首位零零后孙颖莎介绍课件
- 创新实践(理论)学习通超星期末考试答案章节答案2024年
- 2024实施就业优先战略促进高质量充分就业的意见(就业是最基本的民生)
- 英语我的家乡甘肃酒泉课件
- 部编版2024-2025学年六年级上册语文第19课《只有一个地球》同步练习(附答案解析)
- 青岛版科学三年级上册全册课件教材
- 语文园地四 教学设计2024~2025学年一年级语文上册统编版
- 2024汽车行业社媒营销趋势-微播易CAA中国广告协会-2024.08-98正式版
- 出境劳务派遣合同模板
评论
0/150
提交评论