硬件-DAY02(按鍵、中斷、定時器、蜂鳴器)

補充:1.變量前加code,從RAM區變成ROM區
2.三極管的原理就是PN結
3.裸機程序是單線程的,display時不能delay

一、獨立按鍵
1.高電平沒按,低電平按了
按鍵原理:輪詢方式(poll)-->以消耗大量CPU資源為代價
????????代碼:

int key_pressed(void)
{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;}return ret;
}

二、中斷處理(由kernel處理)
1.中斷的概念:
????????當中央處理機CPU正在處理某件事的時候外界發生了緊急事件請求,要求CPU暫停當前的工作,轉而去處理這個緊急事件,處理完以后,再回到原來被中斷的地方,繼續原來的工作,這樣的過程稱為中斷。
2.中斷源:能夠打斷當前工作任務的事件(外部中斷)
? ? ? ? eg:引腳的電平中斷
3.中斷的步驟:
1)中斷源發出中斷請求
2)CPU檢查是否響應中斷及該中斷源是否被屏蔽
3)檢查中斷優先級(高級別 > 低級別)
? ? ? ? 在51單片機中,中斷嵌套最多2個
? ? ? ? 優先級相同的中斷請求時,誰的號小誰先來
4)保護現場
5)執行中斷服務函數
6)恢復現場
? ? ? ? 4、5、6類似于C語言中調用函數
4.51單片機中5個中斷源:外部中斷0、定時器中斷0、外部中斷1、定時器中斷1、串口中斷

5.1)EA:中斷總開關
2)IE中斷允許寄存器(可位尋址)

3)IE0:外部中斷0請求源
IT0:低電平觸發? IT0 = 0;下降沿觸發 ITO = 1;

三、定時器(timer0、timer1)
1.TR0
????????TR0:定時器T0的運行控制位。該位由軟件置位和清0。當GATE(TMOD.3)=0,TR0=1時就允許T0開始計數,TR0=0時禁止T0計數。當GATE(TMOD.3)=1,TR1=0且INT0輸入
高電平時,才允許T0計數???

2.

3.16位定時器? ? 代碼:

void init_timer0(void)
{TMOD &= ~(0x0f << 0);TMOD |= (1 <<0);TH0 = g_n >> 8;TL0 = g_n;TCON |= (1 << 4);IE |= (1 << 7) | (1 << 1);
}

4.晶振(12MHZ、11.0592MHZ)
1s = 1000Ms? 1Ms = 1000us
????????計算HZ的方法:

5.PWM
????????高電平占的部分叫做占空比、從上升沿到下一個上升沿,叫一個周期
? ? ? ? 占空比 = 高電平 /? 周期

四、蜂鳴器(分為有源和無源)
1.源指的不是電源而是震蕩源
2.原理圖:

3.代碼:main.c

#include <reg52.h>
#include "timer.h"
#include "key.h"#define HZ200 63231
#define HZ400 64383
#define HZ600 64768
#define HZ800 64959int main(void)
{init_timer0();while(1){int key = key_pressed();if(1 == key){g_n = HZ200;}else if(2 == key){g_n = HZ400;}else if(3 == key){g_n = HZ600;}else if(4 == key){g_n = HZ200;}		}
}

timer.c

#include "timer.h"
#include <reg52.h>unsigned int g_n;void init_timer0(void)
{TMOD &= ~(0x0f << 0);TMOD |= (1 <<0);TH0 = g_n >> 8;TL0 = g_n;TCON |= (1 << 4);IE |= (1 << 7) | (1 << 1);
}void timer0_handler(void) interrupt 1
{TH0 = g_n >> 8;TL0 = g_n;P2 ^= (1 << 1);
}

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

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

相關文章

前端頁面html開發案例入門實踐、超鏈接標簽、圖片標簽、常用站點

前端頁面html開發案例入門實踐 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>html案例</title> </head> <body><h1>web前端開發</h1><h2>HTML</h2><…

策略模式和模板方法模式的區別【面試題】

策略模式和模板方法模式的區別【面試題】 摘要&#xff1a; 策略模式和模板方法模式均屬于行為設計模式&#xff0c;但核心差異顯著。策略模式通過組合實現&#xff0c;支持運行時動態切換完整算法&#xff08;如支付方式切換&#xff09;&#xff0c;變化維度大&#xff1b;模…

從零打造前沿Web聊天室:消息系統

消息存儲系統 聊天室設計&#xff0c;消息存儲系統非常關鍵&#xff0c;因為一開始設計時使用MongoDB&#xff0c;所以后續使用schemma方式存儲。 后端架構&#xff1a;express MongoDB 消息插入策略 在 MongoDB 中設計聊天消息存儲時&#xff0c;插入策略的選擇會影響性能…

[7-01-03].第03節:環境搭建 - 集群架構

RabbitMQ學習大綱 一、使用集群的原因 1.基于以下原因&#xff0c;需要搭建一個 RabbitMQ 集群來解決實際問題 單機版的&#xff0c;無法滿足目前真實應用的要求。如果 RabbitMQ 服務器遇到內存崩潰、機器掉電或者主板故障等情況&#xff0c;會導致rabbitMQ無法提供服務單臺 R…

【vivado】時序分析之Latch pins with no clock

問題&#xff1a; vivado打開時序報告&#xff0c;如下圖 表示存在鎖存器Latch 解決方法&#xff1a; 查看代碼中是否存在狀態機的狀態沒有寫全&#xff0c;或者default中直接寫了null。

如何將 MX Linux 的垂直任務欄面板移到底部

MX Linux 因其速度和較低的資源消耗&#xff0c;比同類其他 Linux 系統更快地獲得了人氣。它默認帶有 Xfce 桌面環境&#xff0c;但任務欄在左側且是垂直的&#xff0c;這對一部分人來說真的非常不舒服且令人煩惱。如果你也有同感&#xff0c;并且也想將 MX Linux 的任務欄自定…

python debug 監控雙下劃線的變量顯示沒有此變量

名稱改寫&#xff08;Name Mangling&#xff09; 在Python中&#xff0c;如果你在類中定義一個屬性或方法時以雙下劃線開頭&#xff08;例如__attribute&#xff09;&#xff0c;Python會自動對其進行名稱改寫。名稱改寫實際上是在屬性或方法名前加上類名&#xff0c;以避免子…

list使用及模擬

01. list介紹 list是支持常數時間內任意位置插入刪除的序列容器,具備雙向迭代能力。其底層為雙向鏈表結構,各元素存于獨立節點,通過指針指向前后元素。與forward_list的主要區別:后者是單鏈表,僅支持單向迭代,結構更簡單高效。相比array、vector、deque等序列容器,list在…

NLP基礎與詞嵌入:讓AI理解文字(superior哥深度學習系列第13期)

13_NLP基礎與詞嵌入&#xff1a;讓AI理解文字 superior哥深度學習系列第十三篇 從像素到文字&#xff0c;從視覺到語言——讓AI跨越認知的橋梁 &#x1f3af; 前言&#xff1a;當AI學會"讀懂"文字 各位小伙伴們&#xff0c;歡迎來到superior哥深度學習系列的第十三篇…

【時時三省】(C語言基礎)關于變量的聲明和定義

山不在高&#xff0c;有仙則名。水不在深&#xff0c;有龍則靈。 ----CSDN 時時三省 可能有些人弄不清楚定義與聲明有什么區別&#xff0c;它們是否是一回事。有人認為聲明就是定義&#xff0c;有人認為只有賦了值的才是定義。在C語言的學習中&#xff0c;關于定義與聲明這兩個…

Java 時間處理指南:從“踩坑”到“填坑”實戰

&#x1f525;「炎碼工坊」技術彈藥已裝填&#xff01; 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 場景問題&#xff1a;訂單處理系統的時間計算 假設你正在開發一個電商訂單系統&#xff0c;需要解決以下問題&#xff1a; 用戶下單后&#xff0c;需在…

基于Java的Excel列數據提取工具實現

摘要&#xff1a;本文介紹了一個使用Java語言開發的Excel列數據提取工具&#xff0c;該工具借助Apache POI庫實現對Excel文件的讀取與特定列數據提取功能。通過用戶輸入文件路徑與列名&#xff0c;程序可從指定Excel文件中提取相應列的數據并展示&#xff0c;同時詳細闡述了關鍵…

關于人工智能未來的趨勢

學而不思則罔 翻譯&#xff1a;使用深度學習、強化學習卻不用專家系統&#xff0c;就會產生幻覺。 思而不學則殆 翻譯&#xff1a;只有專家系統邏輯推理&#xff0c;但是不用大模型更新知識&#xff0c;就無法發展下去了。 因此&#xff0c;未來智能的范式應該是&#xff1a; …

Java八股文——MySQL「性能調優篇」

MySQL的EXPLAIN有什么作用&#xff1f; 面試官您好&#xff0c;EXPLAIN命令是我在進行SQL性能優化時&#xff0c;使用最頻繁、也最重要的一個工具。 它的核心作用可以一句話概括&#xff1a;模擬MySQL的查詢優化器來執行一條SQL語句&#xff0c;并向我們展示出它最終決定采用…

win打印機共享處理

win打印機共享處理 軟件鏈接 無法啟動Print Spooler服務錯誤193:0xc1的解決方案主要涉及修復服務依賴關系、清理打印緩存及修復系統文件?。該錯誤通常由系統文件損壞、注冊表配置異常或依賴服務未啟動導致&#xff0c;可通過以下步驟系統化解決。?? 解決方法&#xff1a;替換…

C++ map代碼練習 1、2、priority_queue基礎概念、對象創建、數據插入、獲取堆頂、出隊操作、大小操作,自定義結構、代碼練習 1 2

map代碼練習1&#xff0c;對應力扣 兩個數據的交集&#xff0c;代碼見下 class Solution { public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {map<int, int> cnt;vector<int> ans;for(int i0; i<nums1.size(…

三天沖刺《編譯原理》——筆記(一)

點關注不迷路喲。你的點贊、收藏&#xff0c;一鍵三連&#xff0c;是我持續更新的動力喲&#xff01;&#xff01;&#xff01; 持續關注我~~~主頁&#xff0c;查看更多內容喲&#xff08;希望你能在這里有所收獲&#x1f92d;&#xff09;。點關注&#xff0c;不迷路&#xf…

代理模式Proxy Pattern

模式定義 給某一個對象提供一個代理&#xff0c;并由代理對象控制對原對象的引用 對象結構型模式 模式結構 Subject&#xff1a;抽象主題角色Proxy&#xff1a;代理主題角色RealSubject&#xff1a;真實主題角色 代理類實現代碼 public class Proxy implements Subject {p…

基于YOLOv11與單目測距的實戰教程:從目標檢測到距離估算

引言 在計算機視覺領域&#xff0c;目標檢測與距離估算的結合是自動駕駛、機器人導航等場景的關鍵技術。本文將以YOLOv8模型為核心&#xff0c;結合單目相機的幾何模型&#xff0c;實現對視頻中目標的實時檢測與距離估算。代碼參考自單目測距原理博客&#xff0c;并通過實踐驗…

代碼生成器使用原理以及使用方法

代碼生成器使用原理以及使用方法 版本號&#xff1a;1.0 二Ο二五年二月 目錄 文檔介紹 1.1編寫目的 1.2文檔范圍 1.3讀者對象 系統設計 2.1設計目標 2.2設計思路 2.3代碼實現原理 使用方法 3.1如何使用 3.2如何修改&#xff1f; 對原程序的bug修改及簡…