void init(){
IT0=1;
EX0=1;
EA=1;
}
cy009 發(fā)表于 2024-5-10 09:28
EA放在中斷函數里不科學吧!
lightday 發(fā)表于 2024-5-10 09:35
中斷程序加延時是大忌,完全偏離中斷的意義。
可以在中斷里改變閃爍次數變量,然后在主程序里實現閃爍。
lkc8210 發(fā)表于 2024-5-10 13:06
沒電路圖盲猜按鍵接中斷
你沒加按鍵消抖,并在中斷里延時了
于是中斷在延時期間收到抖動信號,誤判了
Longan.Wang 發(fā)表于 2024-5-10 09:57
編程技巧先不說,延時短了,眼睛根本看不到閃
drrteet.JPG (57.07 KB, 下載次數: 36)
xjtong 發(fā)表于 2024-5-10 14:28
你說對了。
我覺得是抖動的問題,所以在中斷是把EA關了呀。
在中斷里延時也是怕抖動的問題。
void int0() interrupt 0
{
u8 i;
if(!P32){
for(i=0;i<xu;i++){
led=1;dd(20);
led=0;dd(20);
}
t=abc[xu++];
xu &=0x07;
}
}
tyrl800 發(fā)表于 2024-5-10 15:30
都說了編譯通不過呀
npn 發(fā)表于 2024-5-10 15:39
外部中斷接的是什么? 如果是按鍵需要消抖處理。
xjtong 發(fā)表于 2024-5-10 14:28
你說對了。
我覺得是抖動的問題,所以在中斷是把EA關了呀。
在中斷里延時也是怕抖動的問題。
#include <STC8G.h>
#include <intrins.h>
#define u16 unsigned int
#define u8 unsigned char
sbit leda = P5^5;
sbit led = P5^4;
sbit fan = P3^3;
const unsigned int data abc[8]={0xea60,0xa410,0x8ca0,0x7530,0x4650,0x1770,0x0bb80,0x05dc};
u16 t;
u8 xu;
void Delay10ms(void) //@11.0592MHz
{
unsigned char data i, j;
_nop_();_nop_();
i = 144;
j = 157;
do
{
while (--j);
} while (--i);
}
void dd(unsigned int tttt){
while(tttt--)Delay10ms();
}
void init(){
IT0=1;
EX0=1;
EA=1;
}
void int0() interrupt 0
{
u8 i;
if(!P32){
for(i=0;i<xu;i++){
led=1;dd(20);
led=0;dd(20);
}
t=abc[xu++];
xu &=0x07;
}
}
void main(){
u16 tt;
P5M0 &= ~0x30; //P54雙向口,P55高阻
P5M1 = (P5M1 & ~0x10) | 0x20;
P3M0 = (P3M0 & ~0x04) | 0x08; //P33 推挽
P3M1 &= ~0x0c;
P3PU |= 0x04; //P3.2上拉開打
init();
led=0;
while(1){
if(leda)tt=t; //5min
led=leda;
if(tt){tt--;fan=1;Delay10ms();} else {fan=0;}
}
}
xjtong 發(fā)表于 2024-5-10 17:33
編譯一直沒問題,就是中斷是亂的。應該是中斷重入的問題。
xiaobendan001 發(fā)表于 2024-5-10 10:30
樓主的中斷只是用來接收開關信號的,又不是定時器中斷,加點延時咋了?
歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |