您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > 基于ATtiny13的无级调光头灯程序
1基于ATtiny13的无级调光手电筒程序市面上的头灯一般有强光、弱光、爆闪三个挡位,一个按钮来控制开/关和换挡,顺序是:开(强光)-〉弱光-闪烁-关,每次开/关灯需要按三次,非常不方便。两年前改造的五挡调光头灯一直用的很好,操作简便又人性化。近来比较空闲,突发DIY一个有无级调光功能的头灯想法。于是在网上搜索合适DIY的头灯,搜索原则是散热性能好、能变焦、尽量是装两节18650电池的灯。本人喜欢变焦灯,因为照射范围可调又均匀。第一次购买的灯完全失败,散热极差,为了节省成本居然灯头的重要部件用的是硬塑料,直接丢掉。第二次买的还好,惊喜的是他的控制芯片用的是CX2812,它的引脚与ATTiny13单片机类似,替换控制芯片,稍微改动电路板的布线就可以利用原配的控制板,避免了从头开始做控制板,省去了最繁琐的印刷电路板的制作了。通过ATtiny13a单片机的编程实现了一下功能:1、按一次开灯,再按一次就关灯,解决了按三次关灯的不方便的问题。2、开关灯保留了逐步亮和逐步暗的功能,此功能非常人性化,本人很喜欢。具体实现如下:开灯的时候PWM信号的占空比从0开始逐步加到设定的亮度,关灯时候占空比逐步减到0。3、无级调光:在灯亮状态下按住按钮,LED灯亮度增加或减少,亮度达到100%或10%时闪烁三次来提醒亮度已经达到了全亮或最暗,松开按钮就停止调光,一直按住就循环调光。程序中利用了ATtiny13a的PWM、外部中断(PCINT0)、睡眠、看门狗和EEPROM的读写功能,基本上每一行都加了注释,对于初次接触ATtiny13的人来说应该有帮助。图片1:头灯2图片2:头灯控制板(此控制板网上也有卖的)图片3:程序调试电路图3图片4:用面包板搭建程序调试电路图片5:基于ATTiny13A的控制板电路图4图片6:修改后的ATTiny13A控制板图片7:18650电池下的待机电流为0.26uA。5程序编辑和编译工具用了CodeVisionAVR2.04.4a,烧写工具用了progisp1.72。程序源码:/***********************************************************************名称:LED控制程序*描述:无级调光功能,单击开/关,长按无级调光*MCU:ATTiny13A*晶振:RC9.6MHz*编译环境:CodeVisionAVR2.04.4a*版本:4.0KEY用外部中断方式、增加睡眠功能、看门狗,8分频(4.6875KHz)*外部中断服务程序=PCINT0,无级调光***********************************************************************/#includetiny13a.h#includedelay.h#defineucharunsignedchar#defineuintunsignedint#defineKEYPINB.2//tiny13第7脚,PCINT0中断#defineLEDDRVPORTB.0//tiny13第5脚#defineKEY_DOWN0//按下按键#defineLED_ON0//LED亮#defineLED_OFF1//LED灭#definePWM_ON0xc3//PWM启动#definePWM_OFF0x03//PWM关闭#defineMIN_VAL0x1a//最小亮度6#defineMAX_VAL0xff//最大亮度#defineLONG_KEY3//长按键的时间#defineADDRESS0x01//保存挡位的地址ucharpwmVal=0;//亮度值uintkeytime=0;//按键时间bitstatus=0;//0为LEDON,1为LEDOFFbitfangxiang=0;//亮度增减方向/***********************************************************************描述:eeprom写一个字节数据*参数:address--地址data--数据***********************************************************************/voideeprom_write(ucharaddress,uchardata){//等待上一次写操作结束while(EECR&(1EEPE));//设置编程模式EECR=(0EEPM1)|(0EEPM0);//设置地址和数据寄存器EEAR=address;EEDR=data;//置位EEMPEEECR|=(1EEMPE);//置位EEWE,启动写操作EECR|=(1EEPE);}/************************************************************************描述:eeprom读一个字节数据*参数:address--地址************************************************************************/uchareeprom_read(ucharaddress){//等待上一次写操作结束while(EECR&(1EEPE));//设置地址寄存器EEAR=address;//设置EERE以启动读操作EECR|=(1EERE);//自数据寄存器返回数据return(EEDR);}7/************************************************************************描述:开启看门狗*参数:无************************************************************************/voidWDT_on(void){//看门狗设置//#asm(cli)//关闭全局中断#asm(WDR)//看门狗复位指令WDR用来复位看门狗定时器WDTCR=0x18;//启动时序WDTCR|=(1WDCE)|(1WDE);//WDTCR=0x28;//看门狗定时4sWDTCR=(1WDP3)|(1WDE);WDTCR=(1WDP3)|(1WDE);//看门狗定时4s//#asm(sei)//开启全局中断}/************************************************************************描述:关闭看门狗*参数:无************************************************************************/voidWDT_off(void){//看门狗设置//#asm(cli)//关闭全局中断#asm(WDR)//看门狗复位指令WDR用来复位看门狗定时器MCUSR&=~(1WDRF);//清除MCUSR寄存器中WDRF//在WDCE与WDE中写逻辑1,保持旧预分频器设置防止无意暂停WDTCR|=(1WDCE)|(1WDE);WDTCR=0x00;//关闭WDT//#asm(sei)//开启全局中断}/************************************************************************描述:LEDFlicker闪烁*参数:无************************************************************************/voidled_flicker(uchardata){uchari;for(i=0;idata;i++){OCR0A=0x00;delay_ms(20);OCR0A=pwmVal;delay_ms(20);}8}/************************************************************************描述:LEDON开灯*参数:无***********************************************************************/voidled_on(void){uchari;TCCR0A=PWM_ON;//开启PWMfor(i=0;ipwmVal;i++){OCR0A=i;//更改占空比delay_us(500);}//全亮时候PWMOffif(pwmVal=MAX_VAL){TCCR0A=PWM_OFF;LEDDRV=LED_ON;}WDT_on();//启动看门狗}/************************************************************************描述:LEDOFF关灯*参数:无************************************************************************/voidled_off(void){uchari;TCCR0A=PWM_ON;//开启PWMfor(i=pwmVal;i0;i--){OCR0A=i;//更改占空比delay_us(500);}TCCR0A=PWM_OFF;//关闭PWMLEDDRV=LED_OFF;}9/************************************************************************描述:LED亮度增加*参数:无***********************************************************************/voidled_zeng(void){TCCR0A=PWM_ON;//开启PWMfor(;pwmValMAX_VAL&&KEY==KEY_DOWN;pwmVal++){OCR0A=pwmVal;//更改占空比delay_ms(2);}if(pwmVal=MAX_VAL)led_flicker(3);}/************************************************************************描述:LED亮度减少*参数:无************************************************************************/voidled_jian(void){TCCR0A=PWM_ON;//开启PWMfor(;pwmValMIN_VAL&&KEY==KEY_DOWN;pwmVal--){OCR0A=pwmVal;//更改占空比delay_ms(2);}if(pwmVal=MIN_VAL)led_flicker(3);}/***********************************************************************描述:定时器中断服务函数*输入:无***********************************************************************//*interrupt[TIM0_OVF]voidtimer0_ovf_isr(void){}*//***********************************************************************名称:外部中断INT0服务程序*功能:*输入:无10*输出:无***********************************************************************//*interrupt[EXT_INT0]voidint
本文标题:基于ATtiny13的无级调光头灯程序
链接地址:https://www.777doc.com/doc-2533510 .html