基于ATtiny13的手电筒(头灯)控制电路和程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于ATtiny13的手电筒(头灯)控制电路和程序
本人有一个用一节18650电池、带变焦的头灯,该头灯有强光、弱光和闪烁三个档,用Q5 LED,一个按钮来控制开/关和换档,顺序是:开(强光)-〉弱光->闪烁->关。
但功能和档位不太满意,于是用A Ttiny13单片机制作一个控制电路替换原有的控制器。
通过ATtiny13a单片机的编程实现了一下功能:
1、按一次开灯,再按一次就关灯,解决了按三次关灯的问题。
2、开灯后长按秒以上并进入设定亮度模式,闪烁三次来提示。
3、亮度设定共有5个档位,20%、40%、60%、80%、100% 每按一次加一个档,到头再按循环。
4、在设定模式下长按秒以上便推出设定模式,闪烁三次来提示。
5、退出设定模式时候亮度值保存在EEPROM,这样就拿掉电池也不怕丢设定值,下次开灯直接就是上次设定值了。
6、开灯时亮度逐渐变亮到设定值,关灯时亮度逐渐变暗,最终灭掉,此功能为独创,是为了减少对眼睛的刺激。设定值为100%亮度的时候,约1秒内亮度从0%开始逐渐达到100%的亮度,关灯相反、约1秒内亮度从100%开始逐渐减到0%。
手电筒控制电路如下:
以下是程序,利用了ATtiny13a的PWM、外部中断、睡眠、看门狗和EEPROM的读写功能,基本上每一行都加了注释,对于初次接触A Ttiny13的人来说应该有帮助的。
流程图:
程序源代码:
/********************************************************************** * 名称:LED控制程序
* 描述:调光设置功能
* MCU :ATTiny13A
* 晶振:RC
* 编译环境:CodeVisionA VR 2.04.4a
* 版本:KEY用外部中断方式、增加睡眠功能、修改看门狗,8分频()
***********************************************************************/ #include <>
//#include <>
#define uchar unsigned char
#define uint unsigned int
#define KEY //tiny13第6脚,INT0 外部中断
#define LEDDRV //tiny13第5脚
#define LEDDRV2 //tiny13第7脚(指示灯)
#define MAX_STA TE 5u //最多档位数
#define LONG_KEY 15 //长按键的时间
#define ADDRESS 0x01 //保存档位的地址
/********** 变量定义**********************************************/
//uchar pwm[]={0x20,0x40,0x60,0x80,0xA0,0xC0,0xE0,0xFF};
uchar pwm[]={0x20,0x40,0x80,0xC0,0xFF}; //亮度值
uchar pwmVal = 0; //亮度档位
uchar status = 0; //0为LED OFF,1为LED ON
uchar mode = 0; //0为使用模式,1为设置模式
uint keytime = 0; //按键时间
/********************************************************************** * 描述:软件延时函数(RC
* 输入:延时毫秒数
***********************************************************************/ void delayMs(uint n)
{
uint i;
uint j;
for (i=0; i for (j=0; j<137 ; j++) //RC 时候延时1MS #asm("nop") } /********************************************************************** * 名称: init_devices() * 功能: 端口、定时器、PWM初始化 * 输入:无 * 输出:无 ***********************************************************************/ void init_devices(void) { // Crystal Oscillator division factor: 8 #pragma optsize- CLKPR=0x80; CLKPR=0x03; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // I/O口的初始化 DDRB = 0x01; // 输出(P5),输入(P6),输出(P7), 输入(P2) PORTB = 0x00; // 输出 // PWM 初始化 // TCCR0A BIT 7 6 5 4 3 2 1 0 // COM0A1 COM0A0 COM0B1 COM0B0 - - WGM01 WGM00