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

📄 51

📁 51单片机大量源码
💻
字号:
C51 COMPILER V8.18   DIANZIZHONG                                                           01/04/2010 13:04:03 PAGE 1   


C51 COMPILER V8.18, COMPILATION OF MODULE DIANZIZHONG
OBJECT MODULE PLACED IN dianzizhong.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE dianzizhong.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg52.h>
   2          #include <intrins.h>
   3          
   4          unsigned char data dis_digit;
   5          unsigned char key_s, key_v;
   6          
   7          unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
   8              0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off 
   9          unsigned char data dis_buf[8];
  10          unsigned char data dis_index;
  11          unsigned char hour,min,sec;
  12          unsigned char sec100; 
  13          
  14          sbit K1 = P3^2;
  15          sbit K2 = P3^3;
  16          bit scan_key();
  17          void proc_key();
  18          void inc_sec();
  19          void inc_min();
  20          void inc_hour();
  21          void display();
  22          void delayms(unsigned char ms);
  23          
  24          void main(void)
  25          {
  26   1       P0 = 0xff;
  27   1       P2 = 0xff;
  28   1       TMOD = 0x11;  // 定时器0, 1工作模式1, 16位定时方式
  29   1       TH1 = 0xdc;
  30   1       TL1 = 0;
  31   1      
  32   1       TH0 = 0xFC;
  33   1       TL0 = 0x17;
  34   1       
  35   1       hour = 12;
  36   1       min = 00;
  37   1       sec = 00;
  38   1      
  39   1       sec100 = 0;
  40   1       
  41   1       dis_buf[0] = dis_code[hour / 10];  // 时十位
  42   1       dis_buf[1] = dis_code[hour % 10];  // 时个位
  43   1       dis_buf[3] = dis_code[min / 10];  // 分十位
  44   1       dis_buf[4] = dis_code[min % 10];  // 分个位
  45   1       dis_buf[6] = dis_code[sec / 10];  // 秒十位
  46   1       dis_buf[7] = dis_code[sec % 10];  // 秒个位
  47   1       dis_buf[2] = 0xbf;      // 显示"-"
  48   1       dis_buf[5] = 0xbf;      // 显示"-"
  49   1         
  50   1       dis_digit = 0xfe;
  51   1       dis_index = 0;
  52   1       
  53   1       TCON = 0x01;
  54   1       IE = 0x8a;    // 使能timer0,1 中断
  55   1       
C51 COMPILER V8.18   DIANZIZHONG                                                           01/04/2010 13:04:03 PAGE 2   

  56   1       TR0 = 1;
  57   1       TR1 = 1;
  58   1      
  59   1       key_v = 0x03;
  60   1      
  61   1       while(1)
  62   1       {
  63   2        if(scan_key())
  64   2        {
  65   3         delayms(10);
  66   3         if(scan_key())
  67   3         {
  68   4          key_v = key_s;
  69   4          proc_key();
  70   4         }
  71   3        }
  72   2        
  73   2       }
  74   1      }
  75          
  76          bit scan_key()
  77          {
  78   1       key_s = 0x00;
  79   1       key_s |= K2;
  80   1       key_s <<= 1;
  81   1       key_s |= K1;
  82   1       return(key_s ^ key_v); 
  83   1      }
  84          
  85          void proc_key()
  86          {
  87   1       EA = 0;
  88   1       if((key_v & 0x01) == 0)  // K1
  89   1       {
  90   2        inc_hour();
  91   2       // JJ=1;
  92   2       }
  93   1       else if((key_v & 0x02) == 0) // K2
  94   1       {
  95   2        min++;
  96   2       // JJ=0;
  97   2        if(min > 59)
  98   2        {
  99   3         min = 0;
 100   3        }
 101   2        dis_buf[3] = dis_code[min / 10];  // 分十位
 102   2        dis_buf[4] = dis_code[min % 10];  // 分个位
 103   2       }
 104   1      
 105   1       EA = 1;
 106   1      }
 107          
 108          void timer0() interrupt 1
 109          // 定时器0中断服务程序, 用于数码管的动态扫描
 110          // dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
 111          // dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
 112          //    选通P2.0口数码管
 113          // dis_buf   --- 显于缓冲区基地址 
 114          {
 115   1       TH0 = 0xFC;
 116   1       TL0 = 0x17;
 117   1       
C51 COMPILER V8.18   DIANZIZHONG                                                           01/04/2010 13:04:03 PAGE 3   

 118   1       P2 = 0xff;       // 先关闭所有数码管
 119   1       P0 = dis_buf[dis_index];   // 显示代码传送到P0口
 120   1       P2= dis_digit;      // 
 121   1      
 122   1       dis_digit = _crol_(dis_digit,1); // 位选通值左移, 下次中断时选通下一位数码管
 123   1       dis_index++;      // 
 124   1           
 125   1       dis_index &= 0x07;   // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
 126   1      } 
 127          
 128          void timer1() interrupt 3
 129          {
 130   1       TH1 = 0xdc;
 131   1       
 132   1       sec100++;
 133   1       
 134   1       if(sec100 >= 100)
 135   1       {
 136   2        sec100 = 0;
 137   2        inc_sec();
 138   2       }
 139   1      }
 140          
 141          void inc_sec()
 142          {
 143   1       sec++;
 144   1       if(sec > 59)
 145   1       {
 146   2        sec = 0;
 147   2        inc_min();
 148   2       }
 149   1       dis_buf[6] = dis_code[sec / 10];  // 秒十位
 150   1       dis_buf[7] = dis_code[sec % 10];  // 秒个位 
 151   1      }
 152          
 153          void inc_min()
 154          {
 155   1       min++;
 156   1       if(min > 59)
 157   1       {
 158   2        min = 0;
 159   2        inc_hour();
 160   2       }
 161   1       dis_buf[3] = dis_code[min / 10];  // 分十位
 162   1       dis_buf[4] = dis_code[min % 10];  // 分个位
 163   1      }
 164          
 165          void inc_hour()
 166          {
 167   1       hour++;
 168   1       if(hour > 23)
 169   1       {
 170   2        hour = 0;
 171   2       }
 172   1       if(hour > 9)
 173   1        dis_buf[0] = dis_code[hour / 10];  // 时十位
 174   1       else
 175   1        dis_buf[0] = 0xff;     // 当小时的十位为0时不显示
 176   1       dis_buf[1] = dis_code[hour % 10];  // 时个位
 177   1      
 178   1      }
 179          
C51 COMPILER V8.18   DIANZIZHONG                                                           01/04/2010 13:04:03 PAGE 4   

 180          
 181          void delayms(unsigned char ms) 
 182          // 延时子程序
 183          {      
 184   1       unsigned char i;
 185   1       while(ms--)
 186   1       {
 187   2        for(i = 0; i < 120; i++);
 188   2       }
 189   1      }


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