|
雖然是個簡單的東西但是花了好長時間,寫程序期間遇到了好多問題,然后慢慢的修改,直到完成,能夠做出來感覺很欣慰,特此上傳來共同學(xué)習(xí)進(jìn)步。
頭燈功能說明書原理圖
1.按鍵按第一下LED1和LED3亮,再按亮LED2,再按全滅。如此循環(huán)。
2.關(guān)燈狀態(tài)下,長按2秒以上進(jìn)入電量指示,電池3.9V以上LED123全部微亮表示滿電。
3.電池電壓3.6-3.9V,LED2,LED3微亮,電池3.6V以下,LED3微亮。
4.另外,LED2點亮狀態(tài)下,單片機(jī)檢測電池電壓,電壓低于3.2V時,LED2亮5s,關(guān)0.5s,重復(fù)。
說明書圖片.png (58.34 KB, 下載次數(shù): 72)
下載附件
說明書截圖
2018-8-24 09:10 上傳
電路原理圖如下:
原理圖截圖.png (38.15 KB, 下載次數(shù): 83)
下載附件
原理圖截圖
2018-8-24 09:10 上傳
程序截圖:
程序截圖.png (84.93 KB, 下載次數(shù): 76)
下載附件
程序截圖
2018-8-24 09:10 上傳
單片機(jī)源程序如下:
- #include "syscfg.h"
- #include "MS83Fxx02.h"
- #define _XTAL_FREQ 4000000 //4T,此定義詳解請看MS_Q&A_Sheet.pdf文檔
- #define LED1 RC2
- #define LED2 RC4
- #define LED3 RA1
- #define KEY RA6
- //#define LED4 RC3//ad轉(zhuǎn)換結(jié)果測試
- unsigned char keycount=0,LEDCOUNT=0,t=0;
- unsigned int flagecount=0,LED1COUNT=0,count=0,count1=0;
- unsigned long advalue=0;
- bit flage=0,flageled2=0,flageled=0,flage3=0;
- float adcvalue=0;
- void ENABLE_INTERRUPT(void);
- void interrupt ISR(void);
- void DEVICE_INIT(void);
- void Keycan(void);
- void ADC_INIT(void);
- void Led1_lighter(void);
- void Led2_lighter(void);
- void Led3_lighter(void);
- void Float_adcvalue(void);
- void Keycan(void);
- void TIMER1_INIT(void);
- /*====================================================
- *函數(shù)名:main
- *功能:主函數(shù)
- *輸入?yún)?shù):無
- *返回參數(shù):無
- ====================================================*/
- void main(void)
- {
- DEVICE_INIT(); //器件初始化
- ADC_INIT(); //adc初始化
- TIMER1_INIT(); //定時器1初始化
- keycount=0;
- LED1=0;
- LED2=0;
- LED3=0;
- ENABLE_INTERRUPT();//進(jìn)入定時器中斷
- while(1)
- { CLRWDT();
- if(!flage) Keycan();
- if(flage||flageled) Float_adcvalue();
- }
- }
- /*====================================================
- *函數(shù)名:interrupt ISR
- *功能:中斷服務(wù)函數(shù)
- *輸入?yún)?shù):無
- *返回參數(shù):無
- ====================================================*/
- void interrupt ISR(void)
- {
- if(T0IE&&T0IF&&!flage3)
- {
- T0IF = 0;
- TMR0 = 6;//(256-6)*4=1000us=1ms
- if(flageled2) LEDCOUNT++;
-
- if(LEDCOUNT==100)
- {
- LEDCOUNT=0;
- count++;
- if(count==50)
- { count=0;
- LED2=0;
- //__delay_ms(500);
- TMR1ON=1;flage3=1;
- }
-
- }
-
-
-
- }
- if(TMR1IE&&TMR1IF)
- {
- TMR1IF = 0;
- TMR1H = 0xFC;
- TMR1L = 0x17;//重裝初值定時時間1ms
- if(flage3){count1++;}
- else LED1COUNT++;
- if(count1==500){LED2=1;count1=0;flage3=0;}
- if(LED1COUNT==3000) {TMR1ON=0;flage=0;LED1COUNT=0;}
- }
- }
- /*====================================================
- *函數(shù)名:DEVICE_INIT
- *功能:上電器件初始化
- *輸入?yún)?shù):無
- *返回參數(shù):無
- ====================================================*/
- void DEVICE_INIT(void)
- {
- OSCCON = 0B01010001; //Bit7 >>> LFMOD=0 >>> WDT振蕩器頻率=32KHz
- //Bit6:4 >>> IRCF[2:0]=101 >>> 內(nèi)部RC頻率=4MHz
- //Bit0 >>> SCS=1 >>> 系統(tǒng)時鐘選擇為內(nèi)部振蕩器
- MSCKCON = 0B00000000;//Bit6 >>> VREG_OE=0 >>> 禁止穩(wěn)壓輸出
- //Bit5 >>> T2CKSRC=0 >>> Timer2時鐘源為系統(tǒng)時鐘
- //Bit4 >>> SLVREN=0 >>> 關(guān)閉LVR
- INTCON = 0B00000000; //暫禁止所有中斷
- CMCON0 = 0B00000111; //關(guān)閉比較器,CxIN為數(shù)字IO口
- ANSEL = 0B10000000; //所有IO口都為數(shù)字IO
- PORTA = 0B00000000;
- TRISA = 0B01000000; //RA0,RA6為輸入,其他為輸出
- WPUA = 0B01000000; //關(guān)閉PORTA口的內(nèi)部上拉除RA6
- PORTC = 0B00000000;
- TRISC = 0B00000000; //設(shè)置所有PORTC口為輸出
- WPUC = 0B00000000; //關(guān)閉啟PORTC口所有上拉
- OPTION = 0B00000000; //bit7=0,開啟PORTA內(nèi)部上拉總閘
-
-
- }
- /*====================================================
- *函數(shù)名:ENABLE_INTERRUPT
- *功能:開啟所需中斷
- *輸入?yún)?shù):無
- *返回參數(shù):無
- ====================================================*/
- void ENABLE_INTERRUPT(void)
- {
- T0IF = 0; //清TIMER0中斷標(biāo)志位
- T0IE = 1; //使能TIMER0中斷
- TMR1IF = 0; //清TIMER1中斷標(biāo)志位
- TMR1IE = 1; //使能TIMER1中斷
- PEIE = 1; //開啟外設(shè)總閘 timer1屬于外設(shè)
- GIE = 1; //開啟總中斷
- }
- /*====================================================
- *函數(shù)名:TIMER1_INIT
- *功能:Tiemr1初始化
- *輸入?yún)?shù):無
- *返回參數(shù):無
- ====================================================*/
- void TIMER1_INIT(void)
- {
- TMR1H = 0xFC;
- TMR1L = 0x17; //Timer1初值為0xFC17=64535
- T1CON = 0B00000000; //預(yù)分頻值5,4位 11=1:8
- // 10=1:4
- // 01=1:2
- // 00=1:1
-
- }
- /*====================================================
- *函數(shù)名:Keycan
- *功能:按鍵函數(shù)
- *輸入?yún)?shù):無
- *返回參數(shù):無
- ====================================================*/
- void Keycan(void)
- {if(KEY==0)
- __delay_ms(20);
- if(KEY==0)
- {
-
-
- while(!KEY)
- {__delay_ms(10);
- flagecount++;
- if((LED1==0)&&(LED2==0)&&(LED3==0)&&(flageled==0)&&(flagecount>299))//這里加flageled=0是為了處在LED2亮燈狀態(tài)時長按出現(xiàn)電量提示
- break;
- }
-
- if(flagecount>299)
- {if((LED1==0)&&(LED2==0)&&(LED3==0)&&(flageled==0))//這里加flageled=0是為了處在LED2亮燈狀態(tài)時長按出現(xiàn)電量提示
- {flage=1;
- flagecount=0;
- }
- else goto begin;
- }
- else
- {
- {if(flage==0)
- { begin:keycount++;
- flagecount=0;flage=0;
- switch(keycount)
- {case 1:LED1=1;LED2=0;LED3=1;flageled=0;flageled2=0;break;
- case 2:LED1=0;LED2=1;LED3=0;flageled=1;flageled2=0;break;
- case 3:LED1=0;LED2=0;LED3=0;keycount=0;flageled=0;flageled2=0;break;
- default: break;
- }
- }
- }
- }
- }
- }
- /*====================================================
- *函數(shù)名:ADC_INIT
- *功能:比較器初始化
- *輸入?yún)?shù):無
- *返回參數(shù):無
- ====================================================*/
- void ADC_INIT(void)
- {
- ANSEL = 0B10000000; //設(shè)置RA0為模擬輸入口
- ADCON1 = 0B01100000; //DIVS=0,時鐘選FOSC
- //ADCS[2:0]=110,分頻FOSC/64
- ADCON0 = 0B10111100; //B7,ADFM=1,結(jié)果右對齊
- //B6:5,VCFG=00,參考電壓VDD
- //B6:5,VCFG=01,參考電壓內(nèi)部2V
- //B6:5,VCFG=10,參考電壓內(nèi)部3V
- //B6:5,VCFG=11,參考電壓Vref
- //B4:2,CHS=000,選擇AN7通道
- //B1,GO,AD轉(zhuǎn)換狀態(tài)位
- //B0,ADON=1,ADC使能
-
- }
- /*====================================================
- *函數(shù)名:GET_ADC_VALUE
- *功能:開啟AD轉(zhuǎn)換,參考電壓為VDD
- *輸入?yún)?shù):ADC通道數(shù)
- *返回參數(shù):采樣到的AD值
- ====================================================*/
- unsigned int GET_ADC_VALUE()
- {
- unsigned int TempADCBuffer=0;
- ADCON0 |= 0b10000001; //開啟ADC電路
- __delay_us(10); //等待采集到電壓
- GO_DONE = 1; //開啟轉(zhuǎn)換
- while(GO_DONE==1) CLRWDT();//等待轉(zhuǎn)換完成
- TempADCBuffer = ADRESH;
- TempADCBuffer = (TempADCBuffer<<8)|ADRESL;
- ADON = 0;
- return(TempADCBuffer);
- }
- /*====================================================
- *函數(shù)名:u16_adcvalue
- *功能:開啟AD轉(zhuǎn)換,參考電壓為VDD
- *輸入?yún)?shù):ADC通道數(shù)
- *返回參數(shù):采樣到的AD值
- ====================================================*/
- void Float_adcvalue(void)
- { unsigned char i;
- for(i=0;i<20;i++)
- { advalue+=GET_ADC_VALUE();}
- advalue=advalue/20;
- adcvalue=advalue;
- adcvalue=adcvalue/1023*2.0000;
- //if(adcvalue>2) Led1_lighter();
- if(flageled)
- {if(adcvalue<0.80) flageled2=1;
- else {flageled2=0;LED1=0;LED2=1;LED3=0;}
- }
-
-
- else
- { flageled=0;flageled2=0;
- if(adcvalue>=1.07)
- { Led1_lighter();}
- if(adcvalue<1.07,adcvalue>=0.98)
- { Led2_lighter();}
- if(adcvalue<0.98)
- {Led3_lighter();}
- TMR1ON=1;
-
- }
- }
- /*====================================================
- *函數(shù)名:Led1_lighter()
- *功能:微亮3個燈
- *輸入?yún)?shù):
- *返回參數(shù):
- ====================================================*/
- void Led1_lighter(void)//微亮3個燈
- {LED1=1;LED2=1;LED3=1;
- __delay_us(500);
- LED1=0;LED2=0;LED3=0;
- //__delay_us(1);
- }
- /*====================================================
- *函數(shù)名:Led2_lighter()
- *功能:微亮2個燈
- *輸入?yún)?shù):
- *返回參數(shù):
- ====================================================*/
- void Led2_lighter(void)//微亮2個燈
- {LED1=0;LED2=1;LED3=1;
- __delay_us(500);
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
0.png (42.82 KB, 下載次數(shù): 70)
下載附件
2018-8-24 16:30 上傳
全部資料51hei下載地址:
頭燈制作.zip
(201.87 KB, 下載次數(shù): 90)
2018-8-24 09:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|