[求助] 把51单片机红外遥控的程序改成能在Arduino编译环境中运行的程序

34747124   2011-7-16 22:05 楼主
我是一个初学者,对于单片机的程序很迷糊,我想用红外遥控来控制一个机器人,板子是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();//蜂鸣器停止鸣叫
   }
}
}

回复评论 (2)

wozenm 我怎么看不懂 看来落伍了
点赞  2011-7-17 14:19
分析每一函数,
块与块再联系就简单了。
动手创造个性自我 https://home.eeworld.com.cn/?95709
点赞  2011-7-18 11:45
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复