找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 460|回复: 0
打印 上一主题 下一主题
收起左侧

基于51单片机RX8010SJ时钟

[复制链接]
跳转到指定楼层
楼主
ID:1123037 发表于 2024-5-30 17:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
常见51单片机时钟用的是DS1302,也有很多视频教程。工作中碰见用到RX8010SJ时钟,查阅相关资料,结合网上案例,总结出以下下代码。


RX8010SJ.c
  1. #include "RX8010.h"                                                   
  2. #include "I2C.h"
  3. #include "DELAY.H"

  4. Calendar_OBJ calendar;

  5. //unsigned char BCD2HEX(unsigned char val)
  6. //{
  7. //    unsigned char i;
  8. //    i= val&0x0f;
  9. //    val >>= 4;
  10. //    val &= 0x0f;
  11. //    val *= 10;
  12. //    i += val;
  13. //    return i;
  14. //}

  15. unsigned short B_BCD(unsigned char val)
  16. {
  17.     unsigned char i,j,k;
  18.     i=val/10;
  19.     j=val%10;
  20.     k=j+(i<<4);
  21.     return k;
  22. }

  23. /**************时钟芯片初始化************/
  24. void RX8010_Init(void)
  25. {        
  26. //   I2C_Init();
  27.         RX8010_Write_Bytes(0x1D,0);
  28.         Delay_ms(2);
  29.         RX8010_Write_Bytes(0x1E,0);
  30.         Delay_ms(2);
  31.         RX8010_Write_Bytes(0x1F,0);
  32.         Delay_ms(2);
  33. }

  34. /**************向RAM指定地址写入数据************/
  35. //slv_addr  器件地址
  36. //sub_addr  内部寄存器地址
  37. void RX8010_Write_Bytes(unsigned char sub_addr,unsigned char bytedata)
  38. {
  39.                 I2C_Start(); //*发送启动信号*/
  40.                 I2C_WriteAbyte(RX8010_WRITE);//*发送SLA+W*///0x64
  41.                 I2C_Check_ACK();
  42.                 I2C_WriteAbyte(sub_addr);
  43.                 I2C_Check_ACK();
  44.                 I2C_WriteAbyte(bytedata);
  45.                 I2C_Check_ACK();
  46.                 I2C_Stop();
  47. }

  48. /**************从RAM指定地址读出数据************/
  49. //slv_addr  器件地址
  50. //sub_addr  内部寄存器地址
  51. unsigned char RX8010_Read_Bytes(unsigned char sub_addr)
  52. {
  53.                 unsigned char Dat = 0;
  54.                 I2C_Start();
  55.                 I2C_WriteAbyte(RX8010_WRITE);
  56.                 I2C_Check_ACK();
  57.                 I2C_WriteAbyte(sub_addr);
  58.                 I2C_Check_ACK();
  59.                 I2C_Start();
  60.                 I2C_WriteAbyte(RX8010_READ);
  61.                 I2C_Check_ACK();
  62.                 Dat = I2C_ReadAbyte();
  63.                 I2C_Stop();
  64.                 return Dat;
  65. }

  66. /**************向时钟写入时间************/
  67. void Set_RX8010SJ_Time(unsigned char yea,unsigned char mon,unsigned char da,unsigned char hou,unsigned char min,unsigned char sec,unsigned char week)
  68. {
  69.         unsigned char temp = 0;

  70.         temp=B_BCD(yea);
  71.     RX8010_Write_Bytes(0x16,temp);

  72.     temp=B_BCD(mon);
  73.     RX8010_Write_Bytes(0x15,temp);

  74.     temp=B_BCD(da);
  75.     RX8010_Write_Bytes(0x14,temp);

  76.     temp=B_BCD(hou);
  77.     RX8010_Write_Bytes(0x12,temp);

  78.     temp=B_BCD(min);
  79.     RX8010_Write_Bytes(0x11,temp);

  80.     temp=B_BCD(sec);
  81.     RX8010_Write_Bytes(0x10,temp);

  82.     temp=B_BCD(week);
  83.     RX8010_Write_Bytes(0x13,temp);
  84. }

  85. /**************从时钟读出时间************/
  86. void Get_RX8010SJ_Time(void)
  87. {
  88.     calendar.w_year=RX8010_Read_Bytes(0x16);  
  89. //    calendar.w_year=BCD2HEX(calendar.w_year);

  90.     calendar.w_month=RX8010_Read_Bytes(0x15);
  91. //    calendar.w_month=BCD2HEX(calendar.w_month);

  92.     calendar.w_date=RX8010_Read_Bytes(0x14);  
  93. //    calendar.w_date=BCD2HEX(calendar.w_date);

  94.     calendar.hour=RX8010_Read_Bytes(0x12);
  95. //  calendar.hour&=0x3f;                  
  96. //    calendar.hour=BCD2HEX(calendar.hour);

  97.     calendar.min=RX8010_Read_Bytes(0x11);
  98. //    calendar.min=BCD2HEX(calendar.min);

  99.     calendar.sec=RX8010_Read_Bytes(0x10);
  100. //    calendar.sec=BCD2HEX(calendar.sec);

  101.     calendar.week=RX8010_Read_Bytes(0x13);
  102. //    calendar.week=BCD2HEX(calendar.week);

  103. }


复制代码
  1. #ifndef _BSP_RTC_H
  2. #define _BSP_RTC_H

  3. #include <STC15F2K60S2.H>


  4. #define RX8010_READ   0x65
  5. #define RX8010_WRITE  0x64


  6. // register address , for RX-8010SJ
  7. #define RX8010_ADDR_SECOND      ( 0x10 )
  8. #define RX8010_ADDR_MINUTE      ( 0x11 )
  9. #define RX8010_ADDR_HOUR        ( 0x12 )
  10. #define RX8010_ADDR_WEEK        ( 0x13 )
  11. #define RX8010_ADDR_DATE        ( 0x14 )
  12. #define RX8010_ADDR_MONTH       ( 0x15 )
  13. #define RX8010_ADDR_YEAR        ( 0x16 )
  14. #define RX8010_ADDR_RSV17       ( 0x17 )
  15. #define RX8010_ADDR_ALM_MINUTE  ( 0x18 )
  16. #define RX8010_ADDR_ALM_HOUR    ( 0x19 )
  17. #define RX8010_ADDR_ALM_WEEK    ( 0x1A )
  18. #define RX8010_ADDR_ALM_DATE    ( 0x1A )
  19. #define RX8010_ADDR_TMR_CNT0    ( 0x1B )
  20. #define RX8010_ADDR_TMR_CNT1    ( 0x1C )
  21. #define RX8010_ADDR_EXT_REG     ( 0x1D )
  22. #define RX8010_ADDR_FLAG_REG    ( 0x1E )
  23. #define RX8010_ADDR_CTRL_REG    ( 0x1F )

  24. typedef struct
  25. {
  26.     unsigned char    hour;
  27.     unsigned char    min;
  28.     unsigned char    sec;            
  29.     unsigned int     w_year;
  30.     unsigned char    w_month;
  31.     unsigned char    w_date;
  32.     unsigned char    week;        
  33.     unsigned char    temper_H;
  34.     unsigned char    temper_L;
  35. }Calendar_OBJ;

  36. extern Calendar_OBJ calendar;    //日历结构体
  37. extern unsigned char const mon_table[12];    //月份日期数据表

  38. void RX8010_Write_Bytes(unsigned char sub_addr,unsigned char bytedata);
  39. unsigned char RX8010_Read_Bytes(unsigned char sub_addr);
  40. void RX8010SJ_Init(void);
  41. void Get_RX8010SJ_Time(void);      
  42. void Set_RX8010SJ_Time(unsigned char syear,unsigned char smon,unsigned char sday,unsigned char hour,unsigned char min,unsigned char sec,unsigned char week);//设置时间

  43. #endif

复制代码
main.c
  1. #include <STC15F2K60S2.H>
  2. #include "LCD1602.h"//??LCD1602???
  3. #include "RX8010.h"//??DS1302???

  4. bit flag200ms = 0;       //200ms定时标志
  5. unsigned char T0RH = 0;  //T0重载值的高字节
  6. unsigned char T0RL = 0;  //T0重载值的低字节

  7. void ConfigTimer0(unsigned int ms);

  8. int main(void)
  9. {
  10.     unsigned char t = 0xAA;
  11.         unsigned char str[12];   //字符串转换缓冲区
  12.     EA = 1;           //开总中断
  13.     ConfigTimer0(1);  //T0定时1ms
  14. //    RX8010SJ_Init();  //初始化实时时钟
  15.     LCD_Init();    //初始化液晶
  16.         Set_RX8010SJ_Time(21,7,1,10,00,00,4);  

  17.         
  18.     while (1)
  19.     {
  20.                 if(flag200ms)
  21.                 {
  22.                         flag200ms = 0;
  23.                         Get_RX8010SJ_Time();

  24.                         if(t != calendar.sec)
  25.                         {
  26.                                 str[0] = '2';
  27.                                 str[1] = '0';
  28.                                 str[2] = (calendar.w_year >> 4) + '0';
  29.                                 str[3] = (calendar.w_year & 0x0F) + '0';
  30.                                 str[4] = '-';
  31.                                 str[5] = (calendar.w_month >> 4) + '0';
  32.                                 str[6] = (calendar.w_month & 0x0F) + '0';
  33.                                 str[7] = '-';
  34.                                 str[8] = (calendar.w_date >> 4) + '0';
  35.                                 str[9] = (calendar.w_date & 0x0F) + '0';
  36.                                 str[10] = '\0';
  37.                                 LCD_ShowString(0, 0, str);

  38.                                 str[0] = ( calendar.week & 0x0F) + '0';
  39.                                 str[1] = '\0';
  40.                                 LCD_ShowString(11, 0, "week");
  41.                                 LCD_ShowString(15, 0, str);

  42.                                 str[0] = (calendar.hour >> 4) + '0';
  43.                                 str[1] = (calendar.hour & 0x0F) + '0';
  44.                                 str[2] = ':';
  45.                                 str[3] = (calendar.min >> 4) + '0';
  46.                                 str[4] = (calendar.min & 0x0F) + '0';
  47.                                 str[5] = ':';
  48.                                 str[6] = (calendar.sec >> 4) + '0';
  49.                                 str[7] = (calendar.sec & 0x0F) + '0';
  50.                                 str[8] = '\0';
  51.                                 LCD_ShowString(4, 1, str);

  52.                                 t = calendar.sec;
  53.                         }
  54.                 }
  55.         
  56.     }
  57. }
  58. /* 配置并启动T0,ms-T0定时时间 */
  59. void ConfigTimer0(unsigned int ms)
  60. {
  61.     unsigned long tmp;  //临时变量
  62.    
  63.     tmp = 11059200 / 12;      //定时器计数频率
  64.     tmp = (tmp * ms) / 1000;  //计算所需的计数值
  65.     tmp = 65536 - tmp;        //计算定时器重载值
  66.     tmp = tmp + 12;           //补偿中断响应延时造成的误差
  67.     T0RH = (unsigned char)(tmp>>8);  //定时器重载值拆分为高低字节
  68.     T0RL = (unsigned char)tmp;
  69.     TMOD &= 0xF0;   //清零T0的控制位
  70.     TMOD |= 0x01;   //配置T0为模式1
  71.     TH0 = T0RH;     //加载T0重载值
  72.     TL0 = T0RL;
  73.     ET0 = 1;        //使能T0中断
  74.     TR0 = 1;        //启动T0
  75. }
  76. /* T0中断服务函数,执行200ms定时 */
  77. void InterruptTimer0() interrupt 1
  78. {
  79.     static unsigned char tmr200ms = 0;
  80.    
  81.     TH0 = T0RH;  //重新加载重载值
  82.     TL0 = T0RL;
  83.     tmr200ms++;
  84.     if (tmr200ms >= 200)  //定时200ms
  85.     {
  86.         tmr200ms = 0;
  87.         flag200ms = 1;
  88.     }
  89. }
复制代码





评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表