找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

C语音怎么实现这个功能 掉电换段2路输出

查看数: 2452 | 评论数: 17 | 收藏 2
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2024-4-8 23:43

正文摘要:

unsigned char EEPROMread(unsigned char EEAddr) {  //读EEPROM unsigned char EEPROMdata; EEADR = EEAddr;                  ...

回复

ID:483092 发表于 2025-1-7 10:16
lkc8210 发表于 2025-1-4 23:57
烧录不用设置,但要冷启动

你好,可以烧录了,要在GND接个开关,如你说的冷启动,测试灯能亮,只是不能同时亮。只能单个灯亮。
ID:483092 发表于 2025-1-6 08:44
lkc8210 发表于 2025-1-4 23:57
烧录不用设置,但要冷启动

你好,我是按照你写的代码,编译也成功了,用STC-ISP烧录的时候出现一直在检测芯片。线也接对了,我用的是CH340G烧录工具。
ID:161164 发表于 2025-1-4 23:57
电子锁1 发表于 2025-1-4 10:38
你好,这里面没有烧入代码的接口设置,我是用到P3.0和P3.1。

烧录不用设置,但要冷启动
ID:483092 发表于 2025-1-4 10:38

你好,这里面没有烧入代码的接口设置,我是用到P3.0和P3.1。
ID:483092 发表于 2025-1-4 10:29

非常感谢你。一直都没空处理。今天板子到了,开始焊接。谢谢。
ID:483092 发表于 2025-1-4 10:16
Hephaestus 发表于 2024-4-9 00:38
硬件上缺乏掉电检测电路。

这不需要掉电检测电路,主控自带。
ID:343102 发表于 2024-12-30 13:29
lkc8210 发表于 2024-4-9 09:39
上电读取EEProm里的模式值
根据模式值控制L1,L2
然后EEProm写入mode = ++mode % 3;

谢谢分享。
ID:343102 发表于 2024-12-30 09:50
学习了。这个也可用于冰箱短期停电保护。
ID:161164 发表于 2024-12-29 23:48
youyouku 发表于 2024-12-14 16:10
不好意思,是我搭错电路了,IO口没有搭正确,那假如改为亮5S后,下次上电还是断电前的状态呢?
  1. while (1)
  2. {
  3.         if(Delay)
  4.         {
  5.                 Delay100ms();
  6.                 if(--Delay==0)
  7.                 {
  8.                         IapErase(EEPRom_Addr);
  9.                         IapProgram(EEPRom_Addr, Mode);
  10.                 }
  11.         }
  12. }
复制代码
ID:483092 发表于 2024-12-29 15:11
youyouku 发表于 2024-12-14 16:10
不好意思,是我搭错电路了,IO口没有搭正确,那假如改为亮5S后,下次上电还是断电前的状态呢?

你好,请问你的可以了吗?
ID:293079 发表于 2024-12-14 16:10
youyouku 发表于 2024-12-14 14:49
你好,我也按这个程序搭了电路,上电灯都没有亮,是什么回事呢?谢谢。

不好意思,是我搭错电路了,IO口没有搭正确,那假如改为亮5S后,下次上电还是断电前的状态呢?
ID:293079 发表于 2024-12-14 14:49

你好,我也按这个程序搭了电路,上电灯都没有亮,是什么回事呢?谢谢。
ID:1109793 发表于 2024-12-5 18:19
意思是5秒内断电再上电就下一段,超过5秒断电就第一段呗,板凳说的很对,不需要掉电检测
ID:161164 发表于 2024-12-5 17:23
电子锁1 发表于 2024-12-5 16:30
有完整的吗?用STC8G1K08A芯片怎么实现?
  1. #include <STC8G.H>

  2. #include "intrins.h"


  3. #define EEPRom_Addr 0x0000
  4. void IapIdle()
  5. {
  6.     IAP_CONTR = 0;                              //关闭IAP功能
  7.     IAP_CMD = 0;                                //清除命令寄存器
  8.     IAP_TRIG = 0;                               //清除触发寄存器
  9.     IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
  10.     IAP_ADDRL = 0;
  11. }

  12. char IapRead(int addr)
  13. {
  14.     char dat;

  15.     IAP_CONTR = 0x80;                           //使能IAP
  16.     IAP_TPS = 12;                               //设置等待参数12MHz
  17.     IAP_CMD = 1;                                //设置IAP读命令
  18.     IAP_ADDRL = addr;                           //设置IAP低地址
  19.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  20.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  21.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  22.     _nop_();
  23.     dat = IAP_DATA;                             //读IAP数据
  24.     IapIdle();                                  //关闭IAP功能

  25.     return dat;
  26. }

  27. void IapProgram(int addr, char dat)
  28. {
  29.     IAP_CONTR = 0x80;                           //使能IAP
  30.     IAP_TPS = 12;                               //设置等待参数12MHz
  31.     IAP_CMD = 2;                                //设置IAP写命令
  32.     IAP_ADDRL = addr;                           //设置IAP低地址
  33.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  34.     IAP_DATA = dat;                             //写IAP数据
  35.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  36.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  37.     _nop_();
  38.     IapIdle();                                  //关闭IAP功能
  39. }

  40. void IapErase(int addr)
  41. {
  42.     IAP_CONTR = 0x80;                           //使能IAP
  43.     IAP_TPS = 12;                               //设置等待参数12MHz
  44.     IAP_CMD = 3;                                //设置IAP擦除命令
  45.     IAP_ADDRL = addr;                           //设置IAP低地址
  46.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  47.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  48.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  49.     _nop_();                                    //
  50.     IapIdle();                                  //关闭IAP功能
  51. }

  52. sbit LED1 = P5^4;
  53. sbit LED2 = P5^5;
  54. #define ON 0
  55. #define OFF 1
  56. void Delay100ms(void)        //@12.000MHz
  57. {
  58.         unsigned char data i, j, k;

  59.         _nop_();
  60.         i = 7;
  61.         j = 23;
  62.         k = 105;
  63.         do
  64.         {
  65.                 do
  66.                 {
  67.                         while (--k);
  68.                 } while (--j);
  69.         } while (--i);
  70. }

  71. void main()
  72. {
  73.         char Mode = 0;
  74.         char Delay = 50;
  75.     P3M0 = 0x00;
  76.     P3M1 = 0x00;
  77.     P5M0 = 0x00;
  78.     P5M1 = 0x00;

  79.     Mode = IapRead(EEPRom_Addr);
  80.         switch(Mode)
  81.         {
  82.                 case 0xFF:IapProgram(EEPRom_Addr, 0xFE);LED1=ON;LED2=OFF;break;
  83.                 case 0xFE:IapProgram(EEPRom_Addr, 0xFC);LED1=OFF;LED2=ON;break;
  84.                 case 0xFC:IapErase(EEPRom_Addr);LED1=ON;LED2=ON;break;
  85.         }   
  86.     while (1){
  87.                 if(Delay)
  88.                 {
  89.                         Delay100ms();
  90.                         if(--Delay==0)
  91.                         {
  92.                                 if(Mode!=0xFC)IapErase(EEPRom_Addr);
  93.                         }
  94.                 }
  95.         }
  96. }

复制代码
ID:483092 发表于 2024-12-5 16:30
lkc8210 发表于 2024-4-9 09:39
上电读取EEProm里的模式值
根据模式值控制L1,L2
然后EEProm写入mode = ++mode % 3;

有完整的吗?用STC8G1K08A芯片怎么实现?
ID:161164 发表于 2024-4-9 09:39
上电读取EEProm里的模式值
根据模式值控制L1,L2
然后EEProm写入mode = ++mode % 3;
计时5秒
5秒后 EEProm写入mode = 0;
ID:883242 发表于 2024-4-9 00:38
硬件上缺乏掉电检测电路。

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

Powered by 单片机教程网

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