|
<p></p><p>
[原创]调试成功,atiny+9926,10段可调带闪,电池电压检测
</p><p></p><p>程序如下:</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 PB4<br /><br />#define set_led_ddrDDRB|=_BV(PB0)<br />#define clr_led_ddrDDRB&=~_BV(PB0)<br />#define led_offPORTB&=~_BV(PB0)<br />#define led_onPORTB|=_BV(PB0)<br /><br />#define uchar unsigned char<br />#define uint unsigned int<br />#define uint8 uint8_t<br /><br />/* 定义全局变量 */<br />int light=205;<br />int inter_count=0;<br />uchar adc_val;<br />uint8 power=0,cpu_sta=0x20,flash_sign=0,flash_count=0;</p><p>//********** 按键检测 *******************<br /><br />void check_key(void)<br />{<br />if(!(PINB&0X10))<br />{<br />power=0;<br />while(!(PINB&0X10)) ;//按住按键2s进入闪烁模式,以4Hz的频率闪烁<br />_delay_ms(5);<br />}<br />}<br /><br />//****** 电池电压检测 *****************<br /><br />void adc_check(void)<br />{<br />adc_val=ADCH;<br />if(adc_val<0x7A) <br />{<br />light=0;<br />DDRB=0X00;<br />MCUCR=0X20;<br />inter_count=0;<br />PORTB=0X02;<br />}<br />}<br /><br />//********** 开灯和关灯 **************<br /><br />SIGNAL(SIG_INTERRUPT0)<br />{<br />inter_count++;<br />flash_sign=0;<br />flash_count=0;<br />if(inter_count==1)//开灯,配置寄存器<br />{<br />PORTB=0X13;<br />power=1;<br />cpu_sta=0;<br />set_led_ddr;<br />light=eeprom_read_byte(0);<br />_delay_ms(1);<br />OCR0A=light;//比较匹配值,ledl亮度<br />TCNT0=0;<br />TCCR0A=0Xc3;//比较匹配模式,快速PWM模式<br />TCCR0B=0X01;//64分频,输出频率f=70Hz<br />TIMSK0=0X02;//开比较匹配中断<br /><br />ADMUX=0X63;<br />DIDR0=0X08;<br />ADCSRB=0X00;<br />ADCSRA=0Xe3;<br /><br />while(!(PINB&0X02));<br />_delay_ms(20);<br />}<br />if(inter_count>=2) <br />{<br />light+=30;<br />if(light>250) light=1;<br />while(!(PINB&0X02));<br />_delay_ms(5);<br />}<br />if(power==0) <br />{<br />eeprom_write_byte(0,light);<br />_delay_ms(1);<br />cpu_sta=0x20;<br />clr_led_ddr;<br />led_off;<br />TCCR0B=0;<br />DDRB=0X00;<br />PORTB=0X02;<br />flash_count=0;<br />inter_count=0;<br />}<br />}<br /><br />//*********** 电池电压检测 ***********<br /><br />SIGNAL(SIG_OVERFLOW0)<br />{<br /><br />if(ADCSRA&0X10) adc_check();<br />if(!(PINB&0X10))<br />{<br />flash_count++;<br />if(flash_count>254) flash_sign=1;<br />}<br />else ;<br /><br />if(flash_sign==1) <br />{<br />TCCR0B=0X04;<br />OCR0A=205;<br />}<br />else <br />{<br />TCCR0B=0X01;<br />OCR0A=light;<br />}<br />}<br /><br /><br />//******* 主程序 **************<br />int main(void)<br />{<br />GIMSK=0X40;<br />PORTB=0x02;<br />CLKPR=0X80;<br />CLKPR=0X06;<br />eeprom_write_byte(0,light);<br />_delay_ms(1);<br />sei();<br />while(1)<br />{<br />check_key();<br />MCUCR=cpu_sta;<br />if(power==0) asm("sleep");<br />}<br />}</p><p><br />功能:按键1为开机加调光,关机时,按下按键1,灯亮,然后按按键1调节亮度,先由亮至暗,然后至亮,循环.</p><p>此时按下按键2,然后再按下按键1,关灯.关灯时记录上一次灯的亮度,开灯自动读取..</p><p>若在开灯后长按按键2,灯爆闪...频率大概是2Hz.爆闪时按下按键1关灯</p><p>功耗(用万用表测量的,不是很准确,不过差不了很远):关灯电流:170uA,按此计算,1天放电=170uA*24=4mAH,10天放电=4*10=40mAH</p><p>软件设定锂电保护电压是3.2V左右.档数由软件设定,可更改..</p><p></p><p></p><p></p><p><br /></p>
[原创]调试成功,atiny+9926,10段可调带闪,电池电压检测
<br />[此帖子已经被作者于[lastedittime]1180274680[/lastedittime]编辑过] |
|