亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
FMD60F010單片機URT外部中斷問題?
[打印本頁]
作者:
nanyexin
時間:
2021-10-18 22:50
標題:
FMD60F010單片機URT外部中斷問題?
求教大師,我現(xiàn)在是用外部中斷去控制燈的三段占空比,現(xiàn)在發(fā)現(xiàn)在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;
/*-------------------------------------------------
* 函數(shù)名:interrupt ISR1
* 功能: 中斷處理函數(shù)
* 輸入: 無
* 輸出: 無
--------------------------------------------------*/
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
}
}
}
// --------------------------------------------------*/
/*-------------------------------------------------
* 函數(shù)名:POWER_INITIAL
* 功能: 上電系統(tǒng)初始化
* 輸入: 無
* 輸出: 無
--------------------------------------------------*/
void POWER_INITIAL (void)
{
OSCCON = 0B01100001; //WDT 32KHZ IRCF=111=16MHZ/4=4MHZ,0.25US/T
//Bit0=1,系統(tǒng)時鐘為內部振蕩器(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穩(wěn)壓輸出(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版之后)
}
/*-------------------------------------------------
* 函數(shù)名: INT_INITIAL
* 功能: 中斷初始化函數(shù)
* 輸入: 無
* 輸出: 無
--------------------------------------------------*/
void INT_INITIAL(void)
{
TRISA2 =1; //SET PA2 INPUT
INTEDG = 0; //OPTION,INTEDG=0;PA2 INT 為下降沿觸發(fā)
INTF =0; //清PA2 INT中斷標志位
INTE =1; //使能PA2 INT中斷?
}
/*-------------------------------------------------
* 函數(shù)名稱: 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; //使能全局中斷
}
/*-------------------------------------------------
* 函數(shù)名稱:DelayUs
* 功能: 短延時函數(shù) --16M-2T--大概快1%左右.
* 輸入?yún)?shù):Time 延時時間長度 延時時長Time Us
* 返回參數(shù):無
-------------------------------------------------*/
void DelayUs(unsigned char Time)
{
unsigned char a;
for(a=0;a<Time;a++)
{
CLRWDT();
}
}
/*----------------------------------------------------
* 函數(shù)名稱:DelayMs
* 功能: 短延時函數(shù)
* 輸入?yún)?shù):Time延時時間長度 延時時長Time ms
* 返回參數(shù):無
----------------------------------------------------*/
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ù)
* 輸入?yún)?shù):Time延時時間長度 延時時長Time S
* 返回參數(shù):無
----------------------------------------------------*/
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ù)
* 輸入: 無
* 輸出: 無
--------------------------------------------------*/
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);
}
}
復制代碼
作者:
liyezhao2019
時間:
2021-10-19 09:05
按鍵處理你確定這樣寫?
作者:
nanyexin
時間:
2021-10-19 12:01
liyezhao2019 發(fā)表于 2021-10-19 09:05
按鍵處理你確定這樣寫?
這不是按鍵,這是中斷
作者:
nanyexin
時間:
2021-10-19 12:02
liyezhao2019 發(fā)表于 2021-10-19 09:05
按鍵處理你確定這樣寫?
其它的單片機維晟和STC已經(jīng)實現(xiàn)這個功能,只是現(xiàn)在要跟換單片機,所以才改的……。
作者:
xqleft
時間:
2021-10-20 11:11
在工作了?
作者:
nanyexin
時間:
2021-10-24 02:32
xqleft 發(fā)表于 2021-10-20 11:11
在工作了?
工作是工作了,現(xiàn)在優(yōu)化了下,撤換正常,就是很耗電,現(xiàn)在還搞不到省電模式
作者:
wjhg1026
時間:
2026-2-28 13:37
請問解決了嗎?
作者:
tt5321
時間:
2026-3-18 16:18
想要省電,就用PWM CPU只在外部中斷進來時喚醒,然后更新占空比,再進入休眠
作者:
tt5321
時間:
2026-3-18 16:35
/*****
Project: zwt.prj
Device: FT60F123-RB SOP16
Memory: PROM=2Kx14, SRAM=128Byte, EEPROM=256Byte
Description:
來一次外部中斷,改變一次占空比,改變燈亮度
RELEASE HISTORY
VERSION DATE DESCRIPTION
1.0 20260318
*****/
#include "SYSCFG.h" //頭文件
//PA2 外部輸入口
#define led PA0 //LED接口,低電平點亮
volatile uint PA2in_cnt=0; //外部中斷計數(shù)
uint duty = 0; //占空比值
//定時器0相關變量
uint t0_cnt=0; //
//上電系統(tǒng)初始化
void power_initial (void)
{
OSCCON = 0B01110001;
INTCON = 0B00000000;
TRISA = 0B00000100; //PA2 IN
TRISC = 0B00000000; //
WPUA = 0B00000100; //上拉
WPUC = 0B00000000; //
WPDA = 0B00000000; //下拉
WPDC = 0B00000000; //
PORTA = 0B00000000; //初值
PORTC = 0B00000000; //初值
OPTION = 0B00000000;
PSRCA = 0B11111111; //源電流設置最大
PSRCC = 0B11111111; //
PSINKA = 0B11111111; //灌電流設置最大
PSINKC = 0B11111111; //
MSCON = 0B00110000;
}
//設置TMR0定時時長=(1/系統(tǒng)時鐘頻率)*指令周期*預分頻值*256
// =(1/16000000)*2*32*256=1.024ms(0.000032*32=0.001024)
void timer0_initial (void)
{
OPTION = 0B00000100;
T0IF = 0; //清空T0軟件中斷
T0IE = 1; //開定時器0中斷
}
//中斷處理
void interrupt ISR(void)
{
//定時器0的中斷處理
if(T0IE && T0IF) //1.024ms翻轉一次
{
T0IF = 0; //清標志
t0_cnt++;
if(t0_cnt>=40) //
{
t0_cnt=0;
}
}
//外部中斷處理
if(INTE && INTF) //PA2中斷處理
{
INTF = 0; //清PA2 INF 標志位
INTE = 0; //暫先禁止PA2中斷
delay_us(10); //短暫延時
if(PA2==0) //檢查下降沿低電平
{
PA2in_cnt++; //累加次數(shù)
if(PA2in_cnt>=4) //
{
PA2in_cnt=0; //0123循環(huán)
}
}
INTE = 1; //開中斷
}
}
//
void int_initial(void)
{
TRISA2 = 1; //設定PA2 輸入
IOCA2 = 0; //禁止PA2電平變化中斷
INTEDG = 0 ; //PA2 INT觸發(fā) 0->下降沿 1->上升沿
INTF = 0; //清中斷標志位
INTE = 1; //使能PA2 INT中斷
}
void get_duty (void)
{
switch(PA2in_cnt)
{
case 0:
duty=0;
break;
case 1:
duty=5;
break;
case 2:
duty=20;
break;
case 3:
duty=40;
break;
default:
duty=0;
break;
}
}
void led_display (void)
{
if(t0_cnt<=duty) //小于占空比的時間是高電平,
{
led=1; //輸出高電平
}
else
{
led=0; //輸出低電平
}
}
//主函數(shù)
void main()
{
power_initial(); //上電初始化
timer0_initial(); //定時器0初始化
int_initial(); //外部中斷
GIE = 1; //總中斷
while(1)
{
get_duty(); //計算當前占空比
led_display(); //點亮燈
}
}
//end
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1