打印

一个音乐程序的问题,请大家看看

[复制链接]
3738|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
还我今生|  楼主 | 2008-2-15 11:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
流程见图
程序如下
ORG 0000H
LJMP START
ORG 000BH
INC 20H ;中断服务,中断计数器加1
MOV TH0,#0D8H
MOV TL0,#0EFH ;12M晶振,形成10毫秒中断
RETI
START: 
MOV SP,#50H
MOV TH0,#0D8H
MOV TL0,#0EFH
MOV TMOD,#01H
MOV IE,#82H
MUSIC0:
NOP
MOV DPTR,#DAT ;表头地址送DPTR
MOV 20H,#00H ;中断计数器清0
MUSIC1:
NOP
CLR A ;A清零
MOVC A,@A+DPTR ;查表取代码
JZ END0 ;是00H,则结束
CJNE A,#0FFH,MUSIC5 ;如果是休止符,往下执行
LJMP MUSIC3
MUSIC5:
NOP
MOV R6,A ;R6=18H音符的频率
INC DPTR DPTR加一
MOV A,#0
MOVC A,@A+DPTR ;取节拍代码送R7
MOV R7,A ;R7=30H音符发音的时间
SETB TR0 ;启动计数 
MUSIC2:
NOP
CPL P2.5 ;P2.5是音乐输出引脚
MOV A,R6
MOV R3,A ;R3=R6=18H
LCALL DEL
MOV A,R7
CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否?
;不等,则继续循环
MOV 20H,#00H ;等于,则取下一代码
INC DPTR
LJMP MUSIC1
MUSIC3:
NOP ;休止100毫秒
CLR TR0 
MOV R2,#0DH ;R2=13
MUSIC4:
NOP
MOV R3,#0FFH ;R3=255
LCALL DEL
DJNZ R2,MUSIC4
INC DPTR
LJMP MUSIC1
END0:
NOP
MOV R2,#0FFH ;歌曲结束,延时1秒后继续
MUSIC6:
MOV R3,#00H
LCALL DEL
DJNZ R2,MUSIC6
LJMP MUSIC0
DEL:
NOP
DEL3: 
MOV R4,#02H
DEL4: 
NOP
DJNZ R4,DEL4
NOP
DJNZ R3,DEL3
RET
NOP
DAT: 
DB 18H, 30H, 1CH, 10H
DB 20H, 40H, 1CH, 10H 
DB 18H, 10H, 20H, 10H
DB 1CH, 10H, 18H, 40H
DB 1CH, 20H, 20H, 20H
end 

相关帖子

沙发
还我今生|  楼主 | 2008-2-15 11:31 | 只看该作者

提问

流程中的B清0是什么意思啊,
程序中我怎么找不到这个B呢?
请高手指点一下 谢谢

使用特权

评论回复
板凳
还我今生|  楼主 | 2008-2-15 11:37 | 只看该作者

电脑圈圈不是很懂音乐的吗!过来解释下哦。。挖哈哈

使用特权

评论回复
地板
hotpower| | 2008-2-15 12:28 | 只看该作者

00已失踪多日...

使用特权

评论回复
5
还我今生|  楼主 | 2008-2-15 12:48 | 只看该作者

00失踪?被绑架了?

使用特权

评论回复
6
gyt| | 2008-2-15 13:12 | 只看该作者

旅游去了吧:)

使用特权

评论回复
7
还我今生|  楼主 | 2008-2-15 13:35 | 只看该作者

难道除了00就没人懂了吗 不是吧?

那我这个菜鸟岂不是也能算个“高手”拉。。。。。

使用特权

评论回复
8
stycx| | 2008-2-15 13:48 | 只看该作者

B 是 20H 中断计数器

MOV 20H,#00H ;中断计数器清0

使用特权

评论回复
9
还我今生|  楼主 | 2008-2-15 22:05 | 只看该作者

感谢ls 另外再问一个100毫秒的延时是怎么算的

还有1秒的延时又是怎么算的
我怎么算来算去不对的
请大虾指点

使用特权

评论回复
10
还我今生|  楼主 | 2008-2-16 11:38 | 只看该作者

有没有人回答一下啊 等待中。。。

使用特权

评论回复
11
还我今生|  楼主 | 2008-2-17 12:18 | 只看该作者

谁回答一下啊 高手都不在吗

使用特权

评论回复
12
iC921| | 2008-2-17 13:22 | 只看该作者

我现在不记得这些代码了

不过,看你的程序,为什么休止时间固定为100ms?这就算有点道理,也增加数据录入麻烦吧,而且,按照程序流程,休止期间应当根本上输出音频,可是,你没有。

我暂时不想细看程序,你把你的音高控制过程结合代码说一下我看看。边学习边向你解释。这个东西,原来我睡着也能说出来的。

使用特权

评论回复
13
还我今生|  楼主 | 2008-2-18 12:43 | 只看该作者

关于这个程序

程序不是我写的,休止时间固定为100ms,可惜我看不出来,这个100ms是怎么延时的,还有那个1秒,算来算去都不对。
DAT: 
DB 18H, 30H, 1CH, 10H
DB 20H, 40H, 1CH, 10H 
DB 18H, 10H, 20H, 10H
DB 1CH, 10H, 18H, 40H
DB 1CH, 20H, 20H, 20H
看第一行,其中18表示音符频率,30H表示那个音符的的节拍持续时间
接下来又是音符频率,然后是该音符频率的节拍。

这个程序网络上应该流传的,谁能帮我解释一下这个延时时间的问题啊

使用特权

评论回复
14
还我今生|  楼主 | 2008-2-19 09:27 | 只看该作者

感觉这个版面的人气不是很足啊,没人回答问题了

本人收回这句话,请大家原谅。

使用特权

评论回复
15
xwj| | 2008-2-19 09:29 | 只看该作者

KAO,这个版面的人气还不足的话,21ic就没有人气足的版面了

使用特权

评论回复
16
高勇| | 2008-2-19 10:04 | 只看该作者

估计

估计这样的解决楼主还是难理解。还得自己多学习一些编程知识。

使用特权

评论回复
17
还我今生|  楼主 | 2008-2-19 10:31 | 只看该作者

I是初学者,请大伙多多帮忙啊

这个程序是看不太明白

使用特权

评论回复
18
stycx| | 2008-2-19 10:51 | 只看该作者

lz喜欢看汇编 再给你一个看看吧

BELL      BIT  P1.3
LCOUNT1          DATA 30H    ;循环次数1
LCOUNT2     DATA 31H    ;循环次数2

         ORG      0000H
         LJMP     MAIN
     ORG      0100H

MAIN:      MOV      SP,#80H
     CALL       MUSIC
     JMP      MAIN
    
MUSIC:
      MOV     R7,#0
SLONG:MOV     DPTR,#SOUND_LONG
      MOV     A,R7
      MOVC     A,@A+DPTR
      MOV     LCOUNT1,A              ;送发音的长短到LONGT1
      MOV     A,R7
      MOV       DPTR,#SOUND_TONE
      MOVC     A,@A+DPTR
      MOV     LCOUNT2,A             ;送音符的周期到LCOUNT2/即音的高低
      MOV     R4,LCOUNT1        ;循环 音长
LONG: MOV     R6,#12            ;循环节拍
MUSI: MOV     R5,LCOUNT2        ;产生音调所需要的方波
MUSI1:CLR     BELL                 ;开蜂鸣器
      DJNZ     R5,MUSI1             ;开蜂鸣器 音调次后退出
      MOV     R5,LCOUNT2
MUSI2:SETB     BELL                ;关蜂鸣器
      DJNZ     R5,MUSI2            ; 关蜂鸣器音调次后退出
      DJNZ     R6,MUSI
      DJNZ     R4,LONG
      PUSH     7
      PUSH     6
LONGS:CALL     DELAY
      POP     6
      POP     7
      INC     R7
      CJNE    R7,#40,SLONG
      RET

DELAY:;延时10ms
      MOV     R7,#90H;
D1:   MOV     R6,#0A0H;
D0:   NOP
      DJNZ     R6,D0
      DJNZ     R7,D1
      RET
SOUND_LONG:                                     ;MUSIC中每一个音符的长度
DB 60,30,30,60,30,30,60,30,120,60
DB 30,30,60,30,30,30,30,30,120,60
DB 30,30,30,30,30,30,30,30,60,30
DB 120,60,60,60,30,30,30,60,30,120
SOUND_TONE:                                     ;MUSIC中每一个音符的音调
DB 142,159,189,142,159,189,142,142,159,142
DB 142,159,189,142,159,189,212,212,239,212
DB 189,189,159,142,120,142,159,189,189,159
DB 239,189,189,189,189,189,142,142,159,142
END

使用特权

评论回复
19
还我今生|  楼主 | 2008-2-19 11:14 | 只看该作者

不是我喜欢看汇编啊

相比之下 c语言的了解程度不如汇编。
如果汇编的基础够了 我会学c。很多人说那样好点,而且据说c语言
很容易学的。
很多公司都要会c语言的人,我想这是一个发展趋势吧。

使用特权

评论回复
20
stycx| | 2008-2-19 11:24 | 只看该作者

知道有汇编那么一回事就可以了 别在上面浪费时间

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

218

主题

1382

帖子

1

粉丝