80c51单片机音乐播放器设计

作者&投稿:愚怪 (若有异议请与网页底部的电邮联系)
用80C51单片机设计一个音乐播放器~

给你个程序,能播放《世上只有妈妈好》。要是要原理图和说明文档可以跟我说一声。
/***************************************************************
* 世上只有妈妈好》+流水灯随音乐的节拍的快慢而动
* P3.7输出使实现蜂鸣器演奏歌曲功能
****************************************************************/

#include
sbit BELL=P3^7; //小喇叭
sbit key1=P3^5;
unsigned char timer0h,timer0l,time,led=1,j=0;
unsigned char flagd=0;

//世上只有妈妈好数据表
code unsigned char sszymmh[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2,
6,2,1, 5,2,1,6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,
6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,5,2,1, 6,2,1,
3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,2,2,1, 1,2,1, 6,1,1, 1,2,1,
5,1,6, 0,0,0
};

// 音阶频率表 高八位
code unsigned char FREQH[]={0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
} ;

// 音阶频率表 低八位
code unsigned char FREQL[]={0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
0xEE,0x44, 0x6B,0xB4,0xF4,0x2D, 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};

void delay(unsigned char t)
{
unsigned char sum1;
unsigned long sum2;
for(sum1=0;sum1<t;sum1++)
{
for(sum2=0;sum2<5000;sum2++)//节奏快慢
{;}
}
TR0=0;
}

void t0int() interrupt 1
{
TR0=0;
BELL=!BELL;
TH0=timer0h;
TL0=timer0l;
TR0=1;
}

void song()
{
TH0=timer0h;
TL0=timer0l;
TR0=1;
delay(time);
}

void main(void)
{
unsigned char k,i;
TMOD=1; //置CT0定时工作方式1
EA=1;ET0=1;//IE=0x82 //CPU开中断,CT0开中断

while(1)
{
i=0;
time=1;
while(time)
{
if(j==8)
{
//led=1;
j=0;flagd=~flagd;
if(flagd)
{
led=0x80;
}
else
{
led=1;
}
}
else
{
P2=~led;
if(flagd)
{
led=led>>1;
}
else
{
led=led<<1;
}
j++;
}

k=sszymmh[i]+7*sszymmh[i+1]-1;
timer0h=FREQH[k];
timer0l=FREQL[k];
time=sszymmh[i+2];
i=i+3;
song();
}
}
}

你这能做产品了

正好做了一个音乐程序,贡献出来给你吧,希望你能满意。
电路连接很简单,在P3.0端口接个蜂鸣器,不过效果一般。如果想效果好点,就加个放大电路,接个小功率喇叭就行。因为这里发电路不方便,所以如果需要放大电路,可加我QQ:7468485。

音乐程序的设计原理和程序如下:
设计原理
⑴ 总体原理:
乐曲中不同的音符,实质就是不同频率的声音。通过单片机产生不同的频率的脉冲信号,经过放大电路,由蜂鸣器放出,就产生了美妙和谐的乐曲。
⑵ 单片机产生不同频率脉冲信号的原理:
1)要产生音频脉冲,只要算出某一音频的脉冲(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期的时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期的时间再对I/O反相,就可以在I/O脚上得到此频率的脉冲。
2)利用8051的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产生不同频率的方法如下:
例如,频率为523Hz,其周期天/523 S=1912uS,因此只要令计数器计时956uS/1us=956,在每计数956次时就将I/O反接,就可得到中音DO(532Hz)。
计数脉冲值与频率的关系公式如下:
N=Fi/2/Fr
(N:计数值,Fi:内部计时一次为1uS,故其频率为1MHz,Fr:要产生的频率 )
⑶ 其计数值的求法如下:
T=65536-N=65536-Fi/2/Fr
计算举例:
设K=65536,F=1000000=Fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的计数值。
T=65536-N=65536-Fi/2/Fr=65536-1000000/2/Fr=65536-500000/Fr
低音DO的T=65536-500000/262=63627
中音DO的T=65536-500000/523=64580
高音DO的T=65536-500000/1047=65059
⑷ C调个音符频率与计数值T的对照表如下表所示:

表9.1 C调各音符频率与计数值T的对照表
音符 频率(Hz) 简谱码T值 音符 频率(Hz) 简谱码T值
低1DO 262 63628 #4FA# 740 64860
#1DO# 277 63731 中5SO 784 64898
低2RE 294 63835 #5SO# 831 64923
#2RE# 311 63928 中6LA 880 64968
低3M 330 64103 #6 932 64994
低4FA 349 64103 中7SI 988 65030
#4FA# 370 64260 高1DO 1046 65058
低5SO 392 64260 #1DO# 1109 65085
#5SO# 415 64331 高2RE 1175 65110
低6LA 440 64400 #2RE# 1245 65124
#6 466 64463 高3M 1318 65157
低7SI 494 64524 高4FA 1397 65178
中1DO 523 64580 #4FA# 1480 65198

⑸ 每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,下表为节拍码的对照。但如果1拍为0.4秒,1/4拍是0.1秒,只要设定延迟时间就可求得节拍的时间。假设1/4节拍为1DELAY,则1拍应为4DELAY,以此类推。所以只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数,如下表为1/4和1/8节拍的时间设定。
表9.2 节拍码对照表
1/4节拍 1/8节拍
节拍码 节拍数 节拍码 节拍数
1 1/4拍 1 1/8拍
2 2/4拍 2 1/4拍
3 3/4拍 3 3/8拍
4 1拍 4 1/2拍
5 1又1/4拍 5 5/8拍
6 1又1/2拍 6 3/4拍
7 1又3/4拍 7 7/8拍
8 2拍 8 1拍
9 2又1/4拍 9 1又1/8拍
A 2又1/2拍 A 1又1/4拍
B 2又3/4拍 B 1又3/8拍
C 3拍 C 1又1/2拍
D 3又1/4拍 D 1又5/8拍
E 3又1/2拍 E 1又3/4拍
F 3又3/4拍 F 1又7/8拍
表9.3 各调节拍的时间设定表
1/4节拍 1/8节拍
曲调值 DELAY 曲调值 DELAY
调4/4 125毫秒 调4/4 62毫秒
调3/4 187毫秒 调3/4 94毫秒
调2/4 250毫秒 调2/4 125毫秒
⑹ 建立音乐的步骤:
1)先把吧乐谱的音符找出,然后由上表建立T值表的顺序。
2)把T值表建立在TABLE1,构成发音符的计数值放在“TABLE”。
3)简谱码(音符)为高位,节拍为(节拍数)为低4位,音符节拍码放在程序的“TABLE”处。

表9.4 简谱对应的简谱码、T值、节拍数
简谱 发音 简谱码 T值 节拍码 节拍数
5 低5SO 1 64260 1 1/4拍
6 低6LA 2 64400 2 2/4拍
7 低7SI 3 64524 3 3/4拍
1 中1DO 4 64580 4 1拍
2 中2RE 5 64684 5 1又1/4拍
3 中3M 6 64777 6 1又2/4拍
4 中4FA 7 64820 7 1又3/4拍
5 中5SO 8 64898 8 2拍
6 中6LA 9 64968 9 2又1/4拍
7 中7SI A 65030 A 2又2/4拍
1 高1DO B 65058 B 2又3/4拍
2 高2RE C 65110 C 3拍
3 高3M D 65157 D 3又1/4拍
4 高4FA E 65178 E 3又2/4拍
5 高5SO F 65217 F 3又3/4拍
不发音 0

1/4拍的延迟时间=187毫秒
DELAY: MOV R7,#2
D2: MOV R4,#187
D3: MOV R3,#248
DJNZ R3,$
DJNZ R4,D3
DJNZ R7,D2
RET
4.程序范例
ORG 0000H ;主程序起始地址
SJMP START ;跳至主程序
ORG 000BH ;TIMER0中断起 始地址
LJMP TIM0 ;跳至TIMER0中断子程序
START: MOV TMOD,#01H ;设T0在M1
MOV IE,#82H ;中断使能
START0:MOV 30H,#00 ;取简谱码指针
NEXT: MOV A,30H ;简谱码指针载入A
MOV DPTR,#TAB ;至TAB取简谱码
MOVC A,@A+DPTR ;
MOV R2,A ;渠道的简谱码暂存于R2
JZ END0 ;是否渠道00(结束码)
ANL A,#0FH ;不是,则取低4位(节拍码)
MOV R5,A ;将节拍码存入R5
MOV A,R2 ;将取到的简谱码再载入A
SWAP A ;高低4位交换
ANL A,#0FH ;取低4位(音符码)
JNZ SING ;取到的音符码是否为0?
CLR TR0 ;开始,则不发音
SJMP D1 ;跳至D1
SING: DEC A ;取到的音符码减1(不含0)
MOV 22H,A ;存入(22H)
RL A ;乘2
MOV DPTR,#TAB1 ;至TABLE1取相对的高位字节计数值
MOVC A,@A+DPTR ;
MOV TH0,A ;取到的高位字节存入TH0
MOV 21H,A ;取到的高位字节存入(21H)
MOV A,22H ;在载入取到的音符码
RL A ;乘2
INC A ;加1
MOVC A,@A+DPTR ;至TABLE1取相对的低位字节计数值
MOV TL0,A ;取到的低位字节存入TL0
MOV 20H,A ;取到的低位字节存入(20H)
SETB TR0 ;启动TIMER0
D1: LCALL DELAY ;其本单位时间1/4拍187毫秒
INC 30H ;取简谱码指针加1
JMP NEXT ;取下一个简谱码
END0: CLR TR0 ;停止TIMER0
JMP START0 ;重复循环
TIM0: PUSH ACC ;将A的值暂存于堆栈
PUSH PSW ;将PSW的值暂存于堆栈
MOV TL0,20H ;重设计数值
MOV TH0,21H ;
CPL P3.0 ;将P3.0位反相,控制蜂鸣器发声
POP PSW ;至堆栈取回PSW的值
POP ACC ;至堆栈取回A的值
RETI
DELAY:MOV R7,#02
D2: MOV R4,#187
D3: MOV R3,#248
DJNZ R3,$
DJNZ R4,D3
DJNZ R7,D2
RET
TAB1: ;决定节拍
DW 64260,64400,64521,64580
DW 64684,64777,64820,64898
DW 64968,65030,65058,65110
DW 65157,65178,65217
TAB: ;乐曲名称《梁祝》
DB 02H,82H,62H,52H,48H,02H,52H,32H,22H,18H
DB 83H,91H,72H,62H,51H,61H,71H,61H,83H,61H
DB 81H,51H,61H,71H,61H,51H,46H,82H,32H,52H
DB 22H,42H,16H,21H,41H,18H,0E4H,13H,21H,43H
DB 51H,21H,41H,12H,83H,81H,61H,81H,58H,53H
DB 61H,31H,22H,13H,21H,42H,52H,0E2H,42H,21H
DB 11H,91H,41H,18H,63H,81H,32H,52H,21H,41H,
DB 16H,0E4H,11H,21H,31H,51H,26H,11H,21H,43H
DB 51H,82H,62H,52H,61H,51H,42H,21H,11H,0E4H
DB 44H,21H,41H,21H,11H,0E1H,11H,21H,41H,18H
DB 61H,81H,51H,61H,51H,41H,32H,21H,41H,18H
DB 08H,0H,04H ;曲子最后静音5拍长的时间
DB 00H ;乐曲结束
END

start:MOV A,#FE (74)(FE)
loop:MOV P1,A (F5)(90)
MOV R1,#10 ;延时
DEL1:MOV R2,#00 (7A)(C8)
DEL2:MOV R3,#126 (7B)(7E)
DEL3:DJNZ R3,DEL3 (DB)(FE)
DJNZ R2,DEL2 (DA)(FA)
DJNZ R1,DEL1 (D9)(F6)
RL A (23)
LJMP LOOP (02)(40)(40)
END

=====

我不懂单片机 这个是找的同一问题 人家验证过的 你试试

有点困难。

不错,没机会帮你了,高手太多了。

用AP89042这个芯片


C51单片机可以做声源产生模块吗
可以。C51单片机其中含有产生声音和释放声音的模块。所以,C51单片机可以做声源产生模块。C51单片机是对兼容英特尔8051指令系统的单片机的统称。51单片机广泛应用于家用电器、汽车、工业测控、通信设备中。因为C51单片机的指令系统、内部结构相对简单,所以国内许多高校用其进行单片机入门教学。

单片机c51,求一个如图的单片机音乐代码,相当于替换图上的音乐!求大神帮...
include "reg52.h"unsigned char Count;sbit led2 =P2^0; unsigned char code SONG[] ={ \/\/祝你平安0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,...

求c51单片机蜂鸣器演奏《青花瓷》c语言程序
2,1,3,2,1,2,2,2,6,1,1,1,2,1,1,2,4,0, 0, 0};*\/ \/\/code unsigned char sszymmh[] = {1,2,3,2,2,1,6,1,1,1,2,1,5,1,2,5,2,3,1,3,1,6,2,1,5,2,1,3,2,1,5,2,1,2,2,4,2,2,3,3,2,1,7,1,2,6,1,2,5,1,3,6,1,1,1,2,2,2,2,2...

单片机c51的音乐发生器
unsigned char flagd=0;\/\/世上只有妈妈好数据表 code unsigned char sszymmh[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,6,1,1, 5,2,1, 3,2,1, 2,2,4...

关于用单片机C51做的音乐问题之二
首先你要知道单片机发声是通过送不同频率的方波给蜂鸣器,让它发出不同频率的声音,波形决定音色。若要发出其它类型的乐器的音色,就要模仿它的波形。然而任何一种乐器的波形都不是简单的方波,而是相当复杂的一种合成波形。从理论上说,你可以在一个周期内用N个方波来合成一个复杂的波形。比如钢琴的波形...

关于用单片机C51做的音乐问题
不知道你用的是有源蜂鸣器还是无源的。做音乐那,要用无源的那种。有源的也会有声调不过很差劲。如果你用无源的还感觉不好,那就只好用解码芯片了。

如何编写51单片机音乐程序
T=65536-N=65536-Fi\/2\/Fr。例:设K=65536,F=1000000=Fi=1 MHZ。求低音DO(26HZ),中音DO(523HZ),高音DO(1046HZ)的记数值。每个音符使用1个音节,字节的高四位代表音符的高低,低四位代表音符的节拍。如果1拍为0.4秒,1\/4拍为0.1秒,假设1\/4拍为 DELAY,则1拍为4 DELAY。

关于用单片机C51做的音乐问题
用定时器T0的中断实现"渴望"主题曲的播放 include<reg51.h> \/\/包含51单片机寄存器定义的头文件 sbit sound=P3^7; \/\/将sound位定义为P3.7 unsigned int C; \/\/储存定时器的定时常数 \/\/以下是C调低音的音频宏定义 define l_dao 262 \/\/将“l_dao”宏定义为低音“1”的频率262Hz...

谁有c51单片机电子琴程序,带播放曲子跟彩灯功能的
Play(Music_Girl,0,3,360); Delay1ms(500); Play(Music_Same,0,3,360); Delay1ms(500); Play(Music_Two,0,3,360); Delay1ms(500); }} 追问 这个只是播放曲子,加上16音的电子琴能弄么?我不会把两个结合在一起 追答 不好意思,我也不知道怎么弄。 本回答由提问者推荐 已赞过 已踩过< 你对...

关于C51单片机通过sound播放音乐的问题
SONG_TONE是每个音符的频率,212就是频率;SONG_LONG是频率的长度,这个不是用中断完成的,是软件延时做的

雁峰区14761744177: 用80C51单片机设计一个音乐播放器 -
妫眉维泽: 给你个程序,能播放《世上只有妈妈好》.要是要原理图和说明文档可以跟我说一声./**************************************************************** 世上只有妈妈好》+流水灯随音乐的节拍的快慢而动* P3.7输出使实现蜂鸣器演奏歌曲功能**************...

雁峰区14761744177: 用80c51单片机设计程序制作一个电子音乐播放器 -
妫眉维泽: 用蜂鸣器吗?如果是的话网上资料很多啊 一首能弄出来那多首是没问题的,在内存能容纳的范围内.

雁峰区14761744177: 基于单片机的mp3播放器设计怎么做 -
妫眉维泽: 1、使用MP3解码芯片,然后通过单片机控制解码芯片;2、使用MP3语音播放模块,通过单片机的串口与语音播放模块通信;

雁峰区14761744177: 用单片机80c51制作电子音乐 求源程序 -
妫眉维泽: #include "reg51.h" unsigned char Count; sbit _Speak =P2^3 ; //蜂鸣器控制脚 unsigned char code SONG[] ={ //祝你平安,以下为编码0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,0x30,0x20,0x39,0x10,...

雁峰区14761744177: 单片机音乐播放系统设计
妫眉维泽: 这个首先得确定1,2,3,4,5,6,7七个音谱对应的频率(假如说用T0).然后由定时器T1来计算该频率持续长度来对应音乐的节拍(拍数……………………你好象要程序?有点长又烦!~才10分哦

雁峰区14761744177: 单片机智能音乐播放器毕业论文 -
妫眉维泽: 一、设计任务 设计题目: 单片机音乐播放器 设计要求: 1、完成89C51的外围复位、时钟和电源等外围电路的设计,完成扬声器驱动设计. 2、根据各音阶频率算出定时器定时常数,根据节拍给出该音阶持续的时间. 3、完成音乐播放软件并完...

雁峰区14761744177: 如何用c语言编写8051单片机音乐程序 -
妫眉维泽: 你可以用pwm和DA两种方式输入;当然.采用不用方式.电路也不同

雁峰区14761744177: 求基于单片机的音乐播放器设计 是要读取sd卡的语音播放器的参考资料 -
妫眉维泽: 单片机51,AVR,STM32 ,430,推荐stm32,资料太多了,播放器用VS1003,资料也多,百度吧

雁峰区14761744177: 找有关单片机设计的音乐门玲程序解析(80C51) -
妫眉维泽: ******************************************************************* 程序功能:模拟简易门铃;且有关闭门铃功能. 当按下TX-1C上的S2键后,蜂鸣器会发出十次短暂的“嘟嘟”声作为呼叫. S3用于关闭或者打开门铃. 当门铃处于关闭时,按下S2不会...

雁峰区14761744177: 基于51单片机U盘MP3播放器+蓝牙+FM的产品应该怎么做,可否提供详细原理图? -
妫眉维泽: 我们使用AVR128做过,最好使用STM32来做.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网