小型音乐喷泉控制主要部分程序Word下载.docx
《小型音乐喷泉控制主要部分程序Word下载.docx》由会员分享,可在线阅读,更多相关《小型音乐喷泉控制主要部分程序Word下载.docx(15页珍藏版)》请在冰点文库上搜索。
![小型音乐喷泉控制主要部分程序Word下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/7/9824ec57-0fde-4889-a336-4caa4a0acc41/9824ec57-0fde-4889-a336-4caa4a0acc411.gif)
AJMPCIRCLE1
DO2:
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:
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;
LINE2:
JBACC.2,LINE3;
判断第三行有无键按下
MOVA,#8H;
LINE3:
JBACC.3,NEXT;
判断第四行有无键按下
MOVA,#0CH;
KEY-CODE:
ADDA,R1;
行号加列号得出键码
PUSHACC;
键码入栈保护
WAIT-REL:
LCALLJUDGE;
检验键是否松开
JNZWAIT-REL;
等待键断开
POPACC;
键码出栈
MOVR6,A;
保护键码
D:
CJNER6,#00H,D0001;
是数字键输出显示,不是数字键
返回主程序
LCALLDISPLAY
D0001:
CJNER6,#01H,D0002;
D0002:
CJNER6,#02H,D0003;
D0003:
CJNER6,#03H,D0004;
D0004:
CJNER6,#04H,D0005;
D0005:
CJNER6,#05H,D0006;
D0006:
CJNER6,#06H,D0007;
D0007:
CJNER6,#07H,D0008;
LCALLDISPLAY
D0008:
CJNER6,#08H,D0009;
D0009:
CJNER6,#09H,KEY-NO
NEXT:
INCR1;
扫描下一列
MOVA,R2;
JNBACC.3,KEY-NO;
四列扫描完还没有键按下的话,
认为是干扰信号,程序返回
RLA
MOVR2,A
SJMPNEXT-L
JUDGE:
MOVA,#00H;
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
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;
设置命令字
INCDPTR;
指向1#PA口
MOVA,34H
MOVX@DPTR,A;
高电平口使电磁阀有电
INCDPTR;
指向1#PB口
MOVA,R7
采集数据子程序
START-AD:
MOVDPTR,#7FFFH;
使DPTR指向MAXll8的端口地址,如图为7FFFH
MOVR5,00H;
R5指向某一通道,指向1N0
MOVA,R5
MOVX@DPTR,A;
启动R5所指通道
WEND:
JBP1.0,WEND;
判是否转换完毕
读取转换结果
MOVR0,A;
把结果保存入R0
MOV36H,A;
把结果暂存入36H
RET
灯光控制子程序
LUMP:
初始化2#8155,PA口为基本输出口
PB口为基本输出口,PC口输入口
MOVA,#1H
INCDPTR
指向2#8155PC口
MOVA,#01H
停止节电子程序
STOP:
……
JBP3.2,$;
在INT0变低前原地等待,有中断键按下,返回主程序
音乐程序模块
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位交换
取低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;
再载入取到的音符码
INCA;
加1
MOVCA,@A+DPRT;
低位字节计数值
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
DB0B4H,0A4H,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;
07H,低速四档
LJMPZHONGSHU;
中速六档
HIEGH:
CLRP2.2;
TH晶闸管导通
MOVA,34H
ANLA#7H;
#00000111
MOV95H,A
LCALLDELAY1;
TH晶闸管按周期比例导通
SETBP2.2
CLRP2.1;
TM晶闸管导通
MOVA,#06H
CLRC
SUBBA,R7
MOV95H,A
LCALLDELAY1;
TM晶闸管按周期比例导通
SETBP2.1
DJNZR5,HIEGH
ZHONG:
CLRP3.1;
MOVA,34H
ANL#7H;
#00000111
MOV95H,A
NOP
CLRP2.0;
TL晶闸管导通
MOVA,#06H
CLRC
SUBBA,R7
MOV95H,A
TL晶闸管按周期比例导通
SETBP2.0
DJNZR5,ZHONG
DISHU:
CLRP2.0;
MOVA,34H
ANL#7H;
MOV95H,A
LCALLDELAY1;
SETBP2.0
MOVA,#06H
SUBBA,R7
LCALLDELAY1;
TL晶闸管周期比例外不导通
DJNZR5,DISHU
DELAY1:
MOVR7,#02;
D2:
MOVR495H
D3:
MOVR3,#248
DJNZR3,﹩
DJNZR4,D3
DJNZR7,D2
CHULIKOU1:
……
8051接收程序
ORG00H
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