| 
//============================================================================
×
注册登录后可以在线提问,行业从业者将帮助您解答!您需要 登录 才可以下载或查看,没有账号?请用中文注册用户! 
  //======翼芯科技 红外遥控解码 数码管显示键值==指拨开关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
 
 |