51單片機:使用蜂鳴器演奏《盜將行》(附代碼詳解)

一、功能實現:

二、代碼內容:

主函數.c

#include <REGX52.H>
#include "Delay.h"
#include "Timer0.h"sbit Buzzer=P2^5;#define SPEED 500
//原先默認一個四分音符延遲500ms#define P 0      //休止
#define L1 1     //低音1
#define L1_ 2    //低音1升半音
#define L2 3
#define L2_ 4
#define L3 5
#define L4 6
#define L4_ 7
#define L5 8
#define L5_ 9
#define L6 10
#define L6_ 11
#define L7 12
#define M1 13
#define M1_ 14
#define M2 15
#define M2_ 16
#define M3 17
#define M4 18
#define M4_ 19
#define M5 20
#define M5_ 21
#define M6 22
#define M6_ 23
#define M7 24
#define H1 25
#define H1_ 26
#define H2 27
#define H2_ 28
#define H3 29
#define H4 30
#define H4_ 31
#define H5 32
#define H5_ 33
#define H6 34
#define H6_ 35
#define H7 36unsigned int FreqTable[]={0,//第零位是休止符63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528,//12低音64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030,//12中音65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283 //12高音};//Music[]數組中每行第一個為音調,第二個為延續時間	
//以16分音符為1,8分音符為2,4分音符為4,2分音符為8,全音符為16//RAM只有512字節,不夠存儲
//ROM有8K(FLASH),使用ROM,Music前要加code,但是此時性質變為只可讀取,不可修改unsigned char code Music[]=
{	//音符,時值,//line1M1,2+1,M1,1,L6,2,M1,2,M3,2,M2,2+2,M1,2,M3,2,M3,2,L5,2,L7,2,L6,4,M1,2,L7,2,L6,2,L6,2,M1,2,M2,2,M3,2,L5,2+2+1,M5,1,//Line2L5,2,L5,2,L3,2,M5,2,M3,4,M3,2,M2,2,L6,4,M1,2,M3,2,M2,2+4,M1,2,M3,2,M3,2,L5,2,L7,2,L6,4,M1,2,L7,2,L6,2,L6,2,M3,2,M3,2,M1,2,M2,2,P,2,M1,2,//Line3M3,2,M3,2,M2,2,M3,2,L6,4+4,P,4,M3,2,M5,2,M6,4,M3,2,M6,2,M5,4,P,2,M5,2,M6,2,M5,2,M3,2,M2,2,M3,4,M3,2,M2,2,M1,2,L6,2,M1,2,M3,2,M2,4,P,2,M3,2,//Line4M5,2,M5,2,M5,2,M1,2,M2,4,M3,2,M5,2,M6,4,M3,2,M6,2,M5,4,P,2,M5,2,M6,2,M5,2,M5,2,M6,2,M3,4,M3,2,M2,2,M1,2,L6,2,M1,2,M2,2,M3,2,L5,2,L5,2,L3,2,//Line5L5,4,L5,2,L7,2,L6,4+4,0xFF	//終止標志
};unsigned char FreqSelect,MusicSelect=0;void main()
{Timer0_Init();while(1){		if(Music[MusicSelect]!=0xFF){FreqSelect=Music[MusicSelect];MusicSelect++;//原先默認一個四分音符延遲500ms,此程序由于四分音符延長時間為4部分,則一部分的延長時間為125msDelay(SPEED/4*Music[MusicSelect]);MusicSelect++;		TR0=0;//停止計時Delay(5);TR0=1;//開始計時			}else{TR0=0;while(1);}}}void Timer0_Routine() interrupt 1
{   if(FreqTable[FreqSelect]!=0){TL0 = FreqTable[FreqSelect]%256;TH0 = FreqTable[FreqSelect]/256; Buzzer=!Buzzer;		}}

定時器.c

#include <REGX52.H>
/*** @brief  定時器0初始化,1毫秒@11.0592MHz* @param  無* @param  無* @retval 無*///由軟件生成的定時器計算,注意每次要重新配置參數
void Timer0_Init(void)		
{//AUXR &= 0x7F;			//(89C52因為版本老沒有這個寄存器)定時器時鐘12T模式TMOD &= 0xF0;			//設置定時器模式TMOD |= 0x01;			//設置定時器模式TL0 = 0x66;				//設置定時初始值TH0 = 0xFC;				//設置定時初始值TF0 = 0;				//清除TF0標志TR0 = 1;				//定時器0開始計時//(補上)ET0=1;//允許中斷EA=1;//允許總中斷PT0=0;//中斷優先級為0
}/*
void Timer0_Init()//定時器+中斷系統的初始化函數
{//原理圖在開發手冊P190//TMOD=0x01;  //0000 0001  from 開發手冊P189-定時器工作模式//TMOD是不可位尋址只能整體賦值	TMOD=TMOD&0xF0;//把TMOD的低四位清零,高四位保持不變/*假設TMOD為1010 00111010 0011 & 1111 0000 = 1010 0000TMOD=TMOD&0xF低四位清零,高四位保持不變TMOD=TMOD|0x01;//把TMOD的最低位改為1,高四位保持不變1010 0000 | 0000 0001 =1010 0001最低位改為1,高四位保持不變TF0=0;   //from 開發手冊P188-定時器控制-中斷//TCOM是可位尋址可以對其中的每一位單獨賦值,TF0就是其中一位TR0=1;  //from 開發手冊P188-定時器控制-開始計數0~65535每隔一微秒計數加一總共定時時間位65535微秒如果賦初始值為64535,距離計數器計數器溢出差值1000所以計時時間為1毫秒P190原理圖TH0=64535/256;TL0=64535%256;16進制存儲在兩個寄存器,分高低位如果以10進制為例子
123存儲在兩個寄存器內
123/100=1(高位)
123%100=23(低位)//下面是中斷系統的初始化,是老一代51單片機,現在單片機可以向下兼容的。ET0=1;EA=1;PT0=0;}
*//*初始化后如何在主代碼中使用定時器T0的功能,定時器T0的中斷號為1舉個例子void Timer0_Routine() interrupt 1
{   static unsigned int T0Count;//退出此程序后不刷新數據,保留數據,稱為局內的靜態數據TL0 = 0x66;TH0 = 0xFC; //計時器溢出默認為0,下一次中斷會變成65倍的時間//將其設定為T0Count++;if(T0Count>=500){T0Count=0;}}
*/

定時器.h

#ifndef __TIMER0_H__
#define __TIMER0_H__void Timer0_Init(void);#endif

Delay.c

void Delay(unsigned int xms)	
{unsigned char data i, j;while(xms--){i = 2;j = 199;do{while (--j);} while (--i);}
}

Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__void Delay(unsigned int xms);#endif

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (創作不易,主函數在主頁下載資源內)

? ? ? ? ? ? ? ? ? ? ? ? ?【免費】51單片機:蜂鳴器播放音樂(盜將行).zip資源-CSDN文庫

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 謝謝大家!

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 小白一枚,請多指教! ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?FROM 明月清風mls

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

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

相關文章

LLaMA-Factory:開源的低代碼大模型訓練框架

LLaMA-Factory 是一個由零隙智能&#xff08;SeamLessAI&#xff09;開源的低代碼大模型訓練框架&#xff0c;它集成了業界最廣泛使用的微調方法和優化技術&#xff0c;并支持眾多開源模型的微調和二次訓練。 一、功能特點 支持多種開源模型&#xff1a;LLaMA-Factory支持包括…

輻射神經場算法——Instant-NGP / Mipi-NeRF 360 / 3D Gaussian Splatting

輻射神經場算法——Instant-NGP / Mipi-NeRF 360 / 3D Gaussian Splatting 1. Instant-NGP1. MultiResolution Hash Encoding1.2 Accelerated Ray Marching1.3 實驗結果 2. Mip-NeRF 3602.1 場景參數化2.2 在線蒸餾2.3 失真正則化2.4 實驗結果 3. 3D Gaussian Splatting3.1 Dif…

krpano開啟日志公能

<krpano version"1.21" title"博物館" debugmode"true" > 之后鼠標右鍵菜單欄最后一行 點擊&#xff08;開啟后會發生變化&#xff09;。

汽車預約維修小程序的設計

管理員賬戶功能包括&#xff1a;系統首頁&#xff0c;個人中心&#xff0c;技師管理&#xff0c;技師信息管理&#xff0c;用戶預約管理&#xff0c;取消預約管理&#xff0c;訂單信息管理&#xff0c;系統管理 微信端賬號功能包括&#xff1a;系統首頁&#xff0c;技師信息&a…

新開發的軟件老被系統攔截有什么辦法解決嗎?

一套新開發的軟件要想在windows操作系統暢通無阻&#xff0c;那就需要使用代碼簽名證書&#xff0c;只要是對軟件進行實名從而證明軟件發布者身份&#xff0c;確保該軟件是一個合法有效的主體開發的&#xff0c;也是讓這個軟件開發者承擔相應的責任。 特別主要如果要獲得即時性…

【深度學習入門篇 ③】PyTorch的數據加載

【&#x1f34a; 易編橙&#xff1a;一個幫助編程小伙伴少走彎路的終身成長社群&#x1f34a; 】 大家好&#xff0c;我是小森( &#xfe61;?o?&#xfe61; ) &#xff01; 易編橙終身成長社群創始團隊嘉賓&#xff0c;橙似錦計劃領銜成員、阿里云專家博主、騰訊云內容共創…

【漏洞復現】宏景HCM-LoadOtherTreeServlet SQL注入

聲明&#xff1a;本文檔或演示材料僅用于教育和教學目的。如果任何個人或組織利用本文檔中的信息進行非法活動&#xff0c;將與本文檔的作者或發布者無關。 一、漏洞描述 宏景HCM人力資源信息管理系統是一個全面的人力資源管理軟件&#xff0c;它覆蓋了人力資源管理的各個模塊…

報錯:python擴展中的調試器不再支持小于3.7的python版本(debugpy)

報錯&#xff1a;python擴展中的調試器不再支持小于3.7的python版本 原因1&#xff1a; debugpy的版本問題原因2 原因1&#xff1a; debugpy的版本問題 是debugpy和你vscode安裝的python解釋器不匹配&#xff0c;根據你使用的python解釋器的版本重新安裝一個debugpy。 原因2 …

華為官方出品:《應用現代化實踐指南》電子書,可免費下載

本期云享書庫為各位開發者帶來了應用現代化方面的技術內容。 在數字化時代&#xff0c;企業面臨著前所未有的機遇與挑戰。隨著技術的飛速發展&#xff0c;特別是云計算、大數據、人工智能&#xff08;AI&#xff09;和機器學習&#xff08;ML&#xff09;的興起&#xff0c;正…

Python爬蟲速成之路(1):獲取網頁源代碼

hello hello~ &#xff0c;這里是絕命Coding——老白~&#x1f496;&#x1f496; &#xff0c;歡迎大家點贊&#x1f973;&#x1f973;關注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;個人主頁&#xff1a;絕命Coding-CSDN博客 &a…

C#面:簡述什么是中間件(Middleware)?

中間件是組裝到應?程序管道中以處理請求和響應的軟件。 每個組件&#xff1a; 選擇是否將請求傳遞給管道中的下?個組件。 可以在調?管道中的下?個組件之前和之后執??作。 請求委托&#xff08;Request delegates&#xff09;?于構建請求管道&#xff0c;處理每個HTTP請…

Threadlocal使用獲取最后更新人信息

Threadlocal 的作用范圍是一個線程&#xff0c;tomcat啟動默認開啟一個線程 首先點擊登錄&#xff0c;登錄方法會返回token 拿到token后放在請求頭中發送商品的插入請求&#xff0c;在插入是設置拿到token中的nickName&#xff08;花名&#xff09;放入&#xff08;lastUpdate…

windows系統長時間不用,無法喚醒

問題背景 在我們使用windows系統的時候&#xff0c;有這樣一種情況&#xff0c;就是電腦長時間不不操作&#xff0c;就會“睡死”過去。此時再用鼠標鍵盤都無法將其喚醒。沒辦法只能長按電源鍵強制關機&#xff0c;再重啟。那么該如何解決這種問題呢&#xff1f; 原因分析 系…

PLSQL Day7

--9.用戶鍵盤輸入5個數字&#xff0c;將數字按從小到大的順序存入集合中&#xff1a;declare declare type num_type is table of number; n_tab num_type; temp_n number ; begin n_tab: num_type(&n1,&n2,&n3,&n4,&n5); for i in 1..n_tab.co…

高可用hadoop分布式節點的擴容

解決方案 修改hdfs-site.xml 文件 原xml文件 <?xml version"1.0" encoding"UTF-8"?> <?xml-stylesheet type"text/xsl" href"configuration.xsl"?> <!--Licensed under the Apache License, Version 2.0 (th…

編程參考 - 在C++類成員函數聲明中使用const關鍵字

在 C 中&#xff0c;可以在類成員函數聲明中使用 const 關鍵字來表示函數不修改對象的狀態。這就是所謂的 "const 成員函數"。將成員函數聲明為 const 時&#xff0c;意味著該函數承諾不更改對象的任何成員變量&#xff08;標記為可變的變量除外&#xff09;。 In C,…

福克斯波羅 FOXBORO FBM201模塊 控制器 處理器

福克斯波羅 FOXBORO FBM201 控制器具有緊湊和堅固的設計&#xff0c;使其非常適合在惡劣的工業環境中使用。它可以承受極端的溫度&#xff0c;濕度和振動&#xff0c;并且以最少的維護來實現持久的性能。 控制器配備了先進的控制算法&#xff0c;使其能夠快速準確地響應過程條…

Python: 從 2.7 升級到 3,我比 vue 慢了一點點

小破站搜索云前端&#xff0c;查看視頻版 2024 年 7 月 7 日&#xff0c;據一位長期的Python觀察者爆料&#xff0c;Fedora 41 系統最終將停止支持 Python 2.7。這是Python 2系列的最后一個版本&#xff0c;Python 2.7在Fedora Linux 41中將被退役且不再替代。除了PyPy之外&…

利用【Python】【線性規劃】優化工廠生產:實現智能資源配置與利潤最大化的現代解決方案

目錄 1. 問題背景和描述 1.1 問題背景 1.2 問題描述 2. 數學模型的建立 2.1決策變量 2.2 目標函數 2.3 約束條件 2.4 數學模型總結 3. 使用Python解決線性規劃問題 3.1 導入必要的庫 3.2 定義目標函數系數 3.3 定義不等式約束矩陣和向量 3.4 定義變量的邊界 非負…

淺談 Webpack5 模塊聯邦

概念 Webpack 模塊聯邦是一種先進的代碼共享技術&#xff0c;它允許在多個獨立構建的 Web 應用程序之間共享代碼&#xff0c;而無需將這些代碼提前發布到 npm 倉庫或其他中央存儲。 這項技術特別適用于微前端架構&#xff0c;因為它能讓各個前端團隊獨立開發、部署自己的應用…