找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机做的手电断电换挡代码遇到问题 要按两下才行?

[复制链接]
跳转到指定楼层
楼主
高手看一下什么问题,负极要断电两下才能换挡,程序思路就是按下的时候就是断电的时候进低功耗ua模式,接通count加1,3.2高阻模式

单片机源程序如下:
#include "STC8G.H"

#include<intrins.h>
#define MAIN_Fosc                12000000L
typedef unsigned char uchar;
typedef unsigned int uint;
sbit LED=P5^4;
//sbit LED2=P5^5;
sbit EN=P5^5;
sbit key=P3^2;
sbit INT0=P3^2;
uchar count=0,count1=0;
uint num=0;
bit i=0,j=0;
/**************中断服务程序*****************/
void delay(uint a)
{
        uint i,j;
        for(i=0; i<a; i++)
                for(j=0; j<500; j++);
}
void INT0_Isr() interrupt 0
{
        EX0=0;
        PCON=0x00;
       count=count+1;
        if(count>2)count=0;
}
void Timer0Init()        //500微秒@12.000MHz
{
        TMOD |= 0x01;                //设置定时器模式
        TL0 = 0x0C;                //设置定时初值
        TH0 = 0xFE;                //设置定时初值
        TR0 = 1;                //定时器0开始计时
        EA = 1;
        ET0 = 1;
}
void Shutdown()//掉电模式函数
{
        
                //关闭所有在用硬件,减小能耗
                                    IT0 = 1;                //INT0 下降沿中断               
                        IE0 = 0;                //清除外中断0标志位
                        _nop_();
                        _nop_();
                        EX0 = 1;                //INT0 允许中断
                        _nop_();
                        _nop_();
                        PCON |= 0x02;        //Sleep
                        _nop_();
                        _nop_();
                        _nop_();
                                                                              EX0 = 0;
                                                  //恢复LED显示=0;                //清0
        
}
void main()
{
        //P3M0 = 0x00;
       // P3M1 = 0x04;
       // P3M0 = 0x00; P3M1 = 0x00;
            P3M0 = 0x00; P3M1 = 0x04; //3.2高阻模式
       //P3口设置为准双向口
        P5M0 = 0x00;
        P5M1 = 0x00;
        //LED2=1;
        Timer0Init();
        IT0 = 1;                //INT0 下降沿中断
        while(1)
        {
                                       
                                        if (P32==0)
                                                Shutdown();
           if(count==0)
                {
                        LED=0;
                        EN=1;
                                                                        
                }
              if(count==1)
                {
                        LED=1;
                        EN=0;
                                                                        
                }
              if(count==2)
                {
                        EN=1;
                     
                }
        }
}

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

使用道具 举报

沙发
ID:213173 发表于 2023-8-3 18:00 | 只看该作者
本帖最后由 wulin 于 2023-8-4 09:26 编辑
  1. //适合STC15/STC8系列
  2. #include <STC8G.H>
  3. #include "intrins.h"
  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. sbit key  = P3^2;//外接1K电阻和104电容硬件消抖可以去掉Delay函数
  7. sbit LED1 = P5^4;
  8. sbit EN   = P5^5;

  9. uchar Key_value; //键值
  10. uint  count;     //消抖计数
  11. bit   sign=0;    //状态标志
  12. bit   allow;     //允许关机标志

  13. void Delay20ms() //@11.0592MHz
  14. {
  15.         unsigned char i, j, k;
  16.        
  17.         i = 2;
  18.         j = 32;
  19.         k = 60;
  20.         do
  21.         {
  22.                 do
  23.                 {
  24.                         while (--k);
  25.                 } while (--j);
  26.         } while (--i);
  27. }

  28. void key_scan()    //按键扫描函数
  29. {
  30.         if(!key)
  31.         {
  32.                 if(++count>=2000 && sign==0)
  33.                 {
  34.                         sign=1;
  35.                         Key_value++;
  36.                 }
  37.         }
  38.         else
  39.         {
  40.                 count=0;        //按键松手count清0
  41.                 sign=0;         //状态标志清0
  42.         }
  43. }

  44. void key_service()//按键服务函数
  45. {
  46.         if(Key_value==0){LED1=0;EN=1;}
  47.         if(Key_value==1){LED1=1;EN=0;}
  48.         if(Key_value==2 )allow=1;//允许休眠
  49. }

  50. void Shutdown()//掉电模式函数
  51. {
  52.         if(allow)
  53.         {
  54.                 //关闭所有在用硬件,减小能耗
  55.                 LED1=1;     //关闭LED
  56.                 EN=1;       //关闭EN
  57.                 Key_value=0;//键值清0
  58.                 while(!key);//等待按键松手
  59.                 Delay20ms();//消抖防止误动作
  60.                 EX0 = 1;    //打开中断
  61.                 PCON = 0x02;//MCU进入掉电模式
  62.         /**********************************************************/
  63.                 _nop_();    //掉电模式被唤醒后,首先执行此语句,然后再进入中断服务程序
  64.                 _nop_();    //中断服务程序执行完再接着此句继续执行       
  65.                 while(!key);//等待按键松手,防止按键扫描程序误读
  66.                 Delay20ms();//消抖防止误动作
  67.                 allow=0;    //清0
  68.         }
  69. }

  70. void main()
  71. {
  72. //        P1M0 = 0x00;
  73. //        P1M1 = 0x00;
  74.         P3M0 = 0x00;
  75.         P3M1 = 0x00;
  76.         P5M0 = 0x00;
  77.         P5M1 = 0x00;

  78.         IT0 = 1;//设置INT0的中断类型为下降沿唤醒
  79.         EA  = 1;//开总中断        
  80.        
  81.         while (1)
  82.         {
  83.                 key_scan();    //按键扫描函数
  84.                 key_service(); //按键服务函数
  85.                 Shutdown();    //掉电模式函数
  86.         }
  87. }
  88. //INT0中断服务程序
  89. void exint0() interrupt 0
  90. {
  91.         EX0 = 0;                //关闭外部中断
  92. }
复制代码

回复

使用道具 举报

板凳
ID:1062408 发表于 2023-8-4 07:26 | 只看该作者

这个是510k当成开关了,不对我要的是负极当开关断一次电换一个档,使用时开关时接通的,断一次换一个档,注意点是开关断开时要进入低功耗ua模式,断开时3.2是低电平,接通是高电平
回复

使用道具 举报

地板
ID:1062408 发表于 2023-8-4 07:28 | 只看该作者

把图片改了下


回复

使用道具 举报

5#
ID:123289 发表于 2023-8-4 09:31 | 只看该作者
改成将芯片GND断开,它还能工作么?
回复

使用道具 举报

6#
ID:213173 发表于 2023-8-4 09:50 | 只看该作者
咯上 发表于 2023-8-4 07:26
这个是510k当成开关了,不对我要的是负极当开关断一次电换一个档,使用时开关时接通的,断一次换一个档, ...

开关接负极,断开就没有电源哪来什么低功耗ua模式,完全无功耗了。想要用电源开关换档就要利用低压中断,EEPROM保存当前状态,下次得电,先读EEPROM,再换挡。
回复

使用道具 举报

7#
ID:1062408 发表于 2023-8-4 09:57 | 只看该作者
yzwzfyz 发表于 2023-8-4 09:31
改成将芯片GND断开,它还能工作么?

断开进入低功耗模式,耗电ua级别,芯片靠电容维持,二极管是防止led用电容里的电,接通高电平唤醒再换挡
回复

使用道具 举报

8#
ID:161164 发表于 2023-8-4 11:12 | 只看该作者
咯上 发表于 2023-8-4 07:26
这个是510k当成开关了,不对我要的是负极当开关断一次电换一个档,使用时开关时接通的,断一次换一个档, ...

你都把电源都截止了,还低功耗个啥?
回复

使用道具 举报

9#
ID:161164 发表于 2023-8-4 11:19 | 只看该作者
咯上 发表于 2023-8-4 09:57
断开进入低功耗模式,耗电ua级别,芯片靠电容维持,二极管是防止led用电容里的电,接通高电平唤醒再换挡

根本不用啥电容,低功耗模式


回复

使用道具 举报

10#
ID:1062408 发表于 2023-8-4 11:24 | 只看该作者
lkc8210 发表于 2023-8-4 11:19
根本不用啥电容,低功耗模式

没电容开关断开时电就放光了
回复

使用道具 举报

11#
ID:161164 发表于 2023-8-4 11:34 | 只看该作者
咯上 发表于 2023-8-4 11:24
没电容开关断开时电就放光了

开关都断开了,没回路去电源负极,何来电流?
回复

使用道具 举报

12#
ID:1062408 发表于 2023-8-4 11:39 | 只看该作者
lkc8210 发表于 2023-8-4 11:19
根本不用啥电容,低功耗模式

这个对寿命有影响,不会吧换一次档就存一次?
回复

使用道具 举报

13#
ID:1062408 发表于 2023-8-4 11:42 | 只看该作者
lkc8210 发表于 2023-8-4 11:34
开关都断开了,没回路去电源负极,何来电流?

芯片不耗电吗,我要断开1秒或几秒
回复

使用道具 举报

14#
ID:161164 发表于 2023-8-4 11:47 | 只看该作者
咯上 发表于 2023-8-4 11:39
这个对寿命有影响,不会吧换一次档就存一次?

要用循环写入算法
每次写在新地址
1k EEProm = 1024Byte x 100000 = 102400000
你每秒按一下,要按102400000/3600/24/365 = 3.25年才可能有影响
回复

使用道具 举报

15#
ID:1062408 发表于 2023-8-4 11:49 | 只看该作者
反正有的驱动就是断开时低功耗模式,然后关机后电容没放光就一直带记忆,需要并一个电阻放电让他关电后只记忆几秒
回复

使用道具 举报

16#
ID:1062408 发表于 2023-8-4 11:51 | 只看该作者
就不能用断电低功耗模式写吗
回复

使用道具 举报

17#
ID:1062408 发表于 2023-8-4 11:53 | 只看该作者
不过有的手电驱动最便宜的那种三个脚的确实没有二极管和电容不知道怎么实现断电换档的
回复

使用道具 举报

18#
ID:1062408 发表于 2023-8-4 12:13 | 只看该作者
eeprom那我不需要记忆,只需要断电几秒记忆,那怎么做
回复

使用道具 举报

19#
ID:1062408 发表于 2023-8-4 12:21 | 只看该作者
https://tieba.baidu.com/p/7528586913
参考下这个帖子他的是汇编,看不懂
回复

使用道具 举报

20#
ID:1062408 发表于 2023-8-4 12:23 | 只看该作者

1) 原理分析:上图原理图中,(+)圆圈接LED正极,(-)圆圈接LED负极;二极管D1与电容C1组成单片机MCU电源,其作用是用于电筒断电后,能给单片机提供几秒的连续应急电源,D1于用断电后防止MCU电源上的电反向流出;C1调节断电维持时间,增大C1,可以延长手电筒断电换档时间,不会复位!MCU中1脚是IC电源正极,8脚是负极,4脚用于断电检测,R1是其下拉电阻,6脚控制LED(实际是通过恒流IC-AMC7135的电源正极来控制LED功能);Q1是三个恒流IC-AM7135并联,每个恒流IC通过电流大约是350mA。
2) 电路工作过程:当K1开关接通时,4脚为高电位,MCU正常工作在第一档功能,在K1快速断开,接通时,MCU的4脚在开关断开时,检测到低电位,(由于C1上的电被D1二极管反向截止,通过R1下拉电阻到负极);当4脚为低电位,单片机MCU关闭输出,LED不亮,同时进入睡眠模式(睡眠模式时,单片机的工作电流很小,几个uA),这样可以延长C1工作时间,也就是开关K断电时间!当开关K接通时,MCU的4脚被单片机内部上拉电阻接通到电池正极,为高电位,MCU被唤醒,通过MCU程序被执行下一档功能(对6脚进行控制);再按开关,MCU如此循环工作!此手电筒为5档功能(强光,中光,弱光,爆闪,SOS闪),当然也可以自行编程其功能!
3)如果要把MCU脚位全部利用起来,可以增加档位选择功能,如把2脚接负极,则手电筒只有2档,如3脚接负极,则手电筒有3档功能,7脚接负极,手电筒为4档,所有3个脚不接负极,为默认5档功能,有的在PCB板上把此三脚画成五角星。
4)注意:此贴能火的话,再附PCB图纸,程序!
-- 觉得好的话,麻烦回个贴哦!
---为满足手电爱好者的动手兴趣,特附上PCB图,可直接打印1:1大小,另再附上原程序,供单片机爱好者参考!
---程序是义隆单片机,型号是EM78P153K
---本人不是专业手电制作者,只是一位有点喜好者,旧电筒线路板坏了,工作之余,特为止重新制作了,包PCB,程序;呵呵。。以上资料大家业余学习参考!
**********怎么不可以传送附件?只能传图片格式!版主有方法吗?****************
*****************原程序供大家参考****************************
;EM78P153K
;P63--KEY(低电位有效)对应P61--LED
;看门狗唤醒
CONT==0X01
IOCB==0X0B
PORT6==0X06
TCC==0X01
STATUS==0X03
IOCF==0X0F
IOCE==0X0E
RF==0X0F
TURN==0X11
DLY1==0X12
DLY2==0X13
FLAG==0X14
LMF==FLAG.0 ;中断中亮灭灯标志
BSF==FLAG.1 ;爆闪标志
SOF==FLAG.2 ;SOS标志
SSF==FLAG.3 ;SOS中快慢标志
SST==FLAG.4 ;SOS中灭灯标志
SKK==FLAG.5 ;SOS中第二次快闪
NUMK==0X16
NUM==0X17
PAR==0X18
ORG 0X00
JMP START
ORG 0X08
JMP TCC_INT
;=====================调光
TCC_INT:
JBC SOF ;SOS
JMP IN_SOS
JBC BSF
JMP IN_BS ;爆闪
JBC LMF
JMP MD
BS PORT6,1
DJZ PAR
JMP OUT
BS LMF ;亮灭标志
COMA NUM
MOV PAR,A
JMP OUT
MD:
BC PORT6,1
DJZ PAR
JMP OUT
BC LMF
MOV A,NUM
MOV PAR,A
JMP OUT
OUT:
MOV A,@250
MOV TCC,A
BC RF,0
RETI
;---------------------爆闪
IN_BS:
DJZ PAR
JMP OUT1
MOV A,@0B00000010
XOR PORT6,A
MOV A,@20
MOV PAR,A
OUT1:
MOV A,@200
MOV TCC,A
BC RF,0
RETI
;--------------------SOS
IN_SOS:
JBC SST
JMP STT ;灭灯
JBC SKK
JMP KK2
DJZ PAR
JMP OUT2
MOV A,@0B00000010
XOR PORT6,A
JBC SSF ;快慢标志
JMP SOK ;慢闪部分
SOM: ;快闪部分
MOV A,@80
MOV PAR,A
DJZ NUM
JMP OUT2
MOV A,@6
MOV NUM,A
BS SSF ;开快闪标志
JMP OUT2
SOK: ;慢闪部分
MOV A,@200
MOV PAR,A
DJZ NUM
JMP OUT2
MOV A,@6
MOV NUM,A
MOV A,@80
MOV PAR,A
BC SSF
BS SKK ;第二次快
BC PORT6,1
JMP OUT2
OUT2:
MOV A,@1
MOV TCC,A
BC RF,0
RETI
;-------------------------
KK2:
DJZ PAR
JMP OUT2
MOV A,@0B00000010
XOR PORT6,A
;----------------------- ;快闪部分
MOV A,@80
MOV PAR,A
DJZ NUM
JMP OUT2
MOV A,@4
MOV NUM,A
BS SST ;开灭灯
JMP OUT2
;------------------------
STT: ;灭灯部分
BC PORT6,0
DJZ PAR
JMP OUT2
MOV A,@200
MOV PAR,A
DJZ NUM
JMP OUT2
BC SST ;关灭灯
BC SSF ;开慢闪
BC SKK
BC PORT6,1
MOV A,@6
MOV NUM,A
JMP OUT2
;===================
;===================
START:
MOV A,@0B11111101 ;P61输出
IOW PORT6
MOV A,@0B11111101 ;P61下拉
IOW IOCB
MOV A,@0X00
MOV PORT6,A
IOW IOCE
MOV A,@10
MOV TURN,A
;-----------------------------
BEG:
MOV A,@0X00
MOV PORT6,A
MOV FLAG,A
IOW IOCE
MOV A,@6
MOV NUMK,A
;------------------功能1 强光
G1:
MOV A,@6
SUB A,NUMK
JBS STATUS,0
JMP G2
MOV A,@0X00
IOW IOCF
BS PORT6,1
JMP KEY

;------------------功能2 中光
G2:
MOV A,@5
SUB A,NUMK
JBS STATUS,0
JMP G3
MOV A,@0B00000000
CONTW
MOV A,@170
MOV NUM,A
MOV PAR,A
MOV A,@0B00000001
IOW IOCF
MOV A,@250
MOV TCC,A
ENI
JMP KEY
;------------------功能3 弱光
G3:
MOV A,@4
SUB A,NUMK
JBS STATUS,0
JMP G4
MOV A,@85
MOV NUM,A
MOV PAR,A
MOV A,@0B00000000
CONTW
MOV A,@0X01
IOW IOCF
MOV A,@250
MOV TCC,A
ENI
JMP KEY
;-----------------功能4 爆闪
G4:
MOV A,@3
SUB A,NUMK
JBS STATUS,0
JMP G5
BS BSF ;爆闪标志
MOV A,@0B00000101
CONTW
MOV A,@20
MOV PAR,A
MOV A,@200
MOV TCC,A
MOV A,@0X01
IOW IOCF
ENI
JMP KEY
;-----------------功能5 SOS
G5:
MOV A,@2
SUB A,NUMK
JBS STATUS,0
JMP BEG
BC BSF ;关爆闪标志
BS SOF ;开SOS标志
MOV A,@0B00000100
CONTW
BS PORT6,1
MOV A,@5
MOV NUM,A ;闪次数
MOV A,@80
MOV PAR,A
MOV A,@1
MOV TCC,A
MOV A,@0X01
IOW IOCF
ENI
JMP KEY
;===============开关检测
KEY:
JBC PORT6,3
JMP KEY
CALL DELAY1
JBC PORT6,3
JMP KEY
DISI
MOV A,@0X00
IOW IOCF ;关所有中断
MOV PORT6,A ;关开关时,要关输出
;------------------
SL:
WDTC ;清除WDT和预分频器
CLR TCC ;清TCC
MOV A,@0B00011110 ;设置WDT分频比,大于1:1
CONTW
MOV A,@0X00 ;禁止WDT
IOW IOCE
MOV PORT6,PORT6
DISI
MOV A,@0B00000010 ;设置唤醒功能
IOW IOCF
SLEP
NOP
WDTC
CLRA
IOW IOCE ;禁止WDT
IOW IOCF ;禁止唤醒
;===========================
K1:
JBS PORT6,3
JMP K1
CALL DELAY2
JBS PORT6,3
JMP K1
DEC NUMK
JMP G1

;================
DELAY1:
MOV A,@15
MOV DLY1,A
D1: MOV A,@10
MOV DLY2,A
D2: DJZ DLY2
JMP D2
DJZ DLY1
JMP D1
RET
;---------------
DELAY2:
MOV A,@40
MOV DLY1,A
E1: MOV A,@50
MOV DLY2,A
E2: DJZ DLY2
JMP E2
DJZ DLY1
JMP E1
RET
回复

使用道具 举报

21#
ID:213173 发表于 2023-8-5 06:50 | 只看该作者
咯上 发表于 2023-8-4 12:21
https://tieba.baidu.com/p/7528586913
参考下这个帖子他的是汇编,看不懂

你绕了这么大圈子,直接说是为了改装成品手电筒不就得了。利用电源开关做触发信号换挡。无需EEPROM。低功耗模式可有可无,在于操作时间间隔需求和蓄能电容大小。基本可以按流水灯程序写。
回复

使用道具 举报

22#
ID:1062408 发表于 2023-8-5 08:36 | 只看该作者
wulin 发表于 2023-8-5 06:50
你绕了这么大圈子,直接说是为了改装成品手电筒不就得了。利用电源开关做触发信号换挡。无需EEPROM。低功 ...

关断一般1s或几s还是要的,所以说低功耗必须要的,电容一般就几uf撑不了多久,我要的是换挡要换io口的,他这个用了pwm只用一个io口这种驱动我也有好几个,我想做没有pwm完全恒流的驱动,能不能按照我发帖的要写一个程序
回复

使用道具 举报

23#
ID:1062408 发表于 2023-8-5 08:39 | 只看该作者
声明下我不是用于伤腰用途,网上也能买到不值钱就是邮费贵点舍不得买,还有程序比较灵活能随便改
回复

使用道具 举报

24#
ID:1090753 发表于 2023-8-5 08:40 | 只看该作者

不是,你把按键复位改一下
回复

使用道具 举报

25#
ID:213173 发表于 2023-8-5 10:49 | 只看该作者
咯上 发表于 2023-8-5 08:36
关断一般1s或几s还是要的,所以说低功耗必须要的,电容一般就几uf撑不了多久,我要的是换挡要换io口的, ...

程序基本构架很简单,可能在调试中需要略做修改。芯片不同,510K电阻未必恰当。
  1. #include "STC8G.H"
  2. #include<intrins.h>
  3. typedef unsigned char uchar;
  4. typedef unsigned int uint;
  5. sbit LED=P5^4;
  6. sbit EN =P5^5;
  7. sbit key=P3^2;

  8. uchar count=0;
  9. bit allow;

  10. void Shutdown()//掉电模式函数
  11. {
  12.         if(allow)
  13.         {
  14.                 LED=1;
  15.                 EN=1;
  16.                 _nop_();
  17.                 _nop_();
  18.                 PCON = 0x02; //MCU进入掉电模式
  19.                 _nop_();
  20.                 _nop_();
  21.                 _nop_();
  22.                 _nop_();
  23.                 allow=0;
  24.         }
  25. }

  26. void INT0_Isr() interrupt 0
  27. {
  28.     if(key)                //判断上升沿换挡
  29.     {
  30.         count=++count%3;
  31.     }
  32.     else                   //判断下降沿休眠
  33.     {
  34.                         allow=1;
  35.     }
  36. }


  37. void main()
  38. {
  39. //P3、P5口都设置为准双向口
  40.         P3M0 = 0x00;
  41.         P3M1 = 0x00;
  42.         P5M0 = 0x00;
  43.         P5M1 = 0x00;
  44.         IT0 = 0;   //使能INT0上升沿和下降沿中断
  45.         EX0 = 1;   //使能INT0中断
  46.         EA = 1;    //开总中断
  47.         while(1)
  48.         {
  49.                 Shutdown();

  50.                 if(count==0)
  51.                 {
  52.                         LED=0;
  53.                         EN=1;
  54.                 }
  55.                 if(count==1)
  56.                 {
  57.                         LED=1;
  58.                         EN=0;
  59.                 }
  60.                 if(count==2)
  61.                 {
  62.                         EN=1;
  63.                 }
  64.         }
  65. }


复制代码

回复

使用道具 举报

26#
ID:1062408 发表于 2023-8-5 14:44 | 只看该作者
wulin 发表于 2023-8-5 10:49
程序基本构架很简单,可能在调试中需要略做修改。芯片不同,510K电阻未必恰当。

睡眠代码要写成这样才能断电睡眠
IT0 = 1;                //INT0 下降沿中断               
                        IE0 = 0;                //清除外中断0标志位
                        _nop_();
                        _nop_();
                        EX0 = 1;                //INT0 允许中断
                        _nop_();
                        _nop_();
                        PCON |= 0x02;        //Sleep
                        _nop_();
                        _nop_();
                        _nop_();

还有510k并了个103电容才成功,不然就出现按几下才换档现象,还有3.2是高阻模式,如果不并103改代码能成功吗?下面放出我并103成功的代码

#include "STC8G.H"
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit LED=P5^4;
sbit EN =P5^5;
sbit key=P3^2;

uchar count=0;
bit allow;

void Shutdown()//掉电模式函数
{
        
                IT0 = 1;                //INT0 下降沿中断               
                        IE0 = 0;                //清除外中断0标志位
                        _nop_();
                        _nop_();
                        EX0 = 1;                //INT0 允许中断
                        _nop_();
                        _nop_();
                        PCON |= 0x02;        //Sleep
                        _nop_();
                        _nop_();
                        _nop_();
            
}

void INT0_Isr() interrupt 0
{
            EX0=0;
     PCON=0x00;
    if(key)                //判断上升沿换挡
    {
        count=++count%3;
    }
   
}


void main()
{
//P3、P5口都设置为准双向口
            P3M0 = 0x00; P3M1 = 0x04;

        P5M0 = 0x00;
        P5M1 = 0x00;
        IT0 = 0;   //使能INT0上升沿和下降沿中断
        EX0 = 1;   //使能INT0中断
        EA = 1;    //开总中断
        while(1)
        {
                                        if(key==0)
                Shutdown();

                if(count==0)
                {
                        LED=0;
                        EN=1;
                }
                if(count==1)
                {
                        LED=1;
                        EN=0;
                }
                if(count==2)
                {
                        EN=1;
                }
        }
}
回复

使用道具 举报

27#
ID:1062408 发表于 2023-8-5 23:22 | 只看该作者
wulin 发表于 2023-8-5 10:49
程序基本构架很简单,可能在调试中需要略做修改。芯片不同,510K电阻未必恰当。

现在试这代码又可以了,之前在负极到电容负串了1k电阻用了测量断电时电流是否是ua级别,可能就是串了这个电阻就失败了,现在取消掉了就可以了,不过电容要大点的要大于47uf不然3.6v以下无法换挡,还有510k要并103电容,不并换挡一会行一会又玄学不行搞不懂,我用的是3.2高阻,搞这个一会行一会不行调了好久真的有点玄学
回复

使用道具 举报

28#
ID:60656 发表于 2023-8-13 22:04 | 只看该作者
咯上 发表于 2023-8-5 23:22
现在试这代码又可以了,之前在负极到电容负串了1k电阻用了测量断电时电流是否是ua级别,可能就是串了这个 ...

如果有lvd 检测 检测到低于一定电压直接睡眠 上电后模式加 能实现你的断电换挡吗可以试试, 电容维持不复位可以 选低频低功耗的mcu
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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