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

📄 222.lst

📁 ds1302温度测试
💻 LST
字号:
C51 COMPILER V8.02   222                                                                   03/20/2009 17:22:44 PAGE 1   


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

line level    source

   1          /**************************************************************
   2            名称:DS1302_TIME_LED
   3            说明:向1302写入起始时间"2008.09.06","14:18:58",并在8位数码管上显示
   4                   (分两次显示,第1显示年月日,第2显示当前时间)
   5            功能:熟练掌握对1302的读写操作。并用其计时
   6            调用:
   7            输入值:写入数据"2008.09.06","14:18:58"
   8            返回值:
   9          
  10          ****************************************************************/
  11          
  12          #include<reg51.h>
  13          
  14          #define uint unsigned int
  15          #define uchar unsigned char
  16          
  17          
  18          /*******************************************************************
  19          分别定义控制,年,月,日,时,分,秒寄存器的写数据地址
  20          *******************************************************************/
  21          #define control_add   0x8e                              //写保护地址
  22          #define year_add      0x8c                   
  23          #define month_add     0x88                     
  24          #define date_add      0x86                    
  25          #define hour_add      0x84                     
  26          #define min_add       0x82                     
  27          #define second_add    0x80 
  28          
  29          /*****************************************************************
  30          定义起始时间的数据"2008.09.06","14:18:58"
  31          ******************************************************************/
  32          #define control_unprotect    0x00           //允许写数据
  33          #define year_data            0x08           //"08"年
  34          #define month_data           0x09           //"09"月
  35          #define date_data            0x06           //"06"号
  36          #define hour_data            0x14           //"14"点
  37          #define min_data             0x58           //"58"分
  38          #define second_data          0x58           //"58"秒,同时开始开启时钟
  39          
  40                                                  
  41          
  42          uchar data_1byte;                               //定义1字节数据
  43          uchar data_1burst;                              //定义数据
  44          uchar data_buffer1[20];                         //定义读取到的年,月,日,时,分,秒数据缓冲区
  45          uchar data_buffer2[14]={2,0,0};                    //定义显示数据缓冲区
  46          uint flag;   
  47          uchar addar;                                    //定义地址
  48          uchar month;
  49          uchar display_buffer[8];                        //定义显示数据缓冲区
  50          uchar code duan_ma[]={0x03,0x9f,0x25,0x0d,0x99,
  51                               0x49,0x41,0x1f,0x01,0x09};
  52                                                          //段码,对应的数字0-9十个数
  53          
  54          sbit  DS1302_SCLK=P1^4;                           //实时时钟控制引脚
  55          sbit  DS1302_IO=P1^5;                             //数据输入、输出引脚
C51 COMPILER V8.02   222                                                                   03/20/2009 17:22:44 PAGE 2   

  56          sbit  DS1302_RST=P1^7;
  57          sbit  HC595_RCK=P3^2;                         //定义74HC595的移位脉冲端
  58          sbit  BIT7=ACC^7;
  59          
  60          
  61          
  62          /**************************************************************
  63          us级延时子程序
  64          ***************************************************************/
  65          void delay_us(uchar i)
  66          {
  67   1        for(i=250;i>0;i--)
  68   1              ;
  69   1      }
  70          
  71          
  72          /**************************************************************
  73          MS级延时子程序
  74          ***************************************************************/
  75          void delay_ms(uchar i)
  76          {
  77   1        uchar j;
  78   1        for(i;i>0;i--)
  79   1        for(j=83;j>0;j--)
  80   1              ;
  81   1      }
  82          
  83          
  84          /************************************************************
  85            名称: write_1302_1byte
  86            说明: 发送1byte数据子程序
  87            功能: 该指令完成对1302的地址或数据1byte的写操作
  88            调用:
  89            输入值:1byte数据
  90            返回值:无
  91          *************************************************************/
  92          void  write_1302_1byte(uchar j)
  93          {
  94   1        uint i;
  95   1        for(i=8;i>0;i--)
  96   1         {
  97   2           if(j&0x01==0x01)
  98   2            {DS1302_IO=1;}                   //从A的最低位开始依次发送
  99   2           else 
 100   2            {DS1302_IO=0;}
 101   2               DS1302_SCLK=1;                    //置写移位脉冲有效
 102   2           DS1302_SCLK=0;
 103   2           j=(j>>1);
 104   2         }
 105   1      }
 106          
 107          
 108          
 109          
 110          /***********************************************************
 111            名称: read_1302_1byte
 112            说明: 读取1byte数据子程序
 113            功能: 该指令完成对1302的地址或数据1byte的读操作
 114            调用:
 115            输入值:1byte数据
 116            返回值:ACC
 117          ************************************************************/
C51 COMPILER V8.02   222                                                                   03/20/2009 17:22:44 PAGE 3   

 118            read_1302_1byte(void)
 119          {  
 120   1          uint i;
 121   1              uchar temp;
 122   1          for(i=0;i<8;++i)
 123   1              {
 124   2             temp=temp>>1;                        //把前一次读取的数据右移一位,下次读取的数据保存到第7位
 125   2                if(DS1302_IO==1)                    //读取1byte的数据保持到temp中
 126   2                 {temp|=0x80;}
 127   2                 else
 128   2                 {temp&=0x7f;}
 129   2                  DS1302_SCLK=1;                    //置读移位脉冲有效
 130   2              DS1302_SCLK=0;
 131   2               }
 132   1               return(temp);
 133   1      }
 134            
 135          
 136          
 137          /************************************************************
 138            名称:write_1302
 139            说明:先写地址,再写数据
 140            功能:完成对1302的写操作
 141            调用:write_1302_1byte()
 142            输入值:地址,数据
 143            返回值:无
 144          ************************************************************/
 145          void write_1302(unsigned addar,unsigned  data_1burst)
 146          {
 147   1        DS1302_RST=0;
 148   1        delay_us(1);
 149   1        DS1302_SCLK=0;
 150   1        DS1302_RST=1;
 151   1        write_1302_1byte(addar);                     //向1302发送将要写入数据的地址
 152   1        write_1302_1byte(data_1burst);               //向1302发送将要写入的数据
 153   1        DS1302_RST=0;
 154   1      }
 155          
 156          
 157          
 158          /************************************************************
 159            名称:read_1302
 160            说明:先写地址,再读取数据
 161            功能:完成对1302的数据读取操作
 162            调用:read_1302_1byte()
 163            输入值:地址
 164            返回值:data_1burst
 165          *************************************************************/
 166          read_1302(char addar)
 167          { 
 168   1        DS1302_RST=0;
 169   1        delay_us(1);
 170   1        DS1302_SCLK=0;
 171   1        DS1302_RST=1;
 172   1        write_1302_1byte(addar|0x01);                          //向1302发送将要读取数据的地址        
 173   1        data_buffer1[0]=read_1302_1byte();                      //把从1302读取到的数据保存到数据缓冲区
 174   1        DS1302_RST=0;
 175   1      }
 176          
 177          
 178          
 179          
C51 COMPILER V8.02   222                                                                   03/20/2009 17:22:44 PAGE 4   

 180          /************************************************************
 181          名称:DS1302_Write_Time
 182          说明:把设定的时间初值写入相应的寄存器中
 183          功能:完成对1302的初始时间设定,并打开写保护
 184          调用:write_1302()
 185          输入值:"2008.09.06","14:18:58"
 186          返回值:无
 187          ************************************************************/
 188                 DS1302_Write_Time()
 189          {
 190   1        read_1302(0x8e);                                       //读取控制寄存器的当前状态
 191   1        if(data_buffer1[0]!=0x80)                              //判断控制寄存器是否写保护
 192   1          {                                                    //没有写保护,则开始写数据
 193   2                write_1302(control_add,0x00);
 194   2            write_1302(year_add,year_data);
 195   2            write_1302(month_add,month_data);
 196   2            write_1302(date_add,date_data);
 197   2            write_1302(hour_add,hour_data);
 198   2            write_1302(min_add,min_data);
 199   2            write_1302(second_add,second_data);
 200   2            write_1302(control_add,0x80);                       //禁止写数据到1302,即开启写保护                                                
 201   2               }
 202   1      }
 203          
 204          
 205          
 206          
 207          /*************************************************************
 208          名称:DS1302_Read_Time
 209          说明:从1302中读取当前各寄存器的数据
 210          功能:读取当前的时间,并把数据保存以便显示
 211          调用:read_1302
 212          输入值:各寄存器地址
 213          返回值:data_buffer[20]
 214          **************************************************************/
 215          void  DS1302_Read_Time()
 216          {
 217   1        uint i;
 218   1        month=0x88;
 219   1        read_1302 (year_add);                            //依次读取当前的年
 220   1        data_buffer1[1]=data_buffer1[0];
 221   1        for(i=2;i<7;i++)
 222   1        {
 223   2          read_1302 (month);                           //依次读取当前的月,日,时,分,秒
 224   2              data_buffer1[i]=data_buffer1[0];
 225   2          month=(month-2);
 226   2         }
 227   1      
 228   1      }
 229          
 230          
 231          
 232          
 233          /******************************************************
 234          名称: Data_processing
 235          说明: 把从1302读取到的数据个,十位分离,以便显示
 236          功能: 读取到的16进制转换成10进制
 237          调用: 
 238          输入值

⌨️ 快捷键说明

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