智能小车循迹、避障、红外遥控C语言代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//智能小车避障、循迹、红外遥控C语言代码
//实现功能有超声波避障,红外遥控智能小车,红外传感器实现小车自动循迹,1602显示小车的工作状态,另有三个独立按键分别控制三种状态的转换
//注:每个小车的引脚配置都不一样,要注意引脚的配置,但是我的代码注释比较多,看起来比较容易一点
#include
#include
#include"lcd.h"
#include
#define uchar unsigned char
#define uint unsigned int
uchar ENCHAR_PuZh1[8]=" run ";//1602显示数组
uchar ENCHAR_PuZh2[8]=" back ";
uchar ENCHAR_PuZh3[8]=" stop ";
uchar ENCHAR_PuZh4[8]=" left ";
uchar ENCHAR_PuZh5[8]=" right ";
uchar ENCHAR_PuZh6[8]=" xunji ";
uchar ENCHAR_PuZh7[8]=" bizhang";
uchar ENCHAR_PuZh8[8]=" yaokong";
#define HW P2//红外传感器引脚配置P2k口
#define PWM P1 /* L298N管脚定义*/
/******************************
超声波引脚控制
******************************/
sbit ECHO=P3^2;//超声波接收引脚定义兼红外遥控按键state_total =2 sbit TRIG=P3^3; //超声波发送引脚定义
/////红外控制引脚配置
sbit KEY2=P3^7; //红外接收器数据线兼循迹按键state_total= 0
sbit KEY1=P3^4; //独立按键p3.4控制自动避障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控制转弯延时计数也做延时一次0.005s
uchar time,timeH,timeL,state=0;//超声波测量缓冲变量state为超声波状态检测控制全局变量
uint count=0;//1602显示计数
/**************************/
unsigned char IRCOM[7]; //红外接收头接收数据缓存IRCOM[2]存放的为数据unsigned char Number,distance[4],date_data[8]={0,0,0,0,0,0,0,0};//红外接收缓存变量
/***********/
void IRdelay(char x); //x*0.14MS 红外头专用delay
void 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_test();
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; // 接收引脚低电平
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)