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
英文地址,請注明出處:http://en.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 可以直接看…