用單片機的蜂鳴,實現(xiàn)簡單小星星
我們在設置板子的時候要翻轉
翻轉IO口是因為使用了步進電機的多余的芯片管腳
我們翻轉之后還想讓它保持一段時間
就是先翻轉500次 Delay(1)之后 就是最小的單位每隔1ms 周期就是2ms 頻率就是500HZ
蜂鳴器播放音樂
我們首先在前面到現(xiàn)在必須明白一個道理 就是我們的蜂鳴器發(fā)聲是因為蜂鳴器的
我們可以不停的反轉的電平,而且隨著電平翻轉頻率的變化,它的音調也會變化,依據(jù)此原理可以用蜂鳴器來播放音樂。我們可以控制電平的時序,傳遞合適的周期以便于控制音調的高低。
我們可以這么想 ,就像一個鼓,我們如果不敲動,那么就不會發(fā)聲。我們必須給他一個擾動 也就是翻轉 。就像是我們控制
舉例
void Timer0_Routine() interrupt 1
{
TL0 = 64580%256; //設置定時初值
TH0 = 64580%256; //設置定時初值
Buzzer=!Buzzer; //蜂鳴器的頻率
}
當我們在實現(xiàn)音樂控制的時候還會出現(xiàn)一個問題就是我們的數(shù)組前兩個數(shù)字是一樣的那該怎么辦
這樣聽聲音就會有一種頓挫感
unsigned char Music[]={12,12,19,19,21,21,19,17,17,16,16,14,14,12};
例如這是最經典的小星星的一段
我們最好在中間插入一點東西使得能夠聽出不一樣的感覺
FreqSelect=Music[MusicSelect];
MusicSelect++;
Delay(500);
TR0=0;
Delay(5);
TR0=1;
做到這里我們會發(fā)現(xiàn)還有問題 我們看樂譜的時候就會發(fā)現(xiàn)有些音他是延長 而又有些音是兩個音的組合成一個
那么在這里我們是否再提供一個數(shù)組用來確定
這時候我們想到上面的music 是一維數(shù)組的形式 我們可以將其改寫為二維數(shù)組的形式
but 用一個數(shù)組也行 最好是二維更加清晰一點吧
FreqSelect=Music[MusicSelect];
MusicSelect++;
Delay(125*Music[MusicSelect]);
MusicSelect++;
TR0=0;
Delay(5);
TR0=1;
}
另外 我們拿到樂譜并不能很好的取一個基準 有很多16分 8分 4分頻 我們按照男人的思維 用數(shù)學的邏輯 取最小的記為1 哪個最小就用哪個
unsigned char Music[]={
12,4,
12,4,
19,4,
19,4,
21,4,
21,4,
19,4+4,
17,4,
17,4,
16,4,
16,4,
14,4,
14,4,
12,4+4
};
unsigned char FreqSelect,MusicSelect;
void main()
{
Timer0Init();
while(1)
{
FreqSelect=Music[MusicSelect];
MusicSelect++;
Delay(125*Music[MusicSelect]);
MusicSelect++;
TR0=0;
Delay(5);
TR0=1;
}
}
新修改的代碼
還有樂譜中會出現(xiàn)休止符 休止符 就是不彈奏的意思
我們再開頭插入一個0 為什么再開頭不再結尾 其實你插入在哪里都可以 開頭最好做好識別一點吧文章來源:http://www.zghlxwxcb.cn/news/detail-570658.html
另外作為一個數(shù)組 難免會出現(xiàn)越界的行為 聲音走了 那么我們需要在特定位置增加一個判斷確定聲音是否越界
ok好了下面是小星星的完整代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-570658.html
main.c
#include <REGX52.H>
#include "Delay.h"
#include"Timer0.h"
sbit Buzzer=P2^5;
#define SPEED 500 //我們以4分音符為基準
unsigned int FreqTable[]={
0,
63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64524,
64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030,
65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283
};
unsigned char Music[]={
13,4,
13,4,
20,4,
20,4,
22,4,
22,4,
20,4+4,
0,4,
18,4,
18,4,
16,4,
16,4,
15,4,
15,4,
13,4+4,
0xFF
};
unsigned char FreqSelect,MusicSelect;
void main()
{
Timer0Init();
while(1)
{
if(Music[MusicSelect]!=0xFF)
{
FreqSelect=Music[MusicSelect];
MusicSelect++;
Delay(SPEED/4*Music[MusicSelect]);
MusicSelect++;
TR0=0;
Delay(5);
TR0=1;
}
else
{
TR0=0;
while(1);
}
}
}
void Timer0_Routine() interrupt 1
{
if(FreqTable[FreqSelect])
{
TL0 = FreqTable[FreqSelect]%256; //設置定時初值
TH0 = FreqTable[FreqSelect]/256; //設置定時初值
Buzzer=!Buzzer; //蜂鳴器的頻率
}
}
Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned int xms);
#endif
Delay.c
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
Timer0.c
#include <REGX52.H>
/**
* @brief 定時器0初始化,1毫秒@12.000MHz
* @param 無
* @retval 無
*/
void Timer0Init(void)
{
TMOD &= 0xF0; //設置定時器模式
TMOD |= 0x01; //設置定時器模式
TL0 = 0x18; //設置定時初值
TH0 = 0xFC; //設置定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
ET0=1;
EA=1;
PT0=0;
}
Timer0.h
#ifndef __TIMER0_H__
#define __TIMER0_H__
void Timer0Init(void);
#endif
到了這里,關于【【51單片機的蜂鳴器實現(xiàn)小星星】】的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!