




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 基于(jy)ATtiny13的無級調光(dio un)手電筒程序 市面上的頭燈一般(ybn)有強光、弱光、爆閃三個擋位,一個按鈕來控制開/關和換擋,順序是:開(強光)-弱光-閃爍-關,每次開/關燈需要按三次,非常不方便。 兩年前改造的五擋調光頭燈一直用的很好,操作簡便又人性化。近來比較空閑,突發(fā)DIY一個有無級調光功能的頭燈想法。于是在網(wǎng)上搜索合適DIY的頭燈,搜索原則是散熱性能好、能變焦、盡量是裝兩節(jié)18650電池的燈。本人喜歡變焦燈,因為照射范圍可調又均勻。第一次購買的燈完全失敗,散熱極差,為了節(jié)省成本居然燈頭的重要部件用的是硬塑料,直接丟掉。第二次買的還好,驚喜的是他的控制芯片用的是C
2、X2812,它的引腳與ATTiny13單片機類似,替換控制芯片,稍微改動電路板的布線就可以利用原配的控制板,避免了從頭開始做控制板,省去了最繁瑣的印刷電路板的制作了。通過ATtiny13a單片機的編程實現(xiàn)了一下功能:1、按一次開燈,再按一次就關燈,解決了按三次關燈的不方便的問題。2、開關燈保留了逐步亮和逐步暗的功能,此功能非常人性化,本人很喜歡。具體實現(xiàn)如下:開燈的時候PWM信號的占空比從0開始逐步加到設定的亮度,關燈時候占空比逐步減到0。3、無級調光:在燈亮狀態(tài)下按住按鈕,LED燈亮度增加或減少,亮度達到100%或10%時閃爍三次來提醒亮度已經(jīng)達到了全亮或最暗,松開按鈕就停止調光,一直按住就
3、循環(huán)調光。程序中利用了ATtiny13a的PWM、外部中斷(PCINT0)、睡眠、看門狗和EEPROM的讀寫功能,基本上每一行都加了注釋,對于初次接觸ATtiny13的人來說應該有幫助。圖片1:頭燈圖片(tpin)2:頭燈控制板(此控制板網(wǎng)上也有賣的)圖片(tpin)3:程序調試電路圖圖片(tpin)4:用面包(minbo)板搭建(d jin)程序調試電路圖片(tpin)5:基于(jy)ATTiny13A的控制板電路圖圖片(tpin)6:修改后的ATTiny13A控制板圖片(tpin)7:18650電池(dinch)下的待機(dij)電流為0.26uA。程序編輯和編譯工具用了CodeVisio
4、nAVR 2.04.4a,燒寫工具用了progisp1.72。程序(chngx)源碼:/* 名稱(mngchng) :LED控制程序* 描述(mio sh) :無級調光功能,單擊開/關,長按無級調光* MCU :ATTiny13A* 晶振 :RC 9.6MHz* 編譯環(huán)境 :CodeVisionAVR 2.04.4a* 版本 :4.0 KEY用外部中斷方式、增加睡眠功能、看門狗,8分頻(4.6875KHz)* 外部中斷服務程序=PCINT0, 無級調光*/#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 啟動#define PWM_OFF 0 x03 /PWM 關閉(gunb)#define MIN_VAL 0 x1a /最小亮度(lingd)#define MAX_VAL 0 xff /最大亮度(lingd)#define LONG_KEY 3 /長按鍵的時間#
6、define ADDRESS 0 x01 /保存擋位的地址uchar pwmVal = 0; /亮度值uint keytime = 0; /按鍵時間bit status = 0; /0為LED ON,1為LED OFFbit fangxiang = 0; /亮度增減方向/* 描述:eeprom寫一個字節(jié)數(shù)據(jù)* 參數(shù):address-地址 data-數(shù)據(jù)*/void eeprom_write(uchar address,uchar data) /等待上一次寫操作結束 while(EECR&(1EEPE); /設置編程模式 EECR=(0EEPM0); /設置地址和數(shù)據(jù)寄存器 EEAR = add
7、ress; EEDR = data; /置位EEMPE EECR |= (1EEMPE); /置位EEWE,啟動寫操作 EECR |= (1EEPE); /* 描述:eeprom讀一個字節(jié)數(shù)據(jù)* 參數(shù):address-地址*/uchar eeprom_read(uchar address) /等待上一次寫操作結束 while(EECR&(1EEPE); /設置地址寄存器 EEAR=address; /設置(shzh)EERE以啟動(qdng)讀操作 EECR |= (1EERE); /自數(shù)據(jù)(shj)寄存器返回數(shù)據(jù) return(EEDR);/* 描述:開啟看門狗* 參數(shù):無*/void WD
8、T_on(void) / 看門狗設置 /#asm(cli) / 關閉全局中斷 #asm(WDR) / 看門狗復位指令WDR用來復位看門狗定時器 WDTCR=0 x18; / 啟動時序 WDTCR |= (1WDCE) | (1WDE); /WDTCR=0 x28; / 看門狗定時4s WDTCR = (1WDP3) | (1WDE); WDTCR = (1WDP3) | (1WDE); / 看門狗定時4s /#asm(sei) / 開啟全局中斷/* 描述:關閉看門狗* 參數(shù):無*/void WDT_off(void) / 看門狗設置 /#asm(cli) / 關閉全局中斷 #asm(WDR)
9、/ 看門狗復位指令WDR用來復位看門狗定時器 MCUSR &= (1WDRF); / 清除MCUSR 寄存器中WDRF / 在WDCE 與WDE 中寫邏輯1,保持舊預分頻器設置防止無意暫停 WDTCR |= (1WDCE) | (1WDE); WDTCR = 0 x00; / 關閉WDT /#asm(sei) / 開啟全局中斷/* 描述:LED Flicker 閃爍* 參數(shù)(cnsh):無*/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 開燈(ki dn)* 參數(shù):無 */void led_on(void) uchar i; TCCR0A = PWM_ON; /開啟PWM for (i=0; i= MAX_VAL) TCCR0A = PWM_OFF; LEDDRV = LED_ON; WDT_on(); /啟動看門狗 /* 描述:LED OFF 關燈* 參數(shù)(cnsh):無*/void led_off(void) uchar i; TCCR0A = PWM_ON; /開啟(kiq)PWM for (i=pwmVal; i0; i-) OCR0A = i;
11、/更改(gnggi)占空比 delay_us(500); TCCR0A = PWM_OFF; /關閉PWM LEDDRV = LED_OFF;/* 描述:LED 亮度增加* 參數(shù):無 */void led_zeng(void) TCCR0A = PWM_ON; /開啟PWM for (; pwmVal=MAX_VAL) led_flicker(3);/* 描述:LED 亮度減少* 參數(shù):無*/void led_jian(void) TCCR0A = PWM_ON; /開啟(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ù)* 輸入 :無*/*interruptTIM0_OVF void timer0_ovf_isr(void)*/* 名稱 : 外部中斷INT0服務程序* 功能 : * 輸入 :無* 輸出 :無*/*interrupt EXT_INT0 void int0_isr(void)*/* 名稱 : 中斷PC_INT0服務程序* 功能 : * 輸入 :無* 輸出 :無*/interrupt PC_INT0 voi
13、d pc_int0_isr(void) if (KEY=KEY_DOWN) /判斷是否按下鍵,KEY接地 delay_ms(5); /防抖延時 for (keytime=0; (KEY=KEY_DOWN) & keytime LONG_KEY & KEY=KEY_DOWN & status = 1) /長按邏輯(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(); /開燈 else if (status = 1) / LED OFF led_off(); /關燈 status = status; /* 名稱(mngchng) : Main()* 功能(gngnng) : 主函數(shù)(hnsh) * 輸入 :無* 輸出 :無*/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; 占空比相反時TCCR0A = 0 x83 0COM0A0) /TCCR0A |= (1COM0A1)|(0COM0A0)|(1WGM01)|(1WGM00); TCCR0A = PWM_ON; /開啟PWM TCCR0B |= (0WGM02)|(0CS02)|(1CS01)|(0CS00); /8分頻(4.6875KHz) OCR0A = 0 x00; TCNT0 = 0 x00; / T/C0計數(shù)寄存器初值 TCCR0A = PWM_OFF; / 關閉PWM / 外部中斷初始化設置 /MCUCR |= (1ISC01) | (0ISC00); / INT0 為下降沿時產(chǎn)生中斷請求 /GIMSK |= (1INT0); / 允許 INT0 產(chǎn)生中斷 GIMSK |= (1PCIE); / 允許 PCINT0 產(chǎn)生中斷 PCMSK |= (1PCINT2); /引腳變化使能 - PB.2(第7引腳) / 讀取eeprom中的亮度檔位數(shù)據(jù) pwmVal = eeprom_read(ADDRESS)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 簽定禁業(yè)協(xié)議書
- 煙臺大學法學院協(xié)議書
- 退賠諒解協(xié)議書
- 荒地合作協(xié)議書
- 男人分工協(xié)議書
- 聘用副總協(xié)議書
- 蘇聯(lián)撤軍協(xié)議書
- 租船傭金協(xié)議書
- 菜品保密協(xié)議書
- 材料員勞務聘用協(xié)議書
- 關愛父母健康知到章節(jié)答案智慧樹2023年哈爾濱商業(yè)大學
- 陜西全過程工程咨詢服務合同示范文本
- 公路水運工程施工企業(yè)(主要負責人和安全生產(chǎn)管理人員)考核大綱及模擬題庫
- 1KV送配電調試報告
- GB/T 5801-2020滾動軸承機制套圈滾針軸承外形尺寸、產(chǎn)品幾何技術規(guī)范(GPS)和公差值
- FZ/T 93029-2016塑料粗紗筒管
- 2022年12月山東省普通高中學業(yè)水平合格性考試語文仿真模擬試卷C(答題卡)
- 塑膠原料來料檢驗指導書
- 人教版音樂三年級下冊知識總結
- 共點力平衡的應用-完整版PPT
- 系桿拱橋工程測量施工方案
評論
0/150
提交評論