lxqlzj 发表于 2012-2-3 14:44:54

(LED学习板)实验31-红外遥控解码 数码管显示键值

//============================================================================
//======翼芯科技 红外遥控解码 数码管显示键值==指拨开关SW2的1位拨向下==========
//============================================================================   
//此源码版权属 翼芯科技 全权享有,如欲引用,敬请署名并告知
//          严禁随意用于商业目的,违者必究,后果自负
//          公司网站 http://www.mcu-led.com
//          公司论坛 http://www.cpu-led.com
//          淘宝店:http://cpu-led.taobao.com/和http://mcu-led.taobao.com/
//          产品咨询 QQ :1322130074   电话:13715619122
//程序说明:本程序用于实现红外遥控解码 数码管显示键值.IC插到U9位置.指拨开关SW2的1位拨向下.      
//文件名称:main.C
//日期:    2011/01/23   
//版本:    1.0
//C编译器:keil 8.05
//=============================================================================                  
#include <STC12C5AXX.H>
#define uchar unsigned char
#define uint unsigned int
#define BIT_32   32

sbitLED1 = P0^0;
sbitLED2 = P0^1;
sbitLED3 = P0^2;
sbitLED4 = P0^3;


sbitIRIN = P3^7;


sbit   CLK= P2^3;                           //74HC595时钟输出
sbit   DAT= P2^1;                                 //74HC594数据输出
sbit   RCLK = P2^2;                                 //数据锁存
sbit   EN   = P2^7;                //74HC595使能口


bit SYNOK,ADDROK,FLAGERR,LOK,FLAG_1MS;
unsigned long int   BYTE1;


ucharLCOUNT,HCOUNT,HLCOUNT,BITCOUNT,CODE_NUM;
uchar T_CNT3;
uchar T_CNT4;
uchar DIS_CNT1,DIS_CNT2;

uchar code DSY_CODE[]=                           //数据管共阴的显示值0-F
{
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71      
};


/******************************************************************
- 功能描述:74HC595输出函数
- 隶属模块:无
- 函数属性:无
- 参数说明:无         
- 返回说明:无
- 注:.....
******************************************************************/
void sendbyte(uchar BYTE)
{   
   uchar num,i;                            //定义局部变量
   num=BYTE;      
   for(i=0;i<8;i++)                   //移8次
      {
         CLK=0;                                 //CLK置1
         DAT=num&0x80;                   //数据左移
         num=num<<1;      
         CLK=1;
         }
      RCLK=0;                                 //数据锁存
      RCLK=1;
         
}


/******************************************************************
- 功能描述:定时器0中断
- 隶属模块:无
- 函数属性:无
- 参数说明:无         
- 返回说明:无
- 注:.....
******************************************************************/

void TIME0_INT() interrupt 1
{
      TH0= (65535-200)/256;
      TL0= (65535-200)%256;


      sendbyte(0xFF);
      if(FLAG_1MS)
          {
            P0=(DSY_CODE);
            sendbyte(0XFD);
                FLAG_1MS=0;
          }
   else
          {         
            P0=(DSY_CODE);
            sendbyte(0xFE);
                FLAG_1MS=1;
          }

//=====================检测高电平====================================================
      if(IRIN==0)
      {
         LCOUNT++;                                                //高电平计数器++
         if(LOK==1)                                    //第一个高电平
             {
            LOK=0;
            if(SYNOK==1)                            //同步码   Ok
                {   
               HLCOUNT=LCOUNT+HCOUNT;                  //检测高低计数值判定
               if((3<HLCOUNT)&&(HLCOUNT<40));   //高低电平小于2560,大于1152,ok;   18
               else
                                        {            
                                        FLAGERR=1;                        //错误退出
                  return;   
                  }                                                               
               if(12<HCOUNT)
                  BYTE1=(BYTE1>>1)|0x80000000;            //为1
               else
                  BYTE1=(BYTE1>>1)|0x00000000;            //为0
               LCOUNT=0;                                 
               HCOUNT=0;
                                 BITCOUNT--;                                    
               if(BITCOUNT==0)                           //解出了一次码
                   {
                  SYNOK=0;                                    //同步清零
                                    BITCOUNT=BIT_32;                  //码的位数
                                    ADDROK=1;                   //解码成功标识
                   }            
               }   
             else
               {
                if((10<HCOUNT)&(HCOUNT<60))    //低电平大于6.4ms,小于12.8ms,同步码电平ok; 80-100,OK   
               {
                   SYNOK=1;
                   LCOUNT=0;
                   HCOUNT=0;                        
               }
               else
               {
                   FLAGERR=1;
               }
            }
         }//end LOK
       }//END IRIN==0;
    else                                                   //检测高电平的宽度==低电平计数
   {                                             
       HCOUNT++;
       if(LOK==1)
          return;
         if(SYNOK)
             {
             if((1<LCOUNT)&(LCOUNT<25))               //低电平大于256us,小于2048,高电平ok;      
         {
            LOK=1;                     
         }
               else
                   {
                  FLAGERR=1;
                   }
                  }
                else
                   {
         if((60<LCOUNT)&(LCOUNT<120))         //低电平大于6MS,小于9MS,      同步低电平ok;         
            {
                         LOK=1;                     
            }
                   else
                        {
                         FLAGERR=1;
                        }
                   }   //END ELSE
               } //EDN ELSE                        
}
/******************************************************************
- 功能描述:主函数
- 隶属模块:无
- 函数属性:无
- 参数说明:无      
- 返回说明:无
- 注:.....
******************************************************************/
voidmain()
    {
             TMOD = 0x01;                         //定时器0工作在16位的定时模式.
            TH0= (65535-200)/256;   //定时器0高位设定
            TL0= (65535-200)%256;   //定时器0低位设定
            IE   = 0x82;                        //开总中断和定时器0中断
      TR0= 1;                                  //开定时器0

//M1:M00:0为标准51;0:1输出;1:0输入;1:1开漏输出
       P0M1=0X00;                              //P0口设为推挽输出
       P0M0=0XFF;



         P3M1=0X80;                                           //P3.7为输入
         P3M0=0X00;

         EN=0;
       P0=0;

      while(1)
          {
            if(FLAGERR==1)       //解码失败,初始化参数         
                     {
                     LCOUNT=0;
                     HCOUNT=0;
                                           LOK=0;
                     FLAGERR=0;
                                           SYNOK=0;
                     BITCOUNT=BIT_32;
                     }
            if(ADDROK==1)
               {
                ADDROK=0;
                              CODE_NUM=(BYTE1>>24);
                              DIS_CNT2=CODE_NUM&0X0F;
                              DIS_CNT1=CODE_NUM>>4;                        
               }//EDN ADDROK                                                      
          }//END WHILE
页: [1]
查看完整版本: (LED学习板)实验31-红外遥控解码 数码管显示键值