嵌入式第四十六天(51單片機(中斷,定時器))

一.獨立按鍵設置

1.

#include "key.h"void init_key(void)
{P1 |= (0x0F << 4);
}int key_pressed(void)
{static int ret = 0;if((P1 & (1 << 4)) == 0){ret = 1;}else if((P1 & (1 << 5)) == 0){ret = 2;}else if((P1 & (1 << 6)) == 0){ret = 3;}else if((P1 & (1 << 7)) == 0){ret = 4;}else{ret = 0;}return ret;
}

二.外部中斷

1.終端流程

2.代碼編寫

#include <reg52.h>
#include "delay.h"
#include "digtub.h"void init_enit(void)
{IE |= (1<<7)|(1<<0)|(1<<2);TCON |= (1<<0)|(1<<2);TCON &= ~(1<<0);P3 |= (1<<2)|(1<<3);
}int num = 0;void enit0_hander(void) interrupt 0
{++num;if(num > 9999){num = 0;}
}void enit1_hander(void) interrupt 2
{--num;if(num < 0){num = 9999;}
}int main(void)
{init_enit();while(1){show_number(num);	}
}

三.定時器

51單片機的定時器(如T0、TI)本質是可編程的16位計數器,核心功能是“計數”或“定時”,原理基于“晶休振蕩器提供的固定時鐘信號”


核心原理拆解:
1.時鐘來源
定時器的計數脈沖來自兩個選擇:


定時模式:脈沖來自單片機內部時鐘 (由外部晶振分頻得到),如晶振11.0592MHz時,內部時鐘頻率為11.0592MHz / 12 = 921.6kHz, 即每個計數脈沖的周期約1.08545(定時的最小單位))


計數模式:脈沖來自外部引腳(TO 對應P3.4、TI對應P3.5),引腳每發生一次電平跳變(下降沿),計數器加|(用于統計外部事件次數,如脈沖數),


2.計數器結構
定時器由兩個8位寄存器(高8位THx、低8位TLx)組成16位計數器(x=0或1,對應TOTI),計數范圍是0000H ~ FFFFH (共65536個計數單位)。


3.工作流程(以定時模式為例)


1.初始化:通過 TMOD寄存器設置定時器模式(如定時模式、16位自動重裝),通過THx和TLX設置初始計數value(如要定時Ims,計算初始值后寫入);


2.啟動:設置TRx=1(TO的TRO、TI 的TRI),定時器開始以固定時鐘脈沖計數,每來一個脈沖,TLx加1,TLx溢出時向THx進位,THx溢出時(計數器從初始值到FFFFH);


3.中斷觸發:計數器溢出后,自動置位“溫出標志位”(TFx=1),若此時中斷允許(ETx=1、EA=1),則觸發定時器中斷,CPU暫停主程序執行中斷服務函數;


4.重裝(可選):若設置為“自動重裝模式”(如TMOD的M1 =1,M0=0),溢出后THx和TLx會自動恢復為初始值,無需在中斷服務函數中手動重置,可實現周期性定時,


示例:11.0592MHz晶振下定時Ims
內部時鐘周期:12 / 11059200Hz 1.085μs;
Ims所需計數次數:1000μs /1.085μS 元921;
16位計數器最大值65536,因此初始值:
65536 - 921 = 64615,轉換為十六進制是FC67H,即THO=OxFC、TLO=0x67.


6、什么是PWM?
(1) PWM(脈沖寬度調制,Pulse Width
Modulation)
PWM是一種通過改變“脈沖信號的高電平時間
占比”來模擬模擬信號的技術,
比如:LED調光(高電平占比高則燈亮,占比
低則燈暗)、電機調速(占比高則轉速快)
-—核心是“用數字脈沖的‘占比’替代連續的模擬電壓”,避免了模擬電路的精度問題,且易于單片機控制,

2.51單片機代碼實現

#include <reg52.h>
#include "key.h"#define Hz200 63035
#define Hz400 64285
#define Hz800 64910
#define Hz2000 65285unsigned int n = Hz200;void init_timer0(void)
{TMOD &= ~(3<<2);TMOD &= ~(3<<0);TMOD |= (1<<0);TH0 = n >> 8;TL0 = n;//TCON |= (1<<4);IE |= (1<<7)|(1<<1);
}/*void timer0_hander(void) interrupt 1
{static int t;++t;if(t >= 500){P2 ^= 0xFF;t = 0;}TH0 = 64535 >> 8;TL0 = 64535;
} */void timer1_hander(void) interrupt 1
{P2 ^= (1<<1);TH0 = n >> 8;TL0 = n;
}int main(void)
{init_timer0();init_key();while(1){int ret;ret = key_pressed();if(ret == 0){TCON &= ~(1<<4);		}if(ret == 1){n = Hz200;TCON |= (1<<4);}if(ret == 2){n = Hz400;TCON |= (1<<4);}if(ret == 3){n = Hz800;TCON |= (1<<4);}if(ret == 4){n = Hz2000;TCON |= (1<<4);}}return 0;
}

四.重點概念

1.中斷: ??

當中央處理機CPU正在處理某件事的時候外界發生了緊急事件請求,要求CPU暫停當前的工作,轉而去處理這個緊急事件,處理完成以后,再回到原來被中斷的地方,繼續原來的工作,這樣的過程稱為中斷。

中斷源:

? ? ? ? 實現中斷功能的部件稱為中斷系統,請示CPU中斷的請求源稱為中斷源。微型機的中斷系統一般允許多個中斷源,當幾個中斷源同時向CPU請求中斷,要求為它服務的時候,這就存在CPU優先響應哪一個中斷源請求的問題。通常根據中斷源的輕重緩急排隊,優先處理最緊急事件的中斷請求源,即規定每一個中斷源有一個優先級別。CPU總是先響應優先級別最高的中斷請求。

2.

中斷處理流程:

(1).中斷源發出中斷請求:


中斷源通過特定信號,向 CPU 或內核發起 “需要即時處理” 的請求,觸發中斷流程。


(2).內核檢查是否響應相應中斷以及該中斷是否被屏蔽:


內核通過查詢中斷控制器的配置,判斷兩要素:一是該中斷是否在 “可響應中斷列表” 內;二是該中斷是否被 “中斷屏蔽字” 禁用。


(3).內核會檢查中斷的中斷優先級:


內核讀取中斷對應的優先級標識,判斷其優先級是否高于當前正在執行任務的優先級 —— 僅高優先級中斷可 “搶占” 當前任務,低優先級則排隊等待。


(4).保護現場:


內核將當前 CPU 寄存器的數值、當前任務的上下文保存至指定存儲區,確保后續恢復后能回到中斷前的執行狀態。


(5).執行中斷服務函數;


內核跳轉到該中斷對應的 “中斷服務程序” 入口,執行預設的處理邏輯,這是中斷的核心處理環節。

(6).恢復現場;

? ? ? ? 從存儲區中取出步驟 4 保存的寄存器值和任務上下文,恢復 CPU 狀態,讓系統回到中斷發生前的執行點,繼續運行被中斷的任務

3.中斷嵌套:

? ?當CPU正在處理一個中斷源請求的時候(即執行相應的中斷服務程序),發生了另外一個優先級比它還高的中斷源請求。如果CPU能夠暫停對原來中斷源的服務程序,轉而去處理優先級更高的中斷請求源,處理完以后,再回到原低級中斷服務程序,這樣的過程稱為中斷嵌套。

4.中斷向量表:

? ? ?中斷向量表是存儲于內存固定地址的核心數據結構,其本質是建立 “中斷號(唯一中斷標識)” 與 “中斷服務程序(ISR)入口地址” 的一一映射,為 CPU / 內核提供中斷響應時快速定位服務程序的 “索引表”,是中斷機制高效尋址的基礎。

5.51單片機的定時器工作原理:

? ? 51 單片機定時器本質是可編程減計數 / 加計數硬件模塊,核心基于內部晶振分頻后的時鐘脈沖驅動,通過預設計數初值、配置工作模式,實現定時(按時間間隔觸發)或計數(對外部脈沖計數)功能,溢出時可觸發中斷或輸出信號。

6.PWM:

定義:
PWM(Pulse Width Modulation,脈沖寬度調制)是一種通過周期性輸出高低電平脈沖信號,以調節高電平(有效電平)在一個周期內占比,從而等效控制輸出 “平均電壓 / 功率” 的數字信號調制技術。其核心是利用數字電路的離散電平,模擬出連續的模擬量輸出效果,廣泛應用于電機調速、燈光調光、電源穩壓等場景。

核心參數:

周期、頻率、占空比、分辨率、幅值。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98333.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98333.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98333.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Visual Studio Code2024安裝包及安裝教程

一、軟件下載軟件名稱&#xff1a;Visual Studio Code 2024安裝環境&#xff1a;window10及以上系統下載鏈接&#xff1a;https://pan.quark.cn/s/d9831b28c69a解壓軟件Bandizip下載鏈接&#xff1a;https://pan.quark.cn/s/a54e79b5d553二、軟件安裝1、下載后&#xff0c;先解…

fps:游戲玩法

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄游戲玩法倒計時僵尸潮游戲成功&失敗計時玩法&#xff1a;玩家在計時內存活&#xff0c;成功&#xff1b;反之失敗Game界面&#xff1a;由關卡調用計時系統計時完成&#xff1a;調用結果界面結果界面玩家死亡&…

如何建立針對 .NET Core web 程序的線程池的長期監控

如何建立針對 .NET Core web 程序的線程池的長期監控 建立針對 .NET Core Web 應用程序線程池的長期監控是一個系統性的工程&#xff0c;它涉及代碼集成、指標收集、存儲、可視化和告警。 核心思路 線程池監控不是孤立的&#xff0c;它必須與應用程序的整體性能指標&#xff08…

前端開發學習路徑

前端開發學習路徑前端開發基礎技能HTML、CSS和JavaScript是前端開發的三大核心技術。HTML用于構建網頁結構&#xff0c;CSS負責樣式設計&#xff0c;JavaScript實現交互功能。掌握這三項技術是學習前端開發的基礎。現代前端開發通常需要了解ES6語法&#xff0c;包括箭頭函數、解…

一款沒有任何限制的免費遠程手機控制手機的軟件簡介

這是一款沒有任何限制的免費遠程手機控制手機的軟件支持安卓和蘋果1.安裝1.1被控制端安裝airdroid1.2控制端air mirror2.登錄同一個賬號3.控制使用打開控制端軟件選擇要控制的機器直接點“遠程控制“連接上后就可以任意操作被控手機了

在word中使用lateX公式的方法

非常好的問題&#xff01;這是一個許多科研人員和學生都渴望實現的功能。但需要明確的是&#xff1a; **Microsoft Word 本身并不具備“自動”將 LaTeX 代碼實時轉換為渲染后公式的功能。** 它不像 Overleaf 或 VS Code 的 Markdown 插件那樣&#xff0c;輸入 $Emc^2$ 就立刻變…

23種設計模式——代理模式(Proxy Pattern)詳解

?作者簡介&#xff1a;大家好&#xff0c;我是 Meteors., 向往著更加簡潔高效的代碼寫法與編程方式&#xff0c;持續分享Java技術內容。 &#x1f34e;個人主頁&#xff1a;Meteors.的博客 &#x1f49e;當前專欄&#xff1a;設計模式 ?特色專欄&#xff1a;知識分享 &#x…

webpack scope hositing 和tree shaking

Scope Hoisting&#xff08;作用域提升&#xff09; 和 Tree Shaking&#xff08;搖樹優化&#xff09; 是現代前端構建中至關重要的概念。它們是構建工具&#xff08;如 Webpack、Rollup、Vite&#xff09;用來優化最終打包產物的核心技術。 核心概念快速理解 Tree Shaking&am…

手寫React狀態hook

在日常開發中&#xff0c;我們經常用到 React 的狀態管理 Hook&#xff1a;useState 和 useReducer。 但你有沒有想過&#xff1a;這些 Hook 內部是怎么實現的&#xff1f;為什么調用 setState 之后組件會重新渲染&#xff1f; 今天我們就來從零手寫 useState 和 useReducer&am…

力扣hot100:相交鏈表與反轉鏈表詳細思路講解(160,206)

問題描述核心思路&#xff1a;雙指針交替遍歷算法思想&#xff1a; 使用兩個指針 pa 和 pb 分別從鏈表A和鏈表B的頭節點出發&#xff0c;同步向后遍歷。當任一指針走到鏈表末尾時&#xff0c;將其重定位到另一鏈表的頭節點繼續遍歷。若兩鏈表相交&#xff0c;pa 和 pb 最終會在…

跨平臺游戲引擎 Axmol-2.8.1 發布

所有使用 axmol-2.8.0 的開發者都應更新至此版本 Axmol 2.8.1 版本是一個以錯誤修復和功能改進為主的次要 LTS 長期支持版本&#xff0c;發布時間: 2025 年 9 月 5 日 &#x1f64f;感謝所有對 axmol 項目的貢獻者&#xff0c;包括財務贊助者&#xff1a;scorewarrior、peter…

通過PXE的方式實現Ubuntu 24.04 自動安裝

PXE自動化安裝Ubuntu 24.04的配置文件之前都是通過PXE來自動化安裝Redhat系列的&#xff0c;例如&#xff1a;Rocky9、Rocky10、CentOS7、銀河麒麟 Kylin-V10、Kylin-V11、OpenEuler 24.03等。現在安裝Ubuntu系列的跟紅帽的不太一樣&#xff0c;所以在這里介紹下。創建三個文件…

AOSP Framework開發的一些超方便的快捷命令

在系統源碼中發現的一些命令和快捷方式。我們在編譯源碼之前執行的source build/envsetup.sh,通過cat build/envsetup.sh發現如下命令 - lunch: lunch <product_name>-<build_variant>Selects <product_name> as the product to build, and <build_…

【Protues仿真】基于AT89C52單片機的數碼管驅動事例

目錄 0案例視頻效果展示 1 AT89C52單片機驅動單個數碼管 1.1 數碼管基礎知識 1.1.1外觀與引腳 1.1.2 共陰(CC) vs 共陽(CA) 1.1.3段碼表(以數字1為例) 1.1.4驅動方式A. 直連IO(最簡單,占用IO多)一個段一根線,共陰或共陽公共端固定接GND/VCC。適合單個數碼管、…

01-Redis 發展簡史與核心定位解析:從誕生到三大產品矩陣

目錄引言一、Redis 的起源與發展&#xff1a;從定制工具到開源生態二、Redis 的核心定位&#xff1a;不止是緩存的多面手三、Redis 三大產品矩陣&#xff1a;按需選擇的完整解決方案3.1 Redis Open Source&#xff08;社區版&#xff09;&#xff1a;入門與輕量場景首選3.2 Red…

記錄jilu~

centos1、安裝最小版Linux 安裝必要工具yum -install -y epel-releaseyum -install -y net-toolsyum -install -y vim2、修改hostname hostnamectl net-hostname newhostname3、網絡配置文件&#xff0c;網關 &#xff0c; 使用ip &#xff0c;dns。。/etc/sysconfig/network-s…

【Linux基礎】fdisk命令詳解:從入門到精通的磁盤分區管理完全指南

目錄 前言 1 fdisk命令概述 1.1 什么是fdisk 1.2 fdisk的應用場景 1.3 fdisk與其他分區工具的比較 2 fdisk命令的安裝與基本語法 2.1 在不同Linux發行版中安裝fdisk 2.2 fdisk的基本語法 3 fdisk命令參數詳解 3.1 主要參數說明 3.2 交互式命令 4 fdisk操作流程詳解…

Flowable 工作流引擎

1、核心類 Flowable 引擎通過 ProcessEngine 作為總入口點&#xff0c;提供了多個核心服務接口&#xff0c;每個服務都負責特定的功能領域&#xff1a;服務名稱 (Service Name)主要功能 (Main Functionality)關鍵操作 (Key Operations)RepositoryService管理流程定義和部署&…

(RDFS)隨機深度特征選擇方法解釋:簡而言之,RDFS主要針對的是惡意的服務器,它建立在客戶端是誠實的前提下。

1. 隨機深度特征選擇是怎么實現的&#xff1f;隨機深度特征選擇 是一種在分布式機器學習&#xff08;特別是聯邦學習&#xff09;中用于保護客戶端數據隱私的技術。它的核心思想是&#xff1a;在每一輪訓練中&#xff0c;每個客戶端隨機選擇模型的一個子集&#xff08;即“深度…

C++20格式化字符串:std::format的使用與實踐

在C編程中&#xff0c;字符串格式化是一項常見的任務。在C20引入std::format之前&#xff0c;開發者通常依賴于一些傳統的解決方案&#xff0c;如printf系列函數、sstream&#xff0c;或者第三方庫如boost.format。然而&#xff0c;這些方法在代碼可讀性、類型安全性和靈活性方…