void init(){
IT0=1;
EX0=1;
EA=1;
}
cy009 发表于 2024-5-10 09:28
EA放在中断函数里不科学吧!
lightday 发表于 2024-5-10 09:35
中断程序加延时是大忌,完全偏离中断的意义。
可以在中断里改变闪烁次数变量,然后在主程序里实现闪烁。
lkc8210 发表于 2024-5-10 13:06
没电路图盲猜按键接中断
你没加按键消抖,并在中断里延时了
于是中断在延时期间收到抖动信号,误判了
Longan.Wang 发表于 2024-5-10 09:57
编程技巧先不说,延时短了,眼睛根本看不到闪
drrteet.JPG (57.07 KB, 下载次数: 36)
xjtong 发表于 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 发表于 2024-5-10 15:30
都说了编译通不过呀
npn 发表于 2024-5-10 15:39
外部中断接的是什么? 如果是按键需要消抖处理。
xjtong 发表于 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 发表于 2024-5-10 17:33
编译一直没问题,就是中断是乱的。应该是中断重入的问题。
xiaobendan001 发表于 2024-5-10 10:30
楼主的中断只是用来接收开关信号的,又不是定时器中断,加点延时咋了?
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |