标题:
FMD60F010单片机URT外部中断问题?
[打印本页]
作者:
nanyexin
时间:
2021-10-18 22:50
标题:
FMD60F010单片机URT外部中断问题?
求教大师,我现在是用外部中断去控制灯的三段占空比,现在发现在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);
}
}
复制代码
作者:
liyezhao2019
时间:
2021-10-19 09:05
按键处理你确定这样写?
作者:
nanyexin
时间:
2021-10-19 12:01
liyezhao2019 发表于 2021-10-19 09:05
按键处理你确定这样写?
这不是按键,这是中断
作者:
nanyexin
时间:
2021-10-19 12:02
liyezhao2019 发表于 2021-10-19 09:05
按键处理你确定这样写?
其它的单片机维晟和STC已经实现这个功能,只是现在要跟换单片机,所以才改的……。
作者:
xqleft
时间:
2021-10-20 11:11
在工作了?
作者:
nanyexin
时间:
2021-10-24 02:32
xqleft 发表于 2021-10-20 11:11
在工作了?
工作是工作了,现在优化了下,撤换正常,就是很耗电,现在还搞不到省电模式
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1