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

📄 readtime.lst

📁 这是一个用STC单片机作的,带液晶显示屏的万年历程序,并有串行接收部份,大家一定要珍惜用.
💻 LST
字号:
C51 COMPILER V7.02b   READTIME                                                             04/19/2008 20:42:51 PAGE 1   


C51 COMPILER V7.02b, COMPILATION OF MODULE READTIME
OBJECT MODULE PLACED IN C:\Documents and Settings\Administrator.MS-C0D3DC71081D\My Documents\readtime.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE readtime.c BROWSE DEBUG OBJECTEXTEND OBJECT(C:\Documents and Settings\Admin
                    -istrator.MS-C0D3DC71081D\My Documents\readtime.obj)

stmt level    source

   1          
   2          #include <52.h>
   3          #define  WDT 63
   4          
   5          #define READ 0xa3
   6          #define WRITE 0xa2
   7          #define  uchar unsigned char
   8          #define  uint unsigned int
   9          #define  ulong unsigned long int
  10          #define  byte unsigned char
  11          #define  word unsigned int
  12          #define  ulong unsigned long int
  13          
  14          sbit SDA = P1^6;//时钟芯片数据线
  15          sbit SCL = P1^7;//时钟芯片时钟线
  16          
  17          uchar  data second, minute, hour, week, day, month, year;
  18          word   data date, time;//从控制器下载的时间暂存储变量
  19          word   code monthday[12] = {31, 28, 31, 30, 31, 30,             //每月天数
  20                                31, 31, 30, 31, 30, 31};
  21          
  22          void wr_time(void);                     //写时间到8563
  23          void byt_to_time(void);         //计算时间      
  24          void time_to_byt(void);         //计算时间      
  25          void rd_time(void);     //从时间芯片中读时间到second,minute,hour,week等变量中                   
  26                                
  27            
  28          void delay_iic(void)
  29          {
  30   1              byte i;
  31   1              for(i = 0; i < 5; i++);
  32   1      }
  33          
  34          void I_start(void)//启动I2C
  35          {
  36   1              SDA = 1;
  37   1              SCL = 1;
  38   1              delay_iic();
  39   1              SDA = 0;
  40   1              delay_iic();
  41   1              SCL = 0;
  42   1      }
  43          
  44          void I_stop(void)//I2C停止
  45          {
  46   1              SDA = 0;
  47   1              SCL = 1;
  48   1              delay_iic();
  49   1              SDA = 1;
  50   1      }
  51          
  52          byte I_WaitAck(void)//等待应答
  53          {
  54   1              bit ack;
C51 COMPILER V7.02b   READTIME                                                             04/19/2008 20:42:51 PAGE 2   

  55   1      
  56   1              SDA = 1;
  57   1              delay_iic();
  58   1              SCL = 1;
  59   1              delay_iic();
  60   1              ack = SDA;
  61   1              SCL = 0;
  62   1       
  63   1      //      WDT_CONTR=WDT;//启动看门狗
  64   1      
  65   1              if(ack) return 0;
  66   1              else return 1;
  67   1      }
  68          
  69          void I_Ack(void)//I2C应答
  70          {
  71   1              SDA = 1;
  72   1              delay_iic();
  73   1              SCL = 1;
  74   1              delay_iic();
  75   1              SCL = 0;
  76   1              delay_iic();
  77   1              SDA = 0;
  78   1      //      WDT_CONTR=WDT;//启动看门狗
  79   1      
  80   1      }
  81          
  82          void I_send(byte i_data)//I2C发送数据
  83          {
  84   1              byte i;
  85   1      
  86   1              for(i = 0; i < 8; i++)
  87   1              {
  88   2                      SDA = (bit)(i_data & 0x80);
  89   2                      i_data = i_data << 1;
  90   2                      SCL = 1;
  91   2                      delay_iic();
  92   2                      SCL = 0;
  93   2                  WDT_CONTR=WDT;//启动看门狗
  94   2              }
  95   1              SDA = 1;
  96   1      }
  97          
  98          byte I_receive(void)//I2C接收数据
  99          {
 100   1              byte i;
 101   1              byte i_data = 0;
 102   1              bit rdata;
 103   1              
 104   1              SDA = 1;
 105   1      
 106   1              for(i = 0; i < 8; i++)
 107   1              {       
 108   2                      SCL = 1;
 109   2                      i_data *= 2;
 110   2                      rdata = SDA;
 111   2                      if(rdata) i_data++;
 112   2                      SCL = 0;        
 113   2                      WDT_CONTR=WDT;//启动看门狗
 114   2      
 115   2              }
 116   1              return i_data;
C51 COMPILER V7.02b   READTIME                                                             04/19/2008 20:42:51 PAGE 3   

 117   1      }
 118          
 119          void I_Write(byte address, byte i_data)//写时间芯片
 120          {
 121   1              I_start();
 122   1              I_send(WRITE);
 123   1              I_WaitAck();
 124   1              I_send(address);
 125   1              I_WaitAck();
 126   1              
 127   1      //      WDT_CONTR=WDT;//启动看门狗
 128   1      
 129   1              I_send(i_data);
 130   1              I_WaitAck();
 131   1              I_stop();
 132   1      }
 133          
 134          byte I_Read(byte address)//读时间芯片
 135          {
 136   1              byte i_data;
 137   1      
 138   1              I_start();
 139   1              I_send(WRITE);
 140   1              I_WaitAck();
 141   1              I_send(address);
 142   1              I_WaitAck();
 143   1      
 144   1      //      WDT_CONTR=WDT;//启动看门狗
 145   1      
 146   1              I_start();
 147   1              I_send(READ);
 148   1              I_WaitAck();
 149   1              i_data = I_receive();
 150   1              I_Ack();
 151   1              I_stop();
 152   1              
 153   1              return i_data;
 154   1      }
 155          
 156          
 157          void wr_time(void)              ////更新8563时间
 158          {
 159   1              byte tmp;
 160   1      
 161   1              tmp = second/10 * 16 + second%10;
 162   1              I_Write(2, tmp);
 163   1              tmp = minute/10 * 16 + minute%10;
 164   1              I_Write(3, tmp);
 165   1              tmp = hour/10 * 16 + hour%10;
 166   1              I_Write(4, tmp);
 167   1      
 168   1              WDT_CONTR=WDT;//启动看门狗
 169   1      
 170   1              tmp = week/10 *16 + week%10;
 171   1              I_Write(6, tmp);
 172   1              tmp = day/10 * 16 + day%10;
 173   1              I_Write(5, tmp);
 174   1              tmp = month/10 * 16 + month%10;
 175   1              I_Write(7, tmp);
 176   1              tmp = year/10 * 16 + year%10;
 177   1              I_Write(8, tmp);
 178   1      }
C51 COMPILER V7.02b   READTIME                                                             04/19/2008 20:42:51 PAGE 4   

 179          
 180          /*void byt_to_time(void)                //把下载的时间计算后放到dyear等变量中   
 181          {
 182                  word tmp, md;
 183                  byte temp, i;
 184          
 185                  year = dn_date / 1461;
 186                  year *= 4;
 187                  tmp = dn_date % 1461;
 188                  if(tmp >= 1096)
 189                  {
 190                          year += 3;
 191                          tmp -= 1096;
 192                  }
 193                  else if(tmp >= 731)
 194                  {
 195                          year += 2;
 196                          tmp -= 731;
 197                  }
 198                  else if(tmp >= 366)
 199                  {
 200                          year += 1;
 201                          tmp -= 366;
 202                  }
 203                  if((year & 3) == 0)
 204                          temp = 1;
 205                  else 
 206                          temp = 0;
 207                  month = 0;
 208                  i = 0;
 209                  while(i == 0)
 210                  {
 211                          md = monthday[month];
 212                          month += 1;
 213                          if((temp != 0) && (month == 2))
 214                                  md += 1;
 215                                          
 216                          WDT_CONTR=WDT;//启动看门狗
 217          
 218                          if(tmp >= md)
 219                                  tmp -= md;
 220                          else 
 221                                  i = 1;
 222                  }
 223                  day = (byte)(tmp + 1);
 224                  week = (dn_date + 6) % 7;
 225          
 226                  hour = dn_time / 1800;
 227                  minute = (dn_time % 1800) / 30;
 228                  second = ((dn_time % 1800) % 30) * 2; 
 229                  if((month>0x0c)|(day>0x1f)|(hour>0x18)|(minute>0x3b))timeflg=1;
 230              else timeflg=0;
 231          
 232          }*/
 233          void rd_time(void)      //从时间芯片中读时间到second,minute,hour,week等变量中                   
 234          {
 235   1              byte tmp;
 236   1      
 237   1              tmp = I_Read(0x02);
 238   1              tmp &= 0x7f;
 239   1              second = tmp/16 * 10 + tmp%16;  //BCD码转换成16进制
 240   1      
C51 COMPILER V7.02b   READTIME                                                             04/19/2008 20:42:51 PAGE 5   

 241   1              tmp = I_Read(0x03);
 242   1              tmp &= 0x7f;
 243   1              minute = tmp/16 * 10 + tmp%16;
 244   1      
 245   1              tmp = I_Read(0x04);
 246   1              tmp &= 0x3f;
 247   1              hour = tmp/16 * 10 + tmp%16;
 248   1      
 249   1              tmp = I_Read(0x06);
 250   1              tmp &= 0x07;
 251   1              week = tmp/16 * 10 + tmp%16;
 252   1              
 253   1      //      WDT_CONTR=WDT;//启动看门狗
 254   1              
 255   1              tmp = I_Read(0x05);
 256   1              tmp &= 0x3f;
 257   1              day = tmp/16 * 10 + tmp%16;
 258   1              
 259   1              tmp = I_Read(0x07);
 260   1              tmp &= 0x1f;
 261   1              month = tmp/16 * 10 + tmp%16;
 262   1              
 263   1              tmp = I_Read(0x08);
 264   1              tmp &= 0x7f;
 265   1              year = tmp/16 * 10 + tmp%16;
 266   1              //time_to_byt();
 267   1      }
 268          
 269          void time_to_byt(void)                  
 270          {
 271   1              byte tmp;
 272   1              word t_da, t_ti;
 273   1      
 274   1              tmp = year / 4;
 275   1              t_da = tmp * 1461;              //每4年有一闰年,共1461天
 276   1              tmp = year & 0x03;
 277   1              t_da += (tmp * 365);            //算年
 278   1      //              WDT_CONTR=WDT;//启动看门狗
 279   1      
 280   1              //if((year == 0) && (month < 3))        //2000年1、2月总天数要减1,  //chinge Vx.xxA    
 281   1              if(((year % 4) == 0) && (month < 3))    //2000年1、2月总天数要减1,
 282   1                      t_da += (day - 1);      //而其它的在下面算天数时由于闰年29天,在monthdat[2]数组中只算了28天,所以不用减1        
 283   1              else 
 284   1                      t_da += day;            //算天
 285   1              for(tmp = 1; tmp < month; tmp++)        //算月
 286   1                      t_da += monthday[tmp-1];        //由于闰年29天,在monthdat[2]数组中只算了28天,所以不用减1
 287   1              date = t_da;            //上传的天数=实际天数-1  (2000年01月01日 数值为0)
 288   1      
 289   1              WDT_CONTR=WDT;//启动看门狗
 290   1      
 291   1              t_ti = hour * 1800 + minute * 30 + second / 2;
 292   1              time = t_ti;
 293   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    707    ----
   CONSTANT SIZE    =     24    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     11       2
   IDATA SIZE       =   ----    ----
C51 COMPILER V7.02b   READTIME                                                             04/19/2008 20:42:51 PAGE 6   

   BIT SIZE         =   ----       2
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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