求教大师,我现在是用外部中断去控制灯的三段占空比,现在发现在if(scale==40) { scale=20;}是它会延时3秒才能跳到scale=20这里,是什么原因,还有一个问题就是我要改小它的电流功耗,需要设置哪里,我试过改变晶振频率它电流没有减小。
单片机源程序如下:
- //*********************************************************
- #include "SYSCFG.h"
- //**********************************************************
- //***********************宏定义*****************************
- #define unchar unsigned char
- #define unint unsigned int
- #define unlong unsigned long
- #define PortOut RA4
- unchar scale=40;
- unchar n;
- /*-------------------------------------------------
- * 函数名:interrupt ISR1
- * 功能: 中断处理函数
- * 输入: 无
- * 输出: 无
- --------------------------------------------------*/
- void interrupt ISR(void)//PIC_HI-TECH使用
- {
- //PA2外部中断处理**********************
- if(INTE && INTF)
- {
- INTF = 0; //清PA2 INT 标志位
-
- }
- //定时器2的中断处理**********************
- if(TMR2IE && TMR2IF) //200us中断一次 = 2.5KHz
- {
- TMR2IF = 0;
- n++;
- if(n<scale) //n<设置比例时,打开灯
- {
- PortOut=1;
-
- }
-
- else if(n>=scale)//n大于等于设置比例时 关闭灯
- {
- PortOut=0;
- }
- if(n==40)
- {
- n=0; //n=0
- }
- }
- }
- // --------------------------------------------------*/
- /*-------------------------------------------------
- * 函数名:POWER_INITIAL
- * 功能: 上电系统初始化
- * 输入: 无
- * 输出: 无
- --------------------------------------------------*/
- void POWER_INITIAL (void)
- {
-
- OSCCON = 0B01100001; //WDT 32KHZ IRCF=111=16MHZ/4=4MHZ,0.25US/T
- //Bit0=1,系统时钟为内部振荡器(60F01x保留位)
- //Bit0=0,时钟源由FOSC<2:0>决定即编译选项时选择
- INTCON = 0; //暂禁止所有中断
- PORTA = 0B00000000;
- TRISA = 0B00000100; //PA输入输出 0-输出 1-输入
- //PA1->输出
- WPUA = 0B00000100; //PA端口上拉控制 1-开上拉 0-关上拉
- OPTION = 0B00001000; //Bit3=1 WDT MODE,PS=000=1:1 WDT RATE
- //Bit3 预分频器分配位 0-Timer0 1-WDT
- //Bit7(PAPU)=0 ENABLED PULL UP PA
- MSCKCON = 0B00000000; //Bit6->0,禁止PA4, PC5稳压输出(60F01x保留位)
- //Bit5->0,TIMER2时钟为Fosc(60F01x保留位)
- //Bit4->0,禁止LVR(60F01x O版之前)
- //Bit4->0, LVREN使能时,开启LVR(60F01x O版及O版后)
- //Bit4->1, LVREN使能时,工作时开启LVR, 睡眠时自动关闭LVR(60F01x O版及O版之后)
- }
- /*-------------------------------------------------
- * 函数名: INT_INITIAL
- * 功能: 中断初始化函数
- * 输入: 无
- * 输出: 无
- --------------------------------------------------*/
- void INT_INITIAL(void)
- {
- TRISA2 =1; //SET PA2 INPUT
- INTEDG = 0; //OPTION,INTEDG=0;PA2 INT 为下降沿触发
- INTF =0; //清PA2 INT中断标志位
- INTE =1; //使能PA2 INT中断?
- }
- /*-------------------------------------------------
- * 函数名称: TIMER2_INITIAL
- * 功能: 初始化设置定时器1
- * 相关寄存器:T2CON TMR2 PR2 TMR2IE TMR2IF PEIE GIE
- -------------------------------------------------*/
- void TIMER2_INITIAL (void)
- {
- T2CON = 0B00000001; //Bit[1,0]=01,T2时钟分频 1:4
- //Bit[6-3]=0000,T2输出时钟分频1:1
- TMR2 = 0; //TMR2赋初值
- PR2 = 10; //设置TMR2输出比较值定时200us=(1/16000000)*4*4*200(PR2)
- //16M-4T-4分频
- TMR2IF = 0; //清TIMER2中断标志
- TMR2IE = 1; //使能TIMER2的中断
- TMR2ON = 1; //使能TIMER2启动
- PEIE=1; //使能外设中断
- GIE = 1; //使能全局中断
- }
- /*-------------------------------------------------
- * 函数名称:DelayUs
- * 功能: 短延时函数 --16M-2T--大概快1%左右.
- * 输入参数:Time 延时时间长度 延时时长Time Us
- * 返回参数:无
- -------------------------------------------------*/
- void DelayUs(unsigned char Time)
- {
- unsigned char a;
- for(a=0;a<Time;a++)
- {
- CLRWDT();
- }
- }
- /*----------------------------------------------------
- * 函数名称:DelayMs
- * 功能: 短延时函数
- * 输入参数:Time延时时间长度 延时时长Time ms
- * 返回参数:无
- ----------------------------------------------------*/
- void DelayMs(unsigned char Time)
- {
- unsigned char a,b;
- for(a=0;a<Time;a++)
- {
- for(b=0;b<5;b++)
- {
- DelayUs(98); //快1%
- }
- }
- }
- /*----------------------------------------------------
- * 函数名称:DelayS
- * 功能: 短延时函数
- * 输入参数:Time延时时间长度 延时时长Time S
- * 返回参数:无
- ----------------------------------------------------*/
- void DelayS(unsigned char Time)
- {
- unsigned char a,b;
- for(a=0;a<Time;a++)
- {
- for(b=0;b<10;b++)
- {
- DelayMs(100);
- }
- }
- }
- /*-------------------------------------------------
- * 函数名: main
- * 功能: 主函数
- * 输入: 无
- * 输出: 无
- --------------------------------------------------*/
- void main()
- {
- POWER_INITIAL(); //系统初始化
- 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);
- }
- }
复制代码
|