找回密码
 请用中文注册用户!

QQ登录

只需一步,快速开始

查看: 3736|回复: 0

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

[复制链接]
lxqlzj 发表于 2012-2-3 14:44:54 | 显示全部楼层 |阅读模式

注册登录后可以在线提问,行业从业者将帮助您解答!

您需要 登录 才可以下载或查看,没有账号?请用中文注册用户!

×
//============================================================================
//======翼芯科技 红外遥控解码 数码管显示键值==指拨开关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

sbit  LED1 = P0^0;
sbit  LED2 = P0^1;
sbit  LED3 = P0^2;
sbit  LED4 = P0^3;


sbit  IRIN = 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;


uchar  LCOUNT,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[DIS_CNT1]);
            sendbyte(0XFD);
                FLAG_1MS=0;
          }
     else
          {         
            P0=(DSY_CODE[DIS_CNT2]);
            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                          
}
/******************************************************************
- 功能描述:主函数
- 隶属模块:无
- 函数属性:无
- 参数说明:无      
- 返回说明:无
- 注:.....
******************************************************************/
void  main()
    {
             TMOD = 0x01;                         //定时器0工作在16位的定时模式.
            TH0  = (65535-200)/256;   //定时器0高位设定
            TL0  = (65535-200)%256;   //定时器0低位设定
            IE   = 0x82;                          //开总中断和定时器0中断
        TR0  = 1;                                  //开定时器0

  //M1:M0  0: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

本版积分规则

QQ|返回首页|有问题扫码关注公众号|LED控制卡 ( 鲁ICP备18053106号 鲁公安网备案号37170202666047 ) keywords:LED显示屏 LED控制卡 LED显示屏配件 麒麟电子

GMT+8, 2024-11-22 01:45

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表