0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用单片机编写的音乐程序

Wildesbeast 来源:福星电子网 作者:福星电子网 2020-01-21 12:18 次阅读

使用单片机编写的音乐程序


6=440Hz,#6=440*1.059463=466.2Hz,7=440*1.059463*1.059463=493.9Hz

#5=440÷1.059463=415.3Hz

5=440÷1.059463÷1.059463=392Hz

相邻半音阶的关系为1.059463倍,只要知道“A”=440Hz,即可算出其余半音阶的频率,比A高的用“*”,比A低的用“÷”

1.059463=12√2(即2开12次根)

440Hz为钢琴中央C组的A(即“6”音)

ok

这是本人一个产品中的音乐单元,很完整,供爱好者参考。

ORG 0000H

AJMP CSH 主程序进入点

ORG 000BH

LJMP TIM0 定时中断T0入口

;

;**********

;* 初始化 *

;**********

;

ORG 0020H

CSH: MOV R0,#7FH 内部RAM(00H~7FH)清零

CSH1: MOV @R0,#00H

DJNZ R0,CSH1

MOV SP,#60H 堆栈60H~7FH,【使用89C51】

MOV TMOD,#01H TMOD=11H,T0作16位计数器(4M晶振)

CLR TCON.4 T0禁止动作

SETB IE.1 T0允许中断

SETB PT0 T0中断优先

SETB IE.7 系统允许中断

;

;**********

;* 主程序 *

;**********

;

MAIN: MOV 5CH,#00 取简码谱指针

LCALL MUSIC

MOV 5CH,#49 取简码谱指针

LCALL MUSIC

MOV 5CH,#66 取简码谱指针

LCALL MUSIC

MOV 5CH,#100 取简码谱指针

LCALL MUSIC

MOV 5CH,#108 取简码谱指针

LCALL MUSIC

MOV 5CH,#136 取简码谱指针

LCALL MUSIC

MOV 5CH,#174 取简码谱指针

LCALL MUSIC

AJMP MAIN

;

;*************************

;* 音乐子程序 MUSIC *

;* 入口: 5CH←简码谱指针 *

;*************************

;

MUSIC: MOV A,5CH 简码谱指针装入A

MOV DPTR,#TABLE 至TABLE取简码

MOVC A,@A+DPTR

MOV R2,A 取到的简码暂存于R2

JZ END1 是否取到00(结束码)?

ANL A,#0FH 不是,则取低四位(节拍码)

MOV R6,A 将节拍码存入R6

MOV A,R2 将取到的简码再装入R2

SWAP A 高低四位交换

ANL A,#0FH 取低四位(音符码)

JNZ SING 取到的音符码是否为0?

CLR TR0 是,则不发音

AJMP D1 跳到D1

;

SING: DEC A 取到的音符码减1

MOV 4BH,A 存入(4BH)

RL A 乘2

MOV DPTR,#TABLE1 至TABLE1取相对的高字节计数值

MOVC A,@A+DPTR

MOV TH0,A 取到的高字节存入TH0

MOV 4AH,A 取到的高字节存入(4AH)

MOV A,4BH 再装入取到的音符码

RL A 乘2

INC A 加1

MOVC A,@A+DPTR 至TABLE1取相对的低位

MOV TL0,A 取到的低字节存入TL0

MOV 49H,A 取到的低字节存入(49H)

SETB TR0 启动TIMER0

D1: CALL DELAY 基本单位时间1/4拍187毫秒

INC 5CH 取简码谱指针加1

AJMP MUSIC 取下一个码

DD1: RET

;

STOP: NOP

; JB P3.7,STOP1 在软件延时中掺插做其他动作

; SETB P2.7 P2.7←“1”

NOP

NOP

STOP0: NOP

RET

STOP1: NOP

; JB P3.6,STOP0 在软件延时中掺插做其他动作

; SETB P2.6 P2.6←“1”

RET

;

END1: CLR TR0 停止TIMER0

RET

;

TIM0: PUSH A 将A的值暂存于堆栈区

PUSH PSW 将PSW的值暂存于堆栈区

MOV TL0,49H 重设计数值

MOV TH0,4AH

CPL P1.7 将输出端P1.1取反(P1.7接至无源蜂鸣器)

POP PSW 至堆栈区取回PSW的值

POP A 至堆栈区取回A的值

RETI 返回主程序

;

DELAY: MOV R7,#02 187毫秒

D2: MOV R4,#24

D3: MOV R3,#48

DJNZ R3,$

ACALL STOP 在软件延时中掺插做其他动作

DJNZ R4,D3

DJNZ R7,D2

DJNZ R6,DELAY 决定节拍

RET

; .5 .6 .7 1

TABLE1: DW 65111,65150,65199,65217 4M晶振时的定时中断时间常数

; 2 3 4 5 若采用其它频率,则要根据乐音的

DW 65252,65283,65297,65323 频率计算,例中央C的A音为440Hz,

; 6 7 1` 2` 440Hz=2.273ms,把T0设置为2.273ms

DW 65347,65367,65377,65394 中断即可发出A音。

; 3` 4` #6

DW 65410,65417,65357

;

;***************************************************************

;* 音符代码 1 2 3 4 5 6 7 8 9 A B C D E F 0 *

;* 音高 .5 .6 .7 1 2 3 4 5 6 7 1` 2` 3` 4` 5` 休止 *

;*-------------------------------------------------------------*

;* 节拍代码 1 2 3 4 5 6 8 A C F *

;* 节拍 1/4 2/4 3/4 1 1(1/4) 1(1/2) 2 2(1/2) 3 3(3/4) *

;*-------------------------------------------------------------*

;* 结束代码 00H *

;*-------------------------------------------------------------*

;* 乐谱格式 每字节的高字节为音符代码,低字节为节拍代码 *

;*-------------------------------------------------------------*

;* 例子: ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ *

;* DB A4H,02H,84H,02H,A4H,02H,84H,02H,D8H,04H,00H *

;* ⑴ A→唱“7” , 4→ 1 拍 *

;* ⑵ 0→休止 , 2→2/4拍 *

;* ⑶ 8→唱“5” , 4→ 1 拍 *

;* ⑷ 0→休止 , 2→2/4拍 *

;* ⑸ A→唱“7” , 4→ 1 拍 *

;* ⑹ 0→休止 , 2→2/4拍 *

;* ⑺ 8→唱“5” , 4→ 1 拍 *

;* ⑻ 0→休止 , 2→2/4拍 *

;* ⑼ D→唱“3`”, 8→ 2 拍 *

;* ⑽ 0→休止 , 4→ 1 拍 *

;* ⑾ 00H→乐曲结束 *

;***************************************************************

;

TABLE:

;【00】

DB 98H,02H,B4H,01H,94H,01H,68H,02H,94H,01H

DB 64H,01H,48H,02H,64H,01H,44H,01H,28H,02H

DB 64H,01H,94H,01H,B4H,01H,94H,01H,B4H,01H

DB 94H,01H,B4H,01H,D4H,01H,94H,01H,64H,01H

DB 44H,01H,64H,01H,98H,02H,01H,01H,00H

;【49】

DB A4H,02H,84H,02H,A4H,02H,84H,02H,D8H,04H

DB C8H,01H,01H,01H,01H,01H,00H

;【66】

DB 42H,52H,62H,72H,82H,92H,A2H,B2H,42H,52H

DB 62H,72H,82H,92H,A2H,B2H,00H

;【100】

DB 61H,81H,B1H,D1H,B1H,81H,61H,00H

;【108】

DB 11H,41H,61H,81H,61H,41H,11H,00H

;【136】

DB 24H,04H,34H,04H,44H,04H,54H,04H,64H,04H,44H,04H,64H,04H,94H,04H

DB 83H,01H,93H,01H,83H,01H,63H,01H,46H,02H,66H,02H

DB 91H,21H,91H,21H,91H,21H,91H,21H,94H,00H

;【174】

DB 94H,04H,A4H,04H,B4H,04H,C4H,04H,D4H,04H

DB B4H,04H,D8H,08H,C4H,04H,F4H,04H,CCH,00H

;

END
责任编辑 LK

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6032

    文章

    44513

    浏览量

    632706
  • 程序
    +关注

    关注

    116

    文章

    3773

    浏览量

    80830
收藏 人收藏

    评论

    相关推荐

    单片机编程语言有哪些选择

    单片机(Microcontroller Unit,MCU)编程是指为单片机编写程序的过程,这些程序控制单片机的行为和功能。单片机广泛应用于嵌
    的头像 发表于 11-01 14:13 317次阅读

    基于51单片机的遥控音乐系统仿真

    ”,表示播放,按下接收器的停止按键后停止播放音乐;(4)按下复位按键后回到初始状态。仿真演示视频:基于51单片机的遥控音乐系统仿真-仿真视频设计介绍51单片机简介51
    的头像 发表于 10-22 14:12 115次阅读
    基于51<b class='flag-5'>单片机</b>的遥控<b class='flag-5'>音乐</b>系统仿真

    单片机怎么写入程序

    程序通常涉及以下几个步骤: 选择单片机和开发环境 : 确定项目需求,选择合适的单片机型号。 安装相应的开发环境,如Keil、IAR、MPLAB等。 硬件连接 : 将单片机连接到开发板或
    的头像 发表于 10-21 11:21 254次阅读

    keil可以读出单片机程序

    表述存在一定的误解,因为Keil主要是用于编写、编译和调试单片机程序的工具,而不是直接从单片机中读取已编程代码的工具。 一、Keil的主要功能 编程开发 :Keil允许用户使用C语言或
    的头像 发表于 09-02 10:32 666次阅读

    单片机烧录程序用什么软件

    单片机烧录程序单片机开发过程中的一个重要环节,涉及到将编写好的程序代码通过烧录器写入单片机的R
    的头像 发表于 09-02 10:05 851次阅读

    单片机烧录程序可以重新烧吗

    单片机(Microcontroller Unit, MCU)是一种集成电路芯片,它将计算机的CPU、存储器、输入/输出接口等集成在一块芯片上,用于控制各种电子设备。单片机烧录程序是指将编写
    的头像 发表于 09-02 10:04 876次阅读

    单片机烧录程序的线比单片机上的少还能烧录吗

    单片机烧录原理 单片机烧录是指将编写好的程序代码通过一定的方式传输到单片机的存储器中,使其能够按照程序
    的头像 发表于 09-02 09:54 403次阅读

    单片机烧录程序的基本步骤是什么

    单片机烧录程序单片机开发过程中非常重要的一步,它涉及到将编写好的程序代码通过一定的方式传输到单片机
    的头像 发表于 09-02 09:47 765次阅读

    蓝牙模块如何实现单片机和手机端数据互传

    ZX-D30、ZX-D37、ZX-D32等。 蓝牙模块设置 : 将蓝牙模块与单片机连接。通常,蓝牙模块通过串口(UART)与单片机通信。 设置蓝牙模块的工作模式和参数,例如波特率、名称、停止位、数据位等。这通常通过发送特定的AT命令来完成。
    的头像 发表于 07-24 17:59 2118次阅读
    蓝牙模块如何实现<b class='flag-5'>单片机</b>和手机端数据互传

    基于51单片机矩阵键盘音乐电子琴电路图proteus仿真及程序

    本资源内容概要:       这是基于51单片机矩阵键盘音乐电子琴电路图proteus仿真及程序设计包含了电路图源文件(Altiumdesigner软件打开)、C语言程序源代码(kei
    发表于 06-21 14:32 1次下载

    基于51单片机8路抢答器电路图proteus仿真及程序

    本资源内容概要:       这是基于51单片机8路抢答器电路图proteus仿真及程序设计包含了电路图源文件(Altiumdesigner软件打开)、C语言程序源代码(keil软件打开
    发表于 06-19 14:15 1次下载

    单片机编程实例介绍

    是指使用特定的编程语言编写控制单片机工作的程序。 在本文中,将为您提供一些常见的单片机编程实例,包括基础应用、传感器应用、通信应用等方面的案例。 一、基础应用 LED流水灯 流水灯是最
    的头像 发表于 01-16 09:37 2549次阅读

    单片机代码自动生成器程序

    和输入/输出设备的芯片。它通常用于嵌入式系统中,能够完成一系列特定的任务。开发人员编写单片机代码负责指导单片机执行相应的任务。然而,编写单片机
    的头像 发表于 01-08 14:12 2889次阅读

    keil5mdk怎么编写51单片机程序

    编写51单片机程序需要以下步骤: 编写程序框架:首先,你需要定义程序所需要的变量和常量,以及设置中断向量和寄存器的初始状态。这些信息可以根据
    的头像 发表于 12-25 14:54 1439次阅读

    pic单片机汇编程序实例

    以下是一个简单的PIC单片机汇编程序示例,这个程序将实现一个LED闪烁的功能。 首先,我们需要了解PIC单片机的结构和指令集。PIC单片机
    的头像 发表于 12-14 11:01 1772次阅读