打印

关于单片机播放音乐程序的不懂部分

[复制链接]
2650|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
陈老师|  楼主 | 2013-5-7 16:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看了一些用汇编编的音乐播放程序,有个关键程序段不懂,请各位指教


/*
程序效果:蜂鸣器发出两只老虎的音律
*/

               ORG 0000H
               AJMP START
               ORG 000BH
               AJMP TIM0
               ORG 0030H
START:     MOV TMOD,#01H //工作在方式1
               MOV IE,#82H  //开总控和分控

START0:    MOV 30H,#00H   //清零
NEXT:           MOV A,30H   //清零
                   MOV DPTR,#TABLE  //赋表首地址
                MOVC A,@A+DPTR
                     MOV R2,A   //暂存A的值
                     JZ END0 //判断A是否为0
                     ANL A,#0FH    //屏蔽A的高半
                     MOV R5,A  //把A屏蔽高半的值赋给R5
                     MOV A,R2  //恢复A的原值
                     SWAP A  //高低位互换
                     ANL A,#0FH  //屏蔽原来A的高半
                     JNZ SING //判断原来A的高半是否为0
                     CLR TR0   //是0,则停止计时
                     SETB P2.0   //关闭蜂鸣器
                     LJMP D1   //转到标号为D1的地方
//原来A的高半不为零,开始唱歌
SING:           DEC A   //¥原来A的高半减1,用于读取相应的音律
                     MOV 22H,A //¥保存现在A的值
                     RL A    //¥左循环移位
                     MOV DPTR,#TABLE1 //赋表首地址
                     MOVC A,@A+DPTR
                     MOV TH0,A    //赋给TH0用于计时,用于控制蜂鸣器响的时间
                     MOV 21H,A //保存A的值
                     MOV A,22H //*
                     RL A //左循环移位
                     INC A  //加1,根据表的存储顺序
                     MOVC A,@A+DPTR
                     MOV TL0,A //用于把低八位赋给TL0,用于计时
                     MOV 20H,A  //*
                     SETB TR0  //启动定时器

D1:               LCALL DELAY   //调用延时子程序,能够听到该音律
                     INC 30H //加1
                     LJMP NEXT

END0:           CLR TR0   //停止计时
                     JMP START0  //无限循环
//定时器0
TIM0:            PUSH ACC //保护A的值
                     PUSH PSW
                     MOV TL0,20H  //赋初值
                     MOV TH0,21H
                     CPL P2.0 //给蜂鸣器高低电平,使蜂鸣器发声
                     POP PSW  //弹出相应的值
                     POP ACC
                     RETI //返回
//延时时间大约为:100ms=0.1s
DELAY:         MOV R4,#187
D3:                MOV R3,#248
                     DJNZ R3,$
                     DJNZ R4,D3
                     DJNZ R5,DELAY //R5代表节拍
                      RET

TABLE1:       DW 63745,63969,64140,64215 //$    ;七个音符
                     DW 64360,64489,64603  //$  他们之间存在一种对应关系

TABLE:    DB 14H,24H,34H,14H,01H  //$
                 DB 14H,24H,34H,14H,01H  //$
                 DB 34H,44H,54H,02H,34H,44H,54H,02H //$
                 DB 52H,62H,52H,42H,34H,14H,01H,52H,62H,52H,42H,34H,14H,02H //$
                 DB 14H,54H,14H,02H,14H,54H,14H,08H,00H //$
                 END


SING那段有了注释,还是不懂为什么用减一、加一、左循环移位??最后怎么求的了TH0,TL0

请各位指教

相关帖子

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

本版积分规则

4

主题

15

帖子

0

粉丝