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

📄 ds1302.lst

📁 DS1302时钟+DS18B20程序 LCD1602显示 51单片机 keil 环境 和大家分享共同学习
💻 LST
📖 第 1 页 / 共 4 页
字号:
 203   1          DS1302InputByte(ucAddr|0x01);        // 地址,命令 
 204   1          ucData = DS1302OutputByte();         // 读1Byte数据
 205   1          DS1302_CLK = 1;
 206   1          DS1302_RST = 0;
 207   1          return(ucData);
 208   1      }
 209          
 210          
 211          
 212          void DS1302_GetTime(SYSTEMTIME *Time)  //获取时钟芯片的时钟数据到自定义的结构型数组
 213          {
 214   1              unsigned char ReadValue;
 215   1              ReadValue = Read1302(DS1302_SECOND);
 216   1              Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 217   1              ReadValue = Read1302(DS1302_MINUTE);
 218   1              Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 219   1              ReadValue = Read1302(DS1302_HOUR);
 220   1              Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 221   1              ReadValue = Read1302(DS1302_DAY);
 222   1              Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);        
 223   1              ReadValue = Read1302(DS1302_WEEK);
 224   1              Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 225   1              ReadValue = Read1302(DS1302_MONTH);
 226   1              Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 227   1              ReadValue = Read1302(DS1302_YEAR);
 228   1              Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);       
 229   1      }
 230          
 231          void DateToStr(SYSTEMTIME *Time)    //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]
 232          {   if(hide_year<2)                 //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2
             -007/07/22
 233   1          {                               
 234   2                Time->DateString[0] = '2';
 235   2                Time->DateString[1] = '0';     
 236   2                Time->DateString[2] = Time->Year/10 + '0';
 237   2                Time->DateString[3] = Time->Year%10 + '0';
 238   2              }
 239   1                else
 240   1                  { 
C51 COMPILER V8.02   DS1302                                                                05/12/2008 20:13:04 PAGE 5   

 241   2                    Time->DateString[0] = ' ';
 242   2                    Time->DateString[1] = ' ';                 
 243   2                    Time->DateString[2] = ' ';
 244   2                    Time->DateString[3] = ' ';
 245   2                      }
 246   1              Time->DateString[4] = '/';
 247   1              if(hide_month<2)
 248   1              {
 249   2                Time->DateString[5] = Time->Month/10 + '0';
 250   2                Time->DateString[6] = Time->Month%10 + '0';
 251   2              }
 252   1                else
 253   1                {
 254   2                  Time->DateString[5] = ' ';
 255   2                  Time->DateString[6] = ' ';
 256   2                }
 257   1              Time->DateString[7] = '/';
 258   1              if(hide_day<2)
 259   1              {
 260   2                Time->DateString[8] = Time->Day/10 + '0';
 261   2                Time->DateString[9] = Time->Day%10 + '0';
 262   2              }
 263   1                else
 264   1                {
 265   2                  Time->DateString[8] = ' ';
 266   2                  Time->DateString[9] = ' ';      
 267   2                }
 268   1              if(hide_week<2)
 269   1              {
 270   2                week_value[0] = Time->Week%10 + '0';  //星期的数据另外放到 week_value[]数组里,跟年,月,日的分开存放,因为
             -等一下要在最后显示
 271   2              }
 272   1                else
 273   1                {
 274   2                  week_value[0] = ' ';
 275   2                }
 276   1                week_value[1] = '\0';
 277   1      
 278   1              Time->DateString[10] = '\0'; //字符串末尾加 '\0' ,判断结束字符
 279   1      }
 280          
 281          void TimeToStr(SYSTEMTIME *Time)  //将时,分,秒数据转换成液晶显示字符放到数组 TimeString[];
 282          {   if(hide_hour<2)
 283   1          {
 284   2                Time->TimeString[0] = Time->Hour/10 + '0';
 285   2                Time->TimeString[1] = Time->Hour%10 + '0';
 286   2              }
 287   1                else
 288   1                  {
 289   2                    Time->TimeString[0] = ' ';
 290   2                    Time->TimeString[1] = ' ';
 291   2                      }
 292   1              Time->TimeString[2] = ':';
 293   1          if(hide_min<2)
 294   1              {
 295   2                Time->TimeString[3] = Time->Minute/10 + '0';
 296   2                Time->TimeString[4] = Time->Minute%10 + '0';
 297   2              }
 298   1                else
 299   1                  {
 300   2                    Time->TimeString[3] = ' ';
 301   2                    Time->TimeString[4] = ' ';
C51 COMPILER V8.02   DS1302                                                                05/12/2008 20:13:04 PAGE 6   

 302   2                  }
 303   1              Time->TimeString[5] = ':';
 304   1          if(hide_sec<2)
 305   1          {
 306   2                Time->TimeString[6] = Time->Second/10 + '0';
 307   2                Time->TimeString[7] = Time->Second%10 + '0';
 308   2          }
 309   1            else
 310   1             {
 311   2               Time->TimeString[6] = ' ';
 312   2                   Time->TimeString[7] = ' ';
 313   2             }
 314   1              Time->DateString[8] = '\0';
 315   1      }
 316          
 317          
 318          void Initial_DS1302(void)   //时钟芯片初始化
 319          {   
 320   1              unsigned char Second=Read1302(DS1302_SECOND);
 321   1              if(Second&0x80)       //判断时钟芯片是否关闭      
 322   1          {
 323   2              Write1302(0x8e,0x00); //写入允许
 324   2              Write1302(0x8c,0x07); //以下写入初始化时间 日期:07/07/25.星期: 3. 时间: 23:59:55
 325   2              Write1302(0x88,0x07);
 326   2              Write1302(0x86,0x25);
 327   2              Write1302(0x8a,0x07);
 328   2              Write1302(0x84,0x23);
 329   2              Write1302(0x82,0x59);
 330   2              Write1302(0x80,0x55);
 331   2              Write1302(0x8e,0x80); //禁止写入
 332   2              }
 333   1      
 334   1      }
 335          
 336          /***********ds18b20子程序*************************/
 337          
 338          /***********ds18b20延迟子函数(晶振12MHz )*******/ 
 339          
 340          void delay_18B20(unsigned int i)
 341          {
 342   1              while(i--);
 343   1      }
 344          
 345          /**********ds18b20初始化函数**********************/
 346          
 347          void Init_DS18B20(void) 
 348          {
 349   1               unsigned char x=0;
 350   1               DQ = 1;          //DQ复位
 351   1               delay_18B20(8);  //稍做延时
 352   1               DQ = 0;          //单片机将DQ拉低
 353   1               delay_18B20(80); //精确延时 大于 480us
 354   1               DQ = 1;          //拉高总线
 355   1               delay_18B20(14);
 356   1               x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
 357   1               delay_18B20(20);
 358   1      }
 359          
 360          /***********ds18b20读一个字节**************/  
 361          
 362          unsigned char ReadOneChar(void)
 363          {
C51 COMPILER V8.02   DS1302                                                                05/12/2008 20:13:04 PAGE 7   

 364   1              uchar i=0;
 365   1              uchar dat = 0;
 366   1              for (i=8;i>0;i--)
 367   1               {
 368   2                        DQ = 0; // 给脉冲信号
 369   2                        dat>>=1;
 370   2                        DQ = 1; // 给脉冲信号
 371   2                        if(DQ)
 372   2                        dat|=0x80;
 373   2                        delay_18B20(4);
 374   2               }
 375   1              return(dat);
 376   1      }
 377          
 378          /*************ds18b20写一个字节****************/  
 379          
 380          void WriteOneChar(uchar dat)
 381          {
 382   1              unsigned char i=0;
 383   1              for (i=8; i>0; i--)
 384   1              {
 385   2                      DQ = 0;
 386   2                      DQ = dat&0x01;
 387   2              delay_18B20(5);
 388   2                      DQ = 1;
 389   2              dat>>=1;
 390   2       }
 391   1      }
 392          
 393          /**************读取ds18b20当前温度************/
 394          
 395          void ReadTemp(void)
 396          {
 397   1              unsigned char a=0;
 398   1              unsigned char b=0;
 399   1              unsigned char t=0;
 400   1      
 401   1              Init_DS18B20();
 402   1              WriteOneChar(0xCC);     // 跳过读序号列号的操作
 403   1              WriteOneChar(0x44);     // 启动温度转换
 404   1      
 405   1              delay_18B20(100);       // this message is wery important
 406   1      
 407   1              Init_DS18B20();
 408   1              WriteOneChar(0xCC);     //跳过读序号列号的操作
 409   1              WriteOneChar(0xBE);     //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
 410   1      
 411   1              delay_18B20(100);

⌨️ 快捷键说明

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