单片机外部中断实验用汇编语言编程,求程序,附图

单片机外部中断实验用汇编语言编程,求程序,附图,第1张

ORG 0000H

LJMP MAIN

ORG 0003H

LJMP EXT0

ORG 0030H

MAIN:

MOV SP,#5FH

SETB IT0

SETB EX0

SETB EA

MOV A,#0F0H

MOV P2,A

SJMP $

EXT0:

CPL A

MOV P2,A

RETI

END

ORG 0000H

LJMP MAIN

ORG 0003H

LJMP EXT0

ORG 0030H

MAIN:

    SETB EX0

    SETB IT0

    SETB EA

    CLR P10

    SJMP $

EXT0:

    SETB P10

    JNB P32,$

    CLR P10

    RETI

    END

中断是指由于某种事件的发生(硬件或者软件的),计算机暂停执行当前的程序,转而执行另一程序,以处理发生的事件,处理完毕后又返回原程序继续作业的过程。中断是处理器一种工作状态的描述。

1、INT0——外部中断0,由P32端口引入,低电平或下降沿引起。默认优先级最高。

2、INT1——外部中断1,由P33端口引入,低电平或下降沿引起。默认优先级第二。

3、T0——定时器/计数器0中断,由T0计数器计满回零引起。默认优先级第三。

4、T1——定时器/计数器1中断,由T1计数器计满回零引起。默认优先级第四。

5、T2——定时器/计数器2中断,由T2计数器计满回零引起。默认优先级第五。

扩展资料

单片机中断源类型

(1)外部设备请求中断。一般的外部设备(如键盘、打印机和A / D转换器等)在完成自身的 *** 作后,向CPU发出中断请求,要求CPU为他服务。 由计算机硬件异常或故障引起的中断,也称为内部异常中断。

(2)故障强迫中断。计算机在一些关键部位都设有故障自动检测装置。如运算溢出、存储器读出出错、外部设备故障、电源掉电以及其他报警信号等,这些装置的报警信号都能使CPU中断,进行相应的中断处理。

(3)实时时钟请求中断。在控制中遇到定时检测和控制,为此常采用一个外部时钟电路(可编程)控制其时间间隔。需要定时时,CPU发出命令使时钟电路开始工作,一旦到达规定时间,时钟电路发出中断请求,由CPU转去完成检测和控制工作。

(4)数据通道中断。数据通道中断也称直接存储器存取(DMA) *** 作中断,如磁盘、磁带机或CRT等直接与存储器交换数据所要求的中断。

(5)程序自愿中断。CPU执行了特殊指令(自陷指令)或由硬件电路引起的中断是程序自愿中断,是指当用户调试程序时,程序自愿中断检查中间结果或寻找错误所在而采用的检查手段,如断点中断和单步中断等。

参考资料来源:百度百科-51单片机

如果是用C去写的话,像汇编一样,开中断就行了。位置一般就在MAIN 之前的。

//晶振频率221184MHz

#include<at89x52h>

#define TIMER0H 0x4c

#define TIMER0L 0x00

#define TIMER0_RUN TR0=1

#define SECOND_OVERFLOW 40

#define SEG_PORT P0

#define DISPLAY_DIG1 P1&=0xf0;P1|=0x01

unsigned char g_CurrentDigit=0; //当前显示的数字

void timer() interrupt 1

{

static unsigned char s_Count = 0;

TH0 = TIMER0H; //重置定时器初值

TL0 = TIMER0L;

//每次进入中断服务程序,TH0和 TL0 的值都

TIMER0_RUN; //定时器运行,开始下一

if(s_Count != SECOND_OVERFLOW)

{ //未到整秒,把 sCount 值加1

s_Count++;

}

else

{ //到整秒,s_Count归 0,更新把当前显示

s_Count = 0;

if(g_CurrentDigit != 9)

{

g_CurrentDigit++;

}

else

{

g_CurrentDigit = 0;

}

}

return;

}

void Initial(void) //初始化

{

IE = 0x82; //仅允许Timer0 中断

TMOD = 0x01; //Timer0 使用工作方式 1(16位) ,定时器

TH0 = TIMER0H; //设置定时器初值

TL0 = TIMER0L;

TIMER0_RUN; //定时器开始运行

DISPLAY_DIG1;

}

void main()

{

unsigned char code SEG_CODE[]

= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

Initial();

while(1)

{

SEG_PORT = SEG_CODE[g_CurrentDigit]; //显示当前的数字

//当timer0溢出时,单片机响应 timer0 中断,调用 timer 函数,

//每40 次调用当前显示的数字加 1

}

}

程序分析:

程序中主程序做的事只是在死循环中反复显示当前的数字,每产生一次中断,程序就跳

转到中断服务函数 timer()中进行相应的更新。

这里中断服务函数 timer()有别于普通 C函数的地方是在声明中多了“interrupt 1” ,说明

这个函数是中断号为 1的中断服务函数。各个中断对应的中断号如表 38所示。

这个程序需要初始化的东西比较多, 我们把这些初始化语句都放在了初始化函数 Initial()

中,这也是程序初始化很常见的做法。我们还第一次用到了静态变量和全局变量。全局变量

是中断处理函数与外界程序进行参数传递的唯一途径,因此在单片机程序中全局变量的使

用频率要比普通的 C 语言程序高。尽管如此,由于全局变量的使用会影响程序的结构化,

所以在可以不使用全局变量的地方,还是要避免使用全局变量。在程序中,为了把全局变

量与静态变量跟普通变量区别开来,我们在变量前分别加了小写 g_和小写 s_以示区别。

IE 寄存器中的使能位和C中的中断号 中断源

0 外部中断0

1 定时器0溢出

2 外部中断1

3 定时器1溢出

4 串行口中断

5

定时器2溢出(仅在S52、

C52中有此中断源)

好了,以上是我找的一个实例,希望对你有帮助!

int_0:

push psw

push acc

call loop

mov a,#00h ;

mov p1,a ;增加这两行,不就恢复初始状态了吗?

pop acc

pop psw

reti

以上就是关于单片机外部中断实验用汇编语言编程,求程序,附图全部的内容,包括:单片机外部中断实验用汇编语言编程,求程序,附图、MCS-51单片机中断c语言或汇编编写完整程序、c51单片机中断程序中的interrupt1,2,3是由什么决定的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存