📄 音阶声音输出试验.c
字号:
/*这一课,我们不再输出简单嘀声了,而是要输出各种不同频率的音乐声。先输出基本
的音阶,12345671为了输出准确的音阶频率,我们需要用定时器输出来控制蜂鸣器的驱动,这里用的T0。
我们再每一次定时器中断溢出时取反P17 引脚,以形成频率驱动蜂鸣器,定时器0 工
作在16 位方式,需要在中断里重新置入初始值。这个值就决定了P17 输出的频率。我们在
程序里先做好了一张表,预先写好了每个音阶的频率需要设置的初始值。到时调入对应的值
进去T0,不断溢出时就P17 可以输出对应的频率。
在这个程序里,我们自动地输出8 个音符,每个音符保持1 秒钟左右
*/
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#include <reg51.h>
sbit bibi=P1^7;
uchar th0;
uchar tl0;
uchar code TH_TL[36*2]={
0xA9,0xEF,//00220HZ ,1 //0 0xA9为高8,0xEF低8,注意//th0=TH_TL[jie8[i]*2];//置一个音符的值
//tl0=TH_TL[jie8[1]*2+1];语句的使用
0x93,0xF0,//00233HZ ,1#
0x73,0xF1,//00247HZ ,2
0x49,0xF2,//00262HZ ,2#
0x07,0xF3,//00277HZ ,3
0xC8,0xF3,//00294HZ ,4
0x73,0xF4,//00311HZ ,4#
0x1E,0xF5,//00330HZ ,5
0xB6,0xF5,//00349HZ ,5#
0x4C,0xF6,//00370HZ ,6
0xD7,0xF6,//00392HZ ,6#
0x5A,0xF7,//00415HZ ,7
0xD8,0xF7,//00440HZ 1 //12
0x4D,0xF8,//00466HZ 1# //13
0xBD,0xF8,//00494HZ 2 //14
0x24,0xF9,//00523HZ 2# //15
0x87,0xF9,//00554HZ 3 //16
0xE4,0xF9,//00587HZ 4 //17
0x3D,0xFA,//00622HZ 4# //18
0x90,0xFA,//00659HZ 5 //19
0xDE,0xFA,//00698HZ 5# //20
0x29,0xFB,//00740HZ 6 //21
0x6F,0xFB,//00784HZ 6# //22
0xB1,0xFB,//00831HZ 7 //23
0xEF,0xFB,//00880HZ `1
0x2A,0xFC,//00932HZ `1#
0x62,0xFC,//00988HZ `2
0x95,0xFC,//01046HZ `2#
0xC7,0xFC,//01109HZ `3
0xF6,0xFC,//01175HZ `4
0x22,0xFD,//01244HZ `4#
0x4B,0xFD,//01318HZ `5
0x73,0xFD,//01397HZ `5#
0x98,0xFD,//01480HZ `6
0xBB,0xFD,//01568HZ `6#
0xDC,0xFD,//01661HZ `7 //35
};
//定时中断0,用于产生唱歌频率
timer0() interrupt 1
{
TH0=th0;//调入预定时值
TL0=tl0;
bibi=~bibi; //取反音乐输出IO
P2=~P2;
}
//音阶声音自动输出试验
void main(void)
{
ulong n;
uchar i;
uchar code jie8[8]={12,14,16,17,19,21,23,24};//八个音符在频率表中的位置
TMOD=0x01;//使用定时器0 的16 位工作模式
TR0=1;
ET0 = 1;
EA==1;
while(1)
{
for(i=0;i<8;i++) //循环播放8 个音符
{
th0=TH_TL[jie8[i]*2];//置一个音符的值
tl0=TH_TL[jie8[1]*2+1];
for(n=0;n<50000;n++);//延时1 秒左右
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -