智能小车循迹、避障、红外遥控C语言代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

智能小车循迹、避障、红外遥控C语言代码
//智能小车避障、循迹、红外遥控 C 语言代码
// 实现功能有超声波避障,红外遥控智能小车,红外传感器实现小车自动循迹, 1602 显示小车
的工作状态,另有三个独立按键分别控制三种状态的转换// 注:每个小车的引脚配置都不一样,要注意引脚的配置,但是我的代码注释比较多,看起来比较容易一点#include <> #include <> #include"" #include <> #define uchar unsigned char #define uint unsigned int uchar ENCHAR_PuZh1[8]=" uchar ENCHAR_PuZh2[8]=" uchar ENCHAR_PuZh3[8]=" uchar ENCHAR_PuZh4[8]=" uchar ENCHAR_PuZh5[8]=" run back stop left right "; ";//1602 显示数组H. H. H. uchar ENCHAR_PuZh6[8]=" xunji "; uchar ENCHAR_PuZh7[8]=" bizhang"; uchar ENCHAR_PuZh8[8]=" yaokong"; #define HW P2 #define PWM /****************************** P1 //红外传感器引脚配置P2k 口/* L298N 管脚定义*/ 超声波引脚控制******************************/ sbit ECHO=P3A2; sbit TRIG=P3A3;
///// 红外控制引脚配置 sbit sbit
uchar KEY2=P3A7; KEY 仁 P3M;
state_total=3,state_2=0;// 2 为红外遥控 uchar
uchar time_1 uchar 局变量 // 超声波接收引脚定义 // 超声波发送引脚定

// 红外接收器数据线 // 独立按键控制总
状态控制全局变量 state_1,DAT; // 红外扫描标志位
time_1=0,time_2=0;// 定时器1 中断全局变量控制转弯延时计数也做延时一次time,timeH,timeL,state=0;// 超声波测量缓冲变量count=0;
//1602 显示计数兼红外遥控按键state_total =2 兼循迹按键
state_total= 0 自动避障 state_total=1
0 为自动循迹模块 1 为自动避障模块 time_ 2 控制 PWM 脉冲计数state 为超声波状态检测控制全uint /**************************/ unsigned char IRC0M[7]; // 红外接收头接收数据缓存unsigned char Number,distance[4],date_data[8]={0,0,0,0,0,0,0,0}; /********* void
void void
IRC0M[2 ]存放的为数据 // 红外接收缓存变量 **/ IRdelay(char x); //x* 红外头专用 delay run(); 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; TH1=0Xfe; TL1=0x0c; TF0=0; TF1=0; ET0=1; ET1=1; EA=1;
// 设置定时器 0 1 // 装入初值定时一次

工作方式 1 16 位初值定时器
2000hz
// 定时器 // 定时器 // 允许定时器
// 允许定时器 0 方式 1 计数溢出标志 1 方式 1 计数溢出标志 0 中断溢出 1 中断溢出
//
开总中断 if(state_total==1)// 为超声波模块时初始
化 {
TRIG=0; ECHO=0; EX0=0; IT0=1;
}
if(state_total==2)
// 发射引脚低电平 // 接收引脚低电平 // 关闭外部中断
// 由高电平变低电平,触发外部中断 0
// 红外遥控初始

{ IT1=1; EX1=1;
TRIG=1;
}
del ay(60);
} void main()
{ uint i; delay(50); init_test(); TR1=1; LCD1602_Init() ; delay(50); while(state_2==0)
// 外部中断 1 为负跳变触发 // 允许外部中断 1 // 为高
电平 I/O 口初始化
// 等待硬件操

// 开启定时器 1
{
if(KEY1==0)
{
Delay10ms(); // 消除抖动 if(KEY1==0) {
state_total=0; // 总状态定义 0 为自动循迹模块 1 为自动避障模块
2 为红外遥控
while((i<30)&&(KEY1==0))
// 检测按键是否松开
{
Delay10ms(); i++;
}
i=0;
}
}
if(TRIG==0)
{
while((i<30)&&(TRIG==0))
// 检测按键是否松开
{
Delay10ms(); i++;
}
i=0;
}
if(KEY2==0)
{
while((i<30)&&(KEY2==0))
// 检测按键是否松开
{
Delay10ms(); i++; }
i=0;
// 检测按键 s1 是否按下
//检测按键s2是否按下
障模块
Delay10ms(); // 消除抖动 if(TRIG==0) { state_total=1; 2 为红外遥控
//总状态定义 0 为自动循迹模块 1 为自动避// 检测按键 s3 是否按下
障模块
Delay10ms(); // 消除抖动 if(KEY2==0) { state_total=2; 2 为红外遥控
// 总状态定义 0 为自动循迹模块
1 为自动避
}
}
} init_test();
delay(50); // 等待硬件操作50us TR1=0; // 关闭定时器 1 if(state_total==1) {
//SPEED=90; 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)
2 外部中断0 4 串口中断外部中断 1
timeH=TH0;
timeL=TL0;
state=1;
EX0=0;
}
void 断号0
{
if(state_total==
1) { TH0=0X00;
TL0=0x00;
}
if(state_total==
0) { TH0=0Xec;
TL0=0x78;
time_1++;
interrupt 0 //3 为定时器 1 的中断号 1 定时器0 的中// 记录高电平次

//
// 标志状态为
// 关闭外部中断
1,表示已接收到返回信号
//3 为定时器 1 的中断号
2 外部中断0 4 串口中断
time0_suspend0(void) interrupt 1
外部中断 1
// 自动避障初值装入
// 装入初值
// 自动循迹初值装入
// 装入初值定时一次200hz
// 控制转弯延时计

1 定时器0 的中
}
}
void IR_IN(void)
{
unsigned char j,k,N=0;
EX1 = 0; IRdelay(5); if (TRIG==1) { EX1 =1; return;
}
//确认IR 信号出现
//等IR 变为高电平,跳过 9ms 的前导低电平信号。

if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“ 1” N=0;
}//end for k }//end for j
if(IRCOM[2]!=~IRCOM[3]) // 判断数据码与数据反码是否正确{ EX1=1; return;
}
EX1 = 1;
interrupt 2
while (!TRIG) {IRdelay(1);}
for (j=0;j<4;j++)
{
for (k=0;k<8;k++)
{
while (TRIG) {IRdelay(1);} while (!TRIG) {IRdelay(1);} while (TRIG)
{
IRdelay(1);
N++; if(N>=30) {EX1=1;
return;} }
IRCOM[j]=IRCOM[j] >>
1;
// 收集四组数据
// 每组数据有 8 位
// 等 IR 变为低电平,跳过的前导高电平信号。

// 等 IR 变为高电平
//计算IR 高电平时长
// 计数过长自动离开。

// 高电平计数完毕
// 数据最高位补“ 0”
真确返回
void
time1_suspend1(void) 中断号0 外部中断1 /*
TH1=0Xec;
TL1=0x78;
time_2++;
if(state_total!=
3) {
state_2=1;
}
if(time_2>100)
{
time_2=0;
}
else
// 控制PWM 脉冲计数
// 判断进入按键是否按下
// 退出按键判

// 装入初值定时一次为2000hz
进入状态 1 避障或者0 循迹
if(time_2<=SPEED)
{
PWM_g;
}
else
{ PWM_l;
} */
// 频率为2000hz 的占空比为高电平的方波// 为低电

}
void IRdelay(unsigned char x) { unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {} }
}
void Delay10ms(void)
{//x* 用于红外遥控
// 用于按键检测误

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
--) {// 延时函数用于初始

interrupt 3 //3
2 外部中断0 4 串口中断
为定时器 1 的中断号 1 定时器0 的
_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_();
}
}
// 小车前进
void run(void)
{
PWM=0X56;
}
// 小车后退
void back(void)
{
PWM=0XA9;
TR1=1;
time_2=0;
while(time_2<=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;。

相关文档
最新文档