51单片机演奏乐曲的程序

发布者:VelvetWhisper最新更新时间:2018-05-08 来源: eefocus关键字:51单片机  演奏乐曲 手机看文章 扫描二维码
随时随地手机看文章

sbit SPK = P1^7                      ;指定扬声器接口

        ORG 0000H
        LJMP START
        ORG 000BH
        LJMP T0_INT
        ORG 001BH
        LJMP T1_INT
;------------------------------------------------------------
B_ZQ_TAB:                            ;定时半周期初始值数据表(数据的意义可见前一篇博文)

    DW 63625, 63833, 64019, 64104, 64260, 64400, 64524 ;低音区:1 2 3 4 5 6 7
    DW 64580, 64685, 64778, 64820, 64898, 64968, 65030 ;中音区:1 2 3 4 5 6 7
    DW 65058, 65110, 65157, 65178, 65218, 65252, 65283 ;高音区:1 2 3 4 5 6 7
    DW 65297                                           ;超高音:1
;------------------------------------------------------------
MUSIC_TAB:                           ;自定义乐曲数据表
;一个音符有三个数字, 分别是音名、音区和时长(以1/8拍为单位)

        DB 3, 1, 8     ;3, 中音, 8个1/8拍
        DB 5, 1, 6     ;5, 中音, 6个1/8拍
        DB 6, 1, 2     ;6, 中音, 2个1/8拍

        DB 1, 2, 6     ;1, 高音, 6个1/8拍
        DB 2, 2, 2     ;2, 高音, 2个1/8拍
        DB 6, 1, 2     ;6, 中音, 2个1/8拍
        DB 1, 2, 2     ;1, 高音, 2个1/8拍
        DB 5, 1, 4     ;5, 中音, 4个1/8拍

        DB 5, 2, 6 
        DB 1, 3, 2     ;1, 超高, 2个1/8拍
        DB 6, 2, 2 
        DB 5, 2, 2
        DB 3, 2, 2 
        DB 5, 2, 2 
        DB 2, 2, 8

        DB 0, 0, 8     ;休止,    8个1/8拍
;------------------------------------------
        DB 5, 1, 8
        DB 3, 1, 4 
        DB 5, 1, 4 
        DB 1, 2, 16    ;1, 高音, 16个1/8拍
        DB 6, 1, 8     ;6, 中音, 8个1/8拍
        DB 1, 2, 4     ;1, 高音, 4个1/8拍
        DB 6, 1, 4     ;6, 中音, 4个1/8拍
        DB 5, 1, 16    ;5, 中音, 16个1/8拍

        DB 0, 0, 8     ;休止,    8个1/8拍

        DB 0, 0, 0     ;乐曲结束标记
;============================================================
START:
        MOV   TMOD, #11H         ;T1, T0皆为定时方式1
        MOV   TL1, #(65536-1000) MOD 256
        MOV   TH1, #(65536-1000) / 256   ;1ms@12MHz
        SETB TR1
        MOV   IE, #10001010B
        MOV   IP, #00000010B
        MOV   42H, #200          ;以200ms,为1/8拍
        MOV   DPTR, #MUSIC_TAB
;-------------------下面是从自定义乐曲数据表中读取三个字节
M_LOOP:
        CLR   A
        MOVC A, @A+DPTR
        MOV   R2, A
        INC   DPTR
        CLR   A
        MOVC A, @A+DPTR
        MOV   B, A
        INC   DPTR
        CLR   A
        MOVC A, @A+DPTR
        JZ    START
;-------------------下面是根据前两个字节,在半周期初值表中找
        MOV   R3, A
        INC   DPTR
        MOV   44H, DPL
        MOV   45H, DPH
        MOV   A, #7
        MUL   AB
        ADD   A, R2
        JZ    JI_SHI
        DEC   A
        ADD   A, ACC
        MOV   R2, A
        MOV   DPTR, #B_ZQ_TAB
        MOVC A, @A+DPTR
        MOV   TH0, A
        MOV   41H, A
        MOV   A, R2
        INC   A
        MOVC A, @A+DPTR
        MOV   TL0, A
        MOV   40H, A
        SETB TR0
JI_SHI:
        MOV   42H, #100
        MOV   43H, #0
        MOV   A, R3             ;用第三个字节控制时长
        CJNE A, 43H, $
        CLR   TR0
        SETB SPK
        MOV   DPL, 44H
        MOV   DPH, 45H
        SJMP M_LOOP
;------------------------------------------------------------
T0_INT:
        MOV   TL0, 40H
        MOV   TH0, 41H
        CPL   SPK
        RETI
;------------------------------------------------------------
T1_INT:
        MOV   TL1, #(65536-1000) MOD 256
        MOV   TH1, #(65536-1000) / 256   ;1ms@12MHz
        DJNZ 42H, T1_END
        MOV   42H, #200         ;此数值越大,节奏越慢
        INC   43H               ;43H单元每隔200ms,加一次一
T1_END:
        RETI
;============================================================


关键字:51单片机  演奏乐曲 引用地址:51单片机演奏乐曲的程序

上一篇:如何正确计算多重循环延时程序的延时时间
下一篇:MCS-51单片机中断测试系统设计

推荐阅读最新更新时间:2024-03-16 16:02

51单片机IO口模拟串口通讯6
/*************************************************************** *模拟接收程序,这个程序的作用从模拟串口接收数据,然后将这些数据发送到实际串口 *在单片机上模拟了一个串口,使用P3.2作为发送和接收端 *以P3.2模拟串口接收端,从模拟串口接收数据发至串口 *本程序来源于《单片机IO口模拟串口程序(发送+接收)》 *硬件环境:11.0592MHz, RXD P3.2 ***************************************************************/ #include reg51.h #include stdio.h
[单片机]
51单片机 HC05蓝牙模块学习
一、注意事项 1、烧写程序时,要把蓝牙tx,rx信号线拔掉,对烧写程序有影响。 2、执行HC05集命令时,均以rn结尾。串口中断若选择“发送新行”时,不用添加rn。原理相同。 二、准备软硬件 1、硬件:单片机STC89C52RC开发板,蓝牙模块HC05 2、软件:串口工具SSCOM3.3,手机蓝牙客户端 三、蓝牙模块HC05端口定义(6引脚) state——蓝牙连接状态,未连接输出低,连接后输出高 TX——信号发 RX——信号收 GND——地 +5V EN——使能端,需要进入AT模式时接3.3V,接单片机i/o引脚即可,高电平 四、进入AT模式进行参数和状态的设置 两种工作模
[单片机]
MCS-51单片机的中央处理器CPU介绍
MCS-51单片机的中央处理器CPU由运算器和控制逻辑构成,其中包括若干特殊功能寄存器(SFR)。 一、以ALU为中心的运算器 算术逻辑单元ALU能对数据进行加、减、乘、除等算术运算;“与”、“或”、“异或”等逻辑运算以及位操作运算。 PSW的格式如图1-3所示,其各位的含义是: 图1-3 PSW的格式 CY:进位标志。有进位/借位时CY=1,否则CY=0; AC:半进位标志。当D3位向D4位产生进位/借位时AC=1,常用于十进制调整运算中; F0:用户可设定的标志位,可置位/复位,也可供测试。 RS1、RS0:四个通用寄存器组的选择位,该两位的四种组合状态用来选择0~3寄存器组。见表1-2。 OV:
[单片机]
MCS-<font color='red'>51单片机</font>的中央处理器CPU介绍
51单片机IO口模拟串口通讯1-延时法
最近因工作需要,研究了一下单片机IO口模拟串口通讯的相关知识。相关内容主要参考了网上《51单片机模拟串口的三种方法》和《单片机IO口模拟串口程序(发送+接收)》两篇文档,并动手做了一下实验。感受颇多。 硬件环境:STC89C52 软件环境:IDE Keil uVision V4.10 编译器 C51 V9.0 代码如下: /********************************************** 方法1:延时法 硬件:11.0592MHz晶振,STC89C52,RXD P1.0 TXD P1.1 波特率:9600 描述:所谓延时法是指根据模拟出的波特率,每1位持续的时间的长短是通过循环空指令来延
[单片机]
<font color='red'>51单片机</font>IO口模拟串口通讯1-延时法
51单片机串口发送字符事例
#include reg52.h #define jingzhen 11059200UL /*使用22.1184M晶体*/ #define botelv 9600UL /*波特率定义为9600*/ unsigned char zifuchuan = 您好!n ; //待显示字符。 volatile unsigned char sending; sbit S4=P3^2; void delay(unsigned char i) { unsigned char j,k; for(j=i;j 0;j--) for(k=90;k 0;k--); } void init(v
[单片机]
解析8051单片机的三种数据传输方式
单片机CPU与外部设备交换信息通常有如下几种方式:无条件传送方式,查询传送方式和中断传送方式。我们以单片机与微型打印机接口为例讲述这三种方式。假定用户要打印三个数据,这三个数据保存在单片机的内部数据存储器10H,11H,和12H中,8051用并口P2与微型打印机的并行数据口DB进行数据交换。 (1)无条件传送方式 这种数据传送方式中没有联络信号,即CPU总是认为打印机在如何时候都是处于“准备好”的状态。这种传送方式中只需要在程序中加入数据送往P2的指令,数据传送便可以实现。但这种数据传送方式有一个致命弱点,数据易丢失,这是因为CPU的速度相当快,而打印机的速度相对来说较慢,其结果是在打印机打印一个数据的时间内,CPU已送来了多
[单片机]
解析80<font color='red'>51单片机</font>的三种数据传输方式
51单片机 16X16点阵循环滚动显示汉字
一、效果展示 二、所用材料 1.16X16点阵 Proteus并不提供16X16的点阵,只能我们自己通过4个8X8的组装为16X16的点阵。 由此可知8*8变成16*16 列需要这样连接: 行需要这样连接: 再把四个放在一起即可: 2.74hc595 详细介绍见我上一篇文章 https://blog.csdn.net/qq_41639829/article/details/82151706 这里需要用到级联,也不算太难,就相当于原来是输入8个数,这需要输入16个,然后再输出,前八个输入的就被自动挤到级联的下一个595中了! 3.stc89c52 三、原理 1.静态显示 同8位的静态显示一
[单片机]
<font color='red'>51单片机</font> 16X16点阵循环滚动显示汉字
stc89c51单片机矩阵键盘扫描
#include reg52.h #include stdio.h #define GPIO_KEY P0 #define GPIO_LED P1 unsigned char KeyValue;//存储键值 unsigned char code DIG_CODE ={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, 0x7F,0x6F}; void Delay10ms();//延时10ms void KeyDown();//监测按键函数 void main(void) { while(1) { KeyDown()
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved