Day42 51单片机中断系统与8×8 LED点阵扫描显示

day42 51单片机中断系统与8×8 LED点阵扫描显示


一、51单片机引脚位操作 —— sbit 关键字

作用

sbit 是专用于 51 单片机架构的 C 语言扩展关键字,用于定义特殊功能寄存器(SFR)中的某一位,从而实现对单个 I/O 引脚的直接位操作。

示例代码

#include <reg51.h>  // 包含51单片机寄存器定义头文件// 定义74HC595芯片控制引脚
sbit SER   = P3^4;    // 串行数据输入引脚,连接P3.4
sbit RCLK  = P3^5;    // 存储寄存器时钟引脚,连接P3.5
sbit SRCLK = P3^6;    // 移位寄存器时钟引脚,连接P3.6
  • SER = P3^4:将 P3 端口第 4 位(即 P3.4 引脚)命名为 SER,后续可直接用 SER = 1;SER = 0; 控制电平。
  • RCLK = P3^5:控制 74HC595 的存储寄存器锁存时钟。
  • SRCLK = P3^6:控制 74HC595 的移位寄存器时钟。

应用场景:精准控制单个引脚,如驱动外设芯片、LED、按键检测等。


二、74HC595 串转并芯片工作原理

功能概述

74HC595 是一个 8 位串行输入、并行输出的移位寄存器芯片,通过 3 根控制线(SER、SRCLK、RCLK)即可控制 8 路输出,极大节省单片机 I/O 资源

关键引脚说明

引脚名功能说明
SER串行数据输入端,逐位送入数据
SRCLK移位寄存器时钟,上升沿将 SER 数据移入内部寄存器
RCLK存储寄存器时钟,上升沿将移位寄存器数据锁存到输出端口

行选通函数实现

/*** 选择8*8点阵的行* @param num 要选择的行号(0-7)* 通过74HC595串行输入数据,控制对应行的选通*/
void led_rect_select(unsigned char num)
{unsigned char i = 0;RCLK = 0;  // 拉低存储寄存器时钟,准备接收数据SRCLK = 0; // 拉低移位寄存器时钟,准备移位操作// 循环8次,串行输入8位数据for(i = 0; i < 8; i++){SRCLK = 0;  // 拉低移位时钟,准备输入数据// 当i等于要选择的行号时,SER置1,否则置0(num == i) ? (SER = 1) : (SER = 0);SRCLK = 1;  // 拉高移位时钟,将SER数据移入移位寄存器}RCLK = 1;  // 拉高存储寄存器时钟,将移位寄存器数据锁存到输出寄存器
}
  • 运行理想结果:调用 led_rect_select(3) 时,74HC595 输出端口第 3 位为高电平,其余为低,即选通第 3 行 LED。

三、8×8 LED点阵扫描显示原理

硬件结构

  • 8 行 × 8 列共 64 个 LED,采用“行选通 + 列数据”方式控制。
  • 本例使用共阴极点阵:行选通为低电平有效,列数据为高电平时对应 LED 点亮。

逐行扫描 + 视觉暂留

  • 原理:每次只选通一行,输出该行的列数据,快速循环扫描 8 行(每行约 1ms),利用人眼视觉暂留效应(约 10~20ms)形成完整稳定图像。
  • 优势:节省 I/O 资源,仅需 3 个引脚(74HC595)控制 8 行 + 8 个引脚(P0)控制 8 列。

显示函数实现

/*** 在8*8点阵上显示图案* 通过逐行扫描的方式,显示预设的图案(此处为数字"1")*/
void led_8_8_show(void)
{// 存储8*8点阵每行要显示的数据,对应显示数字"1"unsigned char led_1_array[8] = {0x0, 0x10, 0x30, 0x10, 0x10, 0x10, 0x38, 0x0};unsigned char i = 0;// 逐行扫描显示for(i = 0; i < 8; i++){  	P0 = 0xff;  // 关闭当前行显示,避免串扰(共阴极,全高电平熄灭)led_rect_select(i);  // 选择第i行P0 = ~led_1_array[i];  // 输出第i行的列数据(取反是因为共阴极点阵:数据1=高电平=点亮)delay(1);  // 延时1ms,保持当前行显示,利用视觉暂留形成稳定图像}
}
  • 图案数组说明
    • led_1_array[8] = {0x0, 0x10, 0x30, 0x10, 0x10, 0x10, 0x38, 0x0};
    • 例如 0x10 = 00010000B,表示该行第 5 列 LED 点亮。
  • 取反原因:共阴极点阵中,列需输出高电平才能点亮 LED,而数组中 1 表示“点亮”,故需 ~ 取反后送 P0 口。
  • 理想运行结果:点阵稳定显示数字“1”的图案。

四、延时函数实现与作用

功能

通过空循环消耗 CPU 时间,实现软件延时,用于控制扫描频率、稳定显示亮度。

实现代码

/*** 延时函数* @param i 延时参数,控制延时时间长短* 通过双重循环实现延时,外层循环10次,内层循环由i控制*/
void delay(unsigned int i)
{unsigned int num = i;int j = 0;for(j = 0; j < 10; j++){num = i;while(num--);  // 内层循环,通过递减计数实现延时}
}
  • 调节方式:增大 i 值可延长延时。
  • 应用场景
    • 点阵扫描中,每行延时约 1ms(delay(1)),总周期约 8ms,刷新率约 125Hz,远高于视觉暂留阈值(约 50Hz),显示稳定无闪烁。
    • 延时过短 → 亮度不足;过长 → 闪烁明显。

五、数组在硬件控制中的应用

1. 数码管段码数组(备用)

/*** 共阴极数码管段码数组* 索引0-9分别对应数字0-9的十六进制段码*/
unsigned char digit_data[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
  • 虽未在主逻辑中使用,但体现“用数组存储固定硬件控制数据”的设计思想。

2. 点阵图案数组

unsigned char led_1_array[8] = {0x0, 0x10, 0x30, 0x10, 0x10, 0x10, 0x38, 0x0};
  • 每个元素对应一行 LED 的亮灭状态。
  • 修改数组即可切换显示图案,如改为 0x7F, 0x49, 0x49, 0x49, 0x36, 0x0, 0x0, 0x0 可显示字母“E”。

六、中断系统详解

中断基本概念

  • 中断源:引起中断产生的事件(如外部信号、定时器溢出、串口接收完成等)。
  • 中断服务程序(ISR):中断产生后 CPU 跳转执行的处理函数。
  • 程序计数器(PC):指向当前执行指令地址,中断发生时自动压栈保存,中断返回时恢复。

中断系统作用

使 CPU 具备实时响应外部紧急事件的能力,提高系统效率与实时性。

中断响应流程

  1. 当前指令执行完毕。
  2. PC 值压入堆栈。
  3. 现场保护(可选,由程序员实现)。
  4. 屏蔽同级/低级中断。
  5. PC 装载中断向量地址(跳转至 ISR)。
  6. 执行中断服务程序。
  7. RETI 指令返回:恢复 PC,恢复中断设置,继续原程序。

中断服务程序特点:无参数、无返回值、执行要快、尽量简短。


七、STC89C51RC/RD+ 中断系统特性

中断源(共8个)

中断源中断号中断向量地址查询优先级
外部中断0 (INT0)00003H最高
定时器01000BH
外部中断1 (INT1)20013H
定时器13001BH
UART 串口中断40023H
定时器25002BH
外部中断2 (INT2)60033H
外部中断3 (INT3)7003BH最低

中断优先级

  • 支持 4 级优先级(通过 IPH 寄存器设置)。
  • 若仅使用 IPXICON,则为传统 8051 的 2 级优先级
  • 高优先级可打断低优先级 → 支持中断嵌套。
  • 同级中断按查询次序响应。

中断控制寄存器

  • EA (IE.7):总中断允许位,置 1 开启全局中断。
  • EX0 (IE.0):外部中断 0 允许位。
  • IT0 (TCON.0):外部中断 0 触发方式(0=低电平,1=下降沿)。

八、C语言中断编程示例

初始化与主函数

// 外部中断0初始化函数
void eint0_init(void)
{IT0 = 1;  // 设置外部中断0为边沿触发方式(下降沿触发)EX0 = 1;  // 使能外部中断0EA = 1;   // 使能总中断
}// 主函数
void main(void)
{unsigned char i = 0;eint0_init();  // 调用外部中断0初始化函数while(1)  // 无限循环,等待中断发生{// 主程序可执行其他任务,中断发生时自动跳转处理}
}

中断服务程序(ISR)

// 外部中断0处理函数,interrupt 0 表示该函数为外部中断0的中断服务程序
void eint0_handler(void) interrupt 0
{P2 = 0xaa;  // 中断发生时,P2口输出0xAA(10101010B),控制外部LED或指示灯
}
  • interrupt 0:指定该函数为中断号 0(外部中断 0)的服务程序。
  • 理想运行结果:当外部中断 0 引脚(P3.2)检测到下降沿,CPU 跳转执行 eint0_handler(),P2 口输出 0xAA,之后自动返回主循环。

📌 注意:ISR 中避免使用延时函数或复杂操作,防止阻塞其他中断。


九、中断向量表与响应机制图示

在这里插入图片描述

  • 中断向量表:包含各中断服务函数入口地址(如 fun0() interrupt 0 对应 0003H)。
  • CPU 响应中断时,根据中断源自动跳转至对应向量地址。

在这里插入图片描述

  • 中断响应步骤
    1. 当前指令执行完。
    2. PC 压栈。
    3. 现场保护(程序员手动)。
    4. 屏蔽同级中断。
    5. PC = 中断向量地址。
    6. 执行 ISR。
    7. RETI 返回,恢复现场。

在这里插入图片描述

  • 中断触发流程:中断源(如 eint0)→ CPU 查询中断向量表 → 跳转 ISR(如 eint0_handler())→ 执行 → RETI 返回。

十、总结

本节内容涵盖 51 单片机两大核心模块:

1. 硬件驱动层

  • 使用 sbit 精准控制 I/O 引脚。
  • 驱动 74HC595 实现串转并,节省 I/O。
  • 8×8 LED 点阵逐行扫描 + 视觉暂留显示技术。
  • 延时函数调节扫描频率。
  • 数组存储硬件控制数据,便于图案切换。

2. 中断系统层

  • 中断源、中断向量、中断优先级机制。
  • 中断响应流程与现场保护。
  • C 语言中断服务程序编写规范(interrupt n)。
  • 外部中断初始化与触发方式设置。
  • 支持中断嵌套与多级优先级。

综合应用价值:掌握本节内容,可独立完成“按键中断控制点阵显示切换”、“定时器中断动态刷新图案”等复杂嵌入式项目,是迈向高级单片机开发的坚实基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/97880.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/97880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

差分: 模板+题目

题目&#xff1a;【模板】差分 应用场景&#xff1a;快速解决将某一个区间所有元素加上 “一个数” 的操作。 第一步&#xff0c;预处理差分数组。 f[i] 表示&#xff1a;当前元素与前一个元素的差值 a[i] - a[i-1]; 但在题目中&#xff0c;我们其实可以不用到a[]这个数组…

GD32 Timer+ADC多通道+DMA+PWM调试记录

本例记录使用GD32307C开发板&#xff0c;实现以内部Timer1 CH1为触发源&#xff0c;触发ADC0的两个通道&#xff0c;进行并行非连续采样&#xff0c;病通过DMA传输采样结果。同时输出PWM&#xff0c;用来检测Timer1 CH1的触发周期。下面介绍具体实现过程&#xff1a;1. gpio初始…

阻塞 IO为什么叫BIO,非阻塞IO为什么叫NIO,异步IO为什么叫AIO

IOIO的核心就是数据传输&#xff0c;也就是程序与外部设备之间进行传输&#xff0c;通过IO的核心可以分为&#xff0c;文件IO和网络IO文件IO交互的对象就是本地存储设备&#xff0c;比方说读写本地文件。网络IO交互的对象就是网络设备&#xff0c;核心的应用场景就是网络通信。…

10分钟了解什么是多模态大模型

10分钟了解什么是多模态大模型&#xff08;MM-LLMs&#xff09; 1. 什么是多模态 Multimodality 多模态&#xff08;Multimodality&#xff09;是指集成和处理两种或两种以上不同类型的信息或数据的方法和技术。在机器学习和人工智能领域&#xff0c;多模态涉及的数据类型通常…

通过DSL生成Jenkins流水线

代码化管理 Jenkins 流水线&#xff08;Infrastructure as Code&#xff09; 版本控制&#xff1a;DSL 脚本可以像代码一样存入 Git、GitLab 等版本控制系统&#xff0c;所有任务配置的变更都有提交记录&#xff0c;便于追溯历史、回滚错误。协作效率&#xff1a;团队成员可以通…

信号量主要API及综合应用

1.信号量概述信号量是一个底层核心模块【int】类型变量&#xff0c;记录当前信号量数据。信号量 P 操作 (sem_wait)线程检测对应信号量底层 int 数据数值&#xff0c;如果大于 0&#xff0c;当前线程获得 CPU 执行权&#xff0c;同时将信号量底层 int 数据-1 操作。如果底层数据…

工业自动化领域的“超级跑车”:西门子TDC系统深度解析与实战架构

工业自动化领域的“超级跑车”&#xff1a;西门子TDC系统深度解析与实战架构 文章目录 工业自动化领域的“超级跑车”&#xff1a;西门子TDC系统深度解析与实战架构引言&#xff1a;当普通PLC遇到性能瓶颈第一章&#xff1a;认识TDC——它不是简单的“大型PLC”1.1 TDC究竟是什…

MySQL高阶查询语句与视图实战指南

MySQL高阶查询语句与视图实战指南 文章目录MySQL高阶查询语句与视图实战指南一、常用高阶查询技巧1. 按关键字排序&#xff08;ORDER BY&#xff09;基础用法进阶用法&#xff1a;多字段排序条件过滤2. 区间判断与去重&#xff08;AND/OR DISTINCT&#xff09;区间判断&#x…

解决Pytest参数化测试中文显示乱码问题:两种高效方法

在使用Pytest进行参数化测试时&#xff0c;许多开发者都会遇到一个常见但令人头疼的问题&#xff1a;当测试用例的ids参数包含中文字符时&#xff0c;控制台输出会出现乱码。这不仅影响了测试报告的可读性&#xff0c;也给测试结果的分析带来了困难。本文将深入探讨这个问题&am…

基于SpringBoot的校园流浪动物救助平台【spring boot实战项目、Java毕设、Java项目、Java实战】

&#x1f496;&#x1f496;作者&#xff1a;计算机毕业设计小途 &#x1f499;&#x1f499;个人简介&#xff1a;曾长期从事计算机专业培训教学&#xff0c;本人也热爱上课教学&#xff0c;语言擅长Java、微信小程序、Python、Golang、安卓Android等&#xff0c;开发项目包括…

利用kimi k2编写postgresql协议服务端的尝试

美团龙猫还是很有自知之明的 提问请用C编写postgresql协议服务端&#xff0c;能接收psql客户端或其他采用postgresql协议的工具的请求&#xff0c;实现将用户请求打印在控制台&#xff0c;并把回应发给客户端回答 抱歉&#xff0c;我无法为您编写完整的 PostgreSQL 协议服务端。…

医疗 AI 再突破:辅助诊断准确率超 90%,但落地医院仍面临数据安全与临床信任难题

一、引言&#xff08;一&#xff09;医疗 AI 发展背景在数字化与智能化浪潮的席卷下&#xff0c;医疗领域正经历着深刻变革&#xff0c;人工智能&#xff08;AI&#xff09;技术的融入成为这场变革的关键驱动力。近年来&#xff0c;医疗 AI 辅助诊断技术取得重大突破&#xff0…

Rocky Linux10.0安装zabbix7.4详细步骤

安装Rocky Linux10.0系统 请参考Rocky Linux10.0安装教程-CSDN博客 查看当前系统版本 cat /etc/*release 安装数据库 安装zabbix之前&#xff0c;需要先安装一个数据库来承载zabbix的数据。这里我选择在本机直接安装一个MariaDB数据库。 Rocky Linux10.0系统默认不包含MySQ…

JDBC插入数据

文章目录视频&#xff1a;JDBC插入数据环境准备写插入数据属性配置属性配置视频&#xff1a;JDBC插入数据 环境准备 MySQL环境 小皮面板 提供MySQL环境 写插入数据 属性配置 声明变量 属性配置 # . properties 是一个特俗的map 集合 # key : 字符串 value : 字符串…

GPU 服务器压力测试核心工具全解析:gpu-burn、cpu-burn 与 CUDA Samples

在 GPU 服务器的性能验证、稳定性排查与运维管理中,压力测试是关键环节,可有效检测硬件极限性能、散热效率及潜在故障。以下从工具原理、核心功能、使用场景等维度,详细介绍三款核心测试工具,帮助用户系统掌握 GPU 服务器压力测试方法。 一、GPU 专属压力测试工具:gpu-bu…

Python进程和线程——多线程

前面提到过进程是由很多线程组成的&#xff0c;那么今天廖老师就详细解释了线程是如何运行的。首先&#xff0c;&#xff0c;Python的标准库提供了两个模块&#xff1a;_thread和threading&#xff0c;_thread是低级模块&#xff0c;threading是高级模块&#xff0c;对_thread进…

【MySQL|第九篇】视图、函数与优化

目录 十、视图 1、简单视图&#xff1a; 2、复杂视图&#xff1a; 3、视图更新&#xff1a; 十一、函数 1、函数创建&#xff1a; 十二、数据库优化 1、索引优化&#xff1a; 2、查询优化&#xff1a; 3、设计优化&#xff1a; 十、视图 在 MySQL 中&#xff0c;视图…

使用Docker和虚拟IP在一台服务器上灵活部署多个Neo4j实例

使用Docker和虚拟IP在一台服务器上灵活部署多个Neo4j实例 前言 在现代应用开发中&#xff0c;图数据库Neo4j因其强大的关系处理能力而备受青睐。但有时候我们需要在同一台服务器上运行多个Neo4j实例&#xff0c;比如用于开发测试、多租户环境或者A/B测试。传统的端口映射方式…

K8s学习笔记(一):Kubernetes架构-原理-组件

Kubernetes&#xff08;简称 K8s&#xff09;是一款开源的容器编排平台&#xff0c;核心目标是实现容器化应用的自动化部署、扩展、故障恢复和运维管理。其设计遵循 “主从架构”&#xff08;Control Plane Node&#xff09;&#xff0c;组件分工明确&#xff0c;通过 “声明式…

ensp配置学习笔记 比赛版 vlan 静态路由 ospf bgp dhcp

学习配置VLAN 虚拟局域网&#xff0c;目的让两台在同一网段的设备&#xff0c;在交换机中访问。基础指令&#xff1a;sys 进入系统 sysname R1 修改交换机名字为R1 display cur 查看数据、端口等交换机信息 &#xff08;在端口中&#xff0c;可以直接display this 可以直接看…