新闻中心

EEPW首页>嵌入式系统>设计应用> 单片机电子琴电路图及源程序代码

单片机电子琴电路图及源程序代码

作者: 时间:2016-11-25 来源:网络 收藏

实验仿真图

本文引用地址://m.amcfsurvey.com/article/201611/321258.htm

源程序代码:(弹奏部分代码暂时去掉,见谅,需要的留言,转载请注明出处,谢谢!)

DUAN EQU 0c000H
WEI EQU0a000H
LED0 EQU 8000H
ORG 0000H;复位地址
LJMP MAIN;跳转到主程序
ORG 0003H;外部中断0入口地址
LJMP INT00;跳转到外部中断0服务程序
ORG 000BH;T0中断入口
LJMP TIM0;跳转到T0中断服务程序


ORG 0030H;主程序入口地址
MAIN:

MOV DPTR,#LED0
MOV A,#00H
MOVX @DPTR,A


MOV TMOD,#01H;写入T0控制字, 16位定时方式
SETB IT0;外部中断为下降沿触发
MOVIE,#83H;开中断
MOV30H,#00H;取简谱码指针
MOVR6,#0FFH;选择音乐节奏灯循环次数
CLR23H;功能选择标志 00:键盘 01:音乐

NEXT:CLRTR0
JNB23H,KEYPLAY;若标志位是0则转到键盘程序
SETB P2.2
MOVA,30H;简谱码指针装入A
JNB P0.1,START1;否则查询播放哪一首歌曲
JNB P0.2,START2
JNB P0.3,START3
LJMP NEXT

;确定不同歌曲的基地址
START1:

MOVDPTR,#TABLE;从TABLE处取简谱码
MOV 60H,DPH
MOV 61H,DPL
MOV A,#00H
LJMP NEXT1
START2:

MOVDPTR,#TABLE2;从TABLE2处取简谱码
MOV 60H,DPH
MOV 61H,DPL
MOV A,#01H
LJMP NEXT1
START3:

MOVDPTR,#TABLE3;从TABLE处取简谱码
MOV 60H,DPH
MOV 61H,DPL
MOV A,#02H
LJMP NEXT1

;键盘弹奏程序入口
KEYPLAY:;键盘程序入口
SETB P2.1
CLR P2.2
JNB P0.4,LOWTONE;查询是高音还是其他的音
JNB P0.5,MIDDLETONE
JNB P0.6,HIGHTONE
LJMP NEXT;没有选择高中低音则重新查询


;确定高中低音基地址
LOWTONE:
MOV DPTR,#LOWTABLE;赋基地址值
MOV 50H,DPH
MOV 51H,DPL
LJMP KEY;跳转到按键查询程序

MIDDLETONE:
MOV DPTR,#MIDDLETABLE
MOV 50H,DPH
MOV 51H,DPL
LJMP KEY

HIGHTONE:
MOV DPTR,#HIGHTABLE
MOV 50H,DPH
MOV 51H,DPL
LJMP KEY


;歌曲播放程序
NEXT1: MOV DPTR,#SEG7
MOVC A,@A+DPTR
MOV DPTR,#DUAN
MOVX @DPTR,A
MOV DPTR,#WEI
MOV A,#000BH
MOVX @DPTR,A
MOV DPH,60H
MOV DPL,61H
MOV A,30H
MOVC A,@A+DPTR
MOVR2,A;取得的简谱码暂存于R2
JZEND0;是否取到结束码00H
ANLA,#0FH;不是,则取节拍码
MOVR5,A;节拍码存于R5
MOVA,R2;将简谱码装入A
SWAP A;高、低4位交换
ANLA,#0FH;取音符码
JNZSING;取得的音符码是否为0?
CLRTR0;是则不发音
lJMPD1;跳转到D1

SING:DECA;取得的音符码减1(不含0)
MOV22H,A;存入22H单元
RLA;乘2
MOVDPTR,#TABLE1;到TABLE1中取相对的高位字节值
MOVC A,@A+DPTR
MOVTH0,A;取得的高位字节装入TH0和21H单元
MOV21H,A
MOVA,22H;再装入取得的音符码
RlA;乘2
INCA;加1
MOVC A,@A+DPTR;到TABLE1中取相对的低位字节值
MOVTL0,A;取得的高位字节装入TL0和20H单元
MOV20H,A
SETB TR0;启动T0
D1:LCALL DELAY;基本单位时间1/4拍,延时187毫秒
INC30H;取简谱码指针加1
LJMP NEXT;取下一个码
END0:CLRTR0;停止T0
CLR 30H;清零简朴指针
LJMP NEXT;重复循环


上一页 1 2 下一页

评论


技术专区

关闭