Loading

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
posted @ 2023-03-29 15:27  滑稽果  阅读(97)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end