红外遥控小车程序.doc
文本预览下载声明
程序已调试,能实现前进、后退、左前转、右前转、左后转、右后转、左圆转、右圆转等,并且有LED灯显示。
//**********************************************
//***************红外小车***********************
//**********************************************
#includereg52.h
#define uint unsigned int
#define uchar unsigned char
sbit M11=P1^0; // 电机1接口
sbit M12=P1^1;
sbit M21=P1^2; // 电机2接口
sbit M22=P1^3;
sbit LED0=P0^0; // 紧急灯
sbit LED1=P0^1; // 左前灯
sbit LED2=P0^2; // 右前灯
sbit LED3=P0^3; // 左后灯
sbit LED4=P0^4; // 左后灯
sbit F=P1^5; //蜂鸣器接口
sbit Int0 = P3^3; // 红外接收采用外部中断1
uchar TEMP1=0; //全局变量用于存放红外返回值 -用于PWM占空比的控制
uchar TEMP2=10; // 用于方向的控制
uchar databus[7];//用于红外接收存放数据
//************************************************************
//延时函数
void delay1(uint xms) //delay 0.1ms
{
uint i,j;
for(i=xms;i0;i--)
for(j=13;j0;j--);
}
//************************************************************
//********************接受解码函数
uchar Rec()
{
uchar temp=0; //函数内部临时变量用于返回函数值
uint i=0; // 用于存放数据的临时变量
uint j=0;
uint m=0; // 局部计数临时变量
uint n=0; // 局部计数临时变量
uint k=0; // 局部计数临时变量
EX1=0; // 关外部中断1 以防再次外部1中断的介入
while(!Int0) //用于计时前9Ms低电平的引导码
{
delay1(1);
m++; // 计数引导码的长度
}
if(m=60)
return 0; //
while(Int0) //用于计时4.5ms高电平的引导码
{
delay1(1);
n++; //计时高电平
}
if(n=30)
return 0;
M11=M12=M21=M22=0; //进入中断停止电机防止电机颤抖
for(i=0;i4;i++)
for(j=0;j8;j++)
{
while(!Int0) //过滤数据的低位 0.56ms低电平
{
delay1(1);
}
while(Int0) // 进入高电平计时
{
delay1(1);
k++; // k计时每次的高电平
}
databus[i]=databus[i]1; // 数据接收数组首先默认接收为0信号即databus【i】//第7位移入0
if(k=10)
{
databus[i]=databus[i]|0x80; // 若为1把第8位置1
}
k=0;
显示全部