久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1118|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 蜜臀久久 | 欧美黄色性生活视频 | 国产a区 | 成人激情视频免费观看 | 精品成人| 剑来高清在线观看 | 日韩欧美三级 | 青青久久 | 国产精品久久久久久久久免费软件 | 国产日韩精品一区二区三区 | 一区二区三区亚洲 | 日韩欧美精品在线播放 | 国产一区二区三区四区 | 国产精品久久在线观看 | 成人无遮挡毛片免费看 | 欧美日韩午夜精品 | 亚洲网站在线播放 | 久久不射电影网 | 毛片一区二区三区 | 国产欧美一区二区三区在线看蜜臀 | 日韩美女在线看免费观看 | 国产精品一区二区三区在线 | 久久国产精品视频观看 | 成人免费区一区二区三区 | 在线激情视频 | 亚洲欧美视频一区 | 国产精品视频在线播放 | 国产欧美一级二级三级在线视频 | 久久久成人一区二区免费影院 | 久久久久久成人 | 亚洲精品av在线 | 国产99久久精品一区二区永久免费 | 国产一区日韩在线 | 精品国产乱码久久久久久蜜柚 | 欧美电影一区 | 久久九九色 | 国产日韩欧美在线 | 亚洲免费在线观看视频 | 天天色综 | 日韩欧美国产精品综合嫩v 一区中文字幕 | 成人小视频在线观看 |