89c51单片机中断控制两个灯闪烁。两个按钮,按第1个按钮,灯1闪烁,灯2熄灭。按第2个按钮,灯2闪烁,灯1熄灭。用keil编写程序
时间: 2024-10-24 18:14:41 浏览: 50
在8051单片机中,比如89C51,通过中断控制可以实现两个按键控制两个灯的交替闪烁。首先,我们需要设置中断结构,包括外部中断INT0和INT1,以及相应的中断服务函数。下面是一个基本的程序框架,假设使用的是汇编语言编写,并且使用了Keil集成开发环境:
```assembly
; 宏定义和全局变量声明
ORG 0000H ; 开始地址
LED1 equ P1.0 ; 灯1连接到P1口的0位
LED2 equ P1.1 ; 灯2连接到P1口的1位
BTN1 equ P3.0 ; 第1个按钮连接到P3口的0位
BTN2 equ P3.1 ; 第2个按钮连接到P3口的1位
TIMER equ TMOD ; 定时器T0的模式寄存器
; 设置定时器T0为工作于模式1(16位自动重装载)
START_TIMER:
MOV Timer, #0x01B8 ; 配置定时器为模式1,初值为1微妙的计数值
; 中断服务函数
INT0_ISR:
; 按钮1按下处理:灯1亮、灯2灭
JB BTN1, LED1_ON
MOVC A, #0 ; 清零A寄存器
OUT P1, A ; 灯2关闭
RETI ; 回到主程序
LED1_ON:
MOV A, #0FFh ; 将A设置为全亮,点亮灯1
OUT LED1, A ; 发送数据到灯1
MOV A, #0 ; 灯2关闭
OUT LED2, A ; 发送数据到灯2
RETI ; 回到主程序
INT1_ISR:
; 按钮2按下处理:灯2亮、灯1灭
JB BTN2, LED2_ON
MOVC A, #0
OUT P1, A ; 灯1关闭
RETI ; 回到主程序
LED2_ON:
MOV A, #0FFh ; 点亮灯2
OUT LED2, A
MOV A, #0 ; 灯1关闭
OUT LED1, A
RETI ; 回到主程序
; 主程序
MAIN_LOOP:
SETB TR0 ; 启动定时器T0
JNB TF0, MAIN_LOOP ; 当TF0标志清除时再次进入循环
CLR TF0 ; 清除TF0标志
JMP START_TIMER ; 重新加载定时器并开始下一次计数
; 结束部分
END
阅读全文