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

📄 main.lst

📁 红外线解码显示程序红外M50560解码
💻 LST
字号:
C51 COMPILER V8.02   MAIN                                                                  10/18/2008 10:20:40 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN Main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Main.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*----------------------------------------
   2          
   3          红外遥控解码
   4          (M50560电视遥控器)
   5          
   6          Copyright 2005/9/13
   7          All rights reserved.            
   8                          
   9                  明浩 E-mail: pnzwzw@163.com   pnzwzw@cdle.net
  10          
  11          一体化接收头输出端拉P3.2(int0),P1为控制输出端。
  12          可以扩展到32路或更多
  13          输出为低电平有效
  14          ----------------------------------------*/
  15          
  16          #include <AT89x051.h>
  17          
  18          void InitCom(void);
  19          void ComOutChar(unsigned char OutData);
  20          void DelayA(void);
  21          void DelayB(void);
  22          
  23          void main(void)
  24          {
  25   1              unsigned int TempCyc;
  26   1      
  27   1              InitCom(); //初始化串口
  28   1              EA = 1; //允许CPU中断
  29   1              IT0 = 1; //INT0下降沿有效
  30   1              EX0 = 1; //开INT0中断;
  31   1              ComOutChar(1);
  32   1              ComOutChar(5);
  33   1              ComOutChar(3);
  34   1              do
  35   1                      {       
  36   2                              for (TempCyc=0; TempCyc<35000; TempCyc++)
  37   2                                      P3_7 = 0;
  38   2                              for (TempCyc=0; TempCyc<30000; TempCyc++)
  39   2                                      P3_7 = 1;               //工作指示LED
  40   2                      }
  41   1              while(1);
  42   1      }
  43          
  44          //INT0中断
  45          void INT0Fun(void) interrupt 0 using 2
  46          {
  47   1              unsigned char IRCode[2], IROK;
  48   1              unsigned int TempCyc, TempCycB, TempCycA;
  49   1              EX0 = 0; //外部中断0关闭
  50   1              IROK = 0;
  51   1              DelayA(); //延时等待引导码的前半部结束
  52   1              DelayA();
  53   1              if (!P3_2)  //检验前半部是否过早结束,防干扰
  54   1                      {
  55   2                              for (TempCycA=0; TempCycA<2; TempCycA++)
C51 COMPILER V8.02   MAIN                                                                  10/18/2008 10:20:40 PAGE 2   

  56   2                                      {
  57   3                                              DelayA();
  58   3                                              if (P3_2)  //检验前半部是否过早结束,防干扰
  59   3                                                      {
  60   4                                                              for (TempCyc=0; TempCyc<300; TempCyc++)
  61   4                                                                      if (!P3_2) break; //等待第一个位,
  62   4                                                              if (TempCyc<300) //超时检验
  63   4                                                                      {
  64   5                                                                              for (TempCyc=0; TempCyc<8; TempCyc++)
  65   5                                                                                      {
  66   6                                                                                              while(!P3_2); //等待P3_2拉高,开始位的下部分
  67   6                                                                                              DelayB(); //这里没设超时,实际应用在多功能的设计时应设超时
  68   6                                                                                              IRCode[TempCycA] = IRCode[TempCycA]>>1;
  69   6                                                                                              if (P3_2) //当延时750us后P3_2仍为高则当前位为1
  70   6                                                                                                      {
  71   7                                                                                                              IRCode[TempCycA] = IRCode[TempCycA] | 0x80;
  72   7                                                                                                              for (TempCycB=0; TempCycB<100; TempCycB++)
  73   7                                                                                                                      if (!P3_2) break; //等待下个位 当位1时高电平为1.5ms,
  74   7                                                                                                              if (TempCycB>99) //之前已延时了750us, 所以超时应大于1.5ms-750us
  75   7                                                                                                                      goto endchk; //这里最大为1ms
  76   7                                                                                                      }
  77   6                                                                                      }
  78   5                                                                      }
  79   4                                                              else
  80   4                                                                      goto endchk;  //超时
  81   4                                                      }
  82   3                                              else
  83   3                                                      goto endchk;
  84   3                                              IROK++; //当自定码和数据码都完成时为2
  85   3                                      }
  86   2                      }
  87   1      endchk:
  88   1              if (IROK==2)
  89   1                      {
  90   2                              ComOutChar(IRCode[0]);
  91   2                              ComOutChar(IRCode[1]); //连接PC串口查看自定义码和数据码
  92   2                              if (IRCode[1]==0x10) //1号键  //只演示点亮2只LED,读者可以自行扩展控制别的器件
  93   2                                      P1_7 = ~P1_7;
  94   2                              if (IRCode[1]==0x11) //2号键
  95   2                                      P1_6 = ~P1_6;
  96   2                              for (TempCyc=0; TempCyc<300; TempCyc++)
  97   2                                      DelayA(); //延时
  98   2                      }
  99   1              EX0 = 1;
 100   1      }
 101          
 102          //向串口输出一个字符(非中断方式)
 103          void ComOutChar(unsigned char OutData)
 104          {
 105   1              SBUF = OutData; //输出字符
 106   1              while(!TI); //空语句判断字符是否发完
 107   1              TI = 0; //清TI
 108   1      }
 109          
 110          //串口初始化 晶振为12M 方式1 波特率4800
 111          void InitCom(void)
 112          {
 113   1              SCON = 0x50; //串口方式1,允许接收
 114   1              TMOD = 0x21; //定时器1定时方式2,定时0为模式1,16位模式
 115   1              TCON = 0x40; //设定时器1开始计数
 116   1              TH1 = 0xF3;     //设波特率为4800
 117   1              TL1 = 0xF3;
C51 COMPILER V8.02   MAIN                                                                  10/18/2008 10:20:40 PAGE 3   

 118   1              PCON = 0x80; //波特率加倍控制,SMOD位
 119   1              RI = 0; //清收发标志
 120   1              TI = 0;
 121   1              TR1 = 1; //启动定时器
 122   1      }
 123          
 124          void  DelayA(void)
 125          {
 126   1              unsigned int TempCyc;
 127   1              for (TempCyc=0; TempCyc<650; TempCyc++); //3.5
 128   1      }
 129          
 130          void DelayB(void)
 131          {
 132   1              unsigned int TempCyc;
 133   1              for (TempCyc=0; TempCyc<93; TempCyc++); //      0.75ms
 134   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    388    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----       7
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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