单片机C语言外部中断程序问题,高手进

单片机C语言外部中断程序问题,高手进,第1张

外部中断,要求是低电平/下降沿触发。

你应该把按键改成接地,不要接电源。

另外,程序缺少延时,这样,按一下键,会加上很多次的。

试试如下程序:

#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外部摁键中断程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9379978.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存