51 单片机外部中断测试代码例程
我的公众号目前已搁置(临近注销),所以我将以前所写的文章转移到博客园。
此篇公众号文章创建于 2019-11-18 21:32,内容后期无修改。
不会创建工程的可以跳转:Keil C51 工程的创建(新手向)
例程可能只适用于我购买的单片机开发板,并不完全适合所有 51 单片机,使用测试例程前请检查该程序是否和您的单片机符合,若不符合请根据您的单片机具体情况更改程序。
例程效果:触发外部中断 0 (P3.2) 后,低四位 LED 灯与高四位 LED 灯状态取反。
C 语言代码
// 实现现象:下载程序后按下 K3 按键可以对灯状态取反。
#include "reg52.h" // 此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; // 对数据类型进行声明定义
typedef unsigned char u8;
sbit k3 = P3^2; // 定义按键 K3
// 延时 15ms 函数
void delay() {
int i = 15000;
while( i-- );
}
// 主函数
void main(void) {
P2 = 0xf0;
// 设置 INT0
IT0 = 1; // 跳变沿出发方式(下降沿)
EX0 = 1; // 打开 INT0 的中断允许
EA = 1; // 打开总中断
while(1);
}
// 外部中断 0 的中断函数
void Int0() interrupt 0 {
delay(); // 延时消抖
if( k3 == 0 ) P2 =~ P2; // 确认按键按下
}
汇编代码
ORG 0000H
AJMP MAIN
ORG 0003H ; INT0 中断入口
AJMP WBI ; 转中断服务程序
ORG 0030H
MAIN: MOV P2, #0F0H ; 低四位灯亮
SETB IT0 ; 边沿触发中断
SETB EX0 ; 允许外中断 0 中断
SETB EA ; 打开中断开关
WAIT: AJMP WAIT ; 等待中断
WBI: ACALL DELAY ; 调用延时
JNB P3.2, START
ENDED:RETI ; 从中断服务程序返回
START:MOV A, P2
SWAP A ; 交换 P2
MOV P2, A
AJMP ENDED ; 结束中断
DELAY:MOV R0, #80H ; 外循环 128 次
DL2: MOV R1, #19H ; 内循环 25 次
DL1: NOP
NOP
DJNZ R1, DL1
DJNZ R0, DL2
RET
END