当前位置: 首页 > web >正文

protues仿真+C51+外部中断

C51的外部中断只用到TCON寄存器、IE寄存器、IP寄存器。

1. TCON定时器控制寄存器:

TCON8FH8EH8DH8CH8BH8AH89H88H
88HTF1TR1TF0TR0IE1IT1IE0IT0

 外部中断用到TCON的低4位:IE1、IT1、IE0、IT0。


IE0:外部中断0的中断请求标志。

         当外部中断引脚0上存在有效的中断请求信号时,由硬件使IE1置1。

         CPU响应该中断请求时,由硬件使IE1清0。

IT0:外部中断0的中断触发方式控制位

   IT0=0时:外部中断0为低电平触发方式。

        CPU在每一个机械周期S5P2期间采样外部中断0引脚的输入电平。

        当引脚为低电平时IE0=1,引脚为高电平时IE0=0。

   IT0=1时:外部中断0为下降沿触发方式。

        CPU在每一个机械周期S5P2期间采样外部中 断0引脚的输入电平。

        如果相继两个机械周期采用过程中,一个为高电平,下一个为低电平。

        则使IE1=1,直到CPU响应该中断时,才由硬件使IE0清0。

同理,IE1,IT1的功能与IE0、IT0的完全一样,但分别控制外部中断1、外部中断0。


2. IE中断允许寄存器

IEAFHAEHADHACHABHAAHA9HA8H
88HEA未使用未使用ESET1EX1ET0EX0

外部中断使用到IE中断允许寄存器的:EA、EX1、EX0


EA:中断允许总控制位。

         EA=0屏蔽所有中断请求;EA=1,CPU开放中断。

EX0:外部中断0中断允许位。

         EX0=0屏蔽外部中断0中断请求;EX0=1,CPU开放外部中断0中断请求。

EX1:外部中断1中断允许位。

         EX1=0屏蔽外部中断1中断请求;EA=1,CPU开放外部中断1中断请求。


3. IP中断优先级寄存器 

IPBCHBBHBAHB9HD8H
D8H未使用未使用未使用PSPT1PX1PT0PX0

外部中断用到IP中断优先级寄存器的PX0、PX1

PX0:外部中断0中断优先级控制位;

PX1:外部中断1中断优先级控制位;

对应控制位置1则相应的中断源就规定为高优先级,反之为低优先级

当同时接收到几个同一优先级中断请求时,优先响应哪个中断源则取决于内部硬件查询顺序。

查询顺序:外部中断0、定时器0、外部中断1、定时器1、串行口中断。

例如:设置外部中断0和外部中断1为高优先级,当两个外部中断同时触发时,根据查询方式可确定优先响应外部中断0。


4.外部中断0和外部中断1——下降沿触发、低电平触发

4.1 main.c文件

#include "reg51.h"
#include "ExternalInterrupt.h"char Flag=0;
char Led_array[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0xFF};void main(){ExternalInterrupt_Init(Ex_Interrupt0_1,Low_Trigger);while(1){P1=Led_array[Flag];
}}

 通过修改ExternalInterrupt_Init(Ex_Interrupt0,Low_Trigger);函数的参数,达到开启不同外部中断,不同触发方式。

参数1:设置开启的外部中断               参数2:设置触发方式

Ex_Interrupt0Ex_Interrupt1Ex_Interrupt0_1Low_TriggerFalling_Trigger
开启外部中断0开启外部中断1开启外部中断0和1下降沿触发低电平触发

Ex_Interrupt0、Ex_Interrupt1、Ex_Interrupt0_1,Low_Trigger、Falling_Trigger

都声明在ExternalInterrupt.h文件中。

4.2 ExternalInterrupt.c文件

#include "ExternalInterrupt.h"
#include "intrins.h"
extern char Flag;void Delay50ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();_nop_();i = 3;j = 26;k = 223;do{do{while (--k);} while (--j);} while (--i);
}void ExternalInterrupt_Init(char Flag,char Mode){if (Flag == 0) {  // 外部中断0IE |= 0x81;  // 使能外部中断0if (Mode == 1) {TCON |= 0x01;}  // 设置外部中断0为下降沿触发else {TCON &= ~0x01;}}  // 设置外部中断0为低电平触发 else if (Flag == 1) {  // 外部中断1IE |= 0x84;  // 使能外部中断1if (Mode == 1) {TCON |= 0x04;}  // 设置外部中断1为下降沿触发else {TCON &= ~0x04;}}  // 设置外部中断1为低电平触发else if (Flag == 2) {  // 外部中断1且设置为高优先级IE |= 0x85;  // 使能外部中断1、外部中断0if (Mode == 1) {TCON |= 0x05;}  // 设置外部中断1为下降沿触发else {TCON &= ~0x05;}  // 设置外部中断1为低电平触发IP |= 0x04;}  // 设置外部中断1为高优先级else IE &= 0x7F;
}void ExternalInterrupt0() interrupt 0 {Delay50ms();  // 延时一段时间Flag++;if(Flag>7){Flag=0;}}void ExternalInterrupt1() interrupt 2 {Delay50ms();  // 延时一段时间Flag--;if(Flag<0){Flag=7;}}

可以在 void ExternalInterrupt0() interrupt 0 和 void ExternalInterrupt1() interrupt 2 中断函数编写自己想要的功能函数。

4.3  ExternalInterrupt.h

#ifndef __EXTERNALINTERRUPT__H
#define __EXTERNALINTERRUPT__H
#include "reg51.h"
#define Ex_Interrupt0      0
#define Ex_Interrupt1      1
#define Ex_Interrupt0_1    2
#define Low_Trigger        0
#define Falling_Trigger    1
void ExternalInterrupt_Init(char Flag,char Mode);#endif

4.4 protues仿真 

5.注意事项

        当设置外部中断0和外部中断为低电平触发时,按下触发按键会导致发生多次触发中断。所以提供的代码中进行简单的延时消抖,快

速按下松开按键不会触发多次中断,但是长时间按下按键,还是会出发多次中断。

6. protues仿真文件下载

.........

http://www.xdnf.cn/news/12863.html

相关文章:

  • MATLAB生成大规模无线通信网络拓扑(任意节点数量)
  • 微服务体系下将环境流量路由到开发本机
  • spring中的@KafkaListener 注解详解
  • NLP学习路线图(三十四): 命名实体识别(NER)
  • unity实现自定义粒子系统
  • java 时区时间转为UTC
  • 云原生架构赋能企业数字化转型:从理念到落地的系统性探索
  • springboot启动mapper找不到方法对应的xml
  • 【Redis/2】核心特性、应用场景与安装配置
  • 用于小目标检测的归一化高斯Wasserstein距离(NWD)之论文阅读
  • 国家奖学金答辩PPT+文稿
  • Halo站点全站定时备份并通过邮箱存储备份
  • 【C++】25. 哈希表封装unordered_map和unordered_set
  • Ubuntu系统多网卡多相机IP设置方法
  • 【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
  • MCP笔记:介绍和原理
  • Web3 借贷与清算机制全解析:链上金融的运行逻辑
  • 基于安卓的线上考试APP源码数据库文档
  • MAC-安装Homebrew、安装Git
  • c++ decltype关键字
  • 二叉数-100.相同的树-力扣(LeetCode)
  • LLMs 系列科普文(3)
  • 用于机器学习的 Podman 简介:简化 MLOps 工作流程
  • 从零开始的云计算生活——番外,实战脚本。
  • 【基于阿里云搭建数据仓库(离线)】使用UDTF时出现报错“FlatEventUDTF cannot be resolved”
  • Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
  • 04.管理表
  • Linux系统的CentOS7发行版安装MySQL80
  • Spring Boot 整合 Apache Flink 的详细过程
  • 二、即时通讯系统设计经验