⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rs_main.lst

📁 51单片机红外线遥控器解码源代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
 181   3                                                                      break;
 182   3                              /*      通道切换,通过SHIFT + 数字键,0键表示所有*/
 183   3                              case    KEY_0:          if( Fresh_KEY_Flag )
 184   3                                                                              if( PRE_KEY == KEY_SHIFT )
 185   3                                                                                      Current_CH = 0;
 186   3                                                                      break;
 187   3                              case    KEY_1:          if( Fresh_KEY_Flag )
 188   3                                                                              if( PRE_KEY == KEY_SHIFT )
 189   3                                                                                      Current_CH = 1;
 190   3                                                                      break;
 191   3                              case    KEY_2:          if( Fresh_KEY_Flag )
 192   3                                                                              if( PRE_KEY == KEY_SHIFT )
 193   3                                                                                      Current_CH = 2;
 194   3                                                                      break;
 195   3                              case    KEY_3:          if( Fresh_KEY_Flag )
 196   3                                                                              if( PRE_KEY == KEY_SHIFT )
 197   3                                                                                      Current_CH = 3;
 198   3                                                                      break;
 199   3                              case    KEY_4:          if( Fresh_KEY_Flag )
 200   3                                                                              if( PRE_KEY == KEY_SHIFT )
 201   3                                                                                      Current_CH = 4;
 202   3                                                                      break;
 203   3                              case    KEY_ESC:        if( Fresh_KEY_Flag )
 204   3                                                                              Current_CH = 0;
 205   3                                                                      break;                                  
 206   3                                      
 207   3                      }
 208   2      
 209   2                      Fresh_KEY_Flag = 0;
 210   2                      PRE_KEY = KEY_DECODE;                           /*      前一个键值更新*/
 211   2              }
 212   1      }
 213          
 214          /********************************************************************/
 215          /*              主初始化程序                                                                                    */
 216          /*              初始化定时器,中断模式等                                                 */
 217          /********************************************************************/
 218          void            Main_Initlization( void )                       /*主初始化程序*/
 219          {
 220   1              TMOD = 0x19;                                    /*      定时器1用于PWM 定时,定时器0用于遥控信号解码*/
 221   1              TCON = 0x55;                                    /*      启动两个定时器,外部中断模式为下降沿*/
 222   1              TH1  = 0xF9;                                            /*      PWM 调节步长*/
 223   1              TL1  = 0x7D;
 224   1              TH0  = 0x00;                                            /*      定时设置,最长约80ms, 24MHz晶振*/
 225   1              TL0  = 0x00;
 226   1              IE   = 0x8F;                                            /*      开放中断:INT0-遥控解码,INT1-10ms中断,T0-遥控解码, T1-PWM 发生*/
 227   1              IP      = 0x0C;                                         /*      10ms外部中断优先级最高*/
 228   1      }
 229          
 230          
 231          /********************************************************************/
 232          /*              外部中断0服务程序( 遥控解码)                                    */
 233          /********************************************************************/
 234          /*      解码输出在RS_DECODE,标志为RS_DECODE_OK,首次按键为Fresh_KEY_Flag  */
 235          
 236          void            Interrupt_INT0( void ) interrupt 0
 237          {
 238   1              /*      搜索帧头,帧尾,数据*/
 239   1              /*      00 22数据为帧头*/
 240   1              /*      00 03为数据0,00 0C为数据1*/
 241   1              /*      01 38为帧尾*/
CX51 COMPILER x7.00  RS_MAIN                                                               05/07/2006 20:40:55 PAGE 5   

 242   1              /*      00 11, 02 F1为重复标志*/
 243   1      
 244   1              bit     Error_Flag;
 245   1      
 246   1              switch( TH0 )
 247   1              {
 248   2                      case    0x02:                                                                   /*      数据0   */
 249   2                      case    0x03:
 250   2                      case    0x04:   if( RS_High == 0 )
 251   2                                                      {
 252   3                                                              RS_CODE.FULL_KEY <<= 1;
 253   3                                                              RS_Index ++;
 254   3                                                      }
 255   2                                                      else
 256   2                                                              RS_Index = 0;
 257   2                                                      break;
 258   2                                              
 259   2                      case    0x0B:                                                                   /*      数据1   */
 260   2                      case    0x0C:
 261   2                      case    0x0D:   if( RS_High == 0 )
 262   2                                                      {
 263   3                                                              RS_CODE.FULL_KEY <<= 1;
 264   3                                                              RS_CODE.FULL_KEY ++;
 265   3                                                              RS_Index ++;
 266   3                                                      }
 267   2                                                      else
 268   2                                                              RS_Index = 0;
 269   2                                                      break;
 270   2                                                      
 271   2                      case    0x10:                                                                   /*      重复按键译码*/
 272   2                      case    0x11:
 273   2                      case    0x12:   if(( RS_High == 0 ) && ( RS_Index == 50 ))
 274   2                                                              RS_Index ++;
 275   2                                                      else
 276   2                                                              RS_Index = 0;
 277   2                                                      break;
 278   2                                              
 279   2                      case    0x21:                                                                   /*      帧头搜索*/
 280   2                      case    0x22:
 281   2                      case    0x23:   if( RS_High == 0 )
 282   2                                                              RS_Index = 1;
 283   2                                                      else
 284   2                                                              RS_Index = 0;
 285   2                                                      break;
 286   2                                              
 287   2                      case    0x37:                                                                   /*      帧尾搜索*/
 288   2                      case    0x38:
 289   2                      case    0x39:   Error_Flag = 1;
 290   2                                                      if(( RS_Index == 33 ) && ( RS_High == 1 ))
 291   2                                                              if(( RS_CODE.KEY[0] == 0x1E ) && ( RS_CODE.KEY[1] == 0xE1 ))
 292   2                                                                      if(( RS_CODE.KEY[2] ^ RS_CODE.KEY[3] ) == 0xFF )
 293   2                                                                      {
 294   3                                                                              KEY_DECODE = RS_CODE.KEY[3];
 295   3                                                                              RS_Index = 50;          /*      数据帧尾结束*/
 296   3                                                                              KEY_DECODE_OK = 1;
 297   3                                                                              Error_Flag = 0;
 298   3                                                                      }
 299   2                                                      if( Error_Flag )                
 300   2                                                              RS_Index = 0;
 301   2                                                      break;
 302   2                                              
 303   2                      case    0xF0:                                                                   /*      重复按键译码*/
CX51 COMPILER x7.00  RS_MAIN                                                               05/07/2006 20:40:55 PAGE 6   

 304   2                      case    0xF1:
 305   2                      case    0xF2:   if(( RS_High == 2 ) && ( RS_Index == 51 ))
 306   2                                                      {
 307   3                                                              RS_Index = 50;
 308   3                                                              KEY_DECODE_OK = 1;                      /*      重复按键*/
 309   3                                                      }
 310   2                                                      else
 311   2                                                              RS_Index = 0;
 312   2                                                      break;
 313   2                                                      
 314   2                      default:                        RS_Index = 0;                                   /*      误码,重新定帧*/                        
 315   2                                                      break;
 316   2              }
 317   1              
 318   1              /*      重新启动遥控器解码脉冲测量*/
 319   1              RS_High = 0;
 320   1              TH0 = 0;
 321   1              TL0 = 0;
 322   1      }
 323          
 324          
 325          /********************************************************************/
 326          /*              定时器中断0服务程序( 遥控解码)                                  */
 327          /********************************************************************/
 328          void            Interrupt_T0( void ) interrupt 1
 329          {
 330   1              RS_High++;
 331   1              if( RS_High > ( IDLE_Cnt + 2 ))                 /*      1个单位为32.768ms       */
 332   1              {
 333   2                      Fresh_KEY_Flag = 1;                             /*      首次按键标志*/
 334   2                      RS_Index = 0;
 335   2                      RS_High = IDLE_Cnt + 2;
 336   2              }
 337   1      }
 338          
 339          /********************************************************************/
 340          /*              外部中断1服务程序( 10ms脉冲输入)                                */
 341          /*              同时用于系统定时任务                                                            */
 342          /********************************************************************/
 343          void            Interrupt_INT1( void ) interrupt 2
 344          {
 345   1              /*      定时器复位,时间基准对齐*/
 346   1              TimeSlot = PWM_INIT;
 347   1              TH1 = 0xFE;
 348   1              TL1 = 0x70;
 349   1      
 350   1              /*      系统定时标志*/
 351   1              System_Timer = 1;
 352   1      }
 353          
 354          
 355          /********************************************************************/
 356          /*              定时器中断1服务程序( PWM 定时器)                                */
 357          /********************************************************************/
 358          void            Interrupt_T1( void ) interrupt 3
 359          {
 360   1      
 361   1              unsigned char   CH_Mirror;
 362   1                      
 363   1              /*      0.2ms定时器,PWM步长为0.2ms,占空比从2%起*/
 364   1              TH1 = 0xFE;
 365   1              TL1 = 0x70;
CX51 COMPILER x7.00  RS_MAIN                                                               05/07/2006 20:40:55 PAGE 7   

 366   1      
 367   1              P1 = P1_Mirror;                                                         /*输出到端口*/
 368   1      
 369   1              /*      计算各通道PWM 脉冲输出*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -