其他分享
首页 > 其他分享> > 基于单片机的音乐喷泉系统设计

基于单片机的音乐喷泉系统设计

作者:互联网

注意:本设计为Marconi工作室版权所有,各大平台搜索Marconi工作室,可联系我们!!!!

备注:如需帮助可加    QQ:2276212993     微信:marconi_e

 

控制系统硬件总体设计方案

该音乐喷泉控制系统的总体结构如图2.1所示,由音乐输入系统、数模转换系统、单片机控制系统和输出控制系统等组成。

 

   

                          图2.1 系统总体结构框图

 

音乐程序

先根据乐谱的音符按表3.1建立T值表的顺序,把T值表建立在TABLE1,构成发音符的计数值放在TABLE中;简谱码(音符,参照表3.4)为高4位,节拍(节拍数,参照表3.2)为低4位,音符节拍码放在程序的“TABLE”处。音乐程序模块

 

START-MU:

 

                     ORG    00H              ;                   主程序起始地址

 

                     JMP    START;                  跳至主程序

 

                     ORG    0BH              ;                   TIMER0中断起始地址

 

                     JMP    TIM0;                   跳至TIMER0中断子程

 

START:               MOV    TMOD,#01H              ;             设TIMER0在MODE1

 

                     MOV    IE,    #82H;            中断使能

 

START0:               MOV    30H,  #00H;            取简谱码指针

 

NEXT:               MOV    A,    30H              ;            简谱码指针载入A

 

                     MOV               DPTR,#TABLE;           至TABLE取简谱码

 

                     MOVC               A,   @A+DPTR     

 

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

 

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

 

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

 

                     MOV               90H,   A;              为调速保存数据

 

                     MOV    R5,    A;             将节拍码存入R5

 

                     MOV    A,     R2;            将取到的简谱码再载入A

 

                     SWAP               A;                     高低4位交换

 

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

 

MOV                 90H,               A;              保存音符码,为调速做准备

 

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

 

                     CLR                TR0;                   是,则不发音

 

                     JMP               D1;                    跳至D1

 

SING:               DEC                A;                     取到的音符码减1(不含0)

 

                     MOV               22H,    A              ;           存入(22H)

 

                     RL                A;                     乘2

 

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

 

                     MOVC              A,    @A+DPRT      

 

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

 

                     MOV               21H,  A;        取到的高位字节存入(21H)

 

                     MOV               A,    22H              ;     再载入取到的音符码

 

                     RL               A;                  乘2

 

                     INC               A;              加1

 

                     MOVC               A,   @A+DPRT;  至TABLE1取相对的低位字节计数值

 

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

 

                     MOV               20H, A;        取到的低位字节存入(20H)

 

                     SETB               TB0;            启动TIMER0

 

D1:                  CALL               CHULIKOU;       调用以1/4拍为基本单位时间的调速子程序

 

         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               P1.0;              将P1.0位反相

 

                    POP              PSW;               至堆栈取回PSW的值

 

                    POP  ACC;           至堆栈取回A的值

 

                    RETI;                  返回主程序

 

TABLE1:

 

                    DW               64260, 64400, 65524, 64580

 

                    DW                64684, 64777, 64820,   64898

 

                    DW               64968, 65030,  65058,   65110

 

                    DW               65157,   65178,   65217

 

TABLE:

 

                    DB               82H,01H,81H,94H,84H ;1

 

DB              0B4H,0A4H,04H

 

                     DB               82H,01H,81H,94H,84H

 

                     DB              0C4H,0B4H,04H;2

 

                     DB               82H,01H,81H,0F4H,0D4H

 

                     DB               0B4H,0A4H,94H

 

                     DB               0E2H,01H,0E1H,0D4H,0B4H

 

                     DB               0C4H,0B4H,04H;3

 

                     DB  82H,01H,81H,94H,84H

 

                     DB               0B4H,0A4H,04H

 

                     DB               82H,01H,81H,94H,84H

 

                     DB               0C4H,0B4H,04H;4

 

                     DB  82H,01H,81H,0F4H,0D4H

 

          DB  0B4H,0A4H,94H

 

          DB 0E2H,01H,0E1H,0D4H,0B4H

 

          DB  C4H,0B4H,04H

 

                     DB  00

 

TABLE2:               DB 04H,05H,06H

 

          DB  09H,0AH,0BH,0CH,0DH,0EH

 

                     DB  11H,12H,13H,14H,15H, 16H

 

                     END

 

灯光控制模块

LC182是音频调制彩灯控制专用芯片,其内部分配器频率的高低受音频信号大小的调制,特别适用于声光音响控制场合,可直接驱动驱动众多发光二极管闪光,也可驱动交流彩色电灯作循环闪光。LC182为四路驱动输出。他们的内部均有信号整流电路。压控振荡器,脉冲分配器。在本系统中,单片机便开启LC182时,LC182四路输出依次变为高电平,其循环频率约为0.5~1HZ,一有音乐信号的输入,彩灯的循环频率随音频信号的大小而变化,其最高循环频率为15HZ。

 

灯光控制子程序

 

LUMP:

 

                 MOV   DPTR,  #0EF00H              ;      初始化2#8155,PA口为基本输出口

 

                                    PB口为基本输出口,PC口输入口

 

                  MOV   A,     #1H

 

                  MOVX @DPTR, A

 

       INC   DPTR

 

                  INC   DPTR;                 指向2#8155PC口

 

                  MOV  A,   #01H

 

                  MOVX @DPTR, A

 

                  RET

 

看门狗子程序

软件看门狗由“喂狗”子程序和(看门狗定时器)TO溢出子程序组成。“喂狗”子程序如下:

 

DOG:

 

MOV TH0,#02H;模式1定时器,在6MHZ晶振时,定时约130ms

 

MOV TL0, #18H

 

RET

 

此子程序应在系统程序的若干处调用,保证在程序正常执行时TO总不溢出。当受到某种干扰程序跑飞时,“喂狗”子程序得不到执行,经130ms后TO溢出中断,就会执行如下的(看门狗定时器)To溢出子程序:

 

TOINT:

 

POP YR1 ;舍去无用栈顶内容

 

POP YR1 ;YRD和 YR1是两个RAM单元名

 

MOV YR0,#49H ;0049H是本程序设定起始喷池花样序号指令的存放地址

 

MOV YR1.#O

 

PUSH YR0 ;使栈顶内容为0049H

 

PUSH YR1

 

RETI ;执行RETI时PC值=0049H,即从0号喷池花样开始演出

 

当执行从中断返回指令RETI时,栈顶内容0049H就会弹出至程序计数器PC,从而重新设定起始喷池花样序号后,再进行乐曲控制初始化,喷池继续正常动作。

 

实验仿真

仿真是利用计算机对实际额屋里模型或数学模型进行试验(虚拟仪器的虚拟实验),通过这样的模型试验来随一个实际系统的性能和工作状态进行分析和研究。

 

近年来计算机仿真技术取得了快速的发展,同时推动了单片机仿真技术的进步。目前,用于单片机仿真的工具很多,有些主要用于软件仿真,侧重于算法的验证;有些用于硬件仿真的工具对CPU的仿真能力有限,至于对CPU外围的硬件仿真更是无能为力。Proteus在单片机CPU和外围器件方面表现出卓越的仿真能力使其成为目前最好的仿真工具之一。

 

Proteus的显著特点如下:

 

   (1)全部满足单片机软件仿真系统的标准,并在同类产品中有明显优势;

 

   (2)具有模拟电路仿真、数字电路仿真、单片机及外围电路组成的系统仿真的功能;

 

   (3)目前支持的单片机类型有:68000系列、51系列、AAVR系列等;

 

   (4)支持大量的存储器和外围设备。

 

由于实验室条件原因本设计仿真部分不能在实验室完成,因此仅在此将使用Proteus来实现本设计仿真的步骤进行描述如下:

 

第一步:打开Proteus 6 Professional绘图界面。

 

第二步:添加所需元件并连接电路图。本设计所需元件有:AT89C51、LED灯、水泵、电磁阀、扬声器等。

 

第三步:添加仿真文件。

 

第四步:单击开始图标,开始仿真。此时喷泉开始运行,根据运行状态进行源代码的调试。

 

标签:仿真,01H,0B4H,音乐,DB,MOV,喷泉,单片机,子程序
来源: https://www.cnblogs.com/MarconiStudio/p/marconi_e.html