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

下载本文档

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

文档简介

基于ATtiny13的无级调光手电筒程序市面上的头灯一般有强光、弱光、爆闪三个挡位,一个按钮来控制开/关和换挡,顺序是:开(强光)-〉弱光->闪烁->关,每次开/关灯需要按三次,非常不方便。两年前改造的五挡调光头灯一直用的很好,操作简便又人性化。近来比较空闲,突发DIY一个有无级调光功能的头灯想法。于是在网上搜索合适DIY的头灯,搜索原则是散热性能好、能变焦、尽量是装两节18650电池的灯。本人喜欢变焦灯,因为照射范围可调又均匀。第一次购买的灯完全失败,散热极差,为了节省成本居然灯头的重要部件用的是硬塑料,直接丢掉。第二次买的还好,惊喜的是他的控制芯片用的是CX2812,它的引脚与ATTiny13单片机类似,替换控制芯片,稍微改动电路板的布线就可以利用原配的控制板,避免了从头开始做控制板,省去了最繁琐的印刷电路板的制作了。通过ATtiny13a单片机的编程实现了一下功能:1、按一次开灯,再按一次就关灯,解决了按三次关灯的不方便的问题。2、开关灯保留了逐步亮和逐步暗的功能,此功能非常人性化,本人很喜欢。具体实现如下:开灯的时候PWM信号的占空比从0开始逐步加到设定的亮度,关灯时候占空比逐步减到0。3、无级调光:在灯亮状态下按住按钮,LED灯亮度增加或减少,亮度达到100%或10%时闪烁三次来提醒亮度已经达到了全亮或最暗,松开按钮就停止调光,一直按住就循环调光。程序中利用了ATtiny13a的PWM、外部中断(PCINT0)、睡眠、看门狗和EEPROM的读写功能,基本上每一行都加了注释,对于初次接触ATtiny13的人来说应该有帮助。图片1:头灯图片2:头灯控制板(此控制板网上也有卖的)图片3:程序调试电路图图片4:用面包板搭建程序调试电路图片5:基于ATTiny13A的控制板电路图图片6:修改后的ATTiny13A控制板图片7:18650电池下的待机电流为0.26uA。程序编辑和编译工具用了CodeVisionAVR2.04.4a,烧写工具用了progisp1.72。程序源码:/***********************************************************************名称:LED控制程序*描述:无级调光功能,单击开/关,长按无级调光*MCU:ATTiny13A*晶振:RC9.6MHz*编译环境:CodeVisionAVR2.04.4a*版本:4.0KEY用外部中断方式、增加睡眠功能、看门狗,8分频(4.6875KHz)*外部中断服务程序=>PCINT0,无级调光***********************************************************************/#include<tiny13a.h>#include<delay.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//最小亮度#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&(1<<EEPE));//设置编程模式EECR=(0<<EEPM1)|(0>>EEPM0);//设置地址和数据寄存器EEAR=address;EEDR=data;//置位EEMPEEECR|=(1<<EEMPE);//置位EEWE,启动写操作EECR|=(1<<EEPE);}/************************************************************************描述:eeprom读一个字节数据*参数:address--地址************************************************************************/uchareeprom_read(ucharaddress){//等待上一次写操作结束while(EECR&(1<<EEPE));//设置地址寄存器EEAR=address;//设置EERE以启动读操作EECR|=(1<<EERE);//自数据寄存器返回数据return(EEDR);}/************************************************************************描述:开启看门狗*参数:无************************************************************************/voidWDT_on(void){//看门狗设置//#asm("cli")//关闭全局中断#asm("WDR")//看门狗复位指令WDR用来复位看门狗定时器WDTCR=0x18;//启动时序WDTCR|=(1<<WDCE)|(1<<WDE);//WDTCR=0x28;//看门狗定时4sWDTCR=(1<<WDP3)|(1<<WDE);WDTCR=(1<<WDP3)|(1<<WDE);//看门狗定时4s//#asm("sei")//开启全局中断}/************************************************************************描述:关闭看门狗*参数:无************************************************************************/voidWDT_off(void){//看门狗设置//#asm("cli")//关闭全局中断#asm("WDR")//看门狗复位指令WDR用来复位看门狗定时器MCUSR&=~(1<<WDRF);//清除MCUSR寄存器中WDRF//在WDCE与WDE中写逻辑1,保持旧预分频器设置防止无意暂停WDTCR|=(1<<WDCE)|(1<<WDE);WDTCR=0x00;//关闭WDT//#asm("sei")//开启全局中断}/************************************************************************描述:LEDFlicker闪烁*参数:无************************************************************************/voidled_flicker(uchardata){uchari;for(i=0;i<data;i++){OCR0A=0x00;delay_ms(20);OCR0A=pwmVal;delay_ms(20);}}/************************************************************************描述:LEDON开灯*参数:无***********************************************************************/voidled_on(void){uchari;TCCR0A=PWM_ON;//开启PWMfor(i=0;i<pwmVal;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;i>0;i--){OCR0A=i;//更改占空比delay_us(500);}TCCR0A=PWM_OFF;//关闭PWMLEDDRV=LED_OFF;}/************************************************************************描述:LED亮度增加*参数:无***********************************************************************/voidled_zeng(void){TCCR0A=PWM_ON;//开启PWMfor(;pwmVal<MAX_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(;pwmVal>MIN_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服务程序*功能:*输入:无*输出:无***********************************************************************//*interrupt[EXT_INT0]voidint0_isr(void){}*//***********************************************************************名称:中断PC_INT0服务程序*功能:*输入:无*输出:无***********************************************************************/interrupt[PC_INT0]voidpc_int0_isr(void){if(KEY==KEY_DOWN)//判断是否按下键,KEY接地{delay_ms(5);//防抖延时for(keytime=0;(KEY==KEY_DOWN)&&keytime<LONG_KEY;keytime++){keytime++;delay_ms(50);//50ms}//长按逻辑处理while(keytime>LONG_KEY&&KEY==KEY_DOWN&&status==1)//长按逻辑处理{//#asm("WDR")//喂狗if(pwmVal>=MAX_VAL)fangxiang=1;if(pwmVal<=MIN_VAL)fangxiang=0;if(fangxiang==0)led_zeng();elseled_jian();fangxiang=~fangxiang;delay_us(10);eeprom_write(ADDRESS,pwmVal);//写eeprom里的数据delay_us(100);//全亮时候PWMOffif(pwmVal>=MAX_VAL){TCCR0A=PWM_OFF;LEDDRV=LED_ON;}}//短按逻辑处理if(keytime>0&&keytime<=LONG_KEY)//短按逻辑处理{if(status==0)//LEDNOled_on();//开灯elseif(status==1)//LEDOFFled_off();//关灯status=~status;}}}/***********************************************************************名称:Main()*功能:主函数*输入:无*输出:无***********************************************************************/voidmain(void){//CrystalOscillatordivisionfactor:8#pragmaoptsize-CLKPR=0x80;CLKPR=0x03;#ifdef_OPTIMIZE_SIZE_#pragmaoptsize+#endif//I/O端口的初始化DDRB=0x01;//PB.1输入,PB.0输出PORTB=0x05;//PB.1上拉电阻,PB.0高电平//PWM初始化(TCCR0A=0xC3;占空比相反时TCCR0A=0x830<<COM0A0)//TCCR0A|=(1<<COM0A1)|(0<<COM0A0)|(1<<WGM01)|(1<<WGM00);TCCR0A=PWM_ON;//开启PWMTCCR0B|=(0<<WGM02)|(0<<CS02)|(1<<CS01)|(0<<CS00);//8分频(4.6875KHz)OCR0A=0x00;TCNT0=0x00;//T/C0计数寄存器初值TCCR0A=PWM_OFF;//关闭PWM//外部中断初始化设置//MCUCR|=(1<<ISC01)|(0<<ISC00);//INT0为下降沿时产

温馨提示

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

评论

0/150

提交评论