设计一个8088/8086的微机系统并写出微机代码,用于监控报警,具备如下功能: 存储系统要求: 32KB的RAM(6264),16KB的EEPROM(9864); 2系统使用1片8259、1片8253和1片8255实现主要功能: 1台设备监控8个点,设备启动信号为3个时钟周期的脉冲信号,某个点为异常时,输出电平为高,1个异常报警灯;3 系统对监控设备1秒钟检查一次; 如果检查到8点中任意一个异常 (一次只有1个点异常),完成以下操作:(1)将异常信号点以ASCII形式存储在RAM和ROM中,如第2个点异常,记为32H;(2) 报警灯闪烁,1秒灭,1秒亮; 警报解除按键1个,按下后,解除报警灯闪烁。
时间: 2024-03-30 09:40:54 浏览: 326
微机原理课程设计基于8086的报警器系统的应用研究
5星 · 资源好评率100%
这是一个相当复杂的问题,需要考虑硬件和软件两个方面。下面是一个简单的设计和代码实现。
硬件设计:
1. 主板采用8088/8086微处理器,具有32KB的RAM(6264)和16KB的EEPROM(9864)。
2. 使用1片8259芯片进行中断控制,1片8253芯片进行定时器控制,1片8255芯片进行输入输出控制。
3. 设备监控8个点,使用3个时钟周期的脉冲信号启动,如果任意一个点异常,输出电平为高,触发异常报警灯。
4. 系统每秒钟检查一次监控设备,如果检测到任意一个异常点,采取以下操作。
5. 将异常信号点以ASCII形式存储在RAM和ROM中,如第2个点异常,记为32H。
6. 报警灯闪烁,1秒灭,1秒亮。
7. 设计一个按键,用于解除报警灯闪烁。
软件设计:
1. 初始化系统,包括RAM和ROM的初始化,8259、8253和8255的初始化,以及定时器的设置。
2. 设计一个中断服务程序,用于处理异常报警和按键中断。
3. 设计一个定时器中断服务程序,用于每秒钟检查监控设备。
4. 在主程序中,使用循环语句不断地检查RAM中存储的异常信号点,如果有异常信号点,触发报警灯闪烁。
5. 在按键中断服务程序中,解除报警灯闪烁。
下面是一个简单的代码实现,仅供参考。
```
; 定义RAM和ROM的起始地址
RAM_START equ 0h
ROM_START equ 8000h
; 定义中断服务程序入口地址
INT_VECTOR equ 0h
; 定义8259、8253和8255的端口地址
INTERRUPT_CTRL equ 20h
TIMER_CTRL equ 40h
IO_CTRL equ 60h
; 定义监控设备端口地址和异常报警灯端口地址
DEVICE_PORT equ IO_CTRL+0
ALARM_PORT equ IO_CTRL+1
; 定义异常报警灯的闪烁时间
BLINK_TIME equ 500 ; 单位为毫秒
org INT_VECTOR ; 中断服务程序入口地址
INTERRUPT_PROC: ; 中断服务程序
; 处理异常报警
cmp byte ptr [RAM_START], 0 ; 如果RAM中有异常信号点
jz KEY_INT ; 跳转到按键中断服务程序
; 触发报警灯闪烁
mov al, 1 ; 将1写入异常报警灯端口
out ALARM_PORT, al ; 异常报警灯亮起
mov cx, BLINK_TIME ; 等待一段时间
call DELAY
mov al, 0 ; 将0写入异常报警灯端口
out ALARM_PORT, al ; 异常报警灯熄灭
mov cx, BLINK_TIME ; 等待一段时间
call DELAY
jmp KEY_INT ; 跳转到按键中断服务程序
KEY_INT: ; 按键中断服务程序
; 处理解除报警
mov al, 0 ; 将0写入异常报警灯端口
out ALARM_PORT, al ; 异常报警灯熄灭
ret ; 返回主程序
DELAY: ; 等待一段时间的子程序
push cx ; 保存cx寄存器
push dx ; 保存dx寄存器
mov dx, 3 ; 设置dx寄存器的值
DELAY_LOOP:
mov cx, 1000 ; 设置cx寄存器的值
DELAY_LOOP1:
loop DELAY_LOOP1 ; 循环等待
dec dx ; dx寄存器减1
jnz DELAY_LOOP ; 如果dx寄存器不为0,继续等待
pop dx ; 恢复dx寄存器
pop cx ; 恢复cx寄存器
ret ; 返回主程序
MAIN: ; 主程序
; 初始化RAM和ROM
mov ax, RAM_START ; 设置ax寄存器的值
mov es, ax ; 设置es寄存器的值
xor di, di ; 设置di寄存器的值
mov cx, 8000h ; 设置cx寄存器的值
mov al, 0 ; 设置al寄存器的值
rep stosb ; 清空RAM
mov ax, ROM_START ; 设置ax寄存器的值
mov es, ax ; 设置es寄存器的值
xor di, di ; 设置di寄存器的值
mov cx, 4000h ; 设置cx寄存器的值
mov al, 0 ; 设置al寄存器的值
rep stosb ; 清空ROM
; 初始化8259、8253和8255
mov al, 13h ; 设置8259的端口A
out INTERRUPT_CTRL+1, al
mov al, 90h ; 设置8259的端口B
out INTERRUPT_CTRL+1, al
mov al, 34h ; 设置8253的控制字
out TIMER_CTRL, al
mov al, 35h ; 设置8253的计数器初值
out TIMER_CTRL+3, al
mov al, 4Eh ; 设置8253的计数器次值
out TIMER_CTRL+3, al
mov al, 80h ; 设置8255的控制字
out IO_CTRL+2, al
; 设置定时器中断
cli ; 关中断
mov al, 34h ; 设置8253的控制字
out TIMER_CTRL, al
mov al, 35h ; 设置8253的计数器初值
out TIMER_CTRL+3, al
mov al, 4Eh ; 设置8253的计数器次值
out TIMER_CTRL+3, al
mov al, 0Bh ; 设置8259的端口A
out INTERRUPT_CTRL+1, al
mov al, 1 ; 设置8259的端口B
out INTERRUPT_CTRL+1, al
sti ; 开中断
; 循环检查监控设备
LOOP:
mov al, [DEVICE_PORT] ; 读取监控设备的输入电平
and al, 0FFh ; 将读取到的电平值转换为字节
cmp al, 0FFh ; 判断是否有异常信号点
jz LOOP ; 如果没有异常信号点,继续循环
; 存储异常信号点
mov byte ptr [RAM_START], al ; 存储到RAM
mov byte ptr es:[DI], al ; 存储到ROM
inc di ; 更新DI指针
mov byte ptr es:[DI], 0 ; 存储到ROM
inc di ; 更新DI指针
; 触发报警灯闪烁
int 08h ; 触发中断服务程序
jmp LOOP ; 继续循环
ret ; 返回操作系统
```
阅读全文