|
300黑幣
求教大師,我現(xiàn)在是用外部中斷去控制燈的三段占空比,現(xiàn)在發(fā)現(xiàn)在if(scale==40) { scale=20;}是它會(huì)延時(shí)3秒才能跳到scale=20這里,是什么原因,還有一個(gè)問(wèn)題就是我要改小它的電流功耗,需要設(shè)置哪里,我試過(guò)改變晶振頻率它電流沒(méi)有減小。
單片機(jī)源程序如下:
- //*********************************************************
- #include "SYSCFG.h"
- //**********************************************************
- //***********************宏定義*****************************
- #define unchar unsigned char
- #define unint unsigned int
- #define unlong unsigned long
- #define PortOut RA4
- unchar scale=40;
- unchar n;
- /*-------------------------------------------------
- * 函數(shù)名:interrupt ISR1
- * 功能: 中斷處理函數(shù)
- * 輸入: 無(wú)
- * 輸出: 無(wú)
- --------------------------------------------------*/
- void interrupt ISR(void)//PIC_HI-TECH使用
- {
- //PA2外部中斷處理**********************
- if(INTE && INTF)
- {
- INTF = 0; //清PA2 INT 標(biāo)志位
-
- }
- //定時(shí)器2的中斷處理**********************
- if(TMR2IE && TMR2IF) //200us中斷一次 = 2.5KHz
- {
- TMR2IF = 0;
- n++;
- if(n<scale) //n<設(shè)置比例時(shí),打開(kāi)燈
- {
- PortOut=1;
-
- }
-
- else if(n>=scale)//n大于等于設(shè)置比例時(shí) 關(guān)閉燈
- {
- PortOut=0;
- }
- if(n==40)
- {
- n=0; //n=0
- }
- }
- }
- // --------------------------------------------------*/
- /*-------------------------------------------------
- * 函數(shù)名:POWER_INITIAL
- * 功能: 上電系統(tǒng)初始化
- * 輸入: 無(wú)
- * 輸出: 無(wú)
- --------------------------------------------------*/
- void POWER_INITIAL (void)
- {
-
- OSCCON = 0B01100001; //WDT 32KHZ IRCF=111=16MHZ/4=4MHZ,0.25US/T
- //Bit0=1,系統(tǒng)時(shí)鐘為內(nèi)部振蕩器(60F01x保留位)
- //Bit0=0,時(shí)鐘源由FOSC<2:0>決定即編譯選項(xiàng)時(shí)選擇
- INTCON = 0; //暫禁止所有中斷
- PORTA = 0B00000000;
- TRISA = 0B00000100; //PA輸入輸出 0-輸出 1-輸入
- //PA1->輸出
- WPUA = 0B00000100; //PA端口上拉控制 1-開(kāi)上拉 0-關(guān)上拉
- OPTION = 0B00001000; //Bit3=1 WDT MODE,PS=000=1:1 WDT RATE
- //Bit3 預(yù)分頻器分配位 0-Timer0 1-WDT
- //Bit7(PAPU)=0 ENABLED PULL UP PA
- MSCKCON = 0B00000000; //Bit6->0,禁止PA4, PC5穩(wěn)壓輸出(60F01x保留位)
- //Bit5->0,TIMER2時(shí)鐘為Fosc(60F01x保留位)
- //Bit4->0,禁止LVR(60F01x O版之前)
- //Bit4->0, LVREN使能時(shí),開(kāi)啟LVR(60F01x O版及O版后)
- //Bit4->1, LVREN使能時(shí),工作時(shí)開(kāi)啟LVR, 睡眠時(shí)自動(dòng)關(guān)閉LVR(60F01x O版及O版之后)
- }
- /*-------------------------------------------------
- * 函數(shù)名: INT_INITIAL
- * 功能: 中斷初始化函數(shù)
- * 輸入: 無(wú)
- * 輸出: 無(wú)
- --------------------------------------------------*/
- void INT_INITIAL(void)
- {
- TRISA2 =1; //SET PA2 INPUT
- INTEDG = 0; //OPTION,INTEDG=0;PA2 INT 為下降沿觸發(fā)
- INTF =0; //清PA2 INT中斷標(biāo)志位
- INTE =1; //使能PA2 INT中斷?
- }
- /*-------------------------------------------------
- * 函數(shù)名稱: TIMER2_INITIAL
- * 功能: 初始化設(shè)置定時(shí)器1
- * 相關(guān)寄存器:T2CON TMR2 PR2 TMR2IE TMR2IF PEIE GIE
- -------------------------------------------------*/
- void TIMER2_INITIAL (void)
- {
- T2CON = 0B00000001; //Bit[1,0]=01,T2時(shí)鐘分頻 1:4
- //Bit[6-3]=0000,T2輸出時(shí)鐘分頻1:1
- TMR2 = 0; //TMR2賦初值
- PR2 = 10; //設(shè)置TMR2輸出比較值定時(shí)200us=(1/16000000)*4*4*200(PR2)
- //16M-4T-4分頻
- TMR2IF = 0; //清TIMER2中斷標(biāo)志
- TMR2IE = 1; //使能TIMER2的中斷
- TMR2ON = 1; //使能TIMER2啟動(dòng)
- PEIE=1; //使能外設(shè)中斷
- GIE = 1; //使能全局中斷
- }
- /*-------------------------------------------------
- * 函數(shù)名稱:DelayUs
- * 功能: 短延時(shí)函數(shù) --16M-2T--大概快1%左右.
- * 輸入?yún)?shù):Time 延時(shí)時(shí)間長(zhǎng)度 延時(shí)時(shí)長(zhǎng)Time Us
- * 返回參數(shù):無(wú)
- -------------------------------------------------*/
- void DelayUs(unsigned char Time)
- {
- unsigned char a;
- for(a=0;a<Time;a++)
- {
- CLRWDT();
- }
- }
- /*----------------------------------------------------
- * 函數(shù)名稱:DelayMs
- * 功能: 短延時(shí)函數(shù)
- * 輸入?yún)?shù):Time延時(shí)時(shí)間長(zhǎng)度 延時(shí)時(shí)長(zhǎng)Time ms
- * 返回參數(shù):無(wú)
- ----------------------------------------------------*/
- void DelayMs(unsigned char Time)
- {
- unsigned char a,b;
- for(a=0;a<Time;a++)
- {
- for(b=0;b<5;b++)
- {
- DelayUs(98); //快1%
- }
- }
- }
- /*----------------------------------------------------
- * 函數(shù)名稱:DelayS
- * 功能: 短延時(shí)函數(shù)
- * 輸入?yún)?shù):Time延時(shí)時(shí)間長(zhǎng)度 延時(shí)時(shí)長(zhǎng)Time S
- * 返回參數(shù):無(wú)
- ----------------------------------------------------*/
- void DelayS(unsigned char Time)
- {
- unsigned char a,b;
- for(a=0;a<Time;a++)
- {
- for(b=0;b<10;b++)
- {
- DelayMs(100);
- }
- }
- }
- /*-------------------------------------------------
- * 函數(shù)名: main
- * 功能: 主函數(shù)
- * 輸入: 無(wú)
- * 輸出: 無(wú)
- --------------------------------------------------*/
- void main()
- {
- POWER_INITIAL(); //系統(tǒng)初始化
- TIMER2_INITIAL(); //初始化T2
-
- while(1)
- {
-
- if(RA2==0)
- {
- DelayMs(2);
- if(scale==40) //如果占空比為
-
- {
-
- scale=20; ////占空比賦值為,
-
-
- }
- else if(scale==20)
- {
- scale=5;
- ;
- }
- else if(scale==5)
- {
-
- scale=40;
-
- }
- INT_INITIAL();
- GIE =1; //使能全局中?
- }
- while(!RA2);
- }
- }
復(fù)制代碼
|
|