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

📄 ex11.lst

📁 单片机秒表程序
💻 LST
字号:
C51 COMPILER V7.03   EX11                                                                  07/08/2005 22:32:54 PAGE 1   


C51 COMPILER V7.03, COMPILATION OF MODULE EX11
OBJECT MODULE PLACED IN ex11.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ex11.C BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*******************************************************************************
   2          ;  Title:  演示程序11 - 秒表                                                                                    *
   3          ;  Name:   ex11.c                                                               *
   4          ;  Date:   2005-5-29                                                            *
   5          ;  Ver:    1.0                                                                                                                  *
   6          ;  web:   http://www.mcustudy.com                                              *
   7          ********************************************************************************
   8          *  描述:                                                                        *
   9          *                 数码管显示秒表, 分辨率0.01s                                   *
  10          *                                                                                               *
  11          *                       K1, 启动开始计时                                                *
  12          *                       K2, 停止                                                        *
  13          *                       K3, 归零                                                        *
  14          *                                                                               *
  15          *    秒单位,寄存器与数码管对应关系:                                             *
  16          *                                                                               *
  17          * --- 秒单位 ---------- 数码管端口 ---- 缓冲区 --------- 计时BCD码值寄存器      *
  18          *     十万位               P20        dis_buf[7]          sec_bcd[7]            *
  19          *     万位                 P21        dis_buf[6]          sec_bcd[6]            *
  20          *     千位                 P22        dis_buf[5]          sec_bcd[5]            *
  21          *     百位                 P23        dis_buf[4]          sec_bcd[4]            *
  22          *     十位                 P24        dis_buf[3]          sec_bcd[3]            *
  23          *     个位(1.s)            P25        dis_buf[2]          sec_bcd[2]            *
  24          *     十分位(0.1s)         P26        dis_buf[1]          sec_bcd[1]            *
  25          *     百分位(0.01s)        P27        dis_buf[0]          sec_bcd[0]            *
  26          *                                                                               *
  27          ********************************************************************************/
  28          
  29          #include <reg51.h>
  30          #include <intrins.h>
  31          
  32          
  33          
  34          unsigned char data dis_digit;
  35          unsigned char key_s,key_v;
  36          
  37          unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0,   // 0, 1, 2, 3
  38                                          0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off 
  39          unsigned char dis_buf[8];               // 显示缓冲区
  40          unsigned char sec_bcd[8];               // 秒计数值, BCD码
  41          unsigned char dis_index;                // 
  42          
  43          
  44          void clr_time();        
  45          void update_disbuf();
  46          unsigned char   scan_key();
  47          void proc_key(unsigned char key);
  48          void delayms(unsigned char ms);
  49          
  50          sbit    K1 = P3^2;
  51          sbit    K2 = P3^3;
  52          sbit    K3 = P3^4;
  53          
  54          void main(void)
  55          {
C51 COMPILER V7.03   EX11                                                                  07/08/2005 22:32:54 PAGE 2   

  56   1              unsigned char key;
  57   1              P0 = 0xff;
  58   1              P2 = 0xff;
  59   1              TMOD = 0x11;            // 定时器0, 1工作模式1, 16位定时方式
  60   1              TH1 = 0xdc;
  61   1              TL1 = 0;
  62   1      
  63   1              TH0 = 0xFC;
  64   1              TL0 = 0x17;
  65   1              
  66   1              clr_time();                     // 
  67   1                                                 
  68   1              dis_digit = 0x7f;               // 初始显示P20口数码管
  69   1              dis_index = 0;                  // 
  70   1              
  71   1              
  72   1              IE = 0x8a;                              // 使能timer0, timer1中断
  73   1              
  74   1              TR0 = 1;
  75   1              TR1 = 0;
  76   1              while(1)
  77   1              {
  78   2                  key = scan_key();
  79   2                      proc_key(key);
  80   2              }
  81   1      }
  82          
  83          void clr_time()
  84          {
  85   1              unsigned char i;
  86   1              for(i=0;i<8;i++)
  87   1                       sec_bcd[i] = 0x0;
  88   1              update_disbuf();
  89   1              
  90   1      }
  91          
  92          unsigned char scan_key()
  93          {
  94   1              unsigned char key_s;
  95   1              key_s = P3 & 0x1c;
  96   1              delayms(20);
  97   1              key_v = P3 & 0x1c; 
  98   1              if(key_s == key_v)
  99   1                      return key_s;           
 100   1              else
 101   1                      return 0 ;
 102   1      }               
 103          
 104          
 105          
 106          void proc_key(unsigned char key)
 107          {
 108   1              switch(key) 
 109   1                      {
 110   2                              case 0x18:         // k1
 111   2                                      TR1 = 1;
 112   2                                      break;
 113   2                              case 0x14:         //k2
 114   2                                      TR1 = 0;
 115   2                                      break;
 116   2                              case 0x0c:         //k3
 117   2                                      clr_time();
C51 COMPILER V7.03   EX11                                                                  07/08/2005 22:32:54 PAGE 3   

 118   2                                      break;
 119   2                              default:
 120   2                                      break;
 121   2                      }
 122   1      }
 123          
 124          
 125          // 定时器0中断服务程序, 用于数码管的动态扫描
 126          // dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
 127          // dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
 128          //                              选通P2.0口数码管
 129          // dis_buf   --- 显于缓冲区基地址       
 130          void timer0() interrupt 1
 131          {
 132   1              TH0 = 0xFC;
 133   1              TL0 = 0x17;
 134   1              
 135   1              P2 = 0xff;                                                      // 先关闭所有数码管
 136   1              P0 = dis_buf[dis_index];                        // 显示代码传送到P0口
 137   1              P2 = dis_digit;                                         // 
 138   1      
 139   1              dis_digit = _cror_(dis_digit,1);        // 位选通值右移(P20<-P27), 下次中断时选通下一位数码管
 140   1              dis_index++;                                            // 
 141   1                                              
 142   1              dis_index &= 0x07;                      // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
 143   1      }
 144          
 145          void timer1() interrupt 3
 146          {       
 147   1              unsigned char i;
 148   1              TH1 |= 0xdc;
 149   1              for(i = 0; i < 8; i++)
 150   1              {
 151   2                      sec_bcd[i]++;                   // 低位加1
 152   2                      if(sec_bcd[i] < 10)             // 如果低位满10则向高位进1
 153   2                              break;                  // 低位未满10
 154   2                      sec_bcd[i] = 0;                 // 低位满10清0
 155   2              }
 156   1              update_disbuf();                        // 更新显示缓冲区
 157   1      }
 158          
 159          void update_disbuf()
 160          // 更新显示缓冲区
 161          {
 162   1              dis_buf[0] = dis_code[sec_bcd[0]];
 163   1              dis_buf[1] = dis_code[sec_bcd[1]];
 164   1              dis_buf[2] = dis_code[sec_bcd[2]] & 0x7f;       // 加上小数点
 165   1              dis_buf[3] = dis_code[sec_bcd[3]];
 166   1              dis_buf[4] = dis_code[sec_bcd[4]];
 167   1              dis_buf[5] = dis_code[sec_bcd[5]];
 168   1              dis_buf[6] = dis_code[sec_bcd[6]];
 169   1              dis_buf[7] = dis_code[sec_bcd[7]];
 170   1      }
 171          
 172          // 延时子程序
 173          void delayms(unsigned char ms)  
 174          {                                               
 175   1              unsigned char i;
 176   1              while(ms--)
 177   1              {
 178   2                      for(i = 0; i < 120; i++);
 179   2              }
C51 COMPILER V7.03   EX11                                                                  07/08/2005 22:32:54 PAGE 4   

 180   1      }
 181          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    314    ----
   CONSTANT SIZE    =     11    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     20       2
   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 + -