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

📄 7.1.3.lst

📁 《单片机C语言编程与实例》的代码
💻 LST
字号:
C51 COMPILER V6.20c  7_1_3                                                                 09/02/2001 14:55:17 PAGE 1   


C51 COMPILER V6.20c, COMPILATION OF MODULE 7_1_3
OBJECT MODULE PLACED IN 7.1.3.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 7.1.3.c DEBUG OBJECTEXTEND

stmt level    source

   1          #include <REG768.H> 			/*Philips 87LPC768 寄存器定义头文件*/
   2          #define REDINT 0x06 			/*红外线间隔*/
   3          
   4          /*存放消息标志的可位寻址字节Message,Message=NULL时无任消息*/
   5          unsigned char bdata Message;
   6          
   7          /*在接收过程中置位,检测标置位Get可以有效防止其它进程干扰接收,防止数据丢失*/
   8          sbit RedMsg=Message^0; 			/*红外遥控消息*/
   9          sbit RedRead=Message^1; 			/*位接收过程标志*/
  10          sbit RedBit =Message^2; 			/*接收到的位值*/
  11          sbit RSend =Message^3; 			/*红外接收中重新发送标志*/
  12          
  13          /*存放遥控的字数据,低4位存放接收到的bit的位移,高12位从低到高存放接收到的bit*/
  14          unsigned char bdata RedDataL,RedDataH;
  15          
  16          /*RedDataH字节低6位代表指令,只有一个1,C1~C3是用户码,H表示连续,S1、S2分别表示第
  17          一、二组单发*/
  18          sbit RedData0=RedDataL^4; 		/*C1*/
  19          sbit RedData1=RedDataL^5; 		/*C2*/
  20          sbit RedData2=RedDataL^6; 		/*C3*/
  21          sbit RedData3=RedDataL^7; 		/*H*/
  22          sbit RedData11=RedDataH^0; 		/*D6*/
  23          sbit RedData10=RedDataH^1; 		/*D5*/
  24          sbit RedData9=RedDataH^2; 		/*D4*/
  25          sbit RedData8=RedDataH^3; 		/*D3*/
  26          sbit RedData7=RedDataH^4; 		/*D2*/
  27          sbit RedData6=RedDataH^5; 		/*D1*/
  28          sbit RedData5=RedDataH^6; 		/*S2*/
  29          sbit RedData4=RedDataH^7; 		/*S1*/
  30          unsigned char bdata State; 			/*状态字节*/
  31          sbit RedControl=State^6; 			/*遥控状态*/
  32          
  33          /*定时器T00 的高位定时参数为Timer,定时256*Timer+(80--336)个周期,共139Timer+(43~
  34          182)us<37ms。定时器T01的高位定时节参数为nTimer,定时256*nTimer+(24~280)个周期,
  35          139nTimer+(13~152)us<9.1s。RedCon存放红外接收时的载波计数*/
  36          unsigned char data RedCon,Timer;
  37          unsigned int nTimer; 				/*定时整型参数*/
  38          
  39          void main()
  40          {
  41   1      IEN0=0x14; 					/*只打开INT1中断*/
  42   1      WDRST=0x1E; 				/*看门狗清0*/
  43   1      WDRST=0xE1;
  44   1      WDCON=0x12; 				/*40-90ms看门狗(>最大延时37ms)*/
  45   1      TCON=0x40; 					/*定时器1开始工作, INT1低电平触发*/
  46   1      TMOD=0x23; 				/*定时器0扩展成两个8位定时器T00和T01用于同步控制*/
  47   1      if((WDCON&0x30)!=0x30) 		/*看门狗陷阱复位时无需初始化*/
  48   1      {
  49   2      Message=0; 			    	/*无消息*/
  50   2      State=0; 					/*正常复位无任何状态*/
  51   2      }
  52   1      while(1) 					/*消息循环*/
  53   1      {
  54   2      WDRST=0x1E; 				/*看门狗清0*/
  55   2      WDRST=0xE1;
C51 COMPILER V6.20c  7_1_3                                                                 09/02/2001 14:55:17 PAGE 2   

  56   2      EX1= RedControl; 			/*设置遥控中断INT1 */
  57   2      if(RedMsg) 				/*执行遥控指令*/
  58   2      {
  59   3      EX1=0; 					/*在指令没有处理完之前不能重复中断*/
  60   3      switch(RedDataH) 			/*这里加入红外指令的控制过程*/
  61   3      {
  62   4      case 0x82: 				/*Channel 1*/
  63   4      break;
  64   4      case 0xA0: 				/*Channel 2*/
  65   4      break;
  66   4            }
  67   3      EX1=1;
  68   3      RedDataL=0; 				/*复位红外数据*/
  69   3      RedDataH=0; 				/*复位红外数据*/
  70   3      RedMsg=0; 				/*复位红外遥控消息*/
  71   3      }
  72   2      }
  73   1      }
  74          
  75          void Count0(void) interrupt 1 using 3  	/*定时器T00中断,最大定时37ms*/
  76          {
  77   1      if(Timer!=0) 					/*检测定时器T00的扩展高位*/
  78   1      {
  79   2      Timer--;
  80   2      return;
  81   2      }
  82   1      }
  83          
  84          
  85          /*INT1用于红外解码状态遥控解码数据处理,nTimer=1定时152~291us*/
  86          void Inte1() interrupt 2 using 2
  87          {
  88   1      for(nTimer=8;nTimer>1;nTimer--);	/*使处理周期达到51机器周期=27.7us使得
  89   1      RedCon<32*/
  90   1      if(RedRead) 					/*0信号宽度a=420us,1信号宽度a=1260us,周期4a=1680us*/
  91   1      RedCon++;
  92   1      else						/*开始计数或者重新发送时开始计数*/
  93   1      {
  94   2      RedBit=0; 					/*复位接收位*/
  95   2      RedCon=0; 				/*复位载波计数*/
  96   2      RedRead=1; 				/*置位位接收标志*/
  97   2      if(!ET1) 					/*首次接收时没有启动定时器T01接收第一个位*/
  98   2      {
  99   3      TF1=0; 					/*复位定时器T01溢出标志*/
 100   3      ET1=1; 					/*启动T01 定时*/
 101   3      RedDataL=0; 				/*复位红外数据*/
 102   3      RedDataH=0; 				/*复位红外数据*/
 103   3      RSend=0; 				/*复位重新发送标志*/
 104   3      }
 105   2      }
 106   1      }
 107          
 108          void Count1(void) interrupt 3 using 3	/*定时器T01中断,最大定时9.1s*/
 109          {
 110   1      if(nTimer!=0) 				/*检测定时器T01 的扩展高位*/
 111   1      {
 112   2      nTimer--;
 113   2      return;
 114   2      }
 115   1      ET1=0; 						/*关闭T01 定时*/
 116   1      if(RedRead) 					/*红外接收状态*/
 117   1      {
C51 COMPILER V6.20c  7_1_3                                                                 09/02/2001 14:55:17 PAGE 3   

 118   2      if((RedDataL&0xF)==12) 		/*第一阶段接收已经结束*/
 119   2      {
 120   3      RSend=1; 				/*置位重新发送标志以便校验*/
 121   3      RedDataL&=0xF0; 			/*复位位指针以便校验*/
 122   3      }
 123   2      if(RedCon>27-REDINT&&RedCon<27+REDINT) 
 124   2      RedBit=1;
 125   2      else						/*低电平计数9 表示0 27 表示1*/
 126   2      RedBit=0;
 127   2      if(RSend) 					/*检验重复发送的数据是否与第一次符合*/
 128   2      {
 129   3      switch(RedDataL&0xF)
 130   3      {
 131   4      case 0: 				/*检验重复发送的第1 位数据*/
 132   4      if(RedBit!=RedData0)  goto RClear;
 133   4      break;
 134   4      case 1: 				/*检验重复发送的第2 位数据*/
 135   4      if(RedBit!=RedData1)  goto RClear;
 136   4      break;
 137   4      case 2: 				/*检验重复发送的第3 位数据*/
 138   4      if(RedBit!=RedData2)  goto RClear;
 139   4      break;
 140   4      case 3: 				/*检验重复发送的第4 位数据*/
 141   4      if(RedBit!=RedData3)  goto RClear;
 142   4      break;
 143   4      case 4: 				/*检验重复发送的第5 位数据*/
 144   4      if(RedBit!=RedData4)  goto RClear;
 145   4      break;
 146   4      case 5: 				/*检验重复发送的第6 位数据*/
 147   4      if(RedBit!=RedData5) goto RClear;
 148   4      break;
 149   4      case 6: 				/*检验重复发送的第7 位数据*/
 150   4      if(RedBit!=RedData6) goto RClear;
 151   4      break;
 152   4      case 7: 				/*检验重复发送的第8 位数据*/
 153   4      if(RedBit!=RedData7)  goto RClear;
 154   4      break;
 155   4      case 8: 				/*检验重复发送的第9 位数据*/
 156   4      if(RedBit!=RedData8)  goto RClear;
 157   4      break;
 158   4      case 9: 				/*检验重复发送的第10 位数据*/
 159   4      if(RedBit!=RedData9)  goto RClear;
 160   4      break;
 161   4      case 10: 				/*检验重复发送的第11 位数据*/
 162   4      if(RedBit!=RedData10) goto RClear;
 163   4      break;
 164   4      case 11: 				/*检验重复发送的第12 位数据*/
 165   4      if(RedBit!=RedData11)  goto RClear;
 166   4      RedMsg=1; 				/*接受到经过检验正确的编码后置位遥控消息*/
 167   4      RedBit=0; 				/*复位接收位*/
 168   4      RSend=0; 				/*复位重新发送标志*/
 169   4      RedRead=0; 			/*复位接收过程标志*/
 170   4      RedCon=0; 				/*复位载波计数*/
 171   4      return;
 172   4      default: 				/*重复发送的数据多于12 位时判断为错误*/
 173   4      goto RClear;
 174   4      }
 175   3      }
 176   2      else
 177   2      {
 178   3      switch(RedDataL&0xF)
 179   3      {
C51 COMPILER V6.20c  7_1_3                                                                 09/02/2001 14:55:17 PAGE 4   

 180   4      case 0: 				/*保存首次发送的第1 位数据*/
 181   4      RedData0=RedBit;
 182   4      break;
 183   4      case 1: 				/*保存首次发送的第2 位数据*/
 184   4      RedData1=RedBit;
 185   4      break;
 186   4      case 2: 				/*保存首次发送的第3 位数据*/
 187   4      RedData2=RedBit;
 188   4      break;
 189   4      case 3: 				/*保存首次发送的第4 位数据*/
 190   4      RedData3=RedBit;
 191   4      break;
 192   4      case 4: 				/*保存首次发送的第5 位数据*/
 193   4      RedData4=RedBit;
 194   4      break;
 195   4      case 5: 				/*保存首次发送的第6 位数据*/
 196   4      RedData5=RedBit;
 197   4      break;
 198   4      case 6: 				/*保存首次发送的第7 位数据*/
 199   4      RedData6=RedBit;
 200   4      break;
 201   4      case 7: 				/*保存首次发送的第8 位数据*/
 202   4      RedData7=RedBit;
 203   4      break;
 204   4      case 8: 				/*保存首次发送的第9 位数据*/
 205   4      RedData8=RedBit;
 206   4      break;
 207   4      case 9: 				/*保存首次发送的第10 位数据*/
 208   4      RedData9=RedBit;
 209   4      break;
 210   4      case 10: 				/*保存首次发送的第11 位数据*/
 211   4      RedData10=RedBit;
 212   4      break;
 213   4      case 11: 				/*保存首次发送的第12 位数据*/
 214   4      RedData11=RedBit;
 215   4      break;
 216   4      default: 				/*首次发送的数据多于12 位时判断为错误*/
 217   4      goto RClear;
 218   4      }
 219   3      }
 220   2      RedDataL++; 				/*位位移加1*/
 221   2      RedBit=0; 					/*复位接收位*/
 222   2      RedRead=0; 				/*复位接收过程标志*/
 223   2      RedCon=0; 				/*复位载波计数*/
 224   2      nTimer=423; 				/*用定时140a 检测同步信号208a*/
 225   2      TF1=0; 					/*复位定时器T01 益出标志*/
 226   2      ET1=1; 					/*启动定时器*/
 227   2      }
 228   1      else if(RSend) 				/*在位接收没有结束时发生定时中断需要复位接收信息(同步)*/
 229   1      {
 230   2      RClear:
 231   2      RedDataL=0; 				/*复位红外数据*/
 232   2      RedDataH=0; 				/*复位红外数据*/
 233   2      RedBit=0; 				/*复位接收位*/
 234   2      RedRead=0; 				/*复位接收过程标志*/
 235   2      RSend=0; 				/*复位重新发送标志*/
 236   2      RedCon=0; 				/*复位载波计数*/
 237   2      ET1=0; 					/*关闭T01 定时*/
 238   2      }
 239   1      }


C51 COMPILER V6.20c  7_1_3                                                                 09/02/2001 14:55:17 PAGE 5   

MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    607    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      8    ----
   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 + -