外部中断,要求是低电平/下降沿触发。
你应该把按键改成接地,不要接电源。
另外,程序缺少延时,这样,按一下键,会加上很多次的。
试试如下程序:
#include <reg52h>
unsigned char code tab[] = {
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
unsigned char a, b, c;
//-------------------------------
void delay(unsigned int k)
{
unsigned int i, j;
for(i = 0; i < k; i++)
for(j = 0; j < 121; j++);
}
//-------------------------------
void main()
{
IT0 = 1;
EX0 = 1;
EA = 1;
while(1) {
P0 = tab[c];
}
}
//-------------------------------
void key()interrupt 0
{
c++;
if(c > 10) c = 0;
delay(200); //延时一会
}
//-------------------------------
程序设计的要求是什么?
说的不太清楚。
简单改了改:
#include<reg52h>
#include<intrinsh>
void delay()
{
unsigned int i, j;
for(i = 0; i <= 800; i++) for(j = 0; j <= 200; j++);
}
void delay2()
{
unsigned int i, j;
for(i = 0; i <= 800; i++) for(j = 0; j <= 200; j++);
}
void init_tx()
{
EA = 1;
EX0 = 1;
IT0 = 1;
}
void main()
{
init_tx();
while(1) { P1 = ~P1; delay(); }
}
void tx0() interrupt 0
{
static unsigned char i = 0xfe;
P1 = i; delay2();
i = _crol_(i, 1);
P1 = 0x00;
}
在中断函数中,进行延时,楼主的这个思路,是错误的。
特别是和主函数共用同一个延时函数,更加添乱。
按键一端接地,另一端接P3^2 就是外部中断0 ,,
sbit key = P3^2;
void main()
{
EX0 = 1;
IT0 = 1;
EA = 1;
while(1)
{
这里写你的功能;
}
}
void int0() interrupt 0
{
unsigned int i = 0;
while(1)
{
if(key == 0)
{
i++;
if(i >= 1000)
{
i=0;
flag = 1;
break;
}
}
else
{
i=0;
break;
}
}
}
这个程序包括了消抖部分,flag = 1的时候就表明 按键按下了。 flag的变量定义,还有头文件,自己加上,在主程序你检测flag的状态就可以了
首先两个中断是否都打开了,也就是EX0、EX1是否都等于1;
另外看看触发方式:IT0、IT1是什么置;
再看看你是否真的触发了,硬件上确认没有问题?
第四,你将两个中断函数后面using n ,使n不同,使用不同的工作组试试。
试试看:
ORG 0000H
JMP MAIN
ORG 0013H
AJMP INT
JMP MAIN
TAB:
DB 0X01, 0X02, 0X04, 0X08
DB 0X10, 0X20, 0X40, 0X80
MAIN:
SETB EA
SETB EX1
MOV DPTR, #TAB
LOOP:
MOV R1, #8
MOV B, #0
AGAIN:
MOV A, B
MOVC A, @A+DPTR
MOV P1, A
INC B ;下一个状态
CALL DELAY
DJNZ R1, AGAIN
JMP LOOP
DELAY:
MOV R6, #2
LOOP3: MOV R5, #255 ;延迟0。5秒
LOOP2: MOV R4, #255
LOOP1: NOP
NOP
DJNZ R4, LOOP1
DJNZ R5, LOOP2
DJNZ R6, LOOP3
RET
INT:
MOV P2, #0XAA
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
MOV P2, #0XFF
MOV A, B ;显示下一个状态
MOVC A, @A+DPTR
MOV P1, A
INC B
RETI
END
一、主体不同
1、内部中断:断是一个算法指令,是由软中断指令启动的中断。
2、外部中断:是单片机实时地处理外部事件的一种内部机制。
二、机制不同
1、内部中断:执行除法指令时,出现除数为0或商超过寄存器所能表达的范围,则产生类型为0 的内部中断。是优先级最高的内部中断。
2、外部中断:当某种外部事件发生时,单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理;中断处理完毕后.又返回被中断的程序处,继续执行下去。
三、特点不同
1、内部中断:由一条指令INT n产生中断类型码或者由指令规定,或者是预定的。不执行INTA总线周期,CPU也不发出响应信号INTA。
2、外部中断:在实时控制中,现场的各种参数、信息均随时问和现场而变化。这些外界变量可根据要求随时向CPU发出中断申请。请求CPU及时处珲中断请求,如中断条件。
参考资料来源:百度百科-外部中断
参考资料来源:百度百科-内部中断
大概是这样的,稍微根据要求改改~(记得给分奥!)
ORG 0000H
LJMP START
ORG 0003H
LJMP INT_0
ORG 0100H
START:
SETB EA ;开总中断
SETB EX0 ;开INT0中断
CLR IT0 ; 设置INT0为电平触发
SP1 EQU P36
MOV A,#00H
MOV R0,#8
SETB C;P10到P17的二极管依次点亮
LOOP1:
RLC A
MOV P1,A
ACALL DELAY
DJNZ R0,LOOP1
MOV A,#00H
MOV R0,#8
SETB C;P17到P10的二极管依次点亮
LOOP2:
RRC A
MOV P1,A
ACALL DELAY
DJNZ R0,LOOP2
AJMP START
;延时1秒子程序
DELAY:
MOV R5,#200
D1: MOV R6,#20
D2:MOV R7,#123
NOP
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
INT_0:
PUSH PSW
PUSH ACC
MOV A,#0FFH
MOV R2,#6
MOV P1,A
L4:
;MOV P1,A
;LCALL DELAY
;CPL A
CPL SP1
LCALL DELAY
DJNZ R2,L4
POP ACC
POP PSW
RETI
END
以上就是关于单片机C语言外部中断程序问题,高手进全部的内容,包括:单片机C语言外部中断程序问题,高手进、单片机C51外部中断程序问题、单片机89c51外部摁键中断程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)