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

📄 clock.lst

📁 电子中开发程序 有图
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V8.06   CLOCK                                                                 04/02/2008 17:44:13 PAGE 1   


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

line level    source

   1          #include <AT89x51.h>
   2          #include "intrins.h"
   3          unsigned char hour,min,sec,year,month,day,weekday;   //当前时间?日期?星期
   4          unsigned int  count_down;       //1秒钟计时用
   5          bit led_on;                      //数码管是否点亮的标志
   6          unsigned char display[8];       //8位数码管要显示的数据
   7          unsigned char attr;             //八个数码管的闪烁控制字节,当为0时,对应数码管闪
   8          bit flash;                       //LED 闪烁开关,与attr共同决定数码管是否闪烁
   9          unsigned char show_status;      //LED 显示状态标志
  10                  // 0:设置闹钟数据
  11                  // 1:显示当前日期及星期
  12                  // 2:显示当前时间
  13                  // 3:设置当前日期
  14                  // 4:设置当前时间
  15          bit km;                          //按键已去抖动标志
  16          bit kp;                          //按键已处理标志
  17          bit sound;                       //蜂鸣器响标志
  18          bit alarm_stop;                  //蜂鸣器响后用户手工按停标志
  19          struct  {       unsigned char h;    //小时
  20                          unsigned char m;         //分钟
  21                   } alarm[8];             //定义结构数组,8个闹钟项
  22          unsigned char alarm_en;         //闹钟项启用标志
  23          unsigned char alarm_wk;         //闹钟项周末启用标志
  24          unsigned char cur_alarm_set;    //当前设置的闹钟项
  25          unsigned char cur_alarm_active; //当前到点的闹钟项
  26          bit new_alarm_info;              //闹钟项内容已修改标志
  27          sbit sound_output = P1^5;        //蜂鸣器驱动端口,输出0时蜂鸣器响
  28          sbit SDA   = P1^6;                        //EEPROM数据线端口
  29          sbit SCL   = P1^7;                        //EEPROM时钟线端口
  30          
  31          
  32          //以下是EEPROM操作时需要的延时函数
  33          void I2cDelay() 
  34          {
  35   1              _nop_();  _nop_();  _nop_();
  36   1          _nop_();  _nop_();  _nop_(); 
  37   1      }
  38          
  39          //以下是延迟函数,参数为毫秒数
  40          void DelayX1ms(unsigned char count) 
  41          {
  42   1              unsigned char i,j;
  43   1          for(i=0;i<count;i++)
  44   1          for(j=0;j<240;j++)   ;
  45   1      }
  46          
  47          //以下是I2C启动函数,24C08使用I2C方式
  48          void Start() 
  49          {
  50   1              SDA=1; 
  51   1              I2cDelay(); 
  52   1              SCL=1; 
  53   1              I2cDelay();
  54   1              SDA=0; 
  55   1              I2cDelay();  
C51 COMPILER V8.06   CLOCK                                                                 04/02/2008 17:44:13 PAGE 2   

  56   1              SCL=0;  
  57   1      } 
  58          
  59          //以下是I2C停止函数
  60          void Stop()
  61          { 
  62   1              I2cDelay();
  63   1              SDA=0;
  64   1              I2cDelay();
  65   1              SCL=1; 
  66   1              I2cDelay(); 
  67   1              SDA=1; 
  68   1              I2cDelay();
  69   1      }
  70          
  71          //以下是发送1字节数据给EEPROM函数
  72          bit SendByte(unsigned char value)
  73          {
  74   1              unsigned char i;
  75   1              bit no_ack=0;
  76   1              for(i=0;i<8;i++)     //发送8位数据
  77   1              {
  78   2                      I2cDelay(); 
  79   2                      if(value&0x80)   SDA=1;
  80   2                      else             SDA=0;
  81   2                      value=value<<1;
  82   2                      I2cDelay();
  83   2                      SCL=1; 
  84   2                      I2cDelay();
  85   2                      I2cDelay(); 
  86   2                      SCL=0; 
  87   2              }
  88   1              I2cDelay(); 
  89   1              SDA=1;     //确认脉冲周期,等待EEPROM的确认
  90   1              I2cDelay();
  91   1              SCL=1; 
  92   1              I2cDelay();
  93   1              if(SDA==1)   no_ack=1;
  94   1              I2cDelay(); 
  95   1              SCL=0;
  96   1              return no_ack;
  97   1      }
  98          
  99          //以下是向EEPROM写1字节函数
 100          void mywrite(unsigned char address,unsigned char value) 
 101          {
 102   1              Start();
 103   1              SendByte(0xa0);      //发送从地址
 104   1              SendByte(address);   //发送子地址
 105   1              SendByte(value);     //发送数值
 106   1              Stop();
 107   1              DelayX1ms(10);
 108   1      }
 109          
 110          //以下是从EEPROM接收1字节函数
 111          unsigned char ReadByte()
 112          {
 113   1              unsigned char i,bval;
 114   1              bval=0;
 115   1              for(i=0;i<8;i++)        //接收8位数据
 116   1              {
 117   2                      I2cDelay();
C51 COMPILER V8.06   CLOCK                                                                 04/02/2008 17:44:13 PAGE 3   

 118   2                      SDA=1;              //从P1输入数据时,先往P1输入"1"
 119   2                      I2cDelay();
 120   2                      SCL=1;
 121   2                      I2cDelay();
 122   2                      bval=bval<<1; 
 123   2                      if(SDA)    bval=bval|0x01;
 124   2                      I2cDelay();
 125   2                      SCL=0;
 126   2              }
 127   1              I2cDelay(); 
 128   1              SDA=1;  //确认脉冲周期,不送出确认
 129   1              I2cDelay();
 130   1              SCL=1; 
 131   1              I2cDelay(); 
 132   1              I2cDelay();
 133   1              return(bval);
 134   1      }
 135          //以下是从EEPROM读入1字节数据函数
 136          unsigned char myread(unsigned char address) 
 137          {
 138   1              unsigned char tmp;
 139   1              Start();
 140   1              SendByte(0xa0); 
 141   1              SendByte(address); 
 142   1              Start();
 143   1              SendByte(0xa1);
 144   1              tmp=ReadByte();
 145   1              Stop();
 146   1              DelayX1ms(2);
 147   1              return(tmp);
 148   1      }
 149          
 150          
 151          //以下是定时器0中断程序,用于走时,1/8000秒一次
 152          void Timer0ISR(void) interrupt 1 using 3 
 153          {
 154   1              unsigned char tmp; unsigned int tmp_days;
 155   1              P3=~P3;
 156   1              count_down--;
 157   1              if(count_down==1 || count_down==1001 || count_down==2001 || count_down==3001)
 158   1              {
 159   2                      flash=~flash;                //数码管闪烁的开关量
 160   2                      if(sound && flash)
 161   2                  sound_output=0;                      //驱动蜂鸣器
 162   2                      else  sound_output=1;        //关闭蜂鸣器
 163   2                      return;
 164   2              }
 165   1      /*** 计算当前日期为星期几***/ 
 166   1       if(count_down==1500)
 167   1      {
 168   2              if(year==0)       weekday=5;    //2000年1月1日为星期六
 169   2              else { 
 170   3                              tmp=(year-1)/4+1;
 171   3                              tmp=(year-tmp)+tmp*2;
 172   3                              weekday=(tmp+5)%7;
 173   3                        }      //计算出当前年的1月1日为星期几
 174   2      
 175   2              tmp_days=0;
 176   2              for(tmp=1;tmp<month;tmp++)
 177   2              if(tmp==1 || tmp==3 || tmp==5 || tmp==7 || tmp==8 || tmp==10 || tmp==12)
 178   2              tmp_days=tmp_days+31;
 179   2              else if(tmp==4 || tmp==6 || tmp==9 || tmp==11)
C51 COMPILER V8.06   CLOCK                                                                 04/02/2008 17:44:13 PAGE 4   

 180   2              tmp_days=tmp_days+30;
 181   2              else if(tmp==2)
 182   2              {

⌨️ 快捷键说明

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