基于ATtiny13的无级调光头灯程序_第1页
基于ATtiny13的无级调光头灯程序_第2页
基于ATtiny13的无级调光头灯程序_第3页
基于ATtiny13的无级调光头灯程序_第4页
基于ATtiny13的无级调光头灯程序_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于ATtiny13的无级调光手电筒程序 市面上的头灯一般有强光、弱光、爆闪三个挡位,一个按钮来控制开/关和换挡,顺序是:开(强光)-弱光-闪烁-关,每次开/关灯需要按三次,非常不方便。 两年前改造的五挡调光头灯一直用的很好,操作简便又人性化。近来比较空闲,突发DIY一个有无级调光功能的头灯想法。于是在网上搜索合适DIY的头灯,搜索原则是散热性能好、能变焦、尽量是装两节18650电池的灯。本人喜欢变焦灯,因为照射范围可调又均匀。第一次购买的灯完全失败,散热极差,为了节省成本居然灯头的重要部件用的是硬塑料,直接丢掉。第二次买的还好,惊喜的是他的控制芯片用的是CX2812,它的引脚与ATTiny1

2、3单片机类似,替换控制芯片,稍微改动电路板的布线就可以利用原配的控制板,避免了从头开始做控制板,省去了最繁琐的印刷电路板的制作了。通过ATtiny13a单片机的编程实现了一下功能:1、按一次开灯,再按一次就关灯,解决了按三次关灯的不方便的问题。2、开关灯保留了逐步亮和逐步暗的功能,此功能非常人性化,本人很喜欢。具体实现如下:开灯的时候PWM信号的占空比从0开始逐步加到设定的亮度,关灯时候占空比逐步减到0。3、无级调光:在灯亮状态下按住按钮,LED灯亮度增加或减少,亮度达到100%或10%时闪烁三次来提醒亮度已经达到了全亮或最暗,松开按钮就停止调光,一直按住就循环调光。程序中利用了ATtiny1

3、3a的PWM、外部中断(PCINT0)、睡眠、看门狗和EEPROM的读写功能,基本上每一行都加了注释,对于初次接触ATtiny13的人来说应该有帮助。图片1:头灯图片2:头灯控制板(此控制板网上也有卖的)图片3:程序调试电路图图片4:用面包板搭建程序调试电路图片5:基于ATTiny13A的控制板电路图图片6:修改后的ATTiny13A控制板图片7:18650电池下的待机电流为0.26uA。程序编辑和编译工具用了CodeVisionAVR 2.04.4a,烧写工具用了progisp1.72。程序源码:/* 名称 :LED控制程序* 描述 :无级调光功能,单击开/关,长按无级调光* MCU :AT

4、Tiny13A* 晶振 :RC 9.6MHz* 编译环境 :CodeVisionAVR 2.04.4a* 版本 :4.0 KEY用外部中断方式、增加睡眠功能、看门狗,8分频(4.6875KHz)* 外部中断服务程序=PCINT0, 无级调光*/#include #include #define uchar unsigned char#define uint unsigned int#define KEY PINB.2 /tiny13第7脚,PCINT0中断#define LEDDRV PORTB.0 /tiny13第5脚#define KEY_DOWN 0 /按下按键#define LED_O

5、N 0 /LED 亮#define LED_OFF 1 /LED 灭#define PWM_ON 0xc3 /PWM 启动#define PWM_OFF 0x03 /PWM 关闭#define MIN_VAL 0x1a /最小亮度#define MAX_VAL 0xff /最大亮度#define LONG_KEY 3 /长按键的时间#define ADDRESS 0x01 /保存挡位的地址uchar pwmVal = 0; /亮度值uint keytime = 0; /按键时间bit status = 0; /0为LED ON,1为LED OFFbit fangxiang = 0; /亮度增减

6、方向/* 描述:eeprom写一个字节数据* 参数:address-地址 data-数据*/void eeprom_write(uchar address,uchar data) /等待上一次写操作结束 while(EECR&(1EEPE); /设置编程模式 EECR=(0EEPM0); /设置地址和数据寄存器 EEAR = address; EEDR = data; /置位EEMPE EECR |= (1EEMPE); /置位EEWE,启动写操作 EECR |= (1EEPE); /* 描述:eeprom读一个字节数据* 参数:address-地址*/uchar eeprom_read(uc

7、har address) /等待上一次写操作结束 while(EECR&(1EEPE); /设置地址寄存器 EEAR=address; /设置EERE以启动读操作 EECR |= (1EERE); /自数据寄存器返回数据 return(EEDR);/* 描述:开启看门狗* 参数:无*/void WDT_on(void) / 看门狗设置 /#asm(cli) / 关闭全局中断 #asm(WDR) / 看门狗复位指令WDR用来复位看门狗定时器 WDTCR=0x18; / 启动时序 WDTCR |= (1WDCE) | (1WDE); /WDTCR=0x28; / 看门狗定时4s WDTCR = (

8、1WDP3) | (1WDE); WDTCR = (1WDP3) | (1WDE); / 看门狗定时4s /#asm(sei) / 开启全局中断/* 描述:关闭看门狗* 参数:无*/void WDT_off(void) / 看门狗设置 /#asm(cli) / 关闭全局中断 #asm(WDR) / 看门狗复位指令WDR用来复位看门狗定时器 MCUSR &= (1WDRF); / 清除MCUSR 寄存器中WDRF / 在WDCE 与WDE 中写逻辑1,保持旧预分频器设置防止无意暂停 WDTCR |= (1WDCE) | (1WDE); WDTCR = 0x00; / 关闭WDT /#asm(se

9、i) / 开启全局中断/* 描述:LED Flicker 闪烁* 参数:无*/void led_flicker(uchar data) uchar i; for(i=0; idata; i+) OCR0A = 0x00; delay_ms(20); OCR0A = pwmVal; delay_ms(20); /* 描述:LED ON 开灯* 参数:无 */void led_on(void) uchar i; TCCR0A = PWM_ON; /开启PWM for (i=0; i= MAX_VAL) TCCR0A = PWM_OFF; LEDDRV = LED_ON; WDT_on(); /启动

10、看门狗 /* 描述:LED OFF 关灯* 参数:无*/void led_off(void) uchar i; TCCR0A = PWM_ON; /开启PWM for (i=pwmVal; i0; i-) OCR0A = i; /更改占空比 delay_us(500); TCCR0A = PWM_OFF; /关闭PWM LEDDRV = LED_OFF;/* 描述:LED 亮度增加* 参数:无 */void led_zeng(void) TCCR0A = PWM_ON; /开启PWM for (; pwmVal=MAX_VAL) led_flicker(3);/* 描述:LED 亮度减少* 参

11、数:无*/void led_jian(void) TCCR0A = PWM_ON; /开启PWM for (; pwmValMIN_VAL & KEY=KEY_DOWN; pwmVal-) OCR0A = pwmVal; /更改占空比 delay_ms(2); if(pwmVal = MIN_VAL) led_flicker(3);/* * 描述 :定时器中断服务函数* 输入 :无*/*interruptTIM0_OVF void timer0_ovf_isr(void)*/* 名称 : 外部中断INT0服务程序* 功能 : * 输入 :无* 输出 :无*/*interrupt EXT_INT

12、0 void int0_isr(void)*/* 名称 : 中断PC_INT0服务程序* 功能 : * 输入 :无* 输出 :无*/interrupt PC_INT0 void pc_int0_isr(void) if (KEY=KEY_DOWN) /判断是否按下键,KEY接地 delay_ms(5); /防抖延时 for (keytime=0; (KEY=KEY_DOWN) & keytime LONG_KEY & KEY=KEY_DOWN & status = 1) /长按逻辑处理 /#asm(WDR) /喂狗 if (pwmVal = MAX_VAL) fangxiang = 1; if

13、 (pwmVal = MAX_VAL) TCCR0A = PWM_OFF; LEDDRV = LED_ON; /短按逻辑处理 if (keytime 0 & keytime = LONG_KEY) /短按逻辑处理 if (status = 0) / LED NO led_on(); /开灯 else if (status = 1) / LED OFF led_off(); /关灯 status = status; /* 名称 : Main()* 功能 : 主函数 * 输入 :无* 输出 :无*/void main(void) / Crystal Oscillator division fact

14、or: 8 #pragma optsize- CLKPR=0x80; CLKPR=0x03; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif / I/O端口的初始化 DDRB = 0x01; / PB.1输入,PB.0输出 PORTB = 0x05; / PB.1上拉电阻,PB.0高电平 /PWM 初始化(TCCR0A=0xC3; 占空比相反时TCCR0A = 0x83 0COM0A0) /TCCR0A |= (1COM0A1)|(0COM0A0)|(1WGM01)|(1WGM00); TCCR0A = PWM_ON; /开启PWM TCCR0B

15、|= (0WGM02)|(0CS02)|(1CS01)|(0CS00); /8分频(4.6875KHz) OCR0A = 0x00; TCNT0 = 0x00; / T/C0计数寄存器初值 TCCR0A = PWM_OFF; / 关闭PWM / 外部中断初始化设置 /MCUCR |= (1ISC01) | (0ISC00); / INT0 为下降沿时产生中断请求 /GIMSK |= (1INT0); / 允许 INT0 产生中断 GIMSK |= (1PCIE); / 允许 PCINT0 产生中断 PCMSK |= (1PCINT2); /引脚变化使能 - PB.2(第7引脚) / 读取eeprom中的亮度档位数据 pwmVal = eeprom_read(ADDRESS); /读取eeprom里的数据 delay_us(100); /延时10us if (pwmVal=MAX_VAL) /eeprom无数据的话设为最高档位 pwmVal = MAX_VAL; if (pwmVal = MAX_VAL) fangxiang = 1; /亮度减 else fangxiang = 0; /亮度增 /

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论