/*从小车后面观察,从左向右的红外检测分别为DD1,DD2,DD3,DD4
DD1---P0^3
DD2---P0^2
DD3---P0^1
DD4---P0^0
*/
#include<reg52.h>
#include<car.h>
#include<red.c>
#define uchar unsigned char
#define uint unsigned int
extern unsigned char IRCOM[7];
sbit IRIN=P3^3;
sbit ENA = P1^5; //定义电机使能端
sbit ENB = P1^0;
extern unsigned char Infrared;
extern unsigned char cnt;
extern unsigned char code RecvData[];
extern unsigned char IRCOM[7];
//按钮程序锁
//int xungui_flag = 0;
//int red_flag = 0;
sbit xunji = P2^4;
sbit red_light = P2^5;
sbit bluetooch= P2^6;
uchar tmp;
void main()
{
static unsigned char date;
if(0 == red_light)
{
IT1=1; //设定外部中断1为低边缘触发类型
EA=1;
EX1 = 1;
Timer0Config();
ENA = 1; ENB = 1;
Infrared = P0 & 0x0F; //取出P0口低四位 //总中断开启
while(1)
{
if(red_light != 0)
{
break;
}
} //程序主循环
}
if(0 == bluetooch)
{
IT1=1; //设定外部中断1为低边缘触发类型
EA=1;
EX1 = 1;
Timer0Config();
ENA = 1; ENB = 1;
Infrared = P0 & 0x0F; //取出P0口低四位
while(1)
{
date = tmp;
switch(date)
{
case 'A':
zhizou();
break;
case 'B':
houtui1();
break;
case 'C':
left();
break;
case 'D':
right();
break;
case 'F':
stop();
break;
}
}
}
if(0 == xunji)
{
Timer0Config();
ENA = 1; ENB = 1;
Infrared = P0 & 0x0F; //取出P0口低四位
while(1)
{
switch(Infrared)
{
case 0x00:
zhizou(); break; //未检测到黑线,直行
case 0x08:
dazhuan1(); break; //左边第一个检测到黑线,左大转
case 0x04:
weitiao1(); break; //左边第二个检测到黑线,左微调
case 0x02:
weitiao2(); break; //右边第一个检测到黑线,右微调
case 0x01:
dazhuan2(); break; //右边第二个检测到黑线,右大转
case 0x0C:
zhizou(); break; //左边两个同时检测到黑线,直行
case 0x0E:
zhizou(); break; //左边三个同时检测到黑线,直行
case 0x03:
zhizou(); break; //右边两个同时检测到黑线,直行
case 0x07:
zhizou(); break; //右边三个同时检测到黑线,直行
case 0x0f:
zhizou(); break; //全部检测到,直行
case 0x06:
zhizou(); break; //中间两个检测到,直行
case 0x09:
zhizou(); break; //旁边两个检测到,直行
case 0x0A:
weitiao1(); break; //左一右一检测到,左微调
case 0x05:
weitiao2(); break; //左二右二检测到,右微调
case 0x0b:
zhizou(); break; //左二未检测到,直行
case 0x0d:
zhizou(); break; //右一未检测到,直行
default: break;
}
if(xunji != 0)break;
}
}
}
void InterruptTimer0() interrupt 1
{
if(0 == bluetooch)
{
if(RI==1) //是否有数据到来 1为是 0为否
{
tmp = SBUF; //暂存接收到的数据
RI = 0;
}
}
if(0 == xunji)
{
TH0 = 0xFF;
TL0 = 0x7E;
cnt++;
if(cnt >= 100)
{
cnt = 0;
}
}
}
void IR_IN() interrupt 0 using 0 //定义INT2外部中断函数
{
unsigned char j,k,N=0;
/*if(0 == bluetooch)
{
if(RI==1) //是否有数据到来 1为是 0为否
{
tmp = SBUF; //暂存接收到的数据
RI = 0;
}
}*/
if(0 == red_light)
{
//定义临时接收变量
EX1 = 0; //关闭外部中断,防止再有信号到达
delayms(15); //延时时间,进行红外消抖
if (IRIN==1) //判断红外信号是否消失
{
EX1 =1; //外部中断开
return; //返回
}
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{
delayms(1); //延时等待
}
for (j=0;j<4;j++) //采集红外遥控器数据
{
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; //返回
}
}
IRCOM[j]=IRCOM[j] >> 1; //进行数据位移操作并自动补零
if (N>=8) //判断数据长度
{
IRCOM[j] = IRCOM[j] | 0x80; //数据最高位补1
}
N=0; //清零位数计录器
}
}
if (IRCOM[2]!=~IRCOM[3]) //判断地址码是否相同
{
EX1=1; //打开外部中断
return; //返回
}
for(j=0;j<10;j++) //循环进行键码解析
{
if(IRCOM[2]==RecvData[j]) //进行键位对应
{
ControlCar_yaokong(j); //遥控小车
}
}
EX1 = 1; //外部中断开
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
51寻轨+红外+蓝牙.zip (30个子文件)
循迹决赛程序1.0
motor.c 1KB
car.c 3KB
决赛.plg 4KB
决赛.M51 26KB
决赛.uvopt 58KB
决赛.uvgui_Administrator.bak 137KB
决赛.uvgui.Administrator 137KB
决赛 16KB
car.OBJ 9KB
STARTUP.OBJ 749B
red.h 0B
决赛.lnp 68B
car.h 418B
决赛.LST 8KB
motor.LST 4KB
STARTUP.A51 6KB
main.__i 34B
car.LST 8KB
motor.h 0B
main.LST 14KB
决赛.uvproj 13KB
motor.OBJ 3KB
决赛.OBJ 7KB
STARTUP.LST 14KB
决赛_uvopt.bak 58KB
决赛_uvproj.bak 13KB
main.OBJ 9KB
决赛.hex 3KB
red.c 2KB
main.c 6KB
共 30 条
- 1
资源评论
Delirious
- 粉丝: 3
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功