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

📄 ds1302.lst

📁 C51编写的DS1302时钟芯片驱动程序
💻 LST
字号:
C51 COMPILER V7.01  DS1302                                                                 11/14/2007 11:43:08 PAGE 1   


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

stmt level    source

   1          /*********************************************************************************************/
   2          /*                 读入或写入 DATE(0--6)  ,分别是:秒,分,时,日,月,年年 .                      */
   3          /*                    例如  写入 2003.02.14 08:34:12  (晶振11.0592MHz)                       */
   4          /*                date[0]=12;date[1]=34;date[2]=8;date[3]=14;date[4]=2;date[5]=3;            */
   5          /*********************************************************************************************/
   6          #include <reg52.h>
   7          #include <intrins.h>
   8          /*-------------------------------------------------------------------------------------------*/
   9          #define uchar unsigned char
  10          #define uint  unsigned int
  11          /*-------------------------------------------------------------------------------------------*/
  12          sbit SCLK=P1^0;
  13          sbit IO=P1^1;
  14          sbit REST=P1^2;
  15          /*********************************************************************************************/
  16          void date_write(uchar con1)            // 串行写入
  17          {
  18   1                uchar i;
  19   1            /*-------------------------------------------------*/
  20   1                REST=1;                          // 片选 
  21   1            /*-------------------------------------------------*/
  22   1                for (i=1;i<=8;i++)               // 一次送8 BIT 
  23   1            {
  24   2                   SCLK=0;
  25   2                   if ((con1 & 0x01)==1) IO=1;else IO=0;
  26   2                   con1=_cror_(con1,1);         // 移位 
  27   2                   SCLK=1;
  28   2                }
  29   1      }
  30          /*---------------------------------------------------------------------------*/
  31          uchar data_read()                      // 串行读出
  32          {
  33   1               uchar j;
  34   1               uchar data_ol,data_oh;
  35   1           /*-------------------------------*/
  36   1           REST=1;
  37   1           /*-------------------------------*/
  38   1           data_ol=0;
  39   1               for(j=1;j<=4;j++)             // 收低4 位 
  40   1           {
  41   2                  SCLK=0;
  42   2                  if (IO==1) data_ol |=0x10;
  43   2                  data_ol=_cror_(data_ol,1);
  44   2                  SCLK=1;
  45   2               }
  46   1           /*-----------------------------------------*/
  47   1               data_oh=0;
  48   1               for (j=1;j<=4;j++)            // 收高4 位 
  49   1           {
  50   2              SCLK=0;
  51   2                  if (IO==1) data_oh |=0x10;
  52   2                  data_oh=_cror_(data_oh,1);
  53   2                  SCLK=1;
  54   2               }
  55   1           /*-------------------------------*/
C51 COMPILER V7.01  DS1302                                                                 11/14/2007 11:43:08 PAGE 2   

  56   1           return(data_ol+data_oh*10); // 变成二进制数,送入数组 
  57   1      }
  58          /*============================================================================*/
  59          void write_ds1302(uchar *date)                // 写入数据 
  60          {
  61   1           uchar n;
  62   1           /*--------------------------------------------------------------*/
  63   1           if (date[0]>60) date[0]=0;       // 限制在0秒
  64   1           if (date[1]>60) date[1]=1;       // 限制在1分
  65   1           if (date[2]>24) date[2]=1;       // 限制在1点
  66   1           if ((date[3]>31)||(date[3]==0)) date[3]=1;       // 限制1日
  67   1           if ((date[4]>12)||(date[4]==0)) date[4]=1;       // 限制在1月
  68   1           /*--------------------------------------------------------------*/
  69   1               /*         下一位表示星期,我们不用,再下位表示年,再补0                */
  70   1           /*--------------------------------------------------------------*/
  71   1           date_write(0x8e);         // 写允许  
  72   1           date_write(0x00);
  73   1           REST=0;
  74   1           SCLK=0;
  75   1           /*--------------------------------------------------------------*/
  76   1           for (n=0;n<=6;n++)
  77   1           {
  78   2              date[n]=(date[n]/10)*0x10+date[n]%10;   //高于10的倍数上移至高四位
  79   2           }
  80   1           /*--------------------------------------------------------------*/
  81   1               date_write(0xbe);                                          //串行发送连续写入命令
  82   1           /*--------------------------------------------------------------*/
  83   1               for (n=0;n<=4;n++)     date_write(date[n]);    //先不写星期和年
  84   1               date_write(1);                                                         //星期一
  85   1               date_write(date[5]);                                           //星期写入年
  86   1               date_write(0);                                                 //星期写入年
  87   1           /*--------------------------------------------------------------*/
  88   1           REST=0;
  89   1           SCLK=0;
  90   1           /*--------------------------------------------------------------*/
  91   1           date_write(0x8e);         // 写禁止 
  92   1           date_write(0x80);
  93   1           REST=0;
  94   1           SCLK=0;
  95   1           /*--------------------------------------------------------------*/
  96   1      }
  97          /*============================================================================*/
  98          void read_ds1302(uchar *date)   //读到时间
  99          {
 100   1           uchar n;
 101   1           /*--------------------------------------------------------------*/
 102   1           date_write(0xbf);
 103   1               for (n=0;n<=4;n++) date[n]=data_read();   //读前四位
 104   1               n=data_read();
 105   1               date[5]=data_read();      //读年(加上2000才是真实年份) 
 106   1               n=data_read();
 107   1           /*--------------------------------------------------------------*/
 108   1           REST=0;
 109   1           SCLK=0;
 110   1           /*--------------------------------------------------------------*/
 111   1      }
 112          /*----------------------------------------------------------------------------*/
 113          void reset_ds1302()              //初始化1302
 114          {
 115   1           /*--------------------------------------------------------------*/
 116   1           date_write(0x8e);            // 写允许  
 117   1           date_write(0x00);
C51 COMPILER V7.01  DS1302                                                                 11/14/2007 11:43:08 PAGE 3   

 118   1           REST=0;
 119   1           SCLK=0;
 120   1           /*--------------------------------------------------------------*/
 121   1           date_write(0x80);           // 启动震荡器
 122   1           date_write(0x00);
 123   1           REST=0;
 124   1           SCLK=0;
 125   1           /*--------------------------------------------------------------*/
 126   1           date_write(0x90);           // 设置备用电池充电电流
 127   1           date_write(0xa5);
 128   1           REST=0;
 129   1           SCLK=0;
 130   1           /*--------------------------------------------------------------*/
 131   1           date_write(0x8e);           // 写禁止 
 132   1           date_write(0x80);
 133   1           REST=0;
 134   1           SCLK=0;
 135   1           /*--------------------------------------------------------------*/
 136   1      }
 137          /*********************************************************************************************/
 138          


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