小型音乐喷泉控制主要部分程序.docx
- 文档编号:5094934
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:15
- 大小:19.09KB
小型音乐喷泉控制主要部分程序.docx
《小型音乐喷泉控制主要部分程序.docx》由会员分享,可在线阅读,更多相关《小型音乐喷泉控制主要部分程序.docx(15页珍藏版)》请在冰点文库上搜索。
小型音乐喷泉控制主要部分程序
小型音乐喷泉控主要部分程序
ORG0000H
AJMPMAIN;复位入口
ORG0003H
LJMPINT0
ORG0013H
LJMPINT1
ORG0100H
MAIN:
MOVSP,#60H
SETBPX0;设定外部中断INT0为高优先级
SETBEX0;开启外部INT0中断
SETBEX1;开启外部INT1中断
SETBEA;开总允许中断
DELAY0:
MOVR5,#100;开机10秒后没有按键启动音乐程序
DEL0:
MOVR6#200
DEL1:
MOVR7,#248
DEL2:
DJNZR7,DEL2
DJNZR6,DEL1
DJNZR5,DEL0
AJMPDO2
DO:
CJNER6,#0BH,DO1;不是停止键转向DO1
LCALLSTOP;转向停止子程序
DO1:
CJNER6,#0AH,DO2;不是启动现场采集键转向DO2
LCALLDIAN;转向控制电磁阀子程序
LCALLLUMP;转向控制灯光子程序
CIRCLE1:
LCALLSTART-AD;转向采集数据子程序
LCALLCHULIKOU1;转向数据处理并调速子程序
AJMPCIRCLE1
DO2:
LCALLDIAN;转向控制电磁阀子程序
LCALLLUMP;转向控制灯光子程序
CIRCLE2:
LCALLSTART-MU;转向音乐程序(内含调速子程序)
AJMPCIRCLE2
求出键码子程序模块
INT0:
MOV32H,#00H
MOV33H,#00H
MOV34H,#00H
MOVSP,#70H
KEY-SUB:
MOVDPTR,#0EF00H;初始化2#8155,PA口为基本输出口PB口为基本输出口,PC口输入口
MOVA,#1H
MOVX@DPTR,A
BEGIN:
NOP
LCALLDISPLAY;显示数据
LCALLJUDGE;全列置0扫描,判断有无键按下
JNZENTER1;若有键按下,则继续
SJMPBEGIN;若没有键按下,则返回,
ENTER1:
NOP
LCALLDELAY5;调用延时子程序,防止抖动
LCALLJUDGE;重新判断有无键按下
JNZENTER2;若有键按下,则说明的确有
键按下
SJMPBEGIN;没有键按下,则返回,继续检测
ENTER2:
MOVR2,#0FEH;若有键按下,开始扫描列
MOVR1,#00H;列号放在R1中,第一列的列号
定义为00H
NEXT-L:
MOVDPTR,#0EF01H;PA口地址
MOVA,R2;扫描码送A
MOVX@DPTR,A;输出扫描码
INCDPTR
MOVXA,@DPTR;读PB口的内容
JBACC.0,LINE1;判断第一行有无键按下,为1
无键按下
MOVA,#00H;行码送A
SJMPKEY-CODE;再确定按键的键号
LINE1:
JBACC.1,LINE2;判断第二行有无键按下
MOVA,#04H;行码送A
SJMPKEY-CODE;再确定按键的键号
LINE2:
JBACC.2,LINE3;判断第三行有无键按下
MOVA,#8H;行码送A
SJMPKEY-CODE;再确定按键的键号
LINE3:
JBACC.3,NEXT;判断第四行有无键按下
MOVA,#0CH;行码送A
SJMPKEY-CODE;再确定按键的键号
KEY-CODE:
ADDA,R1;行号加列号得出键码
PUSHACC;键码入栈保护
WAIT-REL:
NOP
LCALLJUDGE;检验键是否松开
JNZWAIT-REL;等待键断开
POPACC;键码出栈
MOVR6,A;保护键码
D:
CJNER6,#00H,D0001;是数字键输出显示,不是数字键
返回主程序
LCALLDISPLAY
D0001:
CJNER6,#01H,D0002;
LCALLDISPLAY
D0002:
CJNER6,#02H,D0003;
LCALLDISPLAY
D0003:
CJNER6,#03H,D0004;
LCALLDISPLAY
D0004:
CJNER6,#04H,D0005;
LCALLDISPLAY
D0005:
CJNER6,#05H,D0006;
LCALLDISPLAY
D0006:
CJNER6,#06H,D0007;
LCALLDISPLAY
D0007:
CJNER6,#07H,D0008;
LCALLDISPLAY
D0008:
CJNER6,#08H,D0009;
LCALLDISPLAY
D0009:
CJNER6,#09H,KEY-NO
LCALLDISPLAY
NEXT:
INCR1;扫描下一列
MOVA,R2;
JNBACC.3,KEY-NO;四列扫描完还没有键按下的话,
认为是干扰信号,程序返回
RLA
MOVR2,A
SJMPNEXT-L
JUDGE:
MOVDPTR,#0EF01H;PA口地址
MOVA,#00H;全列置0扫描,判断有无键按下
MOVX@DPTR,A
INCDPTR
MOVXA,@DPTR;读PB口数据
CPLA;无键按下结果为零
ANLA,#0FH;屏蔽高位
RET
KEY-NO:
RETI
显示子程序模块
DISPLAY:
MOV33H,32H;递推显示
MOV32H,31H
MOV31H,30H
MOVR3,#33H
NO-DIS:
MOVA,@R3
MOVCA,@A+DPTR
MOVSBUF,A
CLRTI
JNBTI,$
DECR3
CJNER3,#30H,NO-DIS;转向继续显示
RET
DELAY5:
MOV20H,#1FH;延时子程序
DL2:
MOV21H,#0FFH
DL1:
DJNZ21H,DL1
DJNZ20H,DL2
RET
LEDTABLE:
;LED字型码表
DB3FH,06H,5BH,4FH,66H,
DB6DH,7DH,07H,7FH,6FH
END
控制电磁阀子程序模块
DIAN:
MOVA,31H;求出花型数据
ADDA,32H
ADDCA,33H
MOV34H,A;保存起来
MOVDPTR,#0F700H;指向1#8155命令口
MOVA,#3H;设置命令字
MOVX@DPTR,A
INCDPTR;指向1#PA口
MOVA,34H
MOVX@DPTR,A;高电平口使电磁阀有电
INCDPTR;指向1#PB口
MOVA,R7
MOVX@DPTR,A
RET
采集数据子程序
START-AD:
MOVDPTR,#7FFFH;使DPTR指向MAXll8的端口地址,如图为7FFFH
MOVR5,00H;R5指向某一通道,指向1N0
MOVA,R5
MOVX@DPTR,A;启动R5所指通道
WEND:
JBP1.0,WEND;判是否转换完毕
MOVXA,@DPTR;读取转换结果
MOVR0,A;把结果保存入R0
MOV36H,A;把结果暂存入36H
RET
灯光控制子程序
LUMP:
MOVDPTR,#0EF00H;初始化2#8155,PA口为基本输出口
PB口为基本输出口,PC口输入口
MOVA,#1H
MOVX@DPTR,A
INCDPTR
INCDPTR;指向2#8155PC口
MOVA,#01H
MOVX@DPTR,A
RET
停止节电子程序
STOP:
……
JBP3.2,$;在INT0变低前原地等待,有中断键按下,返回主程序
RET
音乐程序模块
START-MU:
ORG00H;主程序起始地址
JMPSTART;跳至主程序
ORG0BH;TIMER0中断起始地址
JMPTIM0;跳至TIMER0中断子程序
START:
MOVTMOD,#01H;设TIMER0在MODE1
MOVIE,#82H;中断使能
START0:
MOV30H,#00H;取简谱码指针
NEXT:
MOVA,30H;简谱码指针载入A
MOVDPTR,#TABLE;至TABLE取简谱码
MOVCA,@A+DPTR
MOVR2,A;取到的简谱码暂存于R2
JZEND0;是否取到00(结束码)?
ANLA,#0FH;不是,则取低4位(节拍码)
MOV90H,A;为调速保存数据
MOVR5,A;将节拍码存入R5
MOVA,R2;将取到的简谱码再载入A
SWAPA;高低4位交换
ANLA,#0FH;取低4位(音符码)
MOV90H,A;保存音符码,为调速做准备
JNZSING;取到的音符码是否为0?
CLRTR0;是,则不发音
JMPD1;跳至D1
SING:
DECA;取到的音符码减1(不含0)
MOV22H,A;存入(22H)
RLA;乘2
MOVDPTR,#TABLE1;至TABLE1取相对的
高位字节计数值
MOVCA,@A+DPRT
MOVTH0,A;取到的高位字节存入TH0
MOV21H,A;取到的高位字节存入(21H)
MOVA,22H;再载入取到的音符码
RLA;乘2
INCA;加1
MOVCA,@A+DPRT;至TABLE1取相对的
低位字节计数值
MOVTL0,A;取到的低位字节存入TL0
MOV20H,A;取到的低位字节存入(20H)
SETBTB0;启动TIMER0
D1:
CALLCHULIKOU;调用以1/4拍为基本单位时间的调速子程序
INC30H;取简谱码指针加1
JMPNEXT;取下一个码
END0:
CLRTR0;停止TIMER0
JMPSTART0;重复循环
TIM0:
PUSHACC;将A的值暂存于堆栈
PUSHPSW;将PSW的值暂存于堆栈
MOVTL0,20H;重设计数值
MOVTH0,21H
CPLP1.0;将P1.0位反相
POPPSW;至堆栈取回PSW的值
POPACC;至堆栈取回A的值
RETI;返回主程序
TABLE1:
DW64260,64400,65524,64580
DW64684,64777,64820,64898
DW64968,65030,65058,65110
DW65157,65178,65217
TABLE:
;1
DB82H,01H,81H,94H,84H
DB0B4H,0A4H,04H
DB82H,01H,81H,94H,84H
DB0C4H,0B4H,04H
;2
DB82H,01H,81H,0F4H,0D4H
DB0B4H,0A4H,94H
DB0E2H,01H,0E1H,0D4H,0B4H
DB0C4H,0B4H,04H
;3
DB82H,01H,81H,94H,84H
DB0B4H,0A4H,04H
DB82H,01H,81H,94H,84H
DB0C4H,0B4H,04H
;4
DB82H,01H,81H,0F4H,0D4H
DB0B4H,0A4H,94H
DB0E2H,01H,0E1H,0D4H,0B4H
DBC4H,0B4H,04H
DB00
TABLE2:
DB04H,05H,06H
DB09H,0AH,0BH,0CH,0DH,0EH
DB11H,12H,13H,14H,15H,16H
END
调速子程序模块(以1/4拍为基本单位时间的调速子程序)
CHULIKOU:
MOVDPTR,#TABLE2
MOVA,90H;90H里为音符简谱码
MOVA,@A+DPTR;找到调速码
MOVR0,A
CJNER0,#0FH,ZHUAN
ZHUAN:
JCNEG;R0<0EH
LJMPHIEGH;高速六档
NEG:
CJNER0,#07H,XIAM
XIAM:
JCDISHU;R0<07H,低速四档
LJMPZHONGSHU;中速六档
HIEGH:
CLRP2.2;TH晶闸管导通
MOVA,34H
ANLA#7H;#00000111
MOV95H,A
LCALLDELAY1;TH晶闸管按周期比例导通
SETBP2.2
NOP
NOP
CLRP2.1;TM晶闸管导通
MOVA,#06H
CLRC
SUBBA,R7
MOV95H,A
LCALLDELAY1;TM晶闸管按周期比例导通
SETBP2.1
DJNZR5,HIEGH
RET
ZHONG:
CLRP3.1;TM晶闸管导通
MOVA,34H
ANL#7H;#00000111
MOV95H,A
LCALLDELAY1;TM晶闸管按周期比例导通
SETBP2.1
NOP
NOP
CLRP2.0;TL晶闸管导通
MOVA,#06H
CLRC
SUBBA,R7
MOV95H,A
LCALLDELAY1;TL晶闸管按周期比例导通
SETBP2.0
DJNZR5,ZHONG
RET
DISHU:
CLRP2.0;TL晶闸管导通
MOVA,34H
ANL#7H;#00000111
MOV95H,A
LCALLDELAY1;TL晶闸管按周期比例导通
SETBP2.0
MOVA,#06H
CLRC
SUBBA,R7
MOV95H,A
LCALLDELAY1;TL晶闸管周期比例外不导通
DJNZR5,DISHU
RET
DELAY1:
MOVR7,#02;
D2:
MOVR495H
D3:
MOVR3,#248
DJNZR3,﹩
DJNZR4,D3
DJNZR7,D2
RET
CHULIKOU1:
……
RET
8051接收程序
ORG00H
START:
MOVSCON,#50H;UART工作在MODE1,
SM1=1,REN=1
MOVTMOD,#20H;TIMER1工作在MODE2,
M2M1=10,自动重装初值的8位计数器
MOVTH1,#F3H;波特率2400bit/s
MOVTL1,#0F3H;设置初值
SETBTR1;启动TIMER1
A1:
JBRI,UART;RI是否为1?
是表示接收到
JMPA1
UART:
MOVA,SBUF;程序载如程序存储器
MOVR0A
CLRRI
JMPAI
……
END
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 小型 音乐喷泉 控制 主要 部分 程序