基于ATtiny13的手电筒(头灯)控制电路和程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档