赞助论坛
  • 2767阅读
  • 0回复

带遥控测码的6路红外线开关C源码 [复制链接]

楼层直达
qxhqaz  

级别: Mod
发帖
439
精华
0
金币
677
威望
37
贡献
40
好评
13
注册
2010-02-17
楼主    qxhqaz 发表于: 2013-11-23 19:46:12 
程序是自己学写的,分享给喜欢折腾的坛友们玩玩,不足之处敬请谅解!把注释部分加上就是带6位数码管显示遥控码的测码器。
#include <AT89X51.h>
#define uchar unsigned char
#define uint unsigned int

/*unsigned char code smg_du[]={
                  0xc0,0xf9,0xa4,0xb0,0x99,0x92,
                  0x82,0xf8,0x80,0x90,0x88,0x83,
                  0xc6,0xa1,0x86,0x8e
                  };   //0--FF
unsigned char code smg_we[]={
                  0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f
                  };     */
uchar irtime;     //红外用时间全局变量
uchar startflag;   //红外接收起始标志位
uchar irdata[33];     //接收到的二进制遥控数据
uchar bitnum;       //第几位bit
uchar irok;       //遥控码接收标志位
uchar ircode[4];     //遥控码
uchar irpro_ok; //遥控码处理OK标志位,为1 :OK;为:0 no;
uchar   disp[8];
sbit beep = P2^2;
sbit led1 = P2^3;
sbit led2 = P2^4;
sbit led3 = P2^5;
sbit led4 = P2^6;
sbit led5 = P2^7;
sbit led6 = P1^7;

/*************延时函数12M晶振下大约50us**************/
void delay_50us(uint t)
  {
    uchar   j;
    for(;t>0;t--)
      for(j=19;j>0;j--);
  }

/*************延时函数12M晶振下大约50ms**************/
/**void delay_50ms(uint t)
  {
    unsigned char   j;
    for(;t>0;t--)
      for(j=6245;j>0;j--);
  } **/
void onled(void)   //等于上电开led
{
  led1 = 0;
  led2 = 0;
  led3 = 0;
  led4 = 0;
  led5 = 0;
  led6 = 0;
}
void on_offled(void)   //全部开或关led
{
  led1 = ~led1;
  led2 = ~led2;
  led3 = ~led3;
  led4 = ~led4;
  led5 = ~led5;
  led6 = ~led6;
}
void offled(void)   //全部关led
{
  led1 = 1;
  led2 = 1;
  led3 = 1;
  led4 = 1;
  led5 = 1;
  led6 = 1;

}
void dingyiyaokong(void)   //指定遥控用于开关LED
{
  if(ircode[0]==0x00&&ircode[1]==0xff&&ircode[2]+ircode[3]==0xff)   //用户码为00ff的遥控
    {  
  switch(ircode[2])
    {
  case 0x01: led1 = ~led1; //中九卓异遥控"1"键开关led1      
      break;  
  case 0x02: led2 = ~led2; //中九卓异遥控"2"键开关led2      
      break;
  case 0x03: led3 = ~led3; //中九卓异遥控"3"键开关led3  
    break;
  case 0x04: led4 = ~led4; //中九卓异遥控"4"键开关led4      
      break;  
  case 0x05: led5 = ~led5; //中九卓异遥控"5"键开关led5      
      break;
  case 0x06: led6 = ~led6; //中九卓异遥控"6"键开关led6  
      break;
/*   case 0x07: led7 = ~led7; //中九卓异遥控"7"键开关led7
        break; */
  case 0x0c: on_offled();     //全开或关led          
      break;
  case 0x1c: offled();   //全关led
             
    /* default :led=0; */
      }
    }
  /*   else
        {
        led=0;
        } */
}
/************************************************/
void timer0_init(void)   //定时器0初始化
{
  TMOD=0X02;
  TH0=0X00;
  TL0=0X00;
  ET0=1;       //开中断
  EA=1;       //开总中断
  TR0=1;       //打开定时器0
}
void int0_init(void) //外中断0初始化
{
  IT0=1;     //外中断0下降延触发
  EX0=1;     //开外中断
  EA=1;     //开总中断
}
void irpros(void)   //红外码处理函数
{
  uchar k=1,i,j;
  uchar value;   //接收到的红外码值
  for(i=0;i<4;i++)
  {
  for(j=0;j<8;j++)
    {
      value=value>>1;
      if(irdata[k]>6)
      {
        value=value|0x80;//将最高位置1
      }
      k++;
    }
    ircode[i]=value;     //装载红外数据
    value=0;
  }
  irpro_ok=1;     //处理完毕标志位
}
void irwork(void)   //接收到的遥控码处理函数
  {
    disp[5]=ircode[0]/16;
    disp[4]=ircode[0]%16;
    disp[3]=ircode[1]/16;
    disp[2]=ircode[1]%16;
    disp[1]=ircode[2]/16;
    disp[0]=ircode[2]%16;
  /* disp[6]=ircode[3]/16;
    disp[7]=ircode[3]%16;   */
  }
/*void display(void)     //数码管显示函数
  {
    unsigned char i;
    for(i=0;i<8;i++)
    {
    P0=   smg_du[disp[i]];
    P1=   smg_we[i];
    delay_50us(20);//延时1ms
    }
  }   */
void mingjiao(void)   //蜂鸣器鸣叫函数
  {
    uint j=10000;
    beep=0;
    while(j--);
    beep=1;
  }
/*****************主函数***********************************/
void main(void)     //主函数
{    
  timer0_init();     //定时器0初始化
  int0_init();       //外中断0初始化
  onled();         //上电全开LED等待遥控开关指令
  while(1)
  {
  if(irok)   //判断数据接收是否OK?
  {
    irpros();   //OK调用数据处理函数
    irok=0;
  }
  if(irpro_ok)   //判断数据处理是否OK?
  {
  irwork();     //OK调用遥控码处理函数
  dingyiyaokong(); //调用自定义遥控函数
  irpro_ok=0;
  }
/*   display();     //调用数码管显示函数     */
  }

}
/*****************定时器0中断函数***********************/
void timer0_() interrupt 1
  {
    irtime++;   //最大加到255
  }
/**********************外中断0服务函数*******************/
void int0_() interrupt 0
{
   
  if(startflag)     //判断红外信号接收是否为第一位?
  {
  //if(irtime>32)     //检测引导码
  if(irtime<63&&irtime>=33)   //检测引导码,TC9012的头码
  {
    bitnum=0;
  }
    irdata[bitnum]=irtime;     //装载红外接收的信号
    irtime=0;
    bitnum++;
    if(bitnum==33)     //判断红外信号是否是32位?
    {
    bitnum=0;
    irok=1;         //信号接收完毕标志OK
    mingjiao();  
    }
  }
  else
  {
    irtime=0;
    startflag=1;
  }
  }