鼠标有点老,是用一节5号电池,10天左右就没电,所以改造为锂电池.
//无线鼠标电源管理
//单片机:stc15w204s
//频率:6M
//单片机工作时管理2.5V稳压输出,鼠标5分钟无动作关闭2.5V输出,单片机进入掉电模式
//单片机工作时电池电压低于3.6V时,进入掉电模式
//按鼠标左键可唤醒单片机
//掉电模式工作电流: <20uA 工作电流: <10mA 锂电池容量:1300mAH 型号:14500
无线鼠标电源管理-15w204.rar
(95.87 KB, 下载次数: 24)
下面是部分程序预览:
- //无线鼠标电源管理
- //单片机:stc15w204s
- //频率:6M
- //单片机工作时管理2.5V稳压输出,鼠标5分钟无动作关闭2.5V输出,单片机进入掉电模式
- //单片机工作时电源电压低于3.6V时,进入掉电模式
- //按鼠标左键可唤醒单片机
- //掉电模式工作电流: <20uA 工作电流: <10mA 电池容量:1300mAH 型号:14500
- #include "stc15w204s.h"
- #include <intrins.h>
- typedef unsigned int u16; //16位无符号整型数
- typedef unsigned char u8; //8位无符号整型数
- /************* 本地常量声明 **************/
- //CMPCR1
- #define CMPEN 0x80 //1: 允许比较器, 0: 禁止,关闭比较器电源
- //#define CMPIF 0x40 //比较器中断标志, 包括上升沿或下降沿中断, 软件清0
- //#define PIE 0x20 //1: 比较结果由0变1, 产生上升沿中断
- //#define NIE 0x10 //1: 比较结果由1变0, 产生下降沿中断
- //#define PIS 0x08 //输入正极性选择, 0: 选择内部P5.5做正输入, 1: 由ADCIS[2:0]所选择的ADC输入端做正输入.
- //#define NIS 0x04 //输入负极性选择, 0: 选择内部BandGap电压BGv做负输入, 1: 选择外部P5.4做输入.
- //#define CMPOE 0x02 //1: 允许比较结果输出到P1.2, 0: 禁止.
- #define CMPRES 0x01 //比较结果, 1: CMP+电平高于CMP-, 0: CMP+电平低于CMP-, 只读
- //CMPCR2
- //#define INVCMPO 0x80 //1: 比较器输出取反, 0: 不取反
- //#define DISFLT 0x40 //1: 关闭0.1uF滤波, 0: 允许
- //#define LCDTY 0x00 //0~63, 比较结果变化延时周期数
- #define Pin0 0x01 //IO引脚 Px.0
- #define Pin1 0x02 //IO引脚 Px.1
- #define Pin2 0x04 //IO引脚 Px.2
- #define Pin3 0x08 //IO引脚 Px.3
- #define Pin4 0x10 //IO引脚 Px.4
- #define Pin5 0x20 //IO引脚 Px.5
- #define Pin6 0x40 //IO引脚 Px.6
- #define Pin7 0x80 //IO引脚 Px.7
- //#define PinAll 0xFF //IO所有引脚
- sbit KongZi = P3^2;
- u8 i ;
- bit DianYa=0;
- void ConfigTimer2(u8 s);
- void main()
- {
- //IO口初始化
- P3M1 |= Pin3;
- P5M1 |= Pin4+Pin5; //P3.3 P5.4 P5.5设置为高阻输入
- //比较器初始化
- CMPCR1 = 0;
- CMPCR2 = 5; //比较结果变化延时周期数, 0~63
- CMPCR1 |= CMPEN; //允许比较器 ENABLE,DISABLE
- // CMPCR1 |= PIE; //允许上升沿中断 ENABLE,DISABLE
- // CMPCR1 |= NIE; //允许下降沿中断 ENABLE,DISABLE
- // CMPCR1 |= PIS; //输入正极性选择, 0: 选择内部P5.5做正输入, 1: 由ADCIS[2:0]所选择的ADC输入端做正输入.
- // CMPCR1 |= NIS; //输入负极性选择, 0: 选择内部BandGap电压BGv做负输入, 1: 选择外部P5.4做输入
- // CMPCR1 |= CMPOE; //允许比较结果输出到P1.2, ENABLE,DISABLE
- // CMPCR2 |= INVCMPO; //比较器输出取反, ENABLE,DISABLE
- // CMPCR2 |= DISFLT; //内部0.1uF滤波, ENABLE,DISABLE
- CLK_DIV=0x07; //低速模式128分频
- WDT_CONTR=0x37; //喂狗 20S
- //IT1=0; //设置INT1中断类型上沿和下沿均可唤醒
- IT1=1; //设置INT1中断类型下沿可唤醒
- EX1=1; //使能INT1中断
- EA=1;
- KongZi=0;
- ConfigTimer2(10); //配置T2定时 0-16s
- while (1);
-
- }
- /* 配置并启动T2,s-T2定时时间 */
- void ConfigTimer2(u8 s)
- {
- unsigned long tmp; //临时变量
-
- tmp = 6000000 / 12 / 128 ; //定时器计数频率
- tmp = tmp * s ; //计算所需的计数值
- tmp = 65536 - tmp; //计算定时器重载值
- T2H = (u8)(tmp>>8); //定时器重载值拆分为高低字节
- T2L = (u8)tmp;
-
- AUXR &= 0xEF; // 启动T2定时器 方式 :16位重装模式计数器
- AUXR |= 0x10; // 启动T2定时器
- IE2 &= 0xFB; // 使能T2中断
- IE2 |= 0x04; // 使能T2中断
-
- //ET2 = 1; //使能T2中断
- //T2R = 1; //启动T2定时器
- }
- /* 外部中断服务函数 , P3.3下降沿触发*/
- void exint1()interrupt 2
- { CMPCR1 |= CMPEN; //开启比较器
- if(DianYa==1)
- { DianYa=0;
- if((CMPCR1 & CMPRES) == 0) //低电压检测
- {
- CMPCR1 = 0; //关闭比较器
- DianYa=1; //掉电记录
- KongZi=1; //控制端 1:2.5V没输出 0:2.5V输出
- PCON=0x02; //进入掉电模式
- _nop_();
- _nop_();
- return;
- }
- }
- i=0;
- KongZi=0; //控制端 1:2.5V没输出 0:2.5V输出
- }
- /* T2中断服务函数 */
- void InterruptTimer2() interrupt 12
- {
- WDT_CONTR=0x37; //喂狗 20S
- if((CMPCR1 & CMPRES) == 0) //低电压检测
- {
- CMPCR1 = 0; //关闭比较器
- DianYa=1; //掉电记录
- KongZi=1; //控制端 1:2.5V没输出 0:2.5V输出
- PCON=0x02; //进入掉电模式
- _nop_();
- _nop_();
- return;
- }
- i++;
- if(i>=30) //空闲5分钟进入掉电模式
- { i=0 ;
- CMPCR1 = 0; //关闭比较器
- KongZi=1; //控制端 1:2.5V没输出 0:2.5V输出
- PCON=0x02; //进入掉电模式
- _nop_();
- _nop_();
-
- }
- }
复制代码
|