① 如何编写51单片机音乐程序
设计的相关音乐说明
要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期时间。利用半周期时间定时这个半周期时间,每当计时到后就将输出的I/O反向,然后重复计时此半周期再对I/O反向,就可以在I/O脚上得到此频率的脉冲。
记数脉冲值与频率的关系公式如:N=Fi/2/Fr。N:记数值;Fi:内部计时依次为1us,故其频率为1 MHZ;Fr:要产生的频率。
其记数值的求法如: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。
(1)单片机mp3程序扩展阅读:
功能特性
1,可以仿真63K程序空间,接近64K 的16位地址空间;
2,可以仿真64Kxdata 空间,全部64K 的16位地址空间;
3,可以真实仿真全部32 条IO脚;
4,完全兼容keilC51 UV2 调试环境,可以通过UV2 环境进行单步,断点, 全速等操作;
5,可以使用C51语言或者ASM汇编语言进行调试 ;
6,可以非常方便地进行所有变量观察,包括鼠标取值观察,即鼠标放在某 变量上就会立即显示出它此的值;
7,可选 使用用户晶振,支持0-40MHZ晶振频率;
8,片上带有768字节的xdata,您可以在仿真时选 使用他们,进行xdata 的仿真;
9,可以仿真双DPTR 指针;
10,可以仿真去除ALE 信号输出. ;
11,自适应300-38400bps 的所有波特率通讯;
12,体积非常细小,非常方便插入到用户板中.插入时紧贴用户板,没有连接电缆,这样可以有效地减少运行中的干扰,避免仿真时出现莫名其妙的故障;
13,仿真插针采用优质镀金插针,可以有效地防止日久生锈,选择优质园脚IC插座,保护仿真插针,同时不会损坏目标板上的插座. ;
14,仿真时监控和用户代码分离,不可能产生不能仿真的软故障;
15,RS-232接口不计成本采用MAX202集成电路,串行通讯稳定可靠,绝非一般三极管的简易电路可比。
② 51单片机做MP3
用转换芯片,淘宝上很多型号,
5v转3.3v特,纠正个问题不是从IO转,是从电源端转换,IO只是信号线。
sd卡,下载个sd卡文件系统51的,或者买个文件系统的芯片,ch37X系列都可以,就很简单
③ 我用单片机AT89C51SND1C外接CH376T扩展T-F卡和U盘的MP3播放器,有谁可以伴我写程序。有酬谢!
首先你的方案里面需要有音频解码芯片或是模块,单片机只是个控制芯片不是万能的;
推荐使用音频VS1003B或是VS1053B音频解码芯片,外围电路简单,带有MIC录音功能;
如果需要自带喇叭播放,就需要音频功放电路,推荐使用芯片XPT4990,外围电路我有,也是非常简单;
硬件搭建完成,就需要软件了;使用单片机配合CH376T对U盘或SD卡进行SPI或是串口读出数据,将数据存到单片机内部自带EEPROM中,然后分时段将数据转入到VS10053B进行解码,通过简单音频硬件处理后过功放电路就能带喇叭输出(也可以不带功放使用耳机接口通过耳机直接输出);
看似非常简单,但如果没有音频处理相关经验,我对你的硬件比较捉急,楼主可先考虑购买模块进行程序调试,然后在熟悉各项原理图的情况下,进行多次layout尝试;走线规范和细节需要自己网络学习或大虾手把手指导,不是简简单单用洞洞板或是手工制板就能搞定的
④ 想用51单片机做一个智能播放MP3的东西 求程序和电路图 ps :我们基础有点弱……
是用51内核的单片机吧?一般有专用芯片,像山景AU7842、AU7850等等都可以做出你说的MP3播放器,性能好点的用AVR的AT89C51SND1做,这类型的单片机是可以即做控制芯片,也集成DSP解码部分。你需要的图和程序就比较多了,没办法在这上面发给你看了。需要的话给个邮箱。
⑤ 简单的单片机音乐程序
#include <REG52.H>
#include "SoundPlay.h"
void Delay1ms(unsigned int count)
{
unsigned int i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++);
}
unsigned char code Music_Two[] ={ 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,
0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,
0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,
0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x16,0x03,
0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01,
0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,
0x16,0x03, 0x15,0x03, 0x10,0x03, 0x15,0x03, 0x16,0x01,
0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,
0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,
0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,
0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x19,0x03,
0x19,0x01, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x01,
0x16,0x03, 0x16,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,
0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0D, 0x15,0x00,
0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03,
0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03,
0x16,0x0D, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03,
0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03,
0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03,
0x19,0x02, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E,
0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E,
0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03,
0x17,0x0D, 0x16,0x03, 0x17,0x03, 0x19,0x01, 0x19,0x03,
0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03,
0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x03,
0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02,
0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01,
0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x03,
0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
0x17,0x16, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x0F,0x02,
0x10,0x03, 0x15,0x00, 0x00,0x00 };
//***********************************************************************************
main()
{
InitialSound();
while(1)
{
Play(Music_Girl,0,3,360);
Delay1ms(500);
Play(Music_Same,0,3,360);
Delay1ms(500);
Play(Music_Two,0,3,360);
Delay1ms(500);
}
}
/**************************************************************************
SOUND PLAY FOR 51MCU
COPYRIGHT (c) 2005 BY JJJ.
-- ALL RIGHTS RESERVED --
File Name: SoundPlay.h
Author: Jiang Jian Jun
Created: 2005/5/16
Modified: NO
Revision: 1.0
*******************************************************************************/
/*说明**************************************************************************
曲谱存贮格式 unsigned char code MusicName{音高,音长,音高,音长...., 0,0}; 末尾:0,0 表示结束(Important)
音高由三位数字组成:
个位是表示 1~7 这七个音符
十位是表示音符所在的音区:1-低音,2-中音,3-高音;
百位表示这个音符是否要升半音: 0-不升,1-升半音。
音长最多由三位数字组成:
个位表示音符的时值,其对应关系是:
|数值(n): |0 |1 |2 |3 | 4 | 5 | 6
|几分音符: |1 |2 |4 |8 |16 |32 |64 音符=2^n
十位表示音符的演奏效果(0-2): 0-普通,1-连音,2-顿音
百位是符点位: 0-无符点,1-有符点
调用演奏子程序的格式
Play(乐曲名,调号,升降八度,演奏速度);
|乐曲名 : 要播放的乐曲指针,结尾以(0,0)结束;
|调号(0-11) : 是指乐曲升多少个半音演奏;
|升降八度(1-3) : 1:降八度, 2:不升不降, 3:升八度;
|演奏速度(1-12000): 值越大速度越快;
***************************************************************************/
#ifndef __SOUNDPLAY_H_REVISION_FIRST__
#define __SOUNDPLAY_H_REVISION_FIRST__
//**************************************************************************
#define SYSTEM_OSC 12000000 //定义晶振频率12000000HZ
#define SOUND_SPACE 4/5 //定义普通音符演奏的长度分率,//每4分音符间隔
sbit BeepIO = P3^7; //定义输出管脚
unsigned int code FreTab[12] = { 262,277,294,311,330,349,369,392,415,440,466,494 }; //原始频率表
unsigned char code SignTab[7] = { 0,2,4,5,7,9,11 }; //1~7在频率表中的位置
unsigned char code LengthTab[7]= { 1,2,4,8,16,32,64 };
unsigned char Sound_Temp_TH0,Sound_Temp_TL0; //音符定时器初值暂存
unsigned char Sound_Temp_TH1,Sound_Temp_TL1; //音长定时器初值暂存
//**************************************************************************
void InitialSound(void)
{
BeepIO = 0;
Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256; // 计算TL1应装入的初值 (10ms的初装值)
Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256; // 计算TH1应装入的初值
TH1 = Sound_Temp_TH1;
TL1 = Sound_Temp_TL1;
TMOD |= 0x11;
ET0 = 1;
ET1 = 0;
TR0 = 0;
TR1 = 0;
EA = 1;
}
void BeepTimer0(void) interrupt 1 //音符发生中断
{
BeepIO = !BeepIO;
TH0 = Sound_Temp_TH0;
TL0 = Sound_Temp_TL0;
}
//**************************************************************************
void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed)
{
unsigned int NewFreTab[12]; //新的频率表
unsigned char i,j;
unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;
unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD;
for(i=0;i<12;i++) // 根据调号及升降八度来生成新的频率表
{
j = i + Signature;
if(j > 11)
{
j = j-12;
NewFreTab[i] = FreTab[j]*2;
}
else
NewFreTab[i] = FreTab[j];
if(Octachord == 1)
NewFreTab[i]>>=2;
else if(Octachord == 3)
NewFreTab[i]<<=2;
}
SoundLength = 0;
while(Sound[SoundLength] != 0x00) //计算歌曲长度
{
SoundLength+=2;
}
Point = 0;
Tone = Sound[Point];
Length = Sound[Point+1]; // 读出第一个音符和它时时值
LDiv0 = 12000/Speed; // 算出1分音符的长度(几个10ms)
LDiv4 = LDiv0/4; // 算出4分音符的长度
LDiv4 = LDiv4-LDiv4*SOUND_SPACE; // 普通音最长间隔标准
TR0 = 0;
TR1 = 1;
while(Point < SoundLength)
{
SL=Tone%10; //计算出音符
SM=Tone/10%10; //计算出高低音
SH=Tone/100; //计算出是否升半
CurrentFre = NewFreTab[SignTab[SL-1]+SH]; //查出对应音符的频率
if(SL!=0)
{
if (SM==1) CurrentFre >>= 2; //低音
if (SM==3) CurrentFre <<= 2; //高音
Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//计算计数器初值
Sound_Temp_TH0 = Temp_T/256;
Sound_Temp_TL0 = Temp_T%256;
TH0 = Sound_Temp_TH0;
TL0 = Sound_Temp_TL0 + 12; //加12是对中断延时的补偿
}
SLen=LengthTab[Length%10]; //算出是几分音符
XG=Length/10%10; //算出音符类型(0普通1连音2顿音)
FD=Length/100;
LDiv=LDiv0/SLen; //算出连音音符演奏的长度(多少个10ms)
if (FD==1)
LDiv=LDiv+LDiv/2;
if(XG!=1)
if(XG==0) //算出普通音符的演奏长度
if (SLen<=4)
LDiv1=LDiv-LDiv4;
else
LDiv1=LDiv*SOUND_SPACE;
else
LDiv1=LDiv/2; //算出顿音的演奏长度
else
LDiv1=LDiv;
if(SL==0) LDiv1=0;
LDiv2=LDiv-LDiv1; //算出不发音的长度
if (SL!=0)
{
TR0=1;
for(i=LDiv1;i>0;i--) //发规定长度的音
{
while(TF1==0);
TH1 = Sound_Temp_TH1;
TL1 = Sound_Temp_TL1;
TF1=0;
}
}
if(LDiv2!=0)
{
TR0=0; BeepIO=0;
for(i=LDiv2;i>0;i--) //音符间的间隔
{
while(TF1==0);
TH1 = Sound_Temp_TH1;
TL1 = Sound_Temp_TL1;
TF1=0;
}
}
Point+=2;
Tone=Sound[Point];
Length=Sound[Point+1];
}
BeepIO = 0;
}
//**************************************************************************
#endif
⑥ 单片机音乐程序代码
T0H EQU30H
T0LEQU31H
ORG0000H
LJMPMAIN
ORG000BH
LJMPT0ISR
ORG0030H
MAIN:
MOVSP,#5FH
MOVTMOD,#01H
SETBET0
SETBEA
LOOP:
MOVDPTR,#FREQ
MOVA,P2 ;控制高中低音区
MOVR1,#0
ANLA,#03H
JBACC.0,LOOP01
MOVR1,#14
SJMPLOOP0
LOOP01:
JBACC.1,LOOP0
MOVR1,#28
LOOP0:
JBP0.0,LOOP1 ;控制音频1234567
MOVA,R1
MOVCA,@A+DPTR
MOVT0H,A
INCDPTR
MOVA,R1
MOVCA,@A+DPTR
MOVT0L,A
LJMPLOOP
LOOP1:
JBP0.1,LOOP2
MOVA,R1
ADDA,#2
MOVCA,@A+DPTR
MOVT0H,A
INCDPTR
MOVA,R1
ADDA,#2
MOVCA,@A+DPTR
MOVT0L,A
LJMPLOOP
LOOP2:
JBP0.2,LOOP3
MOVA,R1
ADDA,#4
MOVCA,@A+DPTR
MOVT0H,A
INCDPTR
MOVA,R1
ADDA,#4
MOVCA,@A+DPTR
MOVT0L,A
LJMPLOOP
LOOP3:
JBP0.3,LOOP4
MOVA,R1
ADDA,#6
MOVCA,@A+DPTR
MOVT0H,A
INCDPTR
MOVA,R1
ADDA,#6
MOVCA,@A+DPTR
MOVT0L,A
LJMPLOOP
LOOP4:
JBP0.4,LOOP5
MOVA,R1
ADDA,#8
MOVCA,@A+DPTR
MOVT0H,A
INCDPTR
MOVA,R1
ADDA,#8
MOVCA,@A+DPTR
MOVT0L,A
LJMPLOOP
LOOP5:
JBP0.5,LOOP6
MOVA,R1
ADDA,#10
MOVCA,@A+DPTR
MOVT0H,A
INCDPTR
MOVA,R1
ADDA,#10
MOVCA,@A+DPTR
MOVT0L,A
LJMPLOOP
LOOP6:
JBP0.6,LOOP7
MOVA,R1
ADDA,#12
MOVCA,@A+DPTR
MOVT0H,A
INCDPTR
MOVA,R1
ADDA,#12
MOVCA,@A+DPTR
MOVT0L,A
LJMPLOOP
LOOP7:
CLRTR0
LJMPLOOP
;-----------------------------
T0ISR:
CLRTR0
MOVTH0,T0H
MOVTL0,T0L
SETBTR0
CPLP3.0
RETI
;-----------------------------
FREQ:
DB0F2H,03DH ;低音1
DB0F3H,0BDH ;低音2
DB0F5H,014H ;低音3
DB0F5H,0B1H ;低音4
DB0F6H,0D0H ;低音5
DB0F7H,0D1H ;低音6
DB0F8H,0B5H ;低音7
DB0F9H,01EH ;中音1
DB0F9H,0DEH ;中音2
DB0FAH,08AH ;中音3
DB0FAH,0D8H ;中音4
DB0FBH,068H ;中音5
DB0FBH,0E8H ;中音6
DB0FCH,05AH ;中音7
DB0FCH,08FH ;高音1
DB0FCH,0EFH ;高音2
DB0FDH,045H ;高音3
DB0FDH,06CH ;高音4
DB0FDH,0B4H ;高音5
DB0FDH,0F4H ;高音6
DB0FEH,029H ;高音7
;-----------------------------
END
⑦ 用单片机制作一个MP3,很急!!!!
这还真不是一句半句能说清楚的,你还是要从器件的功能引脚做起的.
然后再做功能框图
⑧ 请问怎么用单片机播放MP3格式的音乐
单片机播放音乐的途径是数模转换。
1、需要MP3格式的音乐文件和读取外部数据(如SD卡)。
2、利用MP3播放专用单片机,如AT89C51SND1C来播放mp3格式的文件。