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

📄 test.lst

📁 一个51单片机温度控制器,又一个示范如何在2051这样的小内存小ROM单片机上实现实时多任务小例子.使用时间片和状态机来完成任务的调度,而不是靠任务切换机制(这样小的资源是不足以支持RTOS的)
💻 LST
📖 第 1 页 / 共 2 页
字号:
 186   1      //      TH0=TL0=0x7a;//16M
 187   1      //      TH0=TL0=0x75;//16.59M
 188   1      //      TH0=TL0=0x72;//17M
 189   1      //      TH0=TL0=0x37;//24M
 190   1              TH0=TL0=-200;//24M
 191   1              EA=1;
 192   1              ET0=1;
 193   1              TR0=1;
 194   1      }
 195          
 196          void out_time(unsigned int out_time){
 197   1              unsigned char h, m;
 198   1              m = out_time % 60;
 199   1              h = out_time / 60;
 200   1              disp_buff[0] = font[h/10];
 201   1              disp_buff[1] = font[h%10];
 202   1              disp_buff[2] = font[m/10];
 203   1              disp_buff[4] = font[m%10];
 204   1      }
 205          
 206          #define FUCTION_NORMAL 0
 207          #define FUCTION_TIME_ADJUST 1
 208          #define FUCTION_TIMER_ON_SET 2
 209          #define FUCTION_TIMER_OFF_SET 3
 210          #define FUCTION_MAX 4
 211          unsigned char function_select = FUCTION_NORMAL;
 212          
 213          unsigned int key_set = 0;               //各按键按下去的时间,按住该键不放时,每运行一次键扫该值加1.
 214          bit key_func = 0;
 215          #define PUSH_DELAY 200          //100ms
 216          #define FIRST_PUSH_DELAY 500            //250ms
 217          
 218          void key_scan(void){
 219   1              unsigned int diff;
 220   1              //按键为高电平触发.
 221   1              if(key_reg & KEY_SET){
 222   2                      disp_flash = 0;
 223   2                      if(key_set){//原来已经按下,连续增加.
 224   3                              if(key_set % PUSH_DELAY == 0 && key_set > FIRST_PUSH_DELAY){
 225   4                                      unsigned int _key_set = key_set - FIRST_PUSH_DELAY;
 226   4                                      diff = _key_set / PUSH_DELAY;
 227   4                              }else
 228   3                                      diff = 0;
 229   3                      }else
 230   2                              diff = 1;
 231   2                      if (function_select == FUCTION_TIME_ADJUST){
 232   3                              timer_isr_stop = 1;
 233   3                              time += diff;
 234   3                              time %= 1440;   //一天为1440分钟
 235   3                      }else if (function_select == FUCTION_TIMER_ON_SET){
 236   3                              timer_on += diff;
 237   3                              timer_on %= 720;        //一天为1440分钟
 238   3                      }else if (function_select == FUCTION_TIMER_OFF_SET){
 239   3                              timer_long += diff;
 240   3                              timer_long %= 121;
C51 COMPILER V7.02b   TEST                                                                 02/02/2004 17:04:14 PAGE 5   

 241   3                              if(timer_long < 10)
 242   3                                      timer_long += 10;
 243   3                      }
 244   2                      if (key_set < 65500)
 245   2                              key_set++;
 246   2              }else
 247   1                      key_set = 0;
 248   1      
 249   1              if(key_reg & KEY_FUNC){
 250   2                      disp_flash = 0;
 251   2                      if(!key_func){//原来未按下,改变设置模式,否则不作处理.
 252   3                              function_select++;
 253   3                              if (function_select == FUCTION_MAX){
 254   4                                      function_select = FUCTION_NORMAL;//FUCTION_NORMAL == 0
 255   4                                      if (timer_isr_stop){
 256   5                                              timer_isr_stop = 0;
 257   5                                              time_ms = 0;
 258   5                                      }
 259   4                              }
 260   3                              key_func = 1;
 261   3                      }
 262   2              }else
 263   1                      key_func = 0;
 264   1      }
 265          
 266          #define FLASH_CHECK(x) disp_flash % x < x / 2
 267          void sys_run(){
 268   1              while(1){
 269   2                      if (!sys_wake_up)
 270   2                              continue;
 271   2                      sys_wake_up = 0;
 272   2                      key_scan();
 273   2                      if(function_select == FUCTION_NORMAL){
 274   3                              unsigned int diff_time;
 275   3                              diff_time = time % 720;
 276   3                              if (diff_time >= timer_on && diff_time < timer_on + timer_long){//timer_long 为0时,定时器不再作输出.
 277   4                                      //out low
 278   4                                      OUT_PIN = 0;
 279   4                                      disp_flash++;
 280   4                                      if(FLASH_CHECK(500))
 281   4                                              disp_on = 1;
 282   4                                      else
 283   4                                              disp_on = 0;
 284   4                              } else {
 285   4                                      //out high
 286   4                                      OUT_PIN = 1;
 287   4                                      disp_on = 1;
 288   4                              }
 289   3                      } else {
 290   3                              disp_flash++;
 291   3                              if(FLASH_CHECK(1000))
 292   3                                      disp_on = 1;
 293   3                              else
 294   3                                      disp_on = 0;
 295   3                      }
 296   2                      
 297   2                      if (function_select == FUCTION_TIME_ADJUST){
 298   3                              dot_pos = 0;
 299   3                              out_time(time);
 300   3                      }else if (function_select == FUCTION_TIMER_ON_SET){
 301   3                              dot_pos = 1;
 302   3                              out_time(timer_on);
C51 COMPILER V7.02b   TEST                                                                 02/02/2004 17:04:14 PAGE 6   

 303   3                      }else if (function_select == FUCTION_TIMER_OFF_SET){
 304   3                              dot_pos = 2;
 305   3                              out_time(timer_long);
 306   3                      }else{
 307   3                              dot_pos = DISP_WIDTH;
 308   3                              out_time(time);
 309   3                      }
 310   2                      out_disp_buff();
 311   2              }
 312   1      }
 313          
 314          
 315          
 316          void main(){
 317   1      #if 1
 318   1              timer_init();
 319   1              sys_run();
 320   1      #else
                      unsigned char i;
                      unsigned int j;
              
                      out_cs_mask(0);
                      for(i=0; ;){
                              if (i==16)
                                      i=0;
                              //DATA_PORT = ~(1 << i);
              //              out_cs_mask(1);
              //              spiout(1 << i);
              //              spiout(font[i]);
              //              out_disp_buff();
              //              out_cs_mask(0);
              //              for(j=0; j<500; j++);
              //              disp_buff[0] = font[i];
              //              disp_buff[1] = font[(i+1)&0xf];
              //              disp_buff[2] = font[(i+2)&0xf];
              //              disp_buff[3] = font[(i+3)&0xf];
              //              disp_buff[4] = font[(i+4)&0xf];
              //              disp_buff[5] = font[(i+5)&0xf];
              //              for(j=0; j<200; j++);
              //                      out_disp_buff();
              #if 0
                              unsigned char disp_data;
                              out_cs_mask(1);
                              //键盘扫描
                              key_reg = 0;
                              disp_data = 1<<key_cs;
                              spiout(disp_data);
                              if(KEY_LINE)
                                      key_reg |= disp_data;
                              else
                                      key_reg &= ~disp_data;
                              key_cs++;
                              key_cs &= 7;
                              spiout(key_reg);
                              out_cs_mask(0);
                              for(j=0; j<500; j++);
              #endif
                      }
              #endif
 362   1      }
 363          
 364          
C51 COMPILER V7.02b   TEST                                                                 02/02/2004 17:04:14 PAGE 7   

 365          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    913    ----
   CONSTANT SIZE    =     28    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     25       6
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      4       2
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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