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

📄 diometer.lst

📁 自行车里程计 实时显示时间 里程 速度
💻 LST
字号:
C51 COMPILER V8.08   DIOMETER                                                              11/07/2008 11:30:45 PAGE 1   


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

line level    source

   1          //
   2          //数码管采用共阴
   3          //P2作为数码管的段选输入
   4          //p1作为数码管的位选,采用低四位
   5          //
   6          //采用11.0592mhz的晶振
   7          //时钟采用计时器0
   8          //初始值为19465,也就是20次溢出为1秒
   9          //
  10          //红外对管低电平有效
  11          //采用边沿触发
  12          //触发后延时4ms检测若有则说明成功
  13          //
  14          //红外采用外部中断0
  15          //按键采用外部中断1
  16          //
  17          #include <reg52.h>
  18          
  19          int distance=0;
  20          char hour=0;
  21          char minute=0;
  22          char second=0;
  23          //char sec=0;
  24          char timenumber = 0;
  25          //
  26          //共阴七段数码管的显示参数
  27          //
  28          //code char Ascii[10]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x7, 0x7f, 0x6f};
  29          code char Ascii[10]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
  30          //
  31          //显示的控制位
  32          //0表示distance
  33          //1表示time
  34          //
  35          char mod=0;
  36          //
  37          //秒钟的辅助进位
  38          //
  39          char count=0;
  40          
  41          //
  42          //延时的子程序
  43          //
  44          void delay(unsigned char a)
  45          {
  46   1              while(a--)
  47   1              {
  48   2              }
  49   1      }
  50          
  51          void delay_2(int m)   //延时程序,延时m*0.5毫秒 
  52          { 
  53   1         unsigned int i; 
  54   1         unsigned int j; 
  55   1         for (i = 0; i < m; i++) 
C51 COMPILER V8.08   DIOMETER                                                              11/07/2008 11:30:45 PAGE 2   

  56   1         { 
  57   2           for (j = 0; j < 500; j++){} 
  58   2         } 
  59   1      }
  60          
  61          //
  62          //
  63          //
  64          void ShowSpeed()
  65          {
  66   1              int speed=distance*2/(second+minute*60+hour*24);
  67   1              
  68   1              P1=0xff;
  69   1          P2 = 0x00; 
  70   1              P2=Ascii[speed / 1000]& 0x7f;
  71   1              P1=0xfe;
  72   1              delay_2(1);
  73   1              P1=0xff;
  74   1      
  75   1          P2 = 0x00; 
  76   1              speed=speed % 1000;
  77   1              P2=Ascii[speed / 100];
  78   1              P1=0xfd;
  79   1              delay_2(1);
  80   1              P1=0xff;
  81   1      
  82   1          P2 = 0x00; 
  83   1              speed=speed % 100;
  84   1              //
  85   1              //显示闪烁
  86   1              //
  87   1              P2=Ascii[speed /10] ;
  88   1              P1=0xfb;
  89   1              delay_2(1);
  90   1              P1=0xff;
  91   1      
  92   1          P2 = 0x00; 
  93   1              speed=speed%10;
  94   1              P2=Ascii[speed];
  95   1              P1=0xf7;
  96   1              delay_2(1);
  97   1              P1=0xff;
  98   1      }
  99          
 100          //
 101          //显示里程
 102          //
 103          void ShowDistance()
 104          {
 105   1              
 106   1              int tmp=distance*2%10000;
 107   1      
 108   1              P1=0xff;
 109   1          P2 = 0x00; 
 110   1              P2=Ascii[tmp / 1000];
 111   1              P1=0xfe;
 112   1              delay_2(1);
 113   1              P1=0xff;
 114   1      
 115   1          P2 = 0x00; 
 116   1              tmp=tmp % 1000;
 117   1              P2=Ascii[tmp / 100]& 0x7f;
C51 COMPILER V8.08   DIOMETER                                                              11/07/2008 11:30:45 PAGE 3   

 118   1              P1=0xfd;
 119   1              delay_2(1);
 120   1              P1=0xff;
 121   1      
 122   1          P2 = 0xff; 
 123   1              tmp=tmp % 100;
 124   1              //
 125   1              //显示闪烁
 126   1              //
 127   1              P2=Ascii[tmp /10] ;
 128   1              P1=0xfb;
 129   1              delay_2(1);
 130   1              P1=0xff;
 131   1      
 132   1          P2 = 0xff; 
 133   1              tmp=tmp%10;
 134   1              P2=Ascii[tmp];
 135   1              P1=0xf7;
 136   1              delay_2(1);
 137   1              P1=0xff;
 138   1      }
 139          
 140          //
 141          //显示时间
 142          //
 143          void ShowTime()
 144          {       
 145   1              P1=0xff;
 146   1          P2 = 0x00; 
 147   1              P2=Ascii[hour / 10];
 148   1              P1=0xfe;
 149   1              delay_2(1);
 150   1              P1=0xff;
 151   1      
 152   1          P2 = 0x00; 
 153   1              P2=Ascii[hour % 10];
 154   1              P1=0xfd;
 155   1              delay_2(1);
 156   1              P1=0xff;
 157   1      
 158   1          P2 = 0x00; 
 159   1              P2=Ascii[minute / 10] & 0x7f;
 160   1              P1=0xfb;
 161   1              delay_2(1);
 162   1              P1=0xff;
 163   1              //
 164   1              //显示闪烁
 165   1              //
 166   1      
 167   1          P2 = 0x00; 
 168   1              P2=Ascii[minute % 10] ;
 169   1              P1=0xf7;
 170   1              delay_2(1);
 171   1              P1=0xff;
 172   1      }
 173          
 174          //
 175          //显示秒钟
 176          //
 177          void ShowSecond()
 178          {
 179   1              P1=0xff;
C51 COMPILER V8.08   DIOMETER                                                              11/07/2008 11:30:45 PAGE 4   

 180   1          P2 = 0x00; 
 181   1              P2=Ascii[minute / 10];
 182   1              P1=0xfe;
 183   1              delay_2(1);
 184   1              P1=0xff;
 185   1      
 186   1              //
 187   1              //显示闪烁
 188   1              //
 189   1          P2 = 0x00; 
 190   1              P2=Ascii[minute % 10];
 191   1              P1=0xfd;
 192   1              delay_2(1);
 193   1              P1=0xff;
 194   1      
 195   1          P2 = 0x00; 
 196   1              P2=Ascii[second / 10];
 197   1              P1=0xfb;
 198   1              delay_2(1);
 199   1              P1=0xff;
 200   1      
 201   1          P2 = 0x00; 
 202   1              P2=Ascii[second % 10] & 0x7f;
 203   1              P1=0xf7;
 204   1              delay_2(1);
 205   1              P1=0xff;
 206   1      }
 207          //
 208          //定时器0的中断服务器
 209          //
 210          void Timer0() interrupt 1
 211          {
 212   1              EA=0;
 213   1              TH0=0x4c;
 214   1              TL0=0x09;                                       //tmp->timenumber
 215   1              if(timenumber==19)
 216   1              {
 217   2                      timenumber=0;
 218   2                      if(second==59)
 219   2                      {
 220   3                              second=0;
 221   3                              if(minute==59)
 222   3                              {
 223   4                                      minute=0;
 224   4                                      if(hour==99)
 225   4                                      {
 226   5                                              hour=0;
 227   5                                      }
 228   4                                      else
 229   4                                      {
 230   5                                              hour++;
 231   5                                      }
 232   4                              }
 233   3                              else
 234   3                              {
 235   4                                      minute++;
 236   4                              }
 237   3                      }
 238   2                      else
 239   2                      {
 240   3                              second++;
 241   3                      }
C51 COMPILER V8.08   DIOMETER                                                              11/07/2008 11:30:45 PAGE 5   

 242   2                      //sec++;
 243   2              }
 244   1              else
 245   1              {
 246   2                      timenumber++;
 247   2              }
 248   1              EA=1;
 249   1      }
 250          
 251          //
 252          //外部中断0的中断服务程序
 253          //该中断来源于一个按钮
 254          //用以控制显示的切换
 255          //
 256          void Int1() interrupt 2
 257          {
 258   1              EX1=0;
 259   1              EA=0;
 260   1              TR1=1;
 261   1              if(mod==3)
 262   1              {
 263   2                      mod=0;
 264   2              }
 265   1              else
 266   1              {
 267   2                      mod++;
 268   2              }
 269   1              P1=0xff;
 270   1              delay_2(50);
 271   1              EA=1;
 272   1      }
 273          
 274          //
 275          //外部中断1的中断服务程序
 276          //用来检测红外对管
 277          //
 278          void Int0() interrupt 0
 279          {
 280   1              unsigned char tmp=15;
 281   1              EA=0;
 282   1              //
 283   1              //延时4ms
 284   1              //
 285   1              while(tmp--)
 286   1              {
 287   2                      delay(255);
 288   2              }       
 289   1              if(!(P3 & 0x04))
 290   1              {
 291   2                      distance++;
 292   2              }
 293   1              EA=1;
 294   1      }
 295          
 296          //
 297          //计时器1用来按键防抖
 298          //重设时钟,开放按键中断
 299          //
 300          void Timer1() interrupt 3
 301          {
 302   1              EA=0;
 303   1              TR1=0;
C51 COMPILER V8.08   DIOMETER                                                              11/07/2008 11:30:45 PAGE 6   

 304   1              TH1=0xdb;
 305   1              TL1=0x9f;
 306   1              EX1=1;
 307   1              EA=1;
 308   1      }
 309          
 310          main()
 311          {
 312   1              //                                               x
 313   1              //初始化部分
 314   1              //
 315   1              //采用16位定时器模式
 316   1              //中断为边沿触发
 317   1              //
 318   1      //      P1=0xff;
 319   1      //      P2=0x00;
 320   1              TMOD=0x11;
 321   1              TCON=0x15;
 322   1              TH0=0x4c;
 323   1              TL0=0x09;
 324   1              TH1=0xdb;
 325   1              TL1=0x9f;
 326   1              TR1=0;
 327   1              //
 328   1              //开放定时器0和外部中断0和1的中断
 329   1              //
 330   1              IE=0x8f;
 331   1              //
 332   1              //主程序部分
 333   1              //主要是显示模块
 334   1              //
 335   1              while(1)
 336   1              {
 337   2                      switch(mod)
 338   2                      {
 339   3                              case 0:
 340   3                                      ShowSecond();
 341   3                                      break;
 342   3                              case 1:
 343   3                                      ShowTime();
 344   3                                      break;
 345   3                              case 2:
 346   3                                      ShowDistance();
 347   3                                      break ;
 348   3                              case 3:
 349   3                                      ShowSpeed();
 350   3                                      break;;
 351   3                              default:
 352   3                                      ShowDistance();
 353   3                                      break;
 354   3                      }
 355   2              }
 356   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1051    ----
   CONSTANT SIZE    =     10    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      8       4
   IDATA SIZE       =   ----    ----
C51 COMPILER V8.08   DIOMETER                                                              11/07/2008 11:30:45 PAGE 7   

   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 + -