51單片機2(按鍵,外部中斷,定時器中斷,PWM與蜂鳴器)

1.按鍵模塊

????????以按鍵k1為例:兩個引腳被接到GND和P1_4引腳,當K1按鍵被按下時,P1_4引腳會和GND短路到一起,P1_4引腳會呈現低電平。

按鍵初始化:

//按鍵初始化
void Key_Init(void)
{P1 |= (0x0f << 4);P3 |= (1 << 5);
}

檢測那個按鍵按下:

int Key_Press(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;}else if ((P3 & (1 << 5)) == 0){ret = 5;}
}

我們可以以此寫一個函數:那個按鍵亮起就讓數碼管顯示那個數字,如k1亮起數碼管顯示1,如果沒有按鈕按下則顯示0(Diditer_Show函數在上一篇文章有展示)

#include <reg51.h>
#include <key.h>
#include <digiter.h>
#include <delay.h>
int main(void)
{int ret = 0;Key_Init();while(1){ret = Key_Press();Digiter_Show(ret);P0 = 0;}return 0;
}

2.中斷

????????中斷概念:CPU在執行一個任務時,被外界更為緊急的事件打斷,轉而去執行更為緊急的任務,執行完后再回到剛才的地方繼續向下執行,這一過程叫做中斷。

????????中斷源:打斷CPU執行當前任務的事件/源頭叫做中斷源。

????????中斷源分類外部中斷0、外部中斷1、定時器0、定時器1、串口。

????????中斷優先級:CPU再去處理中斷任務時候,會去比較多個中斷的優先級,優先去處理優先級高的中斷

????????默認優先級:

?????????中斷嵌套:處理一個中斷時,再嵌套另外的中斷;51單片機只允許嵌套2層。

????????中斷處理流程

?? ??? ?(1)中斷源發出中斷請求

?? ??? ?(2)檢查CPU是否響應中斷及該中斷源是否被屏蔽

?? ??? ?(3)比較中斷優先級

?? ??? ?(4)保護現場

?? ??? ?(5)執行中斷服務函數(回調函數)

?? ??? ?(6)恢復現場

2.1外部中斷

????????單片機上的引腳電平變化所引發的中斷(INT0(P3-2)、INT1(P3-3))

寄存器相關配置:

1. IE寄存器(中斷允許寄存器)

?? ??? ?(1)將IE寄存器中的bit7,EA置1,代表CPU能夠響應所有中斷

?? ??? ?(2)將IE寄存器中的bit0,EX0置1,代表允許外部中斷0產生中斷

2. TCON寄存器(定時器寄存器)

(1)將TCON寄存器的bit1,IE0置1,代表向CPU發起中斷請求,CPU響應完中斷請求后,硬件清“0”

?? ??? ?(2)將TCON寄存器的bit0,IT0置1,代表外部中斷0下降沿觸發中斷

知道相關寄存器內容后,我們來對外部中斷0進行配置:

//中斷配置
void int0_init(void)
{P3 |= (1 << 2);//將外部中斷0對應的引腳置1IE |= (1 << 7);//CPU能夠響應所有中斷   總開關IE |= (1 << 0);//外部中斷0能夠發起中斷   子開關TCON |= (1 << 0);//外部中斷0:P3_2引腳中斷觸發方式->下降沿觸發
}

再編寫中斷處理函數,即發生中斷后所執行的函數內容:

//外部中斷0的處理函數,每次發生中斷g_i++,無需聲明
unsigned int g_i = 0;
void Int0_Handler(void)  interrupt 0
{g_i++;
}

每發生一次中斷,g_i都會進行自加,我們將g_i傳參進Digiter_Show函數中,使得中斷次數在數碼管上顯示:

#include <reg51.h>
#include <key.h>
#include <digiter.h>
#include <delay.h>
int main(void)
{int ret = 0;Key_Init();int0_init();while(1){Digiter_Show(g_i);	}return 0;
}

????????用杜邦線短接P3.2和GND,每次短接,都會產生下降沿觸發外部中斷0,數碼管也會顯示中斷次數。

2.2定時器中斷

定時器:能夠產生一個精準的定時,不同外設對時序的要求高(高電平和低電平時間是精準的)

?? ??? ?51單片機內部有兩個定時器,分別為timer0、timer1,所使用自增型定時器(計數器 16位),因此其自增范圍為0~2^16=65535。

?????????晶振,晶體振蕩器(12MHZ / 11.0592MHZ)

? ? ? ? ?由于51單片機達不到12MHZ,將12MHZ進行12分頻,12MHZ/12 = 1MHZ

? ? ? ? ?51單片機完成一條指令運算:1/1MHZ = 1us。

因此我們要想定時1ms,需要51單片機完成1000次計時,由于其為自增型,因此我們需要將初始值設為65535-1000=64535。在執行1000次運算后定時器溢出,也就是1ms后中斷。


定時器相關寄存器配置

TCON寄存器:

?? ??? ??? ?(1)bit4置1,TMOD寄存器中的Gate位清0, 代表允許定時器開始計數,

TMOD寄存器:

?? ??? ??? ?(1)定時器0->低四位清0

?? ??? ??? ?(2)將TMOD寄存器中的M0,bit0置1,代表定時器0工作在16位定時器/計數器模式

IE寄存器:

?? ??? ??? ?(1)將IE寄存器中的bit7置1,代表CPU能夠響應所有中斷

(2)將IE寄存器中的bit1置1,代表允許定時器0產生中斷

配置流程:

?? ??? ?1. 先配置TMOD模式選擇寄存器,將低四位清0,再將bit0置1代表工作在16位定時器

?? ??? ?2. 向TH0和TL0中裝入定時器的初值(1ms -> 64535)

3. ?將TCON寄存器中的bit6置1,代表允許定時器開始計數

?? ??? ?4. ?將IE寄存器中的bit7和bit1置1,開啟中斷總開關和定時器0的子開關

?? ??? ?5. 編寫定時器0的中斷服務函數
我們對定時器進行配置:

// 定時器0初始化函數
void Timer0_Init(void)
{TMOD &= ~(0x0F << 0);    // TMOD寄存器低四位清0TMOD |= (1 << 0);		 // 定時器工作在16位定時器模式TH0 = 64535 >> 8;TL0 = 64535;TCON |= (1 << 4);    // 允許定時器0開始計數IE |= (1 << 7) | (1 << 1);   // 允許CPU響應中斷及定時器0產生中斷
}

中斷服務函數:每過1s對所有LED燈進行一次反轉。

void Timer0_handler(void)  interrupt 1
{TH0 = 64535 >> 8;TL0 = 64535;g_i++;if (g_i >= 1000){LED_Nor();g_i = 0;}
}

寫入主函數:

#include <reg51.h>
#include "timer.h"
#include "led.h"
int main(void)
{Timer0_Init();while (1){}return 0;
}

3.蜂鳴器模塊

????????????????????????

蜂鳴器

?? ??? ??? ?震蕩源 ?-> 聲音(波)-> 音調不同 -> 波的頻率發生變化 -> 高音 高頻 ?低音 低頻 ? 音量不同 -> 波的振幅 -> 能量

?? ??? ??? ?有源蜂鳴器:存在震蕩源,通電后蜂鳴器會發出持續頻率的聲音。

?? ??? ??? ?無源蜂鳴器:不存在震蕩源,通電后蜂鳴器不會發出聲音,需要給蜂鳴器一個震蕩。

PWM:脈沖寬度調制,能夠讓引腳產生一個方波,周期性的讓引腳的電平發生翻轉。

????????PWM周期:一個方波所經歷的周期。(從上升沿到上升沿所經歷的時間/從下降沿到下降沿所經歷的時間)

?? ??? ?PWM占空比:在一個周期內高電平所占的比例。

我們分別調制200,400,600,800,1000hz的蜂鳴器發聲頻率

以200為例

????????????????PWM蜂鳴器按照頻率200HZ,占空比50%工作
頻率:200HZ
時間:17公0==0.005s
定時:0.005s/2-0.0025s
定時器初值:
品振:12MHZ*10^6=12,000,000HZ分頻:12,000,000HZ/12=1000000HZ
時間:1/1000000HZ=0.000001s
定時器初值:
0.0025/0.000001=2500
65535-2500=63035
TH0=63035 >> 8;TL0=63035;

調制好的頻率對應的計數器初始值:

#ifndef TIMER_H__
#define TIMER_H__
extern void Timer0_Init(void);
extern unsigned short g_i1;
#define HZ200  63035
#define HZ400  64285
#define HZ600  64703
#define HZ800  64910
#define HZ1000 65035
#endif

定時器初始化以及中斷服務:

#include <reg51.h>
#include "led.h"
unsigned short g_i1 = 0;
// 定時器0中斷服務函數
void Timer0_handler(void)  interrupt 1
{TH0 = g_i1 >> 8;TL0 = g_i1;P2 ^= (1 << 1); //蜂鳴器反轉信號        
}// 定時器0初始化函數
void Timer0_Init(void)
{TMOD &= ~(0x0F << 0);    // TMOD寄存器低四位清0TMOD |= (1 << 0);		 // 定時器工作在16位定時器模式TH0 = g_i1 >> 8;TL0 = g_i1;TCON |= (1 << 4);    // 允許定時器0開始計數IE |= (1 << 7) | (1 << 1);   // 允許CPU響應中斷及定時器0產生中斷
}

主函數調用:當按鍵按下后蜂鳴器會發出對應聲音:

#include <reg51.h>
#include "timer.h"
#include "led.h"
#include "key.h"
int main(void)
{int set = 0;Key_Init();Timer0_Init();while (1){set = Key_Press();if (set ==0){TCON = 0;}else if(set == 1){TCON |= (1 << 4);g_i1 = HZ200;}else if(set == 2){TCON |= (1 << 4);g_i1 = HZ400;}else if(set == 3){TCON |= (1 << 4);g_i1 = HZ600;}else if(set == 4){TCON |= (1 << 4);g_i1 = HZ800;}else if(set == 5){TCON |= (1 << 4);g_i1 = HZ1000;}}return 0;
}

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

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

相關文章

【面試向】人工智能機器學習介紹

一、介紹 人工智能&#xff08;AI&#xff09;是通過模擬、延伸和擴展人類智能的技術&#xff0c;使機器能夠感知、理解、決策和行動。核心目標是實現“智能自動化”&#xff0c;即讓機器在復雜、動態的環境中自主完成任務&#xff0c;甚至超越人類在特定領域的能力。 機器學…

Python趣味入門:打印與計算初體驗

1. 嘗試使用 print() 打印各種內容print() 是我們在Python中最先接觸也是最常用的函數之一。它的核心功能是將內容輸出到控制臺。讓我們用它來玩點花樣&#xff1a;在您的IDE中創建一個新的Python文件&#xff08;例如 play_with_print.py&#xff09;&#xff0c;然后嘗試以下…

swagger接口文檔規范化(蒼穹外賣)

swagger接口文檔規范化 &#xff08;1&#xff09;說明&#xff1a; 將接口文檔分為管理端和用戶端 &#xff08;2&#xff09;WebMvcConfiguration修改 位置&#xff1a;sky-server/src/main/java/com/sky/config/WebMvcConfiguration.java 文件完整代碼&#xff1a; pa…

Transformer 架構的演進與未來方向(RNN → Self-Attention → Mamba)——李宏毅大模型2025第四講筆記

一句話總結——“所有架構都為了解決上一代模型的致命缺陷而生&#xff1a;CNN 解決參數爆炸&#xff0c;ResNet 解決梯度消失&#xff0c;Transformer 解決 RNN 無法并行&#xff0c;而 Mamba 則試圖一次解決 Transformer 的 O(N) 與 RNN 的記憶瓶頸。”1 每種架構的存在理由?…

Vllm-0.10.1:通過vllm bench serve測試TTFT、TPOT、ITL、E2EL四個指標

一、KVM 虛擬機環境GPU:4張英偉達A6000(48G)內存&#xff1a;128G海光Cpu:128核大模型&#xff1a;DeepSeek-R1-Distill-Qwen-32B推理框架Vllm:0.10.1二、四個性能指標介紹2.1、TTFT:Time to First token首次生成token時間&#xff08;ms&#xff09;,TTFT 越短&#xff0c;用戶…

邏輯回歸基礎

昨天一直在復盤梯度下降&#xff0c;都沒咋預習邏輯回歸&#xff0c;好在不是很難&#xff0c;來捋捋邏輯回歸簡介邏輯回歸是解決分類問題數學基礎-sigmoid函數還要回顧一下概率論極大似然估計再來看一下對數邏輯回歸原理邏輯回歸的損失函數例子&#xff1a;分類問題評估混淆矩…

STM32----W25QXX

W25QXX款圖W25QXX存儲解讀塊--->扇-->頁塊分成128塊一塊64kb一塊分成16扇一扇4kb一個扇區分成16頁&#xff0c;頁的大小是256個字節 當數據傳入W25QXX最小的擦除單元是扇區當已經輸入了一頁的數據&#xff0c;這時RAM的數據會轉存進FLASH&#xff0c;這時會置一個標志位&…

【Kafka】Kafka使用場景用例Kafka用例圖

【Kafka】Kafka使用場景用例&Kafka用例圖一、Kafka用例總圖二、Kafka用例圖示三、Kafka場景案例圖一、Kafka用例總圖 二、Kafka用例圖示 三、Kafka場景案例圖 注&#xff1a;以上圖片來源于網絡&#xff0c;如有不妥請私信刪除&#xff01;

Altium Designer(AD24)集成開發環境簡介

??《專欄目錄》 目錄 1,概述 2,界面介紹 2,搜索功能簡介 1,概述 Altium Designer 24的原理圖,PCB等設計工作都是在集成開發環境中進行的,本文簡單介紹集成開發環境界面。 2,界面介紹 如下圖所示,Altium Designer 24的集成開發環境,包括: 標題欄:目前設計中文件的…

[論文閱讀] 軟件工程 | 告別“線程安全玄學”:基于JMM的Java類靜態分析,CodeQL3分鐘掃遍GitHub千倉錯誤

告別“線程安全玄學”&#xff1a;基于JMM的Java類靜態分析&#xff0c;CodeQL3分鐘掃遍GitHub千倉錯誤 論文信息類別詳情論文原標題Scalable Thread-Safety Analysis of Java Classes with CodeQL主要作者及機構1. Bjrnar Haugstad Jatten&#xff08;哥本哈根IT大學&#xff…

jQuery.ajax() 方法核心參數詳解

大家好&#xff0c;歡迎來到程序視點&#xff01;我是你們的老朋友.小二&#xff01;jQuery.ajax() 方法核心參數詳解基礎參數url類型&#xff1a;String功能&#xff1a;請求地址&#xff0c;默認當前頁地址。type類型&#xff1a;String&#xff08;get/post為主&#xff0c;…

LCR 175. 計算二叉樹的深度【簡單】

LCR 175. 計算二叉樹的深度【簡單】 題目描述 某公司架構以二叉樹形式記錄&#xff0c;請返回該公司的層級數。 示例 1&#xff1a;輸入&#xff1a;root [1, 2, 2, 3, null, null, 5, 4, null, null, 4] 輸出: 4 解釋: 上面示例中的二叉樹的最大深度是 4&#xff0c;沿著路…

AI驅動健康升級:新零售企業從“賣產品”到“賣健康”的轉型路徑

隨著健康意識的不斷提升&#xff0c;健康管理增值服務正逐漸成為零售企業的核心競爭力。消費者對“產品服務”的需求激增&#xff0c;企業亟需構建覆蓋健康評估、干預到跟蹤的營養健康管理體系&#xff0c;通過數據化手段提升用戶粘性。在此背景下&#xff0c;AI技術正推動健康…

2025年最新三維WebGIS開發學習路線圖深度解析

地信小白為何學習webgis&#xff1f;我們在后臺經常收到同學們關于地信測繪等專業的吐槽&#xff0c;總結后主要分為以下幾類&#xff1a;第一種吐槽學校理論與實踐脫節的&#xff0c;學校課程偏重理論&#xff0c;缺乏企業級真實項目經驗&#xff0c;導致同學們簡歷空洞、單一…

15-Java-面向對象-標準JavaBean類

文章目錄標準JavaBean類標準JavaBean類 類名需要見名知意成員變量使用private修飾提供至少兩個構造方法 無參構造方法帶全部參數的構造方法 成員方法 提供每一個成員變量對應的setXxx&#xff08;&#xff09;/getXxx&#xff08;&#xff09;如果還有其他行為&#xff0c;也需…

AI大模型應用研發工程師面試知識準備目錄

一、大模型核心基礎理論 大模型核心架構&#xff1a;Transformer&#xff08;Encoder/Decoder結構、自注意力機制、多頭注意力&#xff09;、GPT系列&#xff08;Decoder-only&#xff09;、BERT系列&#xff08;Encoder-only&#xff09;的差異與適用場景關鍵技術原理&#xf…

基于單片機汽車防撞系統設計

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;單片機作品題目速選一覽表&#x1f680; &#x1f449;&#x1f449;&#x1f449;&#x1f449;單片機作品題目功能速覽&#x1f680; &#x1f525;更多文章戳&#x1f449;小新單片機-CSDN博客&#x1f68…

《Java線程池面試全解析:從原理到實踐的高頻問題匯總》

線程池作為Java并發編程的核心組件&#xff0c;是面試中的必考知識點。無論是初級開發崗還是資深架構崗&#xff0c;對線程池的理解深度往往能反映候選人的并發編程能力。本文匯總了線程池相關的高頻面試題&#xff0c;并提供清晰、深入的解答&#xff0c;助你輕松應對各類面試…

波特率vs比特率

一、核心定義1. 波特率&#xff08;Baud Rate&#xff09;定義&#xff1a;單位時間內傳輸的 “信號符號&#xff08;Symbol&#xff09;” 數量&#xff0c;單位為 “波特&#xff08;Baud&#xff09;”。這里的 “符號” 是通信中的基本信號單元&#xff0c;指信號在物理層的…

AI 生成式藝術重塑動漫角色創作:從技術邏輯到多元可能性(一)

當《蜘蛛俠&#xff1a;縱橫宇宙》中風格迥異的角色群像驚艷銀幕&#xff0c;當《鬼滅之刃》的 “柱” 系列角色憑借鮮明人設圈粉無數&#xff0c;動漫角色早已超越 “故事載體” 的屬性&#xff0c;成為承載世界觀、傳遞情感的核心符號。傳統動漫角色創作往往依賴團隊數月甚至…