微机 系统中断控制器程序设计实验

记次数 

按下脉冲后,打印十次 TPPC486 8259 INT5!

应用8255 8259中断

详细代码如下

1.DATA SEGMENT
2.MESS DB 'TPC486 8259 INT5! $'
3.DATA ENDS
4.CODE SEGMENT
5.    ASSUME CS:CODE,DS:DATA
6.START:CLI  ;关中断
7.    MOV AX,DATA
8.    MOV DS,AX  ;给data段地址
9.    
10.    MOV DX,200H  ;ICW1是0端口
11.    MOV AL,11H   ;控制字11H 边沿触发00010001
12.    OUT DX,AL    ;设置ICW1
13.
14.    MOV DX,201H  ;ICW2是1端口 中断向量
15.    MOV AL,08H   ;控制字是08H 中断向量为08H~0FH
16.    OUT DX,AL    ;设置ICW2
17.
18.    MOV AL,00H   ;ICW3
19.    OUT DX,AL    
20.    MOV AL,01H   ;ICW4 EOI结束中断
21.    OUT DX,AL
22.
23.    MOV DX,201H
24.    IN AL,DX  ;读IMR
25.    AND AL,0DFH  ;开放IR5中断 DFH(1101 1111B)
26.    OUT DX,AL
27.
28.    MOV AX,0
29.    MOV DS,AX  ;中断向量码写入内存0段区域
30.
31.    LEA AX,INT_PROC  ;转到中断命令 写中断向量
32.    ;写中断向量地址
33.    MOV BX,5
34.    MOV SI,08H
35.    ADD SI,BX
36.    ;地址乘4 找段地址
37.    ADD SI,SI
38.    ADD SI,SI
39.    MOV [SI],AX  ;IP地址
40.    MOV AX,CS
41.    MOV [SI+2],AX  ;CS设置中断向量地址,置入中断服务程序入口地址的段基地址CS
42.    MOV CX,10  ;10次 计次
43.    STI  ;开中断
44.    L: JMP L  ;自身循环,主程序
45.INT_PROC:
46.    MOV AX,DATA  ;中断处理程序
47.    MOV DS,AX   ;地址转移
48.    MOV DX,OFFSET MESS ;MESS偏移地址
49.    MOV AH,09  ;显示每次中断的提示信息
50.    INT 21H
51.    MOV DX,200H
52.    MOV AL,20H  ;向8259发出结束中断
53.    OUT DX,AL
54.
55.    DEC CX  ;减1
56.    JNZ NEXT ;不为0时转移到NEXT
57.
58.    ;中断结束
59.    MOV DX,201H  ;读IMR
60.    IN AL,DX
61.    OR AL,20H ;屏蔽位  关闭IR5
62.    OUT DX,AL
63.    STI  ;开中断 允许中断嵌套
64.    MOV AH,4CH
65.    INT 21H ;返回DOS
66.
67.NEXT:
68.    IRET ;中断返回
69.
70.CODE ENDS
71.    END START

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微机原理中定时器是一个非常重要的模块,它可以用来计时、延时等各种应用。下面是一个定时器中断程序设计实验。 1. 实验目的 了解定时器的工作原理,掌握定时器的编程方法,学习中断程序的设计方法。 2. 实验设备 (1)单片机开发板 (2)计算机 (3)Keil C51 编译器 3. 实验内容 (1)使用定时器控制 LED 闪烁 将 P1.0 引脚连接到 LED,使用定时器中断控制 LED 闪烁,使 LED 每隔 1 秒钟亮灭一次。 (2)使用定时器进行延时 使用定时器进行延时,实现一个按键消抖程序,当按键按下时,延时 10ms后再进行处理。 4. 实验步骤 (1)使用定时器控制 LED 闪烁 Step1:设置计数器初值 定时器的计数值决定了定时器的时间长度。定时器 THx 和 TLx 组成一个 16 位的计数器,计数器的初值可以通过 THx 和 TLx 的赋值来设置。由于定时器工作时 TLx 会不断地被自动加 1,因此 TLx 的初值应该设为计数器的补数,即 TLx = 0xFFFF - 计数器初值 + 1。 以 11.0592MHz 的晶振为例,要使定时器每隔 1 秒钟中断一次,计数器的初值应该为 65536 - (11059200 / 12) = 44608(12 表示定时器的预分频值为 12)。 Step2:设置定时器的工作方式 定时器的工作方式可以设置为定时器模式或计数器模式。由于要进行定时操作,因此需要设置为定时器模式。 Step3:打开定时器中断 在定时器模式下,当定时器计数到 0 时,会产生中断请求,因此需要打开定时器中断。 Step4:编写中断服务程序 当定时器产生中断时,会跳转到中断服务程序中执行,实现 LED 闪烁的功能。 (2)使用定时器进行延时 Step1:设置计数器初值 同样地,计数器初值需要根据晶振频率和所需延时时间来确定。 以 11.0592MHz 的晶振为例,要实现 10ms 的延时,计数器的初值应该为 65536 - (11059200 / 12 / 100) = 53248(100 表示定时器的预分频值为 100)。 Step2:设置定时器的工作方式 同样地,需要设置为定时器模式。 Step3:等待计数器计数完成 当计数器计数完成后,会产生中断请求,可以在中断服务程序中进行处理。为了实现延时功能,可以在主程序中等待计数器计数完成,即等待定时器中断产生,然后进行按键检测和其他操作。 5. 实验代码 (1)使用定时器控制 LED 闪烁 ``` #include <reg52.h> #define LED P1_0 void timer0_init() { TH0 = 0xAF; // 定时器初值 TL0 = 0xFF; TMOD &= 0xF0; // 定时器模式 TMOD |= 0x01; ET0 = 1; // 打开定时器中断 TR0 = 1; // 启动定时器 EA = 1; // 打开总中断开关 } void timer0_isr() interrupt 1 { static unsigned char count = 0; count++; if(count == 50) // 50 * 20ms = 1s { count = 0; LED = ~LED; // LED 闪烁 } } void main() { timer0_init(); while(1); } ``` (2)使用定时器进行延时 ``` #include <reg52.h> #define KEY P1_0 void delay() { TH0 = 0xD0; // 计数器初值 TL0 = 0x00; TMOD &= 0xF0; // 定时器模式 TMOD |= 0x01; TR0 = 1; // 启动计时器 while(!TF0); // 等待计时完成 TR0 = 0; // 关闭计时器 TF0 = 0; // 清除中断标志 } void main() { while(1) { if(KEY == 0) // 检测按键 { delay(); // 延时 10ms if(KEY == 0) { // 处理按键事件 } } } } ``` 6. 实验总结 通过本次实验,我们学习了定时器的编程方法和中断程序的设计方法,并实现了 LED 闪烁和按键消抖两个应用。定时器是单片机中非常重要的模块,掌握其编程方法对于进行各种计时、延时等应用非常有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值