MCS51单片机初学者,关于汇编语言中断程序设计

MCS51单片机初学者,关于汇编语言中断程序设计,第1张

不知道你要显示几位,我写了个1位显示的。前提是共阴数码LED且一端已接地,由P1口控制。

ORG 0000H

LJMP START

ORG 0003H

LJMP INTT0

ORG 0600H

START: SETB EA

SETB EX0 ; 打开外部中断0

CLR IT0 ; 令中断0为电平触发

MOV @R0,#00H

DISPLAY: MOV DPTR,#TAB;给字形表的初地址

MOV A,R0; 将要显示的数给A

MOVC A,@A+DPTR ;在字形表中取数放到A

MOV P1,A; 假设是P1口输出要显示的数据把A放到P1中

SJMP DISPLAY ;循环显示等待中断

INTT0:INC @R0; ;中断中有按键着加1

RETI

TAB:DB 3FH,06H,5BH,4FH,66H ;字形表

DB 6DH,7DH,07H,7FH,6FH

DB 77H,7CH,39H,5EH,79H

END

ORG 0000H

LJMP MAIN 主程序开始

ORG 000BH

AJMP PIT0 t0中断入口

ORG 001BH

AJMP PIT1 t1中断入口

MAIN: MOV SP, #60H 设置堆栈

MOV TMOD, #03H 定时器方式 T0T1都是方式1

MOV TL0, #9CH T0初始值

MOV TH0, #38H

MOV TCOM, #50H ;TR0=1 TR1=1 启动定时器

MOV IE, #8AH 开启定时器中断

HERE: AJMP HERE

PIT0: MOV TL0, #9CH T0 时间到 重新送初值

CPL P10 取反P10 生成方波

RETI

PIT1: MOV TH0, #38H T1时间到 重新送初值

CPL P11 取反p11 生成方波

RETI

END

还是找到了以前写的,拿分来

;

;purpose:ring and display a message every 10 seconds

;

model small

stack 100h

data

count dw 1

msg db 'The bell is ringing!',0dh,0ah,'$'

code

main proc far

start:

mov ax,@data

mov ds,ax

mov al,1ch

mov ah,35h ;get interrupt vector

int 21h

push es

push bx

push ds

mov dx,offset ring

mov ax,seg ring

mov ds,ax

mov al,1ch

mov ah,25h

int 21h

pop ds

in al,21h

and al,11111110b

out 21h,al

sti

mov di,2000

delay:

mov si,3000

delay1:

dec si

jnz delay

pop dx

pop ds

mov al,1ch

mov ah,25h

int 21h

mov ah,4ch

int 21h

main endp

;---------------------

;purpose:ring every 10 seconds when substituted for interrupt 1ch

ring proc near

push ds

push ax

push cx

push dx

mov ax,@data

mov ds,ax

sti

dec count

jnz exit

mov dx,offset msg

mov ah,09h

int 21h

mov dx,100

in al,61h

and al,0fch

sound:

xor al,02

out 61h,al

mov cx,1400h

wait1:

loop wait1

dec dx

jne sound

mov count ,182

exit:

cli

pop dx

pop cx

pop ax

pop ds

iret

ring endp

end start

主程序:

push ds ;保存数据段

mov ax,0000

mov ds,ax ;数据段清零

mov ax,offset irq7 ;取中断程序入口地址

add ax,2000 ;加装时IP=2000地址

mov si,003c ;填8259中断7中断矢量

mov w[si],ax ;填偏移量矢量

mov ax,0000 ;段地址CS=0000H

mov si,003e

mov w[si],ax ;填段地址矢量

pop ds ;d栈

in al,21 ;读8259中断屏蔽字

and al,7f ;开8259中断7

out 21,al

mov al,b4 ;8253的计数器2为方式2,采用二进制计数,先低后高写入计数值 10110100

out 43,al ;写入方式控制字

mov ax,2e9c 0010 1110 1001 1100B 11932D

out 42,al ;写入低字节计数值 1001 1100

mov al,ah

out 42,al ;写入高字节计数值 0010 1110

mov al,81 ;8255的A口为方式0输出,B口为方式0输出,C口下部输入 1000 0001

out 63,al ;写方式控制字

call first ;调用first子程序,赋计数初值

begi:hlt 延时等待

sti ;开中断

mov ah,01

int 16 ;检测是否按了键盘

jz begi

mov ah,00 ;读键值

int 16

cmp al,0d ;是否按了回车

jnz A1

mov si,4000

not [si+04] ;偏移地址为4004的内存单元内容取反

jmp begi

A1:cmp al,1b ;是否按了ESC键

jnz A2

call first ;重新赋初值,相当于清零

A2:jmp begi

中断程序:

irq7:call disp ;调用disp子程序,用来在数码管显示数据

mov si,4000

cmp [si+04],00 ;判断是否按了第2次回车键

je A4

call addn ;调用addn子程序,用来计数

A4:mov al,20

out 20,al

cli ;关中断

iret ;返回

addn程序:

addn:mov si,4000

add [si+03],01 ;百分之一秒加1

cmp [si+03],0a ;判断是否大于10

jz A5

jmp A9

A5:mov [si+03],00

Add [si+02],01 ;十分之一秒加1

cmp [si+02],0a ;判断是否大于10

jz A6

jmp A9

A6:mov [si+02],00

add [si+01],01 ;秒位加1

cmp [si+01],0a ;判断是否大于10

jz A7

jmp A9

A7:mov [si+01],00

add [si],01 ;十秒位加1

cmp [si],06 ;判断是否大于6

jz A8

jmp A9

A8:mov [si],00 ;大于60:00重新开始

A9: ret

赋初值程序:

first:mov si,4000

mov al,00

mov [si],al

mov [si+01],al

mov [si+02],al

mov [si+03],al

mov [si+04],al

ret

显示程序:

disp:push ax ;保存AX

mov si,4000 ;指向数据缓冲区

mov dl,f7 ;1111 0111 指向数码管

mov al,dl ;al=1111 0111

again:out 60,al ;写端口A

mov al,[si]

mov bx,4100 ;指向数码缓冲区 bx=0100 0001 0000 0000

and ax,00ff ; ax=0000 0000 al

add bx,ax ;得到显示代码 bx=0100 0001 al

mov al,[bx]

out 61,al ;写端口B

call dally :调用延时程序dally

inc si

mov al,dl

test al,01

jz out

ror al,1 ;指向下一个数码管

mov dl,al

jmp again

out: pop ax ;d出AX

ret

dally:push cx ;延时程序

push ax

mov cx,0010

t1 :mov ax,0010

t2 dec ax

jnz t2

loop t1

pop ax

pop cx

ret

数码缓冲区:

0000:4000 3f,06,5b4f,66,6d,7d,07,7f,6f

二、 设计思想

电子秒表要实现的功能:用键盘中断来控制整个程序,按一下回车键启动电子秒表,再按一下暂停,按一下ESC键清零,用七段数码管显示时间。整个程序涉及到8255、8253与8259三个芯片。8253的OUT2,CLK2分别连接8259的IRQ7与PCLK,8253的GATE2连接正5伏电压,采用计数器2每隔001秒产生一次中断并且计数,写入以偏移地址4000H开始的4个内存单元,然后利用8255将内存单元的数据输出到七段数码管。由于键盘中断优先于8259的7号中断,所以程序只有在按一下回车键才启动电子秒表,再按一下暂停,按一下ESC键清零,如果超出了60秒,整个程序自动重新开始。

三、 所用芯片工作原理

8255:接口电路在CPU和I/O设备之间起着信号的变换和传输的作用。 任何接口电路与CPU之间的信息传输方式都是并行的,即CPU与接口电路之间以数据字节/字为单位传送信息。接口电路与I/O设备之间的信息传送方式,有并行和串行两种,相应的接口电路称为并行接口和串行接口。

并行接口是在多根数据线上,以数据字节/字与I/O设备交换信息。在输入过程中,输入设备把数据送给接口,并且使状态线“输入准备好”有效。接口把数据存放在“输入缓冲寄存器”中,同时使“输入回答”线有效,作为对外设的响应。外设在收到这个回答信号后,就撤消数据和“输入准备好”信号。数据到达接口中后,接口会在“状态寄存器”中设置输入准备好标志,或者向CPU发一个中断请求。CPU可用查询方式或中断方式从接口中读取数据。接口中的数据被读取后,接口会自动清除状态寄存器中的标志,且撤消对CPU的中断请求。

在输出过程中,每当输出寄存器可以接收数据,接口就会将状态寄存器中“输出准备好”状态置1或向CPU发一个中断请求,CPU可用查询或中断方式向接口输出数据。当CPU输出的数据到达接口后,接口会清除“输出准备好”状态,把数据送往外设,并向外设发一个“数据输出准备好”信号。外设受到驱动后,便接收数据,并向接口电路发一个“输出回答”信号,接口收到该回答信号后,又将状态寄存器中“输出准备好”置位,以便CPU输出下一个数据。

8253:对CLK信号进行“减1计数”。首先CPU把“控制字”,写入“控制寄存器”,把“计数初始值”写入“初值寄存器”,然后, 定时/计数器按控制字要求计数。计数从“计数初始值 开始,每当CLK信号出现一次,计数值减1,当计数值减为0时,从OUT端输出规定的信号(具体形式与工作模式有关)。当CLK信号出现时,计数值是否减1(即是否计数),受到“门控信号”GATE的影响,一般,仅当GATE有效时,才减1门控信号GATE如何影响计数 *** 作,以及输出端OUT在各种情况下输出的信号形式与定时/计数器的工作模式有关。

8259:1 IR线上提出了中断请求的中断源,即出现请求,IRR中断请求寄存器(共有8位D7~D0)对应于连接在IR0~IR7线上的外设的中断请求,哪一根输入线有请求,哪一根输入线就置1。

2 若OCW1(IMR中断屏蔽寄存器)未使该中断请求屏蔽(对应位为0时不屏蔽),该请求被送入PR(优先权分析器)比较。否则,不送入PR比较。

3 PR把新进入的请求与ISR(服务中寄存器)中正在被处理的中断进行比较。如果新进入的请求优先级较低,则8259不向CPU提出请求。如果新进入的请求优先级较高,则8259使INT引脚输出高电平,向CPU提出请求。

4 如果CPU内部的标志寄存器中的IF(中断允许标志)为0,CPU不响应该请求。若IF=1,CPU在执行完当前指令后,从CPU的INTA引脚上向8259发出两个负脉冲。

5第一个 INTA负脉冲到达8259时,8259完成以下三项工作:

a使IRR(中断请求寄存器)的锁存功能失效。这样一来,在IR7~IR0上的请求信号就不会被8259接收。直到第二个INTA负脉冲到达8259时,才又使IRR的锁存功能有效。

b使ISR(服务中寄存器)中的相应位置1。

c使IRR中的相应位清0。

6第二个INTA负脉冲到达8259时,8259完成以下工作:

a将中断类型码(ICW2中的值)送到数据总线上,CPU将其保存在“内部暂存器”中。

b如果ICW4(它设定级中断联方式之特定完全嵌套方式,将在8259的工作方式中详述ICW4)中设置了中断自动结束方式,则将ISR的相应位清0。

首先你要说明你用什么汇编(X86/ARM/C51/PIC或其它)

其次,中断是否带循环与返回主程序没关联的

如X86的,RETI就可以从中断中返回主程序

实际上,你直接JMP到程序都没关系,只要清空栈中内容,并保证寄存器不冲突就可以了

以上就是关于MCS51单片机初学者,关于汇编语言中断程序设计全部的内容,包括:MCS51单片机初学者,关于汇编语言中断程序设计、51单片机中断器汇编语言程序解释、汇编语言 中断程序代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存