数码之家

 找回密码
 立即注册
搜索
查看: 1071|回复: 19

[C51] 用STC8G1K08实现桶装水抽水器定时开关

[复制链接]
发表于 2025-1-18 20:23:36 | 显示全部楼层 |阅读模式
本帖最后由 aming_ou 于 2025-1-18 20:25 编辑

在《拆修桶装水电动抽水器 https://www.mydigit.cn/forum.php ... 457&fromuid=1106505 》帖子中曾提出一个想法,用STC8G1K08替换8脚芯片,实现按一次定时抽水N秒钟,今天用Keil_v5尝试编写了代码,写入STC8G1K08单片机测试运行,貌似可行。




代码实现目标:// 通过按键开关,通电默认关闭,按一次,接通,15秒后断开,在接通状态如果在15秒内按下按键,就立即断开;无操作30秒后进行掉电省电模式
实测,加入闪烁指示灯时,电流28ma,如果不要闪烁指示灯,电流4ma,超时进入掉电模式后,3为小数的ma万用表测不出电流值,待机功耗应该很低。
先留贴记录折腾日志,改天修改电路,替换芯片,实测试一试。
  1. #include "STC8G.H"
  2. #include "INTRINS.H"
  3. #define PD              0x02  //PCON.1 //掉电模式
  4. #define PX0H            0x01  // 定义PX0H为IPH寄存器的第0位

  5. #define LEDflash P54  //闪烁指示灯
  6. #define LEDctl P55    //控制输出指示灯
  7. #define SWITCH_K1 P32 //复位按键

  8. // 定义全局变量
  9. bool int0_flag = true;
  10. bool wake_flag = true;
  11. bool is_initialized = false;  // 初始化标志
  12. unsigned long msTicks = 0; //单位 毫秒
  13. unsigned long timer_count = 0; // 单位 秒
  14. unsigned long start_count = 0;
  15. unsigned long last_count = 0;


  16. void ReinitTimer(void)                //1毫秒@24.000MHz
  17. {
  18.         AUXR &= 0x7F;                        //定时器时钟12T模式
  19.         TMOD &= 0xF0;                        //设置定时器模式
  20.         TL0 = 0x30;                                //设置定时初始值
  21.         TH0 = 0xF8;                                //设置定时初始值
  22.         TF0 = 0;                                //清除TF0标志
  23.         TR0 = 1;                                //定时器0开始计时
  24.         ET0 = 1;                                //使能定时器0中断
  25.         EA  = 1;                    //打开总中断
  26. }

  27. void Timer0_Isr(void) interrupt 1
  28. {
  29.         msTicks++;
  30.     if (msTicks % 1000 == 0) {  // 假设每次中断为1ms
  31.         timer_count++;
  32.     }       
  33. }

  34. void INT0_Isr() interrupt 0
  35. {
  36.         if (wake_flag == false){
  37.             wake_flag = true;
  38.                 is_initialized = false;
  39.                 _nop_();
  40.                 _nop_();
  41.         }else{
  42.                 LEDctl = !LEDctl;  //测试端口
  43.                 int0_flag = !int0_flag;
  44.                 start_count = timer_count;
  45.         }
  46. }

  47. // 重新初始化全局变量
  48. void ReinitGlobals()
  49. {
  50.     is_initialized = true;  // 重新设置初始化标志
  51.         wake_flag = true;
  52.         LEDflash = 1;
  53.         LEDctl = 1;
  54.         SWITCH_K1 = 1;
  55.         last_count  = timer_count;
  56.         start_count = timer_count;
  57. }

  58. // 掉电模式唤醒时立即进入工作状态
  59. void Restartjob()
  60. {
  61.         last_count  = timer_count;
  62.         start_count = timer_count;
  63.         LEDctl      = 0;
  64.         int0_flag   = false;
  65. }

  66. // 重新初始化I/O端口
  67. void ReinitPorts()
  68. {
  69.         // 初始化为准双向
  70.     P5M0 = 0x00; P5M1 = 0x00;
  71.     P3M0 = 0x00; P3M1 = 0x00;
  72. }

  73. // 重新初始化外部中断
  74. void ReinitInterrupts()
  75. {
  76.     IPH &= (~PX0H);  // PX0H = 0,优先级为0级 (最低级)
  77.     PX0 = 0;         // PX0 = 0,优先级为0级 (最低级)
  78.     IT0 = 1;         // 使能INT0下降沿中断
  79.     EX0 = 1;         // 使能INT0中断
  80.     EA = 1;          // 使能中断总开关
  81. }

  82. // 进入掉电模式的函数
  83. void EnterPowerDownMode()
  84. {
  85.         _nop_();
  86.         _nop_();
  87.     PCON = PD;  // MCU进入掉电模式
  88.         _nop_();
  89.         _nop_();
  90. }

  91. void main()
  92. {
  93.     ReinitPorts();      // 初始配置I/O端口
  94.     ReinitInterrupts(); // 初始配置外部中断
  95.     ReinitTimer();      // 初始配置定时器
  96.     ReinitGlobals();    // 初始配置全局变量
  97.         EnterPowerDownMode();  // 初始进入掉电模式
  98.         while(1){
  99.             if (wake_flag){
  100.             // 检查全局变量是否需要重新初始化
  101.             if (!is_initialized)
  102.             {
  103.                                 ReinitPorts();      // 初始配置I/O端口
  104.                                 ReinitInterrupts(); // 初始配置外部中断
  105.                                 ReinitTimer();      // 初始配置定时器
  106.                                 ReinitGlobals();    // 初始配置全局变量
  107.                                 Restartjob();       // 从掉电模式唤醒时,其实就是按了一次按键,所以立即进入工作模式
  108.             }
  109.                         if (int0_flag){
  110.                                 if (timer_count - last_count >=1) { //闪烁1秒,控制指示灯灭,表示不工作
  111.                                         LEDflash=!LEDflash;
  112.                                         last_count = timer_count;
  113.                                 }
  114.                         }else{
  115.                                 if (timer_count - last_count >=2) { //闪烁2秒,控制指示灯亮,表示工作中
  116.                                         LEDflash=!LEDflash;
  117.                                         last_count = timer_count;
  118.                                 }
  119.                                 if (timer_count - start_count >=15) { //接通15秒后自动断开
  120.                                         int0_flag = true;
  121.                                         LEDctl = 1;
  122.                                 }
  123.                         }
  124.                         if (timer_count - start_count >=30) { //无操作30秒后进入掉电省电模式,按键触发后可以唤醒
  125.                             ReinitGlobals();
  126.                                 wake_flag = false;
  127.                                 EnterPowerDownMode();
  128.                         }
  129.                 }
  130.                
  131.         }
  132. }
复制代码




本帖子中包含更多资源

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

x

打赏

参与人数 4家元 +91 收起 理由
jf201006 + 12 謝謝分享
keye + 7 謝謝分享
nokia5320 + 12
家睦 + 60

查看全部打赏

发表于 2025-1-18 20:54:10 | 显示全部楼层
这些8脚芯片用于小制作,还是可以的
回复 支持 反对

使用道具 举报

发表于 2025-1-18 21:16:16 | 显示全部楼层
高射炮打蚊子?


二○二五年一月十八日
回复 支持 反对

使用道具 举报

发表于 2025-1-19 01:14:59 | 显示全部楼层
不错,很实用的制作
回复 支持 反对

使用道具 举报

发表于 2025-1-19 08:48:59 | 显示全部楼层
这完全是天书啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-1-19 10:06:15 | 显示全部楼层

7毛钱的芯片,支持3~5.5V,不需要外围元件,适应性很强,不算高射炮啦。这个仅仅是一个思路,可玩性很强,比用RC、555 实现容易多了。
回复 支持 反对

使用道具 举报

发表于 2025-1-19 14:26:34 来自手机浏览器 | 显示全部楼层
这个有没有掉电计时的功能?想改成每天固定时间浇水,如果是3ma待机就意义不大了
回复 支持 反对

使用道具 举报

发表于 2025-1-20 08:08:11 来自手机浏览器 | 显示全部楼层
我改的不是固定时间的,长按设置开始抽水,短按停止时记录抽水时间。设置好后短按功能和你这个一样了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-1-20 08:55:26 来自手机浏览器 | 显示全部楼层
flyrack 发表于 2025-1-19 14:26
这个有没有掉电计时的功能?想改成每天固定时间浇水,如果是3ma待机就意义不大了 ...

3ma是工作电流,电机一般通过AO3400 MOS管开关驱动,所以单片机只要输出高电平串接电阻提供大约3ma电流就能驱动AO3400工作,设置进入掉电省电模式后(厂家说明是0.0015ma电流),我代码中通过按键(共用一个开关),当在掉电模式中按下开关,就唤醒并执行一次。至于定时某个时间工作,这就是更高级的了,需要做成时钟(论坛里有帖子)
回复 支持 反对

使用道具 举报

发表于 2025-1-20 09:01:24 | 显示全部楼层
怀疑那个8脚片子是fmd或者粤原点的2毛,可能直接就可以改写,希望不是otp的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-1-20 09:03:36 来自手机浏览器 | 显示全部楼层
flyrack 发表于 2025-1-19 14:26
这个有没有掉电计时的功能?想改成每天固定时间浇水,如果是3ma待机就意义不大了 ...

芯片有掉电计时(定时唤醒)功能,对于你的烧水功能,3ma电流就是一只LED指示灯的功耗,可以忽略啦。只有用于锂电池供电时才需要对待机电流斤斤计较。定时烧水,买个智能插座更简单。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-1-20 09:07:29 来自手机浏览器 | 显示全部楼层
szy912 发表于 2025-1-20 08:08
我改的不是固定时间的,长按设置开始抽水,短按停止时记录抽水时间。设置好后短按功能和你这个一样了。 ...

,我的代码中设置,下载代码后,就固化了。你的设计更高级,写芯片后,还能再次通过按键修改定时时长功能,你的通用性更大。是不是也用STC8G1K08芯片,可以分享代码吗?
回复 支持 反对

使用道具 举报

发表于 2025-1-20 09:08:15 | 显示全部楼层
flyrack 发表于 2025-1-19 14:26
这个有没有掉电计时的功能?想改成每天固定时间浇水,如果是3ma待机就意义不大了 ...


支持掉电时钟唤醒的,可以实现超低功耗定时、待机。
回复 支持 反对

使用道具 举报

发表于 2025-1-20 13:41:31 来自手机浏览器 | 显示全部楼层
挺好,根据水壶容积设计好时间自动停止。。。。
回复 支持 反对

使用道具 举报

发表于 2025-1-20 16:28:43 | 显示全部楼层
代码写得不错,厉害
回复 支持 反对

使用道具 举报

发表于 2025-1-21 09:57:13 来自手机浏览器 | 显示全部楼层
aming_ou 发表于 2025-1-20 09:07
,我的代码中设置,下载代码后,就固化了。你的设计更高级,写芯片后,还能再次通过按键修改定时时长功能 ...

15w201的,稍微改改就行了。
回复 支持 反对

使用道具 举报

发表于 前天 05:13 | 显示全部楼层
有没有大佬有手电用的8脚单片机程序,现有手电单片机都是两个闪灯三档pwm调光,那个闪灯模式就很讨厌,

上电运行,短按切换,高中低三档,高亮度直通就行,pwm占空比100%,另外两档50和25占空比,
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 08:43 来自手机浏览器 | 显示全部楼层
曾经- 发表于 2025-2-14 05:13
有没有大佬有手电用的8脚单片机程序,现有手电单片机都是两个闪灯三档pwm调光,那个闪灯模式就很讨厌,

上 ...

单按键吗?如果是按一下通电默认高亮,再按一下是中亮,再按一下就是低亮,再按一次就是熄灭,如此循环,理论上很好实现,STC8G1K08就是8脚芯片,支持pwm,只是不知脚位跟你电路板是不是恰好对应,如果它原来就是这个芯片,说不定可以直接更新程序。
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 08:47 来自手机浏览器 | 显示全部楼层
flyrack 发表于 2025-1-19 14:26
这个有没有掉电计时的功能?想改成每天固定时间浇水,如果是3ma待机就意义不大了 ...

我也实验出这个代码了,谢谢提示
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 14:37 | 显示全部楼层
曾经- 发表于 2025-2-14 05:13
有没有大佬有手电用的8脚单片机程序,现有手电单片机都是两个闪灯三档pwm调光,那个闪灯模式就很讨厌,

上 ...

用STC8G1K08实现LED多档控制
https://www.mydigit.cn/forum.php ... amp;fromuid=1106505
(出处: 数码之家)
回复 支持 反对

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-2-16 17:06 , Processed in 0.109200 second(s), 10 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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