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

📄 main.lst

📁 这是我在学习红外遥控接收时写的代码
💻 LST
字号:
C51 COMPILER V7.00  MAIN                                                                   08/21/2006 21:45:37 PAGE 1   


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

stmt level    source

   1          /*可在Keil C51 6.0 以上版本中编译晶振采用11.0592Mc 工作在每个机器周期6 时钟的快速状态*/
   2          
   3          
   4          #include <REG768.H> /*Philips 87LPC768 寄存器定义头文件*/
   5          
   6          
   7          #include "version.h"
   8          #include "misc.h"
   9          #include "ir.h"
  10          #include "func.h"
  11          
  12          unsigned char data Timer;
  13          unsigned int tick=0;
  14          
  15          unsigned char control_status;
  16          enum {
  17                  CTRL_IDLE=0,
  18                  
  19                  CTRL_A0,
  20                  CTRL_A1,
  21                  CTRL_A2,
  22                  CTRL_A3,
  23                  CTRL_A4,
  24          
  25                  CTRL_B0,
  26                  CTRL_B1,
  27                  CTRL_B2,
  28                  CTRL_B3,
  29                  CTRL_B4,
  30                  CTRL_B5
  31          };
  32          
  33          void Count0(void) interrupt 1 using 3
  34          { /*定时器T00 中断,最大定时37ms*/
  35   1              if(Timer!=0)
  36   1              { /*检测定时器T00 的扩展高位*/
  37   2                      Timer--;
  38   2                      return;
  39   2              }       
  40   1              tick++;
  41   1              Timer=(int)18.432;
  42   1      }
  43          
  44          unsigned int get_tick()
  45          {
  46   1              return tick;
  47   1      }
  48          
  49          unsigned int timer_diff(unsigned int t1, unsigned int t2)
  50          {
  51   1              unsigned long diff;
  52   1              if(t1>=t2) diff=t1-t2;
  53   1              else diff=t1+65536-t2;
  54   1      
  55   1              return (unsigned int)diff;
C51 COMPILER V7.00  MAIN                                                                   08/21/2006 21:45:37 PAGE 2   

  56   1      }
  57          
  58          unsigned char control()
  59          {
  60   1              static unsigned int tick0;
  61   1              switch(control_status)
  62   1              {
  63   2                      case CTRL_IDLE: 
  64   2                          //处于空闲状态,如果有人靠近, 进入控制阶段
  65   2                              if(SOMEBODY_COMMING==ir_read())
  66   2                              {
  67   3                                      control_status = CTRL_A0;
  68   3                              }
  69   2                              break;
  70   2                      case CTRL_A0:
  71   2                              //启动15w电机,启动18v电压
  72   2                              start_15w_motor(); 
  73   2                              start_18v_vol(); 
  74   2                              tick0=get_tick();
  75   2                              control_status = CTRL_A1;
  76   2                              break;
  77   2                      case CTRL_A1:
  78   2                              //1秒后,启动36v电压
  79   2                              if(timer_diff(get_tick(), tick0)>100)
  80   2                              {  
  81   3                                      start_36v_vol(); 
  82   3                                      tick0=get_tick();
  83   3                                      control_status = CTRL_A2;
  84   3                              }
  85   2                              break;
  86   2                      case CTRL_A2:
  87   2                              //再过1秒后,关闭15w电机
  88   2                              if(timer_diff(get_tick(), tick0)>100)
  89   2                              {
  90   3                                      stop_15w_motor();
  91   3                                      tick0=get_tick();
  92   3                                      control_status = CTRL_A3;
  93   3                              }
  94   2                              break;
  95   2                       case CTRL_A3:
  96   2                              /*开始使用,在此过程中,如果人离开,则关闭36v和18v电压
  97   2                                      否则再过59秒,关闭36v电机                       */
  98   2                              if(SOMEBODY_LEAVING==ir_read())
  99   2                              {
 100   3                                      stop_36v_vol();
 101   3                                      stop_18v_vol();
 102   3                                      control_status = CTRL_B0;
 103   3                              }
 104   2                              else if(timer_diff(get_tick(), tick0)>5900)
 105   2                              {
 106   3                                      stop_36v_vol();
 107   3                                      control_status = CTRL_A4;
 108   3                              }
 109   2                              break;
 110   2                      case CTRL_A4:
 111   2                              /*继续使用,在此过程中,如果人离开,则关闭18v电压               */
 112   2                              if(SOMEBODY_LEAVING==ir_read())
 113   2                              {
 114   3                                      stop_18v_vol();
 115   3                                      control_status = CTRL_B0;
 116   3                              }
 117   2                              break;
C51 COMPILER V7.00  MAIN                                                                   08/21/2006 21:45:37 PAGE 3   

 118   2                      case CTRL_B0:
 119   2                              /*人离开,启动电磁力, 启动15w电机, 启动7。5 A电机
 120   2                              */
 121   2                              start_em_power();
 122   2                              start_15v_vol();
 123   2                              start_75A_motor();
 124   2                              tick0=get_tick();
 125   2                              control_status = CTRL_B1;
 126   2                              break;
 127   2                      case CTRL_B1:
 128   2                              //1秒后,关闭电磁力
 129   2                              if(timer_diff(get_tick(), tick0)>100)
 130   2                              {
 131   3                                      stop_em_power();
 132   3                                      tick0 = get_tick();
 133   3                                      control_status = CTRL_B2;
 134   3                              }
 135   2                              break;
 136   2                      case CTRL_B2:
 137   2                          //再过1秒后,关闭15w电机
 138   2                              if(timer_diff(get_tick(), tick0)>100)
 139   2                              {
 140   3                                      stop_15v_vol();
 141   3                                      tick0 = get_tick();
 142   3                                      control_status = CTRL_B3;
 143   3                              }
 144   2                              break;
 145   2                  case CTRL_B3:
 146   2                          //启动10w负荷,
 147   2                              if(SOMEBODY_COMMING==ir_read())
 148   2                              {
 149   3                                      stop_75A_motor();
 150   3                                      control_status = CTRL_A0;
 151   3                              }
 152   2                              else
 153   2                              {
 154   3                                      start_10w_load();
 155   3                                      control_status = CTRL_B4;
 156   3                                      tick0 = get_tick();
 157   3                              }
 158   2                              break;
 159   2                      case CTRL_B4:
 160   2                      // 关闭7。5A电机
 161   2                              if(SOMEBODY_COMMING==ir_read())
 162   2                              {
 163   3                                      stop_10w_load();
 164   3                                      stop_75A_motor();
 165   3                                      control_status = CTRL_A0;
 166   3                              }
 167   2                              else if(timer_diff(get_tick(), tick0)>2800)
 168   2                              {
 169   3                                      stop_75A_motor();
 170   3                                      control_status = CTRL_B5;
 171   3                              }
 172   2                              break;
 173   2                  case CTRL_B5:
 174   2                      //关闭10w负荷。
 175   2                              if(SOMEBODY_COMMING==ir_read())
 176   2                              {
 177   3                                      stop_10w_load();
 178   3                                      control_status = CTRL_A0;
 179   3                              }
C51 COMPILER V7.00  MAIN                                                                   08/21/2006 21:45:37 PAGE 4   

 180   2                              else if(timer_diff(get_tick(), tick0)>57000)
 181   2                              {
 182   3                                      stop_10w_load();
 183   3                                      control_status = CTRL_IDLE;
 184   3                              }
 185   2                              break;
 186   2                      }
 187   1                      return control_status;
 188   1      }
 189          void main()
 190          {
 191   1              IEN0=0x14; /*只打开INT1 中断*/
 192   1      
 193   1              WDRST=0x1E; /*看门狗清0*/
 194   1              WDRST=0xE1;
 195   1              WDCON=0x12; /*40-90ms 看门狗(>最大延时37ms)*/
 196   1      
 197   1              TCON=0x40; /*定时器1 开始工作, INT1 低电平触发*/
 198   1              TMOD=0x23; /*定时器0 扩展成两个8 位定时器T00 和T01 用于同步控制*/
 199   1              
 200   1              if((WDCON&0x30)!=0x30)
 201   1              { 
 202   2                      ir_init();
 203   2                      init_port();
 204   2                      init_serial();
 205   2                      control_status=0;
 206   2              }
 207   1      
 208   1              while(1)
 209   1              { /*消息循环*/
 210   2                      WDRST=0x1E; /*看门狗清0*/
 211   2                      WDRST=0xE1;
 212   2      
 213   2                      control();              
 214   2              }
 215   1      }


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