基于51单片机两种音乐编码的比较及用法
51单片机上实现7首简单音乐的汇编代码
51单片机上实现7首简单音乐的汇编代码
51单片机上实现7首简单音乐的汇编代码
ORG 00H
JMP START
ORG 0BH
JMP TIM0
START:MOV TMOD,#01H
MOV IE,#10000010B
CLR TR0
MOV P2,#0FFH
MOV A,P2
MOV P2,#0FFH
RR A
RR A
RR A
ANL A,#0FH ;将选择的音乐号放入A
MOV 40H,A
JB P3.3,$ ;P3.3 为起始信号片选信号
START0:MOV 30H,#00H
NEXT: MOV A,40H
JB P3.3,START
CJNE A,#00H,MUSIC1
MOV DPTR,#TABLE ;生日快乐的TABLE
JMP CON
MUSIC1: CJNE A,#01,MUSIC2
MOV DPTR,#TABLE1
JMP CON
MUSIC2:CJNE A,#02,MUSIC3
MOV DPTR,#TABLE2
JMP CON
MUSIC3:CJNE A,#03,MUSIC4
MOV DPTR,#TABLE3
JMP CON
MUSIC4:CJNE A,#04,MUSIC5
MOV DPTR,#TABLE4
JMP CON
MUSIC5:CJNE A,#05,MUSIC6
MOV DPTR,#TABLE5
JMP CON
MUSIC6:CJNE A,#06,MUSIC7
MOV DPTR,#TABLE6
JMP CON
MUSIC7:SETB P2.6
JMP START ;共7首歌,这个时候不发音CON: MOV A,30H
MOVC A,@A+DPTR
基于51单片机音乐播放器课程设计报告
基于51 单片机音乐播放器课程设计报告
课程设计
课程设计名称:单片机课程设计专业班级电科0901 学生姓名:学号:
200948360118指导教师:课程设计时间:2012-9-20〜2012-9-28 电子信息科学与技术专业课
程设计任务书
说明:本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文) 首页
一设计任务及要求利用单片机定时器完成控制音乐的频率,每个音调响的时长,来达到播放出音乐。并且实时监测红外接收管是否触发中断,来判断是否遥控器按下了播放/ 暂停键、上一首、下一首,进而实时处理。并把信息显示在1602 液晶上。音高与频率的对应关系下表:
二设计原理图
单片机与1602 液晶、红外接收管SM0038 接线图单片机驱动蜂鸣器电路及红外遥控器键码
本次实验所用按键及对应编码:
( 1 )上一首07 (2) 下一首15 (3)播放/暂停09
三程序设计框图
Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256;
装入的初值(10ms 的初装值)
Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256; 装入的初值
TH1 = Sound_Temp_TH1;
TL1 = Sound_Temp_TL1;
TMOD |= 0x11;
ET0 = 1;
ET1 = 0;
PT0 = 0;
TR0 = 0;
TR1 = 0;
EA = 1;
void write_cmd(uchar cmd)//1602 lcd_rs=0; lcd_w=0;
用51单片机演奏音乐
单片机演奏音乐
一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率,也就是说不能象电子琴那样能奏出多种音色的声音。因此单片机奏乐只需弄清楚两个概念即可,也就是“音调”和“节拍”。音调表示一个音符唱多高的频率,节拍表示一个音符唱多长的时间。
在音乐中所谓“音调”,其实就是我们常说的“音高”。在音乐中常把五线谱中央C 上方的A 音定为标准音高,其频率f=440Hz。当两个声音信号的频率相差一倍时,也即f2=2f1时,则称f2比f1 高一个倍频程, 在音乐中1与.1(1前面的点应在1的上面),2与.2……正好相差一个倍频程,在音乐学中称它相差一个八度音。在一个八度音内,有12个半音。以1—i 八音区为例,12 个半音是:1—#1、#1—2、2—#2、#2—3、3—4、4—#4,#4—5、5 一#5、#5—6、6—#6、#6—7、7—i。其中“#”表示半音,用于升高或降低半个音。这12 个音阶的分度基本上是以对数关系来划分的。如果我们只要知道了这十二个音符的音高,也就是其基本音调的频率,我们就可根据倍频程的关系得到其他音符基本音调的频率。
知道了一个音符的频率后,常采用的方法就是通过一个延时程序,延时对应频率周期的二分之一周期(即t=1/2f)后,将单片机上连接蜂鸣器的I/O ()口来回取反,或者说来回清零,置位,从而让蜂鸣器发出声音,为了让单片机发出不同频率的声音,我们只需将不同的延时时间值t赋给延时程序即可实现。例:我门以440Hz 的声音频率来计算,其对应的时间t=1/2f=1/2*440=1136us 但在实际程序中常采用查表的方式来取的t值,而为了节约存储器空间则将t值以字节来进行存储,由于大部分t值都大于256。所以,需将t值除以一个常数(t/x)使其小于256。那么,在查表取得t 值后就要再乘上该常数后再赋给延时程序。
51单片机编码
51单片机编码
单片机编码技术是现代电子信息技术中的重要组成部分。作为微控制器的核心,单片机编码通过将输入的数据信息转换为特定的编码方式,实现各种功能和应用。本文将从基本概念、编码原理和应用实例等方面,详细介绍51单片机编码相关内容。
1. 51单片机编码的基本概念
51单片机编码是指使用8051系列单片机进行程序设计和编码的过程。它采用汇编语言或高级语言编写程序代码,并将其转化为机器码,通过单片机的指令集执行相应的操作。由于其成熟的硬件平台和丰富的软件资源,51单片机编码广泛应用于各种嵌入式系统、控制系统等领域。
2. 51单片机编码的原理
51单片机编码的原理主要包括指令集、寄存器、数据存储器、输入输出端口等组成部分。指令集是单片机内部存储的一组机器指令,通过不同的指令实现对数据的处理和控制。寄存器用于存储临时数据和程序状态等信息,提供给CPU进行运算和控制。数据存储器则用于存储程序代码和数据,包括内部RAM和外部ROM等。输入输出端口是单片机与外部设备进行交互的接口,通过读取输入端口的状态和向输出端口写入数据,实现与外部环境的通信。
3. 51单片机编码的应用实例
3.1 系统控制应用
51单片机编码广泛应用于各种系统控制应用中,如智能家居、工业自动化、交通信号控制等。通过编写相应的控制程序代码,将输入的传感器信号处理后,控制相关的执行机构进行动作。例如,通过读取温度传感器的数据,控制空调的开关和温度调节,实现智能环境控制。
3.2 嵌入式系统应用
嵌入式系统是指将计算能力嵌入到各种设备和系统中,实现特定功能的计算系统。51单片机编码在嵌入式系统中有广泛的应用,如智能手机、电视、汽车电子等。通过编写嵌入式软件程序,控制和管理功耗、资源调度、外设驱动等,实现嵌入式系统的各项功能。
51单片机djnz指令用法
51单片机djnz指令用法
1. 介绍
在51单片机中,djnz(Decrement and Jump if Not Zero)指令用于将一个寄存器的值减1,并检查结果是否为零。如果结果不为零,则跳转到指定的目标地址执行程序。
2. 指令格式
djnz 操作数,目标地址
3. 操作数
操作数可以是任意一个寄存器或者内部RAM的一个字节。
4. 目标地址
目标地址是一个16位的绝对地址,用于指定程序执行的下一条指令的位置。
5. 使用方法
首先,我们需要将需要进行减1操作的寄存器(或内部RAM字节)初始化为一个非零值。然后,在使用djnz指令之前,我们需要确定跳转目标地址。通常情况下,跳转目标地址是有条件地执行某段程序代码。
当djnz指令被执行时,它会将操作数所对应的值减1,并检查结果是否为零。如果结果不为零,则会跳转到目标地址处执行下一条指令;如果结果为零,则不会跳转,而是继续顺序执行下一条指令。
需要注意的是,在使用djnz指令之前,我们必须确保操作数所对应的值大于等于1。否则,当操作数为零时,djnz指令会导致一个无限循环。
6. 示例
下面是一个简单的示例程序,演示了如何使用djnz指令:
ORG 0000h ; 设置程序起始地址
MOV R0, #10h ; 将R0寄存器初始化为16
LOOP:
DJNZ R0, LOOP ; R0减1,并检查是否为零,如果不为零则跳转到LOOP处执行下一条指令
END ; 程序结束
在上述示例中,我们首先将R0寄存器初始化为16(10h),然后进入一个循环。
在循环中,我们使用djnz指令将R0的值减1,并检查是否为零。如果R0不为零,则跳转到LOOP处执行下一条指令;如果R0为零,则继续顺序执行下一条指令。这样就实现了一个简单的倒计时功能。
51单片机唱歌 C51音乐程序[整理]
51单片机唱歌 C51音乐程序[整理] 51单片机唱歌 C51音乐程序
,i nclude ,i nclude //本例采用89C52, 晶振为11.0592MHZ //关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.
//频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;
//所以拿出谱子, 试探编吧!
unsigned char n=0; //n为节拍常数变量 unsigned char code music_tab[] ={ 0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,
0x20, 0x40, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x10, 0x1C, 0x10, 0x18 , 0x40, 0x1C, 0x20, 0x20 , 0x20, 0x1C, 0x20, 0x18 , 0x20, 0x20, 0x80,
0xFF , 0x20,
0x30, 0x1C, 0x10 , 0x18,0x20, 0x15, 0x20 , 0x1C, 0x20, 0x20, 0x20 , 0x26, 0x40, 0x20, 0x20 , 0x2B, 0x20, 0x26, 0x20 , 0x20, 0x20, 0x30,
0x80 , 0xFF, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26,
0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x20, 0x1C , 0x10,
51单片机音乐编辑程序详解
#include<reg51.h>
#include<intrins.h>
#define uc unsigned char
#define ui unsigned int
uc a;
sbit speaker=P1^2;
ui code yinpin[]={ //音频的赫兹
0,0,0,0,0,0,0, //高两位单调个位表示节拍
63628,63835,64021,64103,64260,64400,64524,//低音
64680,64684,64777,64820,64898,64968,65030,//中音
65085,65110,65157,65178,65217,65252,65282,//高音
};
uc code yuema[]={//音乐的编码
001,001,001,001,
134,134,154,132,152,168,184,001,001,001,001,
164,164,182,162,162,182,199,197,
154,164,182,162,164,132,124,134,122,132,
154,164,184,192,162,169,167,001,001,001,
204,202,192,198,204,192,202,184,164,204,202,192,194,198,122,132, 114,112,162,164,164,
001,001,001,
156,152,132,152,162,186,156,152,132,152,182,166,
毕业设计论文:基于51单片机的音乐发生器设计
本文是应用MCS-51单片机原理和控制理论技术设计音乐发生器的硬件电路,并利用C语言进行软件开发和程序设计。通过控制单片机内部的定时器产生不同频率的方波,驱动喇叭发出不同音调的音乐,再利用延迟控制发音时间的长短。把乐谱转化成相应的定时常数,从而达到从发音设备中演奏出悦耳动听的音乐的效果。
该音乐盒主要由按键电路、复位电路、时钟电路以及蜂鸣器组成。使用两个按键控制音乐盒,一个用来切换歌曲,另一个用来切换8路LED的变化花样,本音乐盒共有两首歌曲,花样灯花样共计3种。播放歌曲时,蜂鸣器发出某个音调,与之对应的LED亮起。本设计利用KEIL编程软件对音乐盒源程序进行编程并调试,配合PROTEUS仿真软件对硬件进行仿真调试,节约了设计时间。
本系统采用C语言进行软件设计。正文中首先简单描述系统硬件工作原理,且附以系统硬件设计框图,论述了本次毕业设计所应用的各硬件接口技术和各个接口模块的功能及工作过程。其次阐述了程序的流程和实现过程。本文撰写的主导思想是软、硬件相结合,以硬件为基础,来进行各功能模块的编写。
关键词
单片机;音乐;C语言;STC89C51;KEIL;PROTEUS
Abstract
In this paper, The music generator and its hardware circuit is designed by MCS-51 single-chip microcomputer principle and control theory, and the Software development and programming are based on C language programming. According to control the MCU internal timer to produce different frequency Square wave to drive the horn sounds of different tones of music, then use the delay to control the length of time. The music Transformationed into the timing constants corresponding so that the sound equipment can play Melodious music.
基于C51单片机的MP3播放器设计
基于C51单片机的MP3播放器设计
一、引言
随着科技的不断发展,人们对音乐的需求也越来越高。MP3播放器作
为一种便携式的音乐播放设备,已经成为人们日常生活中不可缺少的一部分。本文将介绍一种基于C51单片机的MP3播放器设计。
二、硬件设计
1.主控芯片:选择C51单片机作为主控芯片,因为它具有较低的成本、较好的性能和广泛的应用。
2.存储器:通过串口与单片机连接一个外部闪存芯片作为存储设备,
用于存储MP3文件。闪存芯片的容量可以根据需求进行选择,一般选择
4GB以上的容量。
3.音频解码芯片:为了解码MP3文件并输出音频信号,需要选择一个
音频解码芯片。常用的音频解码芯片有VS10XX系列芯片,可以通过SPI
接口与单片机通信。
4.音频输出电路:为了使音频信号能够输出到扬声器或耳机上,需要
设计一个音频输出电路。这个电路一般包括运放、耳机插座等组件。
5.控制界面:为了方便用户对MP3播放器的控制,需要设计一个控制
界面。可以选择使用按键、旋钮、触摸屏等方式进行控制。
6.电源电路:为了给MP3播放器提供电源,需要设计一个电源电路。
可以选择使用直流电池或者USB供电。
三、软件设计
1.系统初始化:在系统启动时,需要进行一系列的初始化操作,包括
初始化串口、外部存储器、音频解码芯片等。
2.文件读取:通过串口从外部存储器读取MP3文件,并将其存储到内
存中。
3.解码与播放:将MP3文件解码,并通过音频解码芯片输出音频信号。可以通过SPI接口与音频解码芯片进行通信,控制解码过程和音频输出。
4.控制界面处理:根据用户的操作,通过控制界面进行相应的处理。
基于51单片机音乐播放器
SD卡的SPI通信接口使其可以通过SPI通道进行数据读写。从应用的角度来看,采用SPI接口的好处在于,很多单片机内部自带SPI控制器,不光给开发上带来方便,同时也见降低了开发成本。然而,它也有不好的地方,如失去了SD卡的性能优势,要解决这一问题,就要用SD方式,因为它提供更大的总线数据带宽。SPI接口的选用是在上电初始时向其写入第一个命令时进行的。
SPI方式驱动SD卡的方法:
1.命令传输与数据传输
SD卡自身有完备的命令系统,以实现各项操作。命令格式如下:
命令的传输过程采用发送应答机制,过程如下:
每一个命令都有自己命令应答格式。在SPI模式中定义了三种应答格式
2.初始化
3.读取CID
4.读取CSD
5.扇区读
6.扇区写
4.功率放大器TDA2822
7.文件系统…………………………………………5
三、总体设计………………………………………………5
1.设计整体框图………………………………………5
2.程序流程图…………………………………………6
3.SD模块………………………………………………7
4.功率放大部分………………………………………10
四、电路调试与完成情况……………………………11
(二)、MP3解码芯片
方案一、采用常用的MP3解码芯片VS1003
基于51单片机音乐播放器设计
基于51单片机音乐播放器设计
音乐播放器是一种可以播放音频文件的设备,广泛应用于日常生活中。本文将基于51单片机设计一个简单的音乐播放器。
一、设计目标
本音乐播放器设计的主要目标是实现以下功能:
1.支持播放多种格式的音频文件,如MP3、WAV等;
2.支持音量调节和音频文件选择功能;
3.具备简单的界面和易于理解的操作方式;
4.能够适应不同的音频文件大小和音乐时长。
二、硬件设计
2. 存储器:选择外接Flash存储器作为音频文件的存放介质,具备
较大的存储容量和较高的读写速度,能够满足音频文件的多样性需求。
3.音频解码芯片:选择支持MP3和WAV格式音频解码的芯片,能够将
音频文件翻译成能够被音频输出部分播放的信号。
4.音频输出部分:选择合适的音频输出部分,如耳机接口或喇叭接口,将解码后的音频信号输出为声音。
三、软件设计
1.系统初始化:在开机时进行系统初始化,包括对主控芯片、存储器
和音频解码芯片的初始化。
2.文件系统管理:设计一个简单的文件系统,能够以目录结构的形式
管理存储器中的音频文件。
3.音频解码:根据选择的音频文件格式,进行相应的解码操作,将解
码后的音频数据传输给音频输出部分。
4.播放控制:实现音量调节和音频文件选择功能,能够暂停、播放、
停止等操作。
5.用户界面:设计一个简单直观的用户界面,通过按键或显示屏等方
式进行操作反馈和信息显示。
四、系统流程
1.开机初始化:对主控芯片、存储器和音频解码芯片进行初始化。
2.文件系统管理:读取存储器中的文件目录,生成文件列表供用户选择。
3.用户操作:用户通过按键或其他方式进行音量调节和音频文件选择
51单片机汇编语言音乐程序
51单片机汇编语言音乐程序
51单片机汇编语言音乐程序 01两只老虎
NEXT BIT 10H 定义标志位
ORG 0000H
JMP MAIN
ORG 000BH
JMP TONE
ORG 001BH
JMP BEAT
ORG 0100H
MAIN MOV TMOD11H
MOV TH0R2
MOV TL0R3
MOV TH13CH
MOV TL10B0H
MOV R400H
MOV DPTRTAB
YD MOV AR4 取音调数据
MOVC AADPTR
MOV R2A
XRL A00H
JNZ JP 直接取节拍
CALL PD 判断指针是否溢出 MOV AR4
MOVC AADPTR
MOV R3A
XRL A0FFH
JZ JP
MOV AR2
XRL A0FFH
JNZ MAIN
JP INC R4 取节拍数据
CALL PD
MOV AR4
MOVC AADPTR
MOV R5A
SETB EA
SETB ET0
SETB ET1
SETB TR0
SETB TR1
SETB NEXT
JB NEXT
INC R4
CALL PD
JMP YD
CJNE A00HL1
INC DPH
L1 RET
音调产生子程序
TONE CPL P20
MOV TH0R2
MOV TL0R3
RETI
节拍产生子程序
BEAT DJNZ R5L2
MOV TH13CH
MOV TL10B0H
L3 RETI
L2 CLR TR0
CLR TR1
CLR NEXT
JMP L3
两只老虎音符表
TAB DB 0FBH0F9H08H0FCH066H08H0FCH0C7H08H0FBH0F9H08H DB 0FBH0F9H08H0FCH066H08H0FCH0C7H08H0FBH0F9H08H DB 0FCH0C7H08H0FCH0F3H08H0FDH4AH10H0FCH0C7H08H DB 0FCH0F3H08H0FDH4AH08H0FDH4AH04H0FDH95H04H
基于51单片机的可变调音乐演奏系统
0 C 在 T 0中置 4 H。图 2 模 拟钢 琴 键 盘 , 面 的 F H, L 4 是 上 数 字标 号 与表 1 的数 字 标号 是 对应 的 。 率及 计数 器 初 频 值 见表 1 。
速度 、 声音的频率及节拍, 然后根据所 查的结果到相对
应 的存储 器 中取 出这些 常 数 送入 定 时器 。 因为 C D 等各 调 之 间是 移 位 的关 系 ,即 C调 的 2 、
在程序 中, 这样 1 拍应该延时八次, / 4 如此类推。 例如一
个 音调 的节 拍是 3 / ,那 么 它 就 是 1 2 的 2 关 4拍 / . 3拍 4倍 系 , 可 以在表 中存 入 1H, 就 8 以供 以后 查询 延 时常 数 。 各
图 1硬 件 设计
收 稿 1 期 :2 0 一 1 8 5 t 0 8 l— 2
乐谱 中每 一 个音 符 都 与某 一个特 定 的频 率 相对 应 。 单 片 机音 乐 演奏 控 制通 过 控 制 内部 定 时器 T 0来 产生 不
同频 率 的方 波 , 而 驱动 喇 叭 发 出不 同音 符 的声 音 。发 从
下面给 出一个音符的频率是如何转换成 定时常数
的 。C调 中音 1 应 的 频 率 是 53 z那 么 其 半 周期 就 对 2H , 是 T2 l f9 6 ,单 片机 定 时器 1 方 式 1 以定 时 /=/ = 5 2 1 D 可 65 6. ,需要 在 T 53 / t s 0中预 置 数 为 6 5 6 94 6 5 0转 5 3— 5= 4 8 ,
单片机蜂鸣器音乐代码
单片机蜂鸣器音乐代码
在单片机的应用中,蜂鸣器是一个常用的音频输出设备。它可以通
过产生不同频率的声音来实现音乐播放、提醒和警报等功能。本文
将介绍如何使用单片机控制蜂鸣器播放音乐,并提供一个简单的音
乐代码示例。
首先,让我们了解一下单片机蜂鸣器的工作原理。蜂鸣器实际上是
一个压电陶瓷元件,当电压作用于其上时,它会振动产生声音。为
了产生不同的音调,我们需要控制蜂鸣器的频率和占空比。
单片机通过IO口与蜂鸣器连接,并使用定时器来产生所需的频率。具体的代码实现将依赖于使用的单片机型号和开发环境。在这里,
我们将以C语言为例,并基于51单片机进行说明。
以下是一个简单的单片机蜂鸣器音乐代码示例,演奏的是《欢乐颂》的前几个音符:
```c
#include <reg52.h>
// 定义各个音符的频率
#define C4 4778
#define D4 4257
#define E4 3792
#define F4 3579
#define G4 3189
#define A4 2841
#define B4 2531
#define C5 2388
// 延时函数
void delay(unsigned int count)
{
while(count--);
}
// 发声函数
void beep(unsigned int frequency, unsigned int duration) {
unsigned int i;
unsigned long time;
time = 11059200 / frequency; time >>= 1;
毕业设计论文:基于51单片机的音乐发生器设计
本文是应用MCS-51单片机原理和控制理论技术设计音乐发生器的硬件电路,并利用C语言进行软件开发和程序设计。通过控制单片机内部的定时器产生不同频率的方波,驱动喇叭发出不同音调的音乐,再利用延迟控制发音时间的长短。把乐谱转化成相应的定时常数,从而达到从发音设备中演奏出悦耳动听的音乐的效果。
该音乐盒主要由按键电路、复位电路、时钟电路以及蜂鸣器组成。使用两个按键控制音乐盒,一个用来切换歌曲,另一个用来切换8路LED的变化花样,本音乐盒共有两首歌曲,花样灯花样共计3种。播放歌曲时,蜂鸣器发出某个音调,与之对应的LED亮起。本设计利用KEIL编程软件对音乐盒源程序进行编程并调试,配合PROTEUS仿真软件对硬件进行仿真调试,节约了设计时间。
本系统采用C语言进行软件设计。正文中首先简单描述系统硬件工作原理,且附以系统硬件设计框图,论述了本次毕业设计所应用的各硬件接口技术和各个接口模块的功能及工作过程。其次阐述了程序的流程和实现过程。本文撰写的主导思想是软、硬件相结合,以硬件为基础,来进行各功能模块的编写。
关键词
单片机;音乐;C语言;STC89C51;KEIL;PROTEUS
Abstract
In this paper, The music generator and its hardware circuit is designed by MCS-51 single-chip microcomputer principle and control theory, and the Software development and programming are based on C language programming. According to control the MCU internal timer to produce different frequency Square wave to drive the horn sounds of different tones of music, then use the delay to control the length of time. The music Transformationed into the timing constants corresponding so that the sound equipment can play Melodious music.
51单片机code的用法
51单片机code的用法
【原创版】
目录
1.51 单片机简介
2.51 单片机中的 code 用法
3.code 用法的具体示例
4.如何编写 51 单片机的 code
5.总结
正文
51 单片机是一种常见的微控制器,广泛应用于各种嵌入式系统中。它的编程语言通常为 C 语言,使用 code 命令可以方便地编写和修改程序。
在 51 单片机中,code 用法主要有两种。第一种是用于定义特殊功能位。例如,我们可以使用 sbit 来定义 P2 口的第三位为 smgen。在程序中,我们可以用 smegen 代替 P2 口的第三位,并对其进行操作。第二种用法是用于定义寄存器组选择位。例如,我们可以使用 psw.4 和psw.3 来选择不同的寄存器组。
code 用法的具体示例如下。首先,我们可以使用 code 定义一个特殊功能位,例如:
```
sbit smgen = P2^3;
```
接着,我们可以在程序中对 smgen 进行操作,例如:
```
smgen = 0; // 将 smgen 置为 0
```
此外,我们还可以使用 code 定义寄存器组选择位,例如:
```
#define RS1 PSW.4
#define RS0 PSW.3
```
在编写 51 单片机的 code 时,我们需要注意以下几点。首先,我们需要确保 code 的使用符合语法规范。其次,我们需要根据实际需求来选择合适的 code 用法。最后,我们需要在编写 code 时考虑到代码的可读性和可维护性。
总之,51 单片机的 code 用法为我们提供了一种方便的编程方式,使得我们可以更加高效地编写和修改程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
音符=2^n
十位表示音符的演奏效果(0-2): 0-普通,1-连音,2-顿音
百位是符点位: 0-无符点,1-有符点
调用演奏子程序的格式
Play(乐曲名,调号,升降八度,演奏速度);
|乐曲名
: 要播放的乐曲指针,结尾以(0,0)结束;
|调号(0-11)
: 是指乐曲升多少个半音演奏;
|升降八度(1-3) : 1:降八度, 2:不升不降, 3:升八度;
File Name: Author: Created: Modified:
SoundPlay.h Jiang Jian Jun 2005/5/16 NO
Revision:
1.0
******************************************************************************* /
{
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;
// 读出第一个音符和它时时值
LDiv0 = 12000/Speed;
// 算出 1 分音符的长度(几个 10ms)
LDiv4 = LDiv0/4;
// 算出 4 分音符的长度
LDiv4 = LDiv4-LDiv4*SOUND_SPACE; // 普通音最长间隔标准
TR0 = 0;
TR1 = 1;
while(Point < SoundLength)
/*说明
************************************************************************** 曲谱存贮格式 unsigned char code MusicName{音高,音长,音高,音长...., 0,0}; 末尾:0,0 表
示结束(Important)
方法 1 代码: //51 单片机播放音乐库文件
/**************************************************************************
SOUND PLAY FOR 51MCU
COPYRIGHT (c) 2005 BY JJJ. -- ALL RIGHTS RESERVED --
TH0 = Sound_Temp_TH0; TL0 = Sound_Temp_TL0 + 12; //加 12 是对中断延时的补偿
}
SLen=LengthTab[Length%10]; //算出是几分音符
XG=Length/10%10;
//算出音符类型(0 普通 1 连音 2 顿音)
FD=Length/100;
#include <REG51.H>
//**************************************************************************
#define SYSTEM_OSC #define SOUND_SPACE 隔 sbit BeepIO =
11059200//12000000 //定义晶振频率 12000000HZ
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;
TH1 = Sound_Temp_TH1;
TL1 = Sound_Temp_TL1;
TF1=0;
}
}
if(LDiv2!=0)
{
TR0=0; BeepIO=1;
for(i=LDiv2;i>0;i--) //音符间的间隔
{
while(TF1==0);
TH1 = Sound_Temp_TH1;
TL1 = Sound_Temp_TL1;
音高由三位数字组成: 个位是表示 1~7 这七个音符 十位是表示音符所在的音区:1-低音,2-中音,3-高音; 百位表示这个音符是否要升半音: 0-不升,1-升半音。
音长最多由三位数字组成:
个位表示音符的时值,其对应关系是:
|数值(n): |0 |1 |2 |3 | 4 | 5 | 6
|几分音符: |1 |2 |4 |8 |16 |32 |64
|演奏速度(1-12000): 值越大速度越快;
***************************************************************************/ #ifndef __SOUNDPLAY_H_REVISION_FIRST__ #define __SOUNDPLAY_H_REVISION_FIRST__
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; //音长定时器初值暂存
4/5
//定义普通音符演奏的长度分率,//每 4 分音符间
P2^3;
//定义输出管脚
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 在频率表中的位置
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 if(Octachord == 3) NewFreTab[i]<<=2;
}
SoundLength = 0; while(Sound[SoundLength] != 0x00) {
SoundLength+=2; }
//计算歌曲长度
Point = 0; Tone = Sound[Point]; Length = Sound[Point+1];
表 4.4 简谱对应的简谱码、T 值、节拍数
简谱 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5
发音 低音 SO 低音 LA 低音 TI 中音 DO 中音 RE 中音 MI 中音 FA 中音 SO 中音 LA 中音 TI 高音 DO 高音 RE 高音 MI 高音 FA 高音 SO
简谱码 1 2 3 4 5 6 7 8 9 A B C D E F
2拍 2 又 1/2 拍
3拍 3 又 3/4 拍
总结:
通过两种方法仿真比较,这两种方法各有优劣,方法 1 用 Music encode 编码简单不需要对 简谱有深入了解但蜂鸣器发音不理想,用方法 2 编码需要看懂简谱及要知道各音调节拍所对 应的编码号但蜂鸣器比较动听,柔和(后面附有两种方法的仿真代码和原理图) (想要 Music encode 软件的朋友可以留下邮箱,我发给你们,网上也有的)
{
BeepIO = !BeepIO;
TH0 = Sound_Temp_TH0;
TL0 = Sound_Temp_TL0;
}
//**************************************************************************
void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed)
音高由三位数字组成: 个位是表示 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-有符点
2 方法:编码为十六进制(高四位表示音调编码,低四位表示节拍编码)
(各音调频率及初值计算定时器初值网上有,在此不叙说)
do re mi fa so la si 分别编码为 1~7,重音 do 编为 8,重音 re 编为 9,停顿编为 0。 如 0x24,表示低音 LA、1 拍。以此类推
TF1=0;
}
}
Point+=2;
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);
//低音
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;
T值 64260 64400 64524 64580 64684 64777 64820 64898 64968 65030 65058 65110 65157 65178 65217
节拍码 1 2 3 4 5 6 8 A C F
节拍数 1/4 拍 2/4 拍 3/4 拍
1拍 1 又 1/4 拍 1 又 1/2 拍
// 计算 TL1 应装入的初值 // 计算 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 //音符发生中断
//**************************************************************************
void InitialSound(void)
{
BeepIO = 1; Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256; (10ms 的初装值) Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256; 值
{
SL=Tone%10;
//计算出音符
SM=Tone/10%10;
//计算出高低音
SH=Tone/100;
//计算出是否升半
CurrentFre = NewFreTab[SignTab[SL-1]+SH]; //查出对应音符的频率
if(SL!=0)
{ 器初值
ifБайду номын сангаас(SM==1) CurrentFre >>= 2;
基于 51 单片机的两种音乐编码方法的比较及用法
(建议对这方面有兴趣的朋友们要先看懂了解音乐简谱,包括高音、中音、低音, 节拍、延时,及各个音调的频率,网上有很多资料)
1 方法:用 51 单片机音乐编码器软件(Music encode)
输出十六进制数表示:
曲谱存贮格式 unsigned char code MusicName{音高,音长,音高,音长...., 0,0}; 末 尾:0,0 表示结束(Important) (其实软件“关于”里的源代码有使用方法的介绍)