




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 基于(jy)ATtiny13的無(wú)級(jí)調(diào)光(dio un)手電筒程序 市面上的頭燈一般(ybn)有強(qiáng)光、弱光、爆閃三個(gè)擋位,一個(gè)按鈕來(lái)控制開(kāi)/關(guān)和換擋,順序是:開(kāi)(強(qiáng)光)-弱光-閃爍-關(guān),每次開(kāi)/關(guān)燈需要按三次,非常不方便。 兩年前改造的五擋調(diào)光頭燈一直用的很好,操作簡(jiǎn)便又人性化。近來(lái)比較空閑,突發(fā)DIY一個(gè)有無(wú)級(jí)調(diào)光功能的頭燈想法。于是在網(wǎng)上搜索合適DIY的頭燈,搜索原則是散熱性能好、能變焦、盡量是裝兩節(jié)18650電池的燈。本人喜歡變焦燈,因?yàn)檎丈浞秶烧{(diào)又均勻。第一次購(gòu)買(mǎi)的燈完全失敗,散熱極差,為了節(jié)省成本居然燈頭的重要部件用的是硬塑料,直接丟掉。第二次買(mǎi)的還好,驚喜的是他的控制芯片用的是C
2、X2812,它的引腳與ATTiny13單片機(jī)類(lèi)似,替換控制芯片,稍微改動(dòng)電路板的布線就可以利用原配的控制板,避免了從頭開(kāi)始做控制板,省去了最繁瑣的印刷電路板的制作了。通過(guò)ATtiny13a單片機(jī)的編程實(shí)現(xiàn)了一下功能:1、按一次開(kāi)燈,再按一次就關(guān)燈,解決了按三次關(guān)燈的不方便的問(wèn)題。2、開(kāi)關(guān)燈保留了逐步亮和逐步暗的功能,此功能非常人性化,本人很喜歡。具體實(shí)現(xiàn)如下:開(kāi)燈的時(shí)候PWM信號(hào)的占空比從0開(kāi)始逐步加到設(shè)定的亮度,關(guān)燈時(shí)候占空比逐步減到0。3、無(wú)級(jí)調(diào)光:在燈亮狀態(tài)下按住按鈕,LED燈亮度增加或減少,亮度達(dá)到100%或10%時(shí)閃爍三次來(lái)提醒亮度已經(jīng)達(dá)到了全亮或最暗,松開(kāi)按鈕就停止調(diào)光,一直按住就
3、循環(huán)調(diào)光。程序中利用了ATtiny13a的PWM、外部中斷(PCINT0)、睡眠、看門(mén)狗和EEPROM的讀寫(xiě)功能,基本上每一行都加了注釋?zhuān)瑢?duì)于初次接觸ATtiny13的人來(lái)說(shuō)應(yīng)該有幫助。圖片1:頭燈圖片(tpin)2:頭燈控制板(此控制板網(wǎng)上也有賣(mài)的)圖片(tpin)3:程序調(diào)試電路圖圖片(tpin)4:用面包(minbo)板搭建(d jin)程序調(diào)試電路圖片(tpin)5:基于(jy)ATTiny13A的控制板電路圖圖片(tpin)6:修改后的ATTiny13A控制板圖片(tpin)7:18650電池(dinch)下的待機(jī)(dij)電流為0.26uA。程序編輯和編譯工具用了CodeVisio
4、nAVR 2.04.4a,燒寫(xiě)工具用了progisp1.72。程序(chngx)源碼:/* 名稱(chēng)(mngchng) :LED控制程序* 描述(mio sh) :無(wú)級(jí)調(diào)光功能,單擊開(kāi)/關(guān),長(zhǎng)按無(wú)級(jí)調(diào)光* MCU :ATTiny13A* 晶振 :RC 9.6MHz* 編譯環(huán)境 :CodeVisionAVR 2.04.4a* 版本 :4.0 KEY用外部中斷方式、增加睡眠功能、看門(mén)狗,8分頻(4.6875KHz)* 外部中斷服務(wù)程序=PCINT0, 無(wú)級(jí)調(diào)光*/#include #include #define uchar unsigned char#define uint unsigned int
5、#define KEY PINB.2 /tiny13第7腳,PCINT0中斷#define LEDDRV PORTB.0 /tiny13第5腳#define KEY_DOWN 0 /按下按鍵#define LED_ON 0 /LED 亮#define LED_OFF 1 /LED 滅#define PWM_ON 0 xc3 /PWM 啟動(dòng)#define PWM_OFF 0 x03 /PWM 關(guān)閉(gunb)#define MIN_VAL 0 x1a /最小亮度(lingd)#define MAX_VAL 0 xff /最大亮度(lingd)#define LONG_KEY 3 /長(zhǎng)按鍵的時(shí)間#
6、define ADDRESS 0 x01 /保存擋位的地址uchar pwmVal = 0; /亮度值uint keytime = 0; /按鍵時(shí)間bit status = 0; /0為L(zhǎng)ED ON,1為L(zhǎng)ED OFFbit fangxiang = 0; /亮度增減方向/* 描述:eeprom寫(xiě)一個(gè)字節(jié)數(shù)據(jù)* 參數(shù):address-地址 data-數(shù)據(jù)*/void eeprom_write(uchar address,uchar data) /等待上一次寫(xiě)操作結(jié)束 while(EECR&(1EEPE); /設(shè)置編程模式 EECR=(0EEPM0); /設(shè)置地址和數(shù)據(jù)寄存器 EEAR = add
7、ress; EEDR = data; /置位EEMPE EECR |= (1EEMPE); /置位EEWE,啟動(dòng)寫(xiě)操作 EECR |= (1EEPE); /* 描述:eeprom讀一個(gè)字節(jié)數(shù)據(jù)* 參數(shù):address-地址*/uchar eeprom_read(uchar address) /等待上一次寫(xiě)操作結(jié)束 while(EECR&(1EEPE); /設(shè)置地址寄存器 EEAR=address; /設(shè)置(shzh)EERE以啟動(dòng)(qdng)讀操作 EECR |= (1EERE); /自數(shù)據(jù)(shj)寄存器返回?cái)?shù)據(jù) return(EEDR);/* 描述:開(kāi)啟看門(mén)狗* 參數(shù):無(wú)*/void WD
8、T_on(void) / 看門(mén)狗設(shè)置 /#asm(cli) / 關(guān)閉全局中斷 #asm(WDR) / 看門(mén)狗復(fù)位指令WDR用來(lái)復(fù)位看門(mén)狗定時(shí)器 WDTCR=0 x18; / 啟動(dòng)時(shí)序 WDTCR |= (1WDCE) | (1WDE); /WDTCR=0 x28; / 看門(mén)狗定時(shí)4s WDTCR = (1WDP3) | (1WDE); WDTCR = (1WDP3) | (1WDE); / 看門(mén)狗定時(shí)4s /#asm(sei) / 開(kāi)啟全局中斷/* 描述:關(guān)閉看門(mén)狗* 參數(shù):無(wú)*/void WDT_off(void) / 看門(mén)狗設(shè)置 /#asm(cli) / 關(guān)閉全局中斷 #asm(WDR)
9、/ 看門(mén)狗復(fù)位指令WDR用來(lái)復(fù)位看門(mén)狗定時(shí)器 MCUSR &= (1WDRF); / 清除MCUSR 寄存器中WDRF / 在WDCE 與WDE 中寫(xiě)邏輯1,保持舊預(yù)分頻器設(shè)置防止無(wú)意暫停 WDTCR |= (1WDCE) | (1WDE); WDTCR = 0 x00; / 關(guān)閉WDT /#asm(sei) / 開(kāi)啟全局中斷/* 描述:LED Flicker 閃爍* 參數(shù)(cnsh):無(wú)*/void led_flicker(uchar data) uchar i; for(i=0; idata; i+) OCR0A = 0 x00; delay_ms(20); OCR0A = pwmVal;
10、 delay_ms(20); /* 描述(mio sh):LED ON 開(kāi)燈(ki dn)* 參數(shù):無(wú) */void led_on(void) uchar i; TCCR0A = PWM_ON; /開(kāi)啟PWM for (i=0; i= MAX_VAL) TCCR0A = PWM_OFF; LEDDRV = LED_ON; WDT_on(); /啟動(dòng)看門(mén)狗 /* 描述:LED OFF 關(guān)燈* 參數(shù)(cnsh):無(wú)*/void led_off(void) uchar i; TCCR0A = PWM_ON; /開(kāi)啟(kiq)PWM for (i=pwmVal; i0; i-) OCR0A = i;
11、/更改(gnggi)占空比 delay_us(500); TCCR0A = PWM_OFF; /關(guān)閉PWM LEDDRV = LED_OFF;/* 描述:LED 亮度增加* 參數(shù):無(wú) */void led_zeng(void) TCCR0A = PWM_ON; /開(kāi)啟PWM for (; pwmVal=MAX_VAL) led_flicker(3);/* 描述:LED 亮度減少* 參數(shù):無(wú)*/void led_jian(void) TCCR0A = PWM_ON; /開(kāi)啟(kiq)PWM for (; pwmValMIN_VAL & KEY=KEY_DOWN; pwmVal-) OCR0A =
12、 pwmVal; /更改(gnggi)占空比 delay_ms(2); if(pwmVal = MIN_VAL) led_flicker(3);/* * 描述(mio sh) :定時(shí)器中斷服務(wù)函數(shù)* 輸入 :無(wú)*/*interruptTIM0_OVF void timer0_ovf_isr(void)*/* 名稱(chēng) : 外部中斷INT0服務(wù)程序* 功能 : * 輸入 :無(wú)* 輸出 :無(wú)*/*interrupt EXT_INT0 void int0_isr(void)*/* 名稱(chēng) : 中斷PC_INT0服務(wù)程序* 功能 : * 輸入 :無(wú)* 輸出 :無(wú)*/interrupt PC_INT0 voi
13、d pc_int0_isr(void) if (KEY=KEY_DOWN) /判斷是否按下鍵,KEY接地 delay_ms(5); /防抖延時(shí) for (keytime=0; (KEY=KEY_DOWN) & keytime LONG_KEY & KEY=KEY_DOWN & status = 1) /長(zhǎng)按邏輯(lu j)處理 /#asm(WDR) /喂狗 if (pwmVal = MAX_VAL) fangxiang = 1; if (pwmVal = MAX_VAL) TCCR0A = PWM_OFF; LEDDRV = LED_ON; /短按邏輯處理 if (keytime 0 & ke
14、ytime = LONG_KEY) /短按邏輯處理 if (status = 0) / LED NO led_on(); /開(kāi)燈 else if (status = 1) / LED OFF led_off(); /關(guān)燈 status = status; /* 名稱(chēng)(mngchng) : Main()* 功能(gngnng) : 主函數(shù)(hnsh) * 輸入 :無(wú)* 輸出 :無(wú)*/void main(void) / Crystal Oscillator division factor: 8 #pragma optsize- CLKPR=0 x80; CLKPR=0 x03; #ifdef _O
15、PTIMIZE_SIZE_ #pragma optsize+ #endif / I/O端口的初始化 DDRB = 0 x01; / PB.1輸入,PB.0輸出 PORTB = 0 x05; / PB.1上拉電阻,PB.0高電平 /PWM 初始化(TCCR0A=0 xC3; 占空比相反時(shí)TCCR0A = 0 x83 0COM0A0) /TCCR0A |= (1COM0A1)|(0COM0A0)|(1WGM01)|(1WGM00); TCCR0A = PWM_ON; /開(kāi)啟PWM TCCR0B |= (0WGM02)|(0CS02)|(1CS01)|(0CS00); /8分頻(4.6875KHz) OCR0A = 0 x00; TCNT0 = 0 x00; / T/C0計(jì)數(shù)寄存器初值 TCCR0A = PWM_OFF; / 關(guān)閉PWM / 外部中斷初始化設(shè)置 /MCUCR |= (1ISC01) | (0ISC00); / INT0 為下降沿時(shí)產(chǎn)生中斷請(qǐng)求 /GIMSK |= (1INT0); / 允許 INT0 產(chǎn)生中斷 GIMSK |= (1PCIE); / 允許 PCINT0 產(chǎn)生中斷 PCMSK |= (1PCINT2); /引腳變化使能 - PB.2(第7引腳) / 讀取eeprom中的亮度檔位數(shù)據(jù) pwmVal = eeprom_read(ADDRESS)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 小米3小米電視發(fā)布會(huì) 課件
- 醫(yī)療糾紛的心得體會(huì)模版
- 《大禹治水》教學(xué)設(shè)計(jì)
- 大學(xué)生職業(yè)規(guī)劃大賽《地理科學(xué)專(zhuān)業(yè)》生涯發(fā)展展示
- 臨床醫(yī)學(xué)檢驗(yàn)技術(shù)核心要點(diǎn)
- 精細(xì)化管理護(hù)理體系構(gòu)建與實(shí)踐
- 民辦學(xué)校校長(zhǎng)發(fā)言稿模版
- 玉林消防考試題及答案
- 小區(qū)物業(yè)管理調(diào)研報(bào)告
- 智慧教育云解決方案
- GB/T 45545-2025廚房家具配合尺寸
- 安全生產(chǎn)管理和培訓(xùn)制度
- 2025山東濟(jì)南先行投資集團(tuán)有限責(zé)任公司及權(quán)屬公司社會(huì)招聘169人筆試參考題庫(kù)附帶答案詳解
- 八年級(jí)心理健康微課件
- 建設(shè)工程消防驗(yàn)收課件
- 《大眾敏捷制造》課件
- 采礦機(jī)器人技術(shù)發(fā)展-全面剖析
- 地質(zhì)勘查合同補(bǔ)充協(xié)議
- 某橋梁工程專(zhuān)項(xiàng)施工方案
- 信息技術(shù)服務(wù)質(zhì)量承諾及保障措施
- GB 19646-2025食品安全國(guó)家標(biāo)準(zhǔn)稀奶油、奶油和無(wú)水奶油
評(píng)論
0/150
提交評(píng)論