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

📄 test.lst

📁 一个51单片机温度控制器,又一个示范如何在2051这样的小内存小ROM单片机上实现实时多任务小例子.使用时间片和状态机来完成任务的调度,而不是靠任务切换机制(这样小的资源是不足以支持RTOS的)
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.04   TEST                                                                  05/10/2004 15:25:07 PAGE 1   


C51 COMPILER V7.04, COMPILATION OF MODULE TEST
OBJECT MODULE PLACED IN test.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE test.c ROM(SMALL) BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include <reg51.h>
   2          
   3          code unsigned char* ver = "00000005";
   4          
   5          sbit CS0 = P3^0;
   6          sbit CS1 = P1^6;
   7          sbit CS2 = P1^5;
   8          sbit CS3 = P3^1;
   9          sbit CS4 = P1^3;
  10          sbit CS5 = P3^7;
  11          
  12          sbit LIGHT = P3^3;
  13          sbit JX = P3^4;
  14          sbit WARM = P3^5;
  15          
  16          //#define DATA_PORT P1
  17          
  18          void out_cs_mask(bit n){
  19   1              CS0 = n;
  20   1              CS1 = n;
  21   1              CS2 = n;
  22   1              CS3 = n;
  23   1              CS4 = n;
  24   1              CS5 = n;
  25   1      }
  26          
  27          void out_cs(unsigned char cs, bit n){
  28   1              switch (cs){
  29   2                      case 0:                 CS0 = n;                        break;
  30   2                      case 1:                 CS1 = n;                        break;
  31   2                      case 2:                 CS2 = n;                        break;
  32   2                      case 3:                 CS3 = n;                        break;
  33   2                      case 4:                 CS4 = n;                        break;
  34   2                      case 5:                 CS5 = n;                        break;
  35   2              }
  36   1      }
  37          
  38          sbit CLK = P1^7;
  39          sbit DATA = P1^4;
  40          void spiout(unsigned char byte){
  41   1              unsigned char i;
  42   1              CLK = 0;
  43   1              for(i=0; i<8; i++){
  44   2                      if(byte & 1)
  45   2                              DATA = 1;
  46   2                      else
  47   2                              DATA = 0;
  48   2                      CLK = 1;
  49   2                      CLK = 0;
  50   2                      byte >>= 1;
  51   2              }
  52   1      }
  53          
  54          #define a +1
  55          #define b +2
C51 COMPILER V7.04   TEST                                                                  05/10/2004 15:25:07 PAGE 2   

  56          #define c +4
  57          #define d +8
  58          #define e +16
  59          #define f +32
  60          #define g +64
  61          //code unsigned char font[16] = "\x6f\x41\x3b\x6b" "\x4d\x76\x77\xe4" "\xf7\xf6\x00\x00" "\x00\x00\x00\x00
             -";
  62          code unsigned char font[16] = {
  63                  a b c e f g,    //0
  64                  a g,                    //1
  65                  a b d e f,              //2
  66                  b a d g f,              //3
  67                  a c d g,                //4
  68                  b c d f g,              //5
  69                  b c d e f g,    //6
  70                  a b g,                  //7
  71                  a b c d e f g,  //8
  72                  a b c d f g,    //9
  73                  a b c d e g,    //A
  74                  c d e f g,              //B
  75                  b c e f,                //C
  76                  a d e f g,              //D
  77                  b c d e f,              //E
  78                  b c d e,                //F
  79          };
  80          #undef a
  81          #undef b
  82          #undef c
  83          #undef d
  84          #undef e
  85          #undef f
  86          #undef g
  87          
  88          #define DISP_WIDTH 6
  89          unsigned char disp_buff[DISP_WIDTH];
  90          
  91          unsigned char dot_pos = DISP_WIDTH;
  92          unsigned char disp_cs = 0;
  93          bit     time_dot_on = 0;
  94          
  95          
  96          /*key value:
  97          1:                              (1<<2)
  98          2:                              (1<<3)
  99          3:                              (1<<7)
 100          4:                              (1<<6)
 101          5:                              (1<<5)
 102          6:                              (1<<4)
 103          */
 104          #define KEY_FUNC                        (1<<5)
 105          #define KEY_SET                         (1<<4)
 106          #define KEY_WARM_START          (1<<6)
 107          #define KEY_LIGHT_START         (1<<3)
 108          #define KEY_JX_START            (1<<1)
 109          #define KEY_ALL_START           (1<<7)
 110          #define KEY_POWER                       (1<<2)
 111          
 112          unsigned char key_reg = 0x00, tmp_key_reg = 0x00;
 113          unsigned char key_cs = 0;
 114          sbit KEY_LINE = P1^2;           //键盘扫描读取线
 115          bit disp_on = 1;
 116          unsigned char disp_off_cs = DISP_WIDTH;
C51 COMPILER V7.04   TEST                                                                  05/10/2004 15:25:07 PAGE 3   

 117          void out_disp_buff(){
 118   1              unsigned char disp_data;
 119   1      
 120   1              out_cs_mask(1);
 121   1              //键盘扫描
 122   1              if(key_cs == 0)
 123   1                      tmp_key_reg = 0;
 124   1              disp_data = 1<<key_cs;
 125   1              spiout(disp_data);
 126   1              if(KEY_LINE)
 127   1                      tmp_key_reg |= disp_data;
 128   1              else
 129   1                      tmp_key_reg &= ~disp_data;
 130   1              key_cs++;
 131   1              key_cs &= 7;
 132   1              if(key_cs == 0){
 133   2                      key_reg = tmp_key_reg;
 134   2      //              disp_buff[5] = key_reg;
 135   2              }
 136   1              //键盘扫描完成
 137   1      
 138   1      //      if (!disp_on){
 139   1      //              out_cs_mask(1);
 140   1      //              return;
 141   1      //      }
 142   1      
 143   1              disp_data = disp_buff[disp_cs];
 144   1              if (dot_pos == disp_cs)
 145   1                      disp_data |= 0x80;
 146   1      
 147   1              if (time_dot_on && disp_cs == 3)
 148   1                      disp_data |= 0x80;
 149   1      
 150   1      
 151   1              if ((disp_cs & 1) == 1){
 152   2                      unsigned char d;
 153   2                      d = (disp_data & 0x80) >> 3;
 154   2                      d |= (disp_data & 0x40) >> 1;
 155   2                      d |= (disp_data & 0x20) << 1;
 156   2                      d |= (disp_data & 0x10) << 3;
 157   2                      d |= (disp_data & 0x8) >> 3;
 158   2                      d |= (disp_data & 0x4) >> 1;
 159   2                      d |= (disp_data & 0x2) << 1;
 160   2                      d |= (disp_data & 0x1) << 3;
 161   2                      disp_data = d;
 162   2              }
 163   1      
 164   1              //DATA_PORT = ~disp_data;
 165   1              spiout(disp_data);//~disp_data表示共阳驱动,disp_data是共阴驱动
 166   1              if (disp_on){
 167   2                      out_cs(disp_cs, 0);
 168   2              } else {
 169   2                      if (disp_off_cs >= DISP_WIDTH){
 170   3                              out_cs_mask(1);
 171   3                      } else {
 172   3                              if (disp_cs == disp_off_cs){
 173   4                                      out_cs(disp_cs, 1);
 174   4                              } else {
 175   4                                      out_cs(disp_cs, 0);
 176   4                              }
 177   3                      }
 178   2              }
C51 COMPILER V7.04   TEST                                                                  05/10/2004 15:25:07 PAGE 4   

 179   1              disp_cs++;
 180   1              if (disp_cs == DISP_WIDTH)
 181   1                      disp_cs = 0;
 182   1      }
 183          
 184          unsigned int disp_flash = 0;
 185          bit sys_wake_up = 0;
 186          
 187          
 188          unsigned char temper = 20;
 189          unsigned int temper_gate = 0;
 190          
 191          unsigned int time_min= 0;
 192          unsigned char time_sec= 0;
 193          unsigned int time_ms= 0;
 194          unsigned int sys_clock=0;
 195          unsigned char jiffies = 0;
 196          bit timer_isr_stop = 0;
 197          bit warm_start = 0;
 198          bit light_start = 0;
 199          bit jx_start = 0;
 200          
 201          sbit TEMPER_TEST = P3^6;        //电压比较器输出端,温度检测
 202          sbit TEMPER_KEY = P1^1;
 203          //unsigned int temper_test_count = 0;
 204          unsigned int temper_test_count = 0;
 205          unsigned int temper_not_test_count = 250;
 206          #define TESTING 1
 207          #define NOT_TESTING 0
 208          bit temp_test_cycle = NOT_TESTING;
 209          
 210          void timer_isr(void) interrupt 1 using 1{
 211   1              //测温例程
 212   1              if (temp_test_cycle == TESTING){
 213   2                      temper_test_count++;
 214   2                      if (!TEMPER_TEST){
 215   3                              TEMPER_KEY = 0;         //开始放电
 216   3                              temper_not_test_count = 2500;           //放电250个周期
 217   3      #if 1
 218   3                              if (temper_gate > temper_test_count){
 219   4                                      unsigned int diff = temper_gate - temper_test_count;
 220   4                                      if (diff > 80)
 221   4                                              temper_gate = temper_test_count;
 222   4                                      else
 223   4                                              temper_gate -= diff / 10;
 224   4                              }else{
 225   4                                      unsigned int diff = temper_test_count - temper_gate;
 226   4                                      if (diff > 80)
 227   4                                              temper_gate = temper_test_count;
 228   4                                      else
 229   4                                              temper_gate += diff / 10;
 230   4                              }
 231   3      #else
                                      temper_gate = temper_test_count;
              #endif
 234   3                              temp_test_cycle = NOT_TESTING;
 235   3                      }
 236   2              } else {
 237   2                      temper_not_test_count--;

⌨️ 快捷键说明

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