|
<p></p><p>用AVR tiny13作控制,亮度连续调节,oca0引脚输出PWM,NMOS管是手机电池保护板上的低电压导通NMOS,Vgs最高只有1.2V,电池用一个18650供电...</p><p>功能:初始时,MCU在掉电模式下工作,理论电流<10uA,按下S1灯亮,然后案S1,S2分别降低和增加亮度,按住S1后2S关闭手电,按住S2后2S进入爆闪模式...MCU有自带AD,可检测电池电压,设定低于3.2V时自动关断..NMOS管有很多种,其导通电阻极低,只有30毫欧左右,8引脚,双NMOS...</p><p>最近忙于毕业设计,电路还没调试,懂AVR的朋友可以帮忙调试下,我将原程序贴上来...</p><p>调试工具GCC</p><p>功能可编程随意设定,因为按键只有2个,功能有限,要最大限度的利用...</p><p>#include <avr/io.h><br />#include <avr/signal.h><br />#include <avr/interrupt.h><br />#include <avr/delay.h> <br />#include <avr/eeprom.h><br /><br />#define key1 PB1<br />#define key2 PB2<br />#define set_led_ddrDDRB|=_BV(PB0)<br />#define led_offPORTB&=~_BV(PB0)<br />#define uchar unsigned char<br />#define uint unsigned int<br />#define uint8 uint8_t<br /><br />/* 定义全局变量 */<br />uchar cpu_state;//cpu状态变量<br />uchar light_sign;<br />uchar adc_val;<br />uint8 power=1,inter_count=0,power_sign=0,flash_sign=0;<br /><br />//********** 供电检测 ************<br />// 检测是否进入关机状态 <br />void power_check(void)<br />{<br />if(power==0)<br />{<br />cpu_state=0x30;<br />ADCSRA&=~_BV(ADEN);<br />ADMUX&=~_BV(REFS0);<br />PORTB=0X3F;<br />inter_count=0;<br />led_off;<br />eeprom_write_byte(0,light_sign);<br />}<br />}<br />//****** 电池电压检测 *****************<br />void adc_check(void)<br />{<br />adc_val=ADCH;<br />if(adc_val<0x80) power=0;<br />}<br /><br />//********** 按键检测 *******************<br /><br />void check_key(void)<br />{<br />if(!(PINB&0X04))<br />{<br />uint i;<br />light_sign+=5;<br />if(light_sign>=206) light_sign=206;<br />while(!(PINB&0X3B));//按住按键2s进入闪烁模式,以4Hz的频率闪烁<br />{<br />for(i=0;i<100;i++) _delay_ms(20);<br />flash_sign=1;<br />}<br />}<br />}</p><p>//******* 主程序 **************<br />int main(void)<br />{<br />MCUCR=0X30;//配置CPU状态<br />GIMSK=0X40;//使能休眠<br />TCCR0A=0XC3;//比较匹配模式,快速PWM模式<br />TCNT0=155;//计数值<br />TIMSK0=0X04;//开比较匹配中断<br />cpu_state=0x30;//CPU状态,进入掉电模式<br />PORTB=0X3e;//配置端口<br />eeprom_write_byte(0,186);<br />while(1)<br />{<br />MCUCR=cpu_state;<br />asm("sleep");//掉电模式,最大节省电能<br />check_key();<br />}<br />}<br /><br />//********** 开灯和关灯 **************<br /><br />SIGNAL(SIG_INTERRUPT0)<br />{<br />inter_count++;<br />if(inter_count==1)//开灯,配置寄存器<br />{<br />cpu_state=0x00;<br />inter_count++;<br />PORTB=0X3F;<br />set_led_ddr;<br />light_sign=eeprom_read_byte(0);<br />OCR0A=light_sign;//比较匹配值,ledl亮度<br />TCCR0B=0X0B;//64分频,输出频率f=70Hz<br />ADMUX=0X60;<br />DIDR0=0X20;<br />ADCSRB=0X00;<br />ADCSRA=0XC3;<br />while(!(PINB&0X02));<br />_delay_ms(20);<br />}<br />if(inter_count>=2) <br />{<br />uint8 i;<br />flash_sign=0;<br />light_sign-=5;<br />if(light_sign<=156) light_sign=156;<br />while(!(PINB&0X3D))<br />{<br />for(i=0;i<100;i++) _delay_ms(25);<br />power=0;<br />}<br />}<br /><br />}<br /><br />//*********** 电池电压检测 ***********<br /><br />SIGNAL(SIG_OUTPUT_COMPARE0A)<br />{<br />power_check();<br />if(ADCSRA&0X10) adc_check();<br />if(flash_sign==0)<br />{<br />TCCR0B=0X0B;<br />TCNT0=155;<br />OCR0A=light_sign;<br />}<br />else <br />{<br />TCCR0B=0X0D;<br />TCNT0=155;<br />OCR0A=205;<br />}<br />}<br /></p>
[原创]我设计的手电
<br />
[原创]我设计的手电
<br /> |
|