数码之家

 找回密码
 立即注册
搜索
查看: 7669|回复: 40

[C51] 用RX8025AC制作定时控制器(源代码分享)

[复制链接]
发表于 2020-1-18 19:13:09 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 慕名而来 于 2020-1-19 16:24 编辑

一、缘起:
玩过了红外控制后闲了这久没啥感兴趣的东西,元旦前有朋友说家里老房子的水压不足加了增压泵感觉不错,只是因为只是上午有人在家、下午和晚间没人,担心原有的老管道长期保存压力在没人在的时候出问题每天拉闸挺麻烦的,我说这个问题简单呀,于是就有了此次制作,巧的是前段时间坛里有朋友在玩RX8025也跟风入了几片,不想下单时错拍了RX8025AC这种,后来又重拍了8025T,原本这东西入手时只为了玩还没找到用途,还有以前玩过的OLED0.98"屏也一直没有用处,这次就一并送人了。

二、元件清单如下:
1.单片机:STC15W408AS=1
2.显示屏:OLED12864_I2C_0.98"=1
3.RTC芯片:RX8025AC=1
4.备用电池:CR2032-3V=1
5.后备电源控制芯片:BL1551=1
6.降压稳压芯片:AMS1117_3.3V=1
7.继电器:5V继电器模块=1
8.洞洞板、电阻、电容、发光管、轻触开关
9.加工按钮=3只、明装开关盒+白盖各一个

三、系统原理图如下:
需要稍稍啰嗦几句的是我以往画电路图都是用CAXA手工画,效果真的不好,为了这次画图特意注册了力创EDA,原本只想试玩一下,不想这软件竟然可以搜索找库元件图符,所以就可以毫无障碍的玩耍了,以往玩其他软件都是因为找库难、库里的英文元件名称不认识而难以应对,这个没问题了,也建议有需要的玩玩试试,感觉真的不错。
OLED定时器原理图.jpg
原理图就凑合看吧,第一次用这个软件好多都不懂,比如“引脚”、“导线”就用不明白,感觉自画的元件好多引脚放反了,好在不在线仿真也就不求真了,慢慢会好起来的,我会努力的。
图中RX8025的SDA引脚连接在P1.0,感觉坛友 @bg4rff 指正

四、代码开源分享
废话还是要说的:虽然代码毫无技术含量但本人编程菜手调试时也耗费了许多心神,开源分享只与坛内朋友交流,请不要转帖或用于其他用途
OLED定时器.zip (215.3 KB, 下载次数: 68)





补充内容 (2021-5-13 19:43):
@zxwxh001   说附件缺少源码,我想下载来检查,结果自己下载自己的资源也提示口30M,重新分享在18楼吧

打赏

参与人数 2家元 +80 收起 理由
人艰不拆了 + 20
家睦 + 60

查看全部打赏

 楼主| 发表于 2020-1-18 19:28:29 | 显示全部楼层
如果需要完整代码就是楼上的附件了,下面贴出的是RX8025AC的代码,时钟的走时更新没有使用读秒更新的方式,而是采样了查询/INTA秒中断的方式,借鉴了坛友星期与日期绑定的思路,不对芯片内的星期寄存器进行操作了,而是通过公式换算显示星期。
  1. //------------------------------
  2. //器件读取地址:0x65
  3. //器件写入地址:0x64
  4. #include "8025AC.h"
  5. #include "Delay.h"
  6. #include <intrins.h>

  7. uchar xdata time[7]={0};//调整时间用的缓存空间、存放顺序:秒、分、时、星期、日、月、年
  8. uchar time_init[7]={0x00,0x59,0x07,0x03,0x01,0x01,0x20};//初次上电初始化时间为20-1-1 8:30:00  星期3
  9. uchar se=0,flag;
  10. uchar fen,shi,ri,yue,nian;
  11. //----IIC总线的开始信号------------
  12. void i2c_start()
  13. {
  14. SDAK=1;
  15. delay_I2C();
  16. SCLK=1;
  17. delay_I2C();
  18. SDAK=0;
  19. delay_I2C();
  20. }
  21. //----IIC总线的停止信号-----------------
  22. void i2c_stop()
  23. {
  24. SDAK=0;
  25. delay_I2C();
  26. SCLK=1;
  27. delay_I2C();
  28. SDAK=1;
  29. delay_I2C();
  30. }
  31. //----IIC总线应答函数--------------------
  32. void ack()
  33. {
  34. SDAK=0;
  35. delay_I2C();
  36. SCLK=1;
  37. delay_I2C();
  38. SCLK=0;
  39. delay_I2C();
  40. }
  41. //----IIC总线非应答函数-----------------
  42. void nack()
  43. {
  44. SDAK=1;
  45. delay_I2C();
  46. SCLK=1;
  47. delay_I2C();
  48. SCLK=0;
  49. delay_I2C();
  50. }
  51. //----IIC释放总线信号------------------
  52. void released()
  53. {
  54. SCLK=0;
  55. delay_I2C();
  56. SDAK=1;
  57. delay_I2C();
  58. }
  59. //----向总线上写一个字节数据--------------
  60. void write_dat(uchar date)
  61. {
  62. uchar i;
  63. for(i=0;i<8;i++)
  64. {
  65. date=date<<1;//将字节的第一位移入CY位
  66. SCLK=0;                        //拉低总线使数据操作有效
  67. delay_I2C();
  68. SDAK=CY;
  69. delay_I2C();
  70. SCLK=1;
  71. delay_I2C();
  72. }
  73. released();//释放总线;
  74. SCLK=0;
  75. }
  76. //----在总线上读取一个字节数据--------------
  77. uchar read_dat()
  78. {
  79. uchar i,k=0;
  80. released();//释放总线
  81. for(i=0;i<8;i++)
  82. {
  83. SCLK=1;                //锁定总线(只有在SCLK=1是SDAK是稳定数据)
  84. delay_I2C();
  85. k=(k<<1)|SDAK;
  86. SCLK=0;                //解除锁定以便读取新的位数据
  87. delay_I2C();
  88. }
  89. return k;
  90. }
  91. //----在指定寄存器中写入一个数据------------------
  92. void write_8025(uchar addr,uchar date)//(地址,数据)
  93. {
  94. //经过测试对于RX8025AC函数中的三个ack();是必须有的
  95. i2c_start();
  96. write_dat(0x64);        //指定总线上的器件(写给谁)
  97. ack();
  98. write_dat(addr<<4);                        //指定该器件中的数据寄存器地址(写到哪里)
  99. ack();
  100. write_dat(date);                        //向指定的地址写入数据(写什么)
  101. ack();
  102. i2c_stop();
  103. }
  104. //----在指定寄存器中读出一个数据------------------
  105. uchar read_8025(uchar addr)
  106. {
  107. uchar date;
  108. i2c_start();
  109. write_dat(0x64);        //指定器件(读谁的数据)
  110. ack();
  111. write_dat(addr<<4);//指定数据的位置(在哪里读)<<4|0x01
  112. ack();
  113. i2c_start();
  114. write_dat(0x65);        //使器件进入读出状态
  115. ack();
  116. date=read_dat();                        //读出数据
  117. nack();
  118. i2c_stop();
  119. return date;
  120. }
  121. //----16进制转10进制换算函数用于时钟输出--------
  122. uchar HEX_D(uchar num)
  123. {
  124. uchar L;
  125. L=(num/16)*10+(num%16);
  126. return L;
  127. }
  128. //----10进制转16进制换算函数用于时钟设置--------
  129. uchar D_HEX(uchar num)
  130. {
  131. uchar L;
  132. L=(num/10)*16+(num%10);
  133. return L;
  134. }
  135. //====读出DS8025实时时间========================================
  136. //读取的数据为BCD格式数据、只用于再次写入1302所以不需要转变数据格式

  137. void read_8025time(uchar *timedata)
  138. {

  139. uchar i;


  140. for(i=0;i<7;i++) //分 7 次读取 秒分时日月周年
  141. {
  142. timedata[i]=read_8025(i);
  143. }

  144. }
  145. //====DS8025时间寄存器数据写入函数==========================

  146. void write_8025time(uchar *timedata)
  147. {
  148. uchar i;
  149. for (i=0;i<7;i++)         //7 次写入 秒分时日月周年
  150. {
  151. write_8025(i,timedata[i]);
  152. }
  153. }

  154. //====星期与日期绑定显示、调整函数====================
  155. //RX8025T的星期寄存值为0x01=(日)0x02=(一)0x04=(二)0x08=(三)0x10=(四)0x20=(五)0x40=(六)
  156. //公式原型:week=(y+y/4+c/4-2*c+26*(month+1)/10+day-1)%7;
  157. //本案设计有效寿命至2099年、世纪值固定为20所以公式简化为:
  158. //week=(y+y/4+5+26*(month+1)/10+day-41)%7;
  159. //其中:如果月份为1、2月时;month=13、14并且年值-1
  160. void set_week()
  161. {
  162. uint ye,mo,da;
  163. char wk;
  164. ye=HEX_D(time[6]);
  165. mo=HEX_D(time[5]);
  166. da=HEX_D(time[4]);
  167. if(mo<0x03)
  168.         {
  169.         mo+=12;
  170.         ye-=1;
  171.         }
  172. wk=(ye+ye/4+5+(26*(mo+1))/10+da-41)%7;
  173. if(wk<0) wk=wk+7;
  174. PutGB16H16(1,6,110,wk);                //显示星期(0=星期日)
  175. }
  176. //====时间设置函数===============================
  177. void set_time(uchar c)
  178. {
  179. //首先擦除调整时间时不需要显示的内容
  180. PutGB16_16(1,6,90," ");                //擦除"周"显示
  181. PutGB16H16(1,6,110,7);                //擦除星期数值
  182. PutGB8_16(1,6,0,10);                        //擦除秒10位       
  183. PutGB8_16(1,6,8,10);                        //擦除秒个位
  184. switch(c)
  185.         {
  186.         case 0x01:
  187.                 {
  188.                 time[6]=read_8025(0x06);//读年
  189.                 PutGB8_16(0,0,9,HEX_D(time[6])/10);
  190.                 PutGB8_16(0,0,17,HEX_D(time[6])%10);        //显示年
  191.                 PutGB16_16(1,0,25,"年");
  192.                 Adjustment(time[6],6);//调整年
  193.                 } break;
  194.         case 0x02:
  195.                 {
  196.                 time[5]=read_8025(0x05);//读月
  197.                 PutGB8_16(0,0,45,HEX_D(time[5])/10);
  198.                 PutGB8_16(0,0,53,HEX_D(time[5])%10);        //显示月
  199.                 PutGB16_16(1,0,65,"月");
  200.                 Adjustment(time[5],5);//调整月
  201.                 } break;
  202.         case 0x03:
  203.                 {
  204.                 time[4]=read_8025(0x04);//读日
  205.                 PutGB8_16(0,0,85,HEX_D(time[4])/10);
  206.                 PutGB8_16(0,0,93,HEX_D(time[4])%10);        //显示日
  207.                 PutGB16_16(1,0,105,"日");
  208.                 Adjustment(time[4],4);//调整日
  209.                 } break;
  210.         case 0x04:
  211.                 {
  212.                 time[2]=read_8025(0x02);//读时
  213.                 PutGB16_32(0,2,16,HEX_D(time[2])/10);
  214.                 PutGB16_32(0,2,32,HEX_D(time[2])%10);        //显示时
  215.                 Adjustment(time[2],2);//调整时
  216.                 } break;
  217.         case 0x05:
  218.                 {       
  219.                 time[1]=read_8025(0x01);//读分
  220.                 PutGB16_32(0,2,80,HEX_D(time[1])/10);
  221.                 PutGB16_32(0,2,96,HEX_D(time[1])%10);        //显示分
  222.                 Adjustment(time[1],1);//调整分
  223.                 } break;
  224.         }
  225.         write_8025(0x00,0x00);        //秒归0开始运行
  226. }
  227. //====时间显示函数==================================
  228. void dasply_time()
  229. {

  230. read_8025time(&time);                        //读取实时时间time

  231. PutGB8_16(1,0,9,HEX_D(time[6])/10);
  232. PutGB8_16(1,0,17,HEX_D(time[6])%10);        //显示年
  233. PutGB16_16(1,0,25,"年");
  234. PutGB8_16(1,0,45,HEX_D(time[5])/10);
  235. PutGB8_16(1,0,53,HEX_D(time[5])%10);        //显示月
  236. PutGB16_16(1,0,65,"月");
  237. PutGB8_16(1,0,85,HEX_D(time[4])/10);
  238. PutGB8_16(1,0,93,HEX_D(time[4])%10);        //显示日
  239. PutGB16_16(1,0,105,"日");
  240. PutGB16_32(1,2,16,HEX_D(time[2])/10);
  241. PutGB16_32(1,2,32,HEX_D(time[2])%10);        //显示时
  242. PutGB16_32(1,2,80,HEX_D(time[1])/10);
  243. PutGB16_32(1,2,96,HEX_D(time[1])%10);        //显示分
  244. PutGB16_16(1,6,90,"周");                       
  245. set_week();                                                                                //显示星期
  246. }

  247. //====时间更新函数==================================
  248. void dasply_Update()                                                //每秒更新显示时间
  249. {
  250. if(flag)        //分钟标志置位后读取RTC数据刷新显示
  251.         {       
  252.         flag=0;
  253.         dasply_time();
  254.         }

  255. }
  256. //====RX_8025初始化函数==================================
  257. void init_8025()
  258. {
  259. uchar PON;//,VDET;
  260. write_8025(0x0F,0x00);//清除所有标志
  261. //~~~~以下为是否初始化时间的判断操作~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  262. PON=read_8025(0x0F);//读标志寄存器F的PON位,如果为1则提示实时时间数据丢失
  263. //VDET=PON;
  264. if((PON&0x10)==0x10)//如掉电PON标志被置位为1、计时数据将丢失
  265. {
  266. write_8025(0x0F,0x00);        //清除所有标志
  267. write_8025time(&time_init);//重新上电时显示20-1-1 8:30:00星期3
  268. }
  269. //~~~~以下为时间(秒)更新中断的设置~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  270. //设置1.设定为24小时模式。2.使能INTA输出1秒中断脉冲
  271. write_8025(0x0E,0x23);
  272. //~~~~以下为走时精度调整~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  273. write_8025(0x07,0x04);
  274. }
复制代码


回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-18 19:47:48 | 显示全部楼层
本帖最后由 慕名而来 于 2020-1-18 20:22 编辑

本帖程序只适用于RX8025AC,不适应RX8025T;如需要RX8025T代码可以等待后续发帖。
代码中的相关提示:
1.
本代码运行后会在屏幕左下方显示秒数值,这是调试时用于观察的,如果碍眼可以在主循环中封闭两条显示代码如下:
PutGB8_16(1, 6, 0, HEX_D(time[0]) / 10); //测试用秒数值显示
PutGB8_16(1, 6, 8, HEX_D(time[0]) % 10);
2.
时间的调整方法在程序中注释不完整,完整步骤是按N1键选择,第一次=20年反白显示(N2加、N3减调整)、第二次=月、第三次=日、第四次=时、第五次=分;第六次进入走时状态,调整时将分钟多加一分钟,等到时钟源到0时按下第六次即可与时钟源同步(肯定有同步误差,希望高手指点修正)
3.
主函数中缺少一个关闭单片机中断的语句,可以添加如下,也可以不添加而是删除那条开启的语句,本程序中这个操作可以省略。
if(r != 0)   //调整键按下时进入调时状态
        {
            e = 1;   //调整后开始显示时间的标志置位
   EA=0;
            set_time(r); //调用调试函数
        }
        else if(r == 0)  //走时
        {
            if(e)   //如果时间调整并调整结束了
            {
                e = 0;  //清除标志
                dasply_time(); //显示调整后的时间
                EA = 1;   //开启中断、恢复运行
            }


回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-18 20:06:24 | 显示全部楼层
借由这个制作,最近重新玩了手里所有的RTC芯片,此前也做了几个时钟,头像图片的闹钟就是是纯单片机编程的时钟,除了这个闹钟程序完全是自己编写的,其他都是抄录改编的,对于新手而言时钟程序最难读的就是按键调时代码,其他函数大都是通用的,这次玩时钟就是想编一个自己的按键、调时程序并且固定下来,下面将这段代码贴出来,希望高手指正。

代码如下:
  1. #include "key.h"
  2. uchar r;
  3. //-------时间数据调节范围设定函数---------------------
  4. //仅调整1-分、2-时、3-星期、4-日、5-月、6-年、共6个数据
  5. uchar data_range(signed char date,uchar i)//定义有符号变量适应数值<0的判断
  6. {
  7. switch(i)
  8.         {
  9.         case 0x01:        {if(date>59) date=0; if(date<0) date=59;} break;
  10.         case 0x02:        {if(date>23) date=0; if(date<0) date=23;} break;
  11.         case 0x03:        {if(date>06) date=0; if(date<0) date=06;} break;
  12.         case 0x04:        {if(date>31) date=1; if(date<1) date=31;} break;
  13.         case 0x05:        {if(date>12) date=1; if(date<1) date=12;} break;
  14.         case 0x06:        {if(date>99) date=19;if(date<19) date=99;}break;
  15.         }
  16. return(date);
  17. }
  18. //-------按键加减调整函数---------------------------------
  19. void Adjustment(signed char da,uchar i)//定义有符号变量适应数值<0的判断
  20. {
  21. signed char dat;
  22. dat=HEX_D(da);
  23. if(N2==0)
  24.         {
  25.         Delay_1ms(25);
  26.         if(N2==0)
  27.                 {                                                                             //如果按动上调键
  28.                 dat++;                                                               //数字加
  29.                 dat=data_range(dat,i);
  30.                 while(!N2);
  31.                 }
  32.         }
  33. if(N3 == 0)
  34.         {
  35.         Delay_1ms(25);
  36.         if(N3 == 0)
  37.                 {                                                                             //如果按动下调键
  38.                 dat--;                                                               //数字减
  39.                 dat=data_range(dat,i);
  40.                 while(!N3);
  41.                 }
  42.         }
  43. write_8025(i,D_HEX(dat));
  44. }
  45. //------设置按键函数--------------------------------
  46. //对照时间源设定时,使分钟多出一分钟而后等待时钟源的秒达到0时按最后次确认即可
  47. uchar Choice_set()
  48. {
  49. if(N1==0)                                //选择键   
  50.         {
  51.         Delay_1ms(25);      
  52.         if(N1==0)   
  53.                 {      
  54.                 r++;   
  55.                 if(r>5)                        
  56.                         {
  57.                         r=0;
  58.                         }
  59.                 while(!N1);
  60.                 }
  61.         }
  62. return(r);
  63. }
  64. //--------------------------------------------------------
复制代码



主函数如下:
  1. #include <STC15W.h>
  2. #include "OLED.h"
  3. #include "8025AC.h"
  4. #include "Delay.h"
  5. //---------------------------------------------
  6. #define uchar unsigned char
  7. sbit jk = P5 ^ 5;
  8. //--------------------------------------------
  9. sbit Vcc_SH = P1 ^ 4;                                 //主/备用电源切换控制端
  10. extern xdata uchar time[7];                //数据排列顺序:秒、分、时、日、月、星期、年
  11. extern uchar time_init[7];
  12. extern  uchar r, flag, se;                // Low_voltage;
  13. uchar tim;
  14. //----外部中断初始化函数----------------------
  15. void INT_init()
  16. {
  17.     INT_CLKO |= 0x20;        //使能INT3(默认且仅为下降沿触发)
  18.     //IT0 = 1;                        //INT0下降沿触发中断
  19.     //EX0 = 1;                        //使能INT0
  20.     EA = 1;                                //开启中断
  21.     //IP &= 0xFE;                        //PX0=0使INT0优先级为最低以免影响INT3的秒输出中断
  22. }
  23. //----定时控制函数----------------------------
  24. void timing_8025AC()
  25. {
  26.     if(time[1] == 0x00)                //每隔一小时查询一次
  27.     {
  28.         if(time[2] >= 0x08)
  29.             jk = 0;
  30.         if(time[2] >= 0x13)
  31.             jk = 1;
  32.     }
  33. }
  34. //--------------------------------------------
  35. //e用于调时后显示一次调整后的时间并开启中断、此后由刷新函数控制走时运行
  36. void main(void)
  37. {
  38.     uchar e = 0;
  39.     Vcc_SH = 1;        //控制切换到VCC供电
  40.     Initial_SSD1306();
  41.     init_8025();
  42.     Delay_1ms(5);
  43.     CLS_OLED();
  44.     Delay_1ms(1);
  45.     INT_init();
  46.     r = 0;
  47.     //write_8025time(&time_init);
  48.     while(1)
  49.     {
  50.         Choice_set();//调取"设置"按键的状态
  51.         if(r != 0)                        //调整键按下时进入调时状态
  52.         {
  53.             e = 1;                        //调整后开始显示时间的标志置位
  54.             set_time(r);        //调用调试函数
  55.         }
  56.         else if(r == 0)                //走时
  57.         {
  58.             if(e)                        //如果时间调整并调整结束了
  59.             {
  60.                 e = 0;                //清除标志
  61.                 dasply_time();        //显示调整后的时间
  62.                 EA = 1;                        //开启中断、恢复运行
  63.             }
  64.             dasply_Update();        //时钟开始走时显示、并间隔1分钟读取RTC数据刷新显示时间
  65.             if(se)                                //跟随秒方波闪烁显示秒
  66.                 PutGB16_32(1, 2, 56, 10);        //显示":"1秒
  67.             else
  68.                 PutGB16_32(1, 2, 56, 11);        //清除":"1秒

  69.             PutGB8_16(1, 6, 0, HEX_D(time[0]) / 10); //测试用秒数值显示
  70.             PutGB8_16(1, 6, 8, HEX_D(time[0]) % 10);
  71.         }
  72.         timing_8025AC();

  73.     }
  74. }
  75. //====外部中断INT3函数========================
  76. void exint3() interrupt 11
  77. {
  78.     se = ~se;
  79.     flag = 1;        //每分钟置位标志一次
  80. }
复制代码


打赏

参与人数 1家元 +10 收起 理由
家睦 + 10

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2020-1-18 20:39:27 | 显示全部楼层
直播吗,虽然不懂,留个记号,以后学习
回复 支持 反对

使用道具 举报

发表于 2020-1-18 21:21:39 来自手机浏览器 | 显示全部楼层
老哥又跟水泵干上了哈哈哈…净水机的废水处理,水泵增压…:titter:你头像的时钟用的是译码器还是tm系列的驱动模块?
回复 支持 反对

使用道具 举报

发表于 2020-1-18 22:59:23 | 显示全部楼层
本帖最后由 40560335 于 2020-1-18 23:06 编辑

我买的都是爱普森的RX8025T
回复 支持 反对

使用道具 举报

发表于 2020-1-19 03:10:20 | 显示全部楼层
我也有RX8025T,吃灰呢
回复 支持 反对

使用道具 举报

发表于 2020-1-19 08:26:10 | 显示全部楼层
原理图RX8025T的SDA引脚没有连接呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-19 16:25:18 | 显示全部楼层
bg4rff 发表于 2020-1-19 08:26
原理图RX8025T的SDA引脚没有连接呢

多谢指正,已经编辑文字标注了,再谢。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-19 16:34:15 | 显示全部楼层
触景情伤 发表于 2020-1-18 21:21
老哥又跟水泵干上了哈哈哈…净水机的废水处理,水泵增压…你头像的时钟用的是译码器还是tm系列的驱 ...

身边除了家居物联那些玩不动东西也只能控制这些低端的东西了,我头像的时钟是有一片STC12C2052AD加几片74HC595做的,是单片机定时器编程作为时基的挺稳定的,只是怕停电,接下来也要加RTC升级的。
回复 支持 反对

使用道具 举报

发表于 2020-1-19 20:27:27 | 显示全部楼层
终于看到高手发表用stc单片机+rx8025 大作了
回复 支持 反对

使用道具 举报

发表于 2020-1-19 22:06:50 来自手机浏览器 | 显示全部楼层
慕名而来 发表于 2020-1-19 16:34
身边除了家居物联那些玩不动东西也只能控制这些低端的东西了,我头像的时钟是有一片STC12C2052AD加几片74 ...

说起这个了我记得论坛里好像有个搞断电单片机低功耗继续运行的好像也能用
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-20 21:24:36 | 显示全部楼层
fsj5098 发表于 2020-1-19 20:27
终于看到高手发表用stc单片机+rx8025 大作了

只是弄些简单的东西玩乐而已。:lol:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-20 21:27:40 | 显示全部楼层
触景情伤 发表于 2020-1-19 22:06
说起这个了我记得论坛里好像有个搞断电单片机低功耗继续运行的好像也能用 ...

听起来挺高级的东西,手里的时钟模块、芯片不用也是吃灰的货,准备将身边的时钟、闹表都升级一下,哈哈。
回复 支持 反对

使用道具 举报

发表于 2020-1-20 23:14:38 | 显示全部楼层
看了你的帖子,参考了代码搞定了8025AC,谢谢!
self.i2c.writeto_mem(self.addr, 0xE0,bytearray((0x20,)))  #设定为24小时模式(必须,地址在高位)
复制代码


关键是要将地址移动到高4位,先设置12或24小时,再写入日期。
谢谢分享!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-21 21:10:52 | 显示全部楼层
lyy-cy 发表于 2020-1-20 23:14
看了你的帖子,参考了代码搞定了8025AC,谢谢!
self.i2c.writeto_mem(self.addr, 0xE0,bytearray((0x20,)) ...

有用就好,其实8025AC和8025T的I2C差别最明显的只有寄存器地址为高4位这里,它的手册里的读写顺序说的云里雾里的,关于这些我此前发帖说过:RX8025AC时钟芯片驱动有问题的新手可以看看https://www.mydigit.cn/forum.php?mod=viewthread&tid=114911(出处: 数码之家)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-13 19:48:41 | 显示全部楼层
本帖最后由 慕名而来 于 2021-5-13 19:53 编辑

坛友发消息说本帖附件中缺少源码,我在电脑里翻找到了相关的工程文件,但因为一年前的东西了也不知道是否与硬件匹配,百度盘分享于此仅供参考吧,另外 @zxwxh001   坛友,其实你要的RX8025AC的完整代码就是1楼的代码,直接复制就可以使用的。
链接: https://pan.baidu.com/s/1CScUJcJwDRC2bEFoOiEUvQ 提取码: gim6
回复 支持 反对

使用道具 举报

发表于 2021-5-15 08:25:19 | 显示全部楼层
没时间折腾了
回复 支持 反对

使用道具 举报

发表于 2021-5-15 13:13:44 | 显示全部楼层
R8025AC和R8025T有啥区别呢
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-27 13:08 , Processed in 0.156001 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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