[经验分享] DS1302

[复制链接]
 楼主| updownq 发表于 2025-5-13 13:11 | 显示全部楼层 |阅读模式
  1. #include"ds1302.h"
  2. //定义ds1302使用的IO口
  3. sbit DS1302_IO=P3^4;
  4. sbit DS1302_RST=P3^5;
  5. sbit DS1302_SCLK=P3^6;

  6. u8 DS1302_TIME[7]; //存放读取的时间

  7. /*
  8. 函数功能: 将十进制数据转为BCD码
  9. */
  10. u8 DEC_TO_BCD(u8 val)
  11. {
  12.         return ((val/10)<<4)+val%10;
  13. }

  14. /*
  15. 函数功能: 将BCD码数据转为十进制格式
  16. */
  17. u8 BCD_TO_DEC(u8 val)
  18. {
  19.         return (val&0x0f)+(val>>4)*10;
  20. }

  21. void DS1302_Init(void)
  22. {
  23.    DS1302_RST=0;
  24.    DS1302_SCLK=0;//先将DS1302_SCLK置低电平。
  25. }

  26. /*
  27. 函数功能: 向DS1302指定寄存器里写一个字节数据
  28. */
  29. void DS1302_WriteByte(u8 addr,u8 dat)
  30. {
  31.         u8 n;
  32.         DS1302_RST=1; //然后将DS1302_RST(CE)置高电平。
  33.     /*1. 设置写入的地址*/
  34.         for(n=0;n<8;n++)
  35.         {
  36.                 DS1302_IO=addr&0x01;//数据从低位开始传送
  37.                 addr>>=1;
  38.                 DS1302_SCLK=1;//数据在上升沿时,DS1302读取数据
  39.                 DS1302_SCLK=0;
  40.         }
  41.    
  42.     /*2. 写入数据*/
  43.         for(n=0;n<8;n++)
  44.         {
  45.                 DS1302_IO=dat&0x01;
  46.                 dat>>=1;
  47.                 DS1302_SCLK=1;//数据在上升沿时,DS1302读取数据
  48.                 DS1302_SCLK=0;
  49.         }       
  50.         DS1302_RST=0;//传送数据结束
  51. }

  52. /*
  53. 函数功能: 从DS1302指定寄存器里读取一个字节数据
  54. */
  55. u8 DS1302_ReadByte(u8 addr)
  56. {
  57.         u8 n=0,dat=0;
  58.         DS1302_RST=1;   //然后将DS1302_RST(CE)置高电平。
  59.     /*1. 设置读取的地址*/
  60.         for(n=0;n<8;n++)
  61.         {
  62.                 DS1302_IO=addr&0x01;//数据从低位开始传送
  63.                 addr>>=1;
  64.                 DS1302_SCLK=1;//数据在上升沿时,DS1302读取数据
  65.                 DS1302_SCLK=0;//DS1302下降沿时,放置数据
  66.         }
  67.     /*2. 读取数据*/
  68.         for(n=0;n<8;n++)
  69.         {
  70.         dat>>=1;
  71.         if(DS1302_IO)dat|=0x80;
  72.                 DS1302_SCLK=1;
  73.                 DS1302_SCLK=0;//DS1302下降沿时,放置数据
  74.         }
  75.         DS1302_RST=0;
  76.     //必须的操作,复位时间
  77.         DS1302_IO=0;
  78.         DS1302_IO=1;
  79.         return dat;       
  80. }

  81. /*
  82. 函数功能: 设置DS1302芯片的时间
  83. DS1302的时间基准是从2000年开始的,设置年份时要减去2000再传入设置
  84. 例如:DS1302_WriteTime(20,1,18,14,46,20,6);
  85. */
  86. void DS1302_WriteTime(u8 year,u8 mon,u8 mday,u8 hour,u8 min,u8 sec,u8 week)
  87. {
  88.         DS1302_WriteByte(0x8E,0x00); //禁止写保护,就是关闭写保护功能       
  89.     DS1302_WriteByte(0x8c,DEC_TO_BCD(year)); //设置年       
  90.     DS1302_WriteByte(0x88,DEC_TO_BCD(mon));  //设置月       
  91.     DS1302_WriteByte(0x86,DEC_TO_BCD(mday)); //设置日       
  92.     DS1302_WriteByte(0x84,DEC_TO_BCD(hour)); //设置时       
  93.     DS1302_WriteByte(0x82,DEC_TO_BCD(min));  //设置分       
  94.     DS1302_WriteByte(0x80,DEC_TO_BCD(sec));  //设置秒       
  95.     DS1302_WriteByte(0x8a,DEC_TO_BCD(week)); //设置星期       
  96.         DS1302_WriteByte(0x8E,0x80);                     //打开写保护功能
  97. }

  98. /*
  99. 函数功能: 读取DS1302时钟的时间
  100. DS1302寄存器的最低位是读写位,0是写,1是读
  101. */
  102. void DS1302_ReadTime(void)
  103. {
  104.     DS1302_TIME[0]=BCD_TO_DEC(DS1302_ReadByte(0x8c|0x01));//读取年
  105.     DS1302_TIME[1]=BCD_TO_DEC(DS1302_ReadByte(0x88|0x01));//读取月
  106.     DS1302_TIME[2]=BCD_TO_DEC(DS1302_ReadByte(0x86|0x01));//读取日       
  107.     DS1302_TIME[3]=BCD_TO_DEC(DS1302_ReadByte(0x84|0x01));//读取时
  108.     DS1302_TIME[4]=BCD_TO_DEC(DS1302_ReadByte(0x82|0x01));//读取分       
  109.     DS1302_TIME[5]=BCD_TO_DEC(DS1302_ReadByte(0x80|0x01));//读取秒       
  110.     DS1302_TIME[6]=BCD_TO_DEC(DS1302_ReadByte(0x8a|0x01));//读取星期
  111. }


您需要登录后才可以回帖 登录 | 注册

本版积分规则

57

主题

3461

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

57

主题

3461

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部