我是一个初学者,对于单片机的程序很迷糊,我想用红外遥控来控制一个机器人,板子是Arduino 2009 MEGA168,晶振16M,可是卖家给我的程序只有51单片机的,上面很多库函数
在Arduino的编译环境是没有的,下面是红外遥控的解码程序,烦请各位大神帮忙改成能在Arduino中运行的程序,主要就是里面有一些中断还有延时的函数不懂,程序并不复杂,希望各位指点迷津,帮忙改一下程序,感激不尽
//红外遥控器解码程序
//MCU:STC89C52
//系统晶振:12MHz
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit Speaker = P3^6;//蜂鸣器引脚定义
sbit IRIN = P3^3;//红外接收头引脚定义
uchar IRCOM[4];
//功能:延时1毫秒
//入口参数:x
//出口参数:无
//说明:晶振为12M
void Delay_xms(uint x)
{
uint i,j;
for(i=0;i
for(j=0;j<112;j++);
}
//x*0.14MS
void delay(uchar x)
{
uchar i;
while(x--)
{
for (i = 0; i<12; i++)
{
_nop_();
}
}
}
//功能:1us延时
void Delay_xus(uint t)
{
for(;t>0;t--)
{
_nop_();
}
}
//功能:打开蜂鸣器
//说明:当P36为低电平时,三极管导通,电流流过蜂鸣器使其发声
void Buzzer_on(void)
{
Speaker=0;
}
//功能:关闭蜂鸣器
//说明:当P36为高电平时,三极管关断,没有电流流过蜂鸣器,不发声
void Buzzer_off(void)
{
Speaker=1;
}
//功能:蜂鸣器鸣叫1次
void buz(void)
{
Buzzer_on();
Delay_xus(400);//本开发板所用蜂鸣器最佳工作频率2.5KHz
Buzzer_off();
Delay_xus(400);
}
//红外解码函数
void IR_IN() interrupt 2 using 0
{
uchar j,k,N=0;
EX1 = 0;
delay(15);
if (IRIN==1)
{ EX1 =1;
return;
}
//确认IR信号出现
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{delay(1);}
for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
{delay(1);}
while (!IRIN) //等 IR 变为高电平
{delay(1);}
while (IRIN) //计算IR高电平时长
{
delay(1);
N++;
if (N>=30)
{ EX1=1;
return;} //0.14ms计数过长自动离开。
} //高电平计数完毕
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补'0'
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;
}
void main(void)
{
Delay_xms(50); //等待系统稳定
EA=0; //关总中断
IT1=1; //INT1下降沿中断
EX1=1; //开INT1中断
EA=1; //开总中断
IRIN=1; //INT1引脚置高
while(1)
{
if(IRCOM[2]==0x01)//"MENU"键
{
buz();//蜂鸣器鸣叫
}
else if(IRCOM[2]==0x00)//关机键
{
Buzzer_off();//蜂鸣器停止鸣叫
}
}
}
分析每一函数,
块与块再联系就简单了。
动手创造个性自我
https://home.eeworld.com.cn/?95709