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

📄 main.lst

📁 时间倒计时C51源程序
💻 LST
字号:
C51 COMPILER V7.01  MAIN                                                                   06/15/2004 20:36:51 PAGE 1   


C51 COMPILER V7.01, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          //**********************************************************************
   2          //功能          : 时间倒计时程序
   3          //作者          : lihj
   4          //创建日期      : 2004-06-15
   5          //版本          : V1.0
   6          //修改记录      :
   7          //***********************************************************************
   8          #include "REG51.h"
   9          #include "intrins.h"                                    //包含内联函数
  10          
  11          #ifndef TRUE                                                    //如果没有定义宏TRUE,那么定义以下宏
  12          #define TRUE            0
  13          #define FALSE           1
  14          #endif                                                                  //结束条件编译
  15          
  16          //系统宏定义
  17          #define XTAL            12000000                        //系统晶振
  18          #define TIME_BASE       10                                      //时间基准, 以1ms为单位
  19          #define RED_TIME        45                                      //红灯倒计时时间
  20          #define GREEN_TIME      30                                      //绿灯倒计时时间
  21          
  22          //全局变量声明
  23          int      g_wTimerIniValue;                                      //定时器初始化值
  24          int  g_w10msCounter;                                    //10ms系统时钟基准
  25          int  g_wRedDownCounter;                                 //红灯倒计时计数器
  26          int  g_wGreenDownCounter;                               //绿灯倒计时计数器
  27          bit  g_bUpdateCountFlag;                                //更新标志
  28          sbit g_bRedFlag = P1^0;                                 //假设P1.0口输入红灯计数信号,高电平有效
  29          sbit g_bGreenFlag = P1^1;                               //假设P1.1口输入绿灯计数信号,高电平有效
  30          
  31          //函数声明
  32          char TimerIni(char);                                    //初始化定时器函数
  33          char UpdateCounter(int, int*);                  //计数器生成函数
  34          void OutputTime(int );                                  //输出当前计时值
  35          
  36          //主循环
  37          void main(void)
  38          {
  39   1              int cur_counter=60;                                     //当前输出值
  40   1      
  41   1              //初始化全局变量
  42   1              g_w10msCounter = 0;                                     //10ms系统时钟基准
  43   1              g_wRedDownCounter = RED_TIME;           //红灯倒计时计数器
  44   1              g_wGreenDownCounter = GREEN_TIME;       //绿灯倒计时计数器
  45   1              g_bUpdateCountFlag = 0;                         //更新标志
  46   1              g_bRedFlag = 0;
  47   1              g_bGreenFlag = 0;
  48   1                      
  49   1              g_wTimerIniValue = 65535 - ((XTAL/12)/1000)*TIME_BASE + 1;              
  50   1                                                                                      //初值=65536 - 定时时间长度
  51   1              TimerIni(0);                                            //将定时器0初始化成10ms定时器
  52   1              
  53   1              EA = 1;                                                         //总中断使能
  54   1      
  55   1              while(1)                                                        //主循环体
C51 COMPILER V7.01  MAIN                                                                   06/15/2004 20:36:51 PAGE 2   

  56   1              {
  57   2                      if(_testbit_(g_bUpdateCountFlag))
  58   2                      {
  59   3                              //更新红灯计数器 
  60   3                              if(g_bRedFlag)
  61   3                              {
  62   4                                      //红灯开始计数的时候,初始化绿灯倒计时时间
  63   4                                      g_wGreenDownCounter = GREEN_TIME;                               
  64   4                                      UpdateCounter(100, &g_wRedDownCounter);
  65   4                                      cur_counter = g_wRedDownCounter;
  66   4                              }
  67   3      
  68   3                              //更新绿灯计数器
  69   3                              if(g_bGreenFlag)
  70   3                              {
  71   4                                      //绿灯开始计时的时候,初始化红灯倒计时时间
  72   4                                      g_wRedDownCounter = RED_TIME;
  73   4                                      UpdateCounter(100, &g_wGreenDownCounter);
  74   4                                      cur_counter = g_wGreenDownCounter;
  75   4                              }
  76   3      
  77   3                              //输出当前计时时间
  78   3                              OutputTime(cur_counter);
  79   3                      }
  80   2              }
  81   1      }
  82                  
  83          //定时器初始化函数
  84          //参数说明      : n, 定时器序号
  85          char TimerIni(char n)
  86          {
  87   1              if(n == 0)                                                      //使用定时器0
  88   1              {
  89   2                      TMOD = 0X01;                                    //定时器0工作方式1(16位定时器)
  90   2                      TH0 = g_wTimerIniValue >> 8;    //定时器赋初始值
  91   2                      TL0 = g_wTimerIniValue;
  92   2                      ET0 = 1;                                                //允许定时器中断
  93   2                      TR0 = 1;                                                //启动计数
  94   2              }               
  95   1              else if(n == 1)                                         //使用定时器1
  96   1              {
  97   2                      TMOD = 0x10;                                    //工作方式1
  98   2                      TH1 = g_wTimerIniValue >> 8;    //定时器赋初值
  99   2                      TL1 = g_wTimerIniValue;
 100   2                      ET1 = 1;                                                //允许定时器中断
 101   2                      TR1 = 1;                                                //启动计数
 102   2              }
 103   1              else
 104   1              {
 105   2                      return FALSE;                                   //返回出错标志
 106   2              }
 107   1      
 108   1              return TRUE;
 109   1      }
 110          
 111          //计数器生成函数
 112          //传入参数      : count, 多少ms计数器,单位1ms
 113          //                      : *pCounter, 指向需要更新的计数器
 114          char UpdateCounter(int count, int *pCounter)
 115          {
 116   1              //计数器长度限幅(600s)
 117   1              //更长时间的计数器需要更改时间基准
C51 COMPILER V7.01  MAIN                                                                   06/15/2004 20:36:51 PAGE 3   

 118   1              if(count > 65536/TIME_BASE)
 119   1              {
 120   2                      return FALSE;
 121   2              }
 122   1      
 123   1              if(g_w10msCounter%count == 0)
 124   1          {
 125   2                      if(*pCounter == 0)                              //已经到零了,直接返回
 126   2                      {
 127   3                              return TRUE;
 128   3                      }
 129   2      
 130   2                      (*pCounter) --;                                 //向下减一
 131   2              }
 132   1      
 133   1              return TRUE;
 134   1      }
 135          
 136          //定时器0中断服务程序
 137          //interrupt关键字后的数字指向中断向量号
 138          //using关键字后的数字表示该中断函数使用第几组寄存器
 139          void Timer0Int(void) interrupt 1 using 1
 140          {
 141   1              TL0 += g_wTimerIniValue;
 142   1              TH0 += g_wTimerIniValue>>8;                             //恢复定时器初值
 143   1      
 144   1              g_w10msCounter ++;                                              //10ms计数器累加
 145   1              if(g_w10msCounter >= 60000)
 146   1              {
 147   2                      g_w10msCounter -= 60000;
 148   2              }
 149   1      
 150   1              g_bUpdateCountFlag = 1;                                 //更新其它计数器
 151   1      }
 152                  
 153          //将当前倒计时时间输出到显示界面
 154          //预留接口
 155          void OutputTime(int count)
 156          {
 157   1      
 158   1      }
*** WARNING C280 IN LINE 155 OF MAIN.C: 'count': unreferenced local variable


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    308    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      8       7
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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