资源描述:
《单片机音乐程序(六首歌)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、单片机音乐程序(六首歌);六首唱歌的音乐程序按p3.4循环,直到一首歌唱完及停p3.3口接小喇叭*;********************************************************************************;*日期:2007-3-25*;*版本:3.0*;*作者:深圳学林电子有限公司专业8051单片机教学站*;*邮箱:sxj1974@163.com*;*网站:http://www.51c51.comhttp://www.8951.com更多例程请登陆网站*;**********************************
2、**********************************************;*硬件:此程序在本公司xlisp系列单片机实验仪运行通过*;********************************************************************************;*【版权】Copyright(C)深圳学林电子有限公司www.51c51.comAllRightsReserved*;*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!*;*******************************************
3、*************************************org00h;主程序起始地址jmpstart;跳动主程序org0bh;timer0中断起始地址jmptim0;跳至timer0在mode1org0080hstart:movtmod,#00000001b;设timer0在mode1movie,#10000010b;中断使能jbp3.4,$;第一次按to?calldelay1;消除抖动jnbp3.4,$;to放开?mov31h,#00;按to次数计数指针初值为00hstart0:mov30h,#lowsong;取简谱码指针(第1首)next:mova,30h
4、movdptr,#tablemovca,@a+dptr;至相关页码,高4位为音符的高低movr2,a;低4位为音符的节拍jzend0;检查简谱码是否已结束(有无00?)anla,#0fh;取节拍(低4位)movr5,a;存入r5,节拍的时间mova,r2swapaanla,#0fh;取音频值(高4位)jnzsing;是否为0,是0则不发音clrtr0jmpd1sing:deca;因0不列入mov22h,a;存入(22h)rla;乘2movdptr,#tablemovca,@a+dptr;至table取码,取t的值movth0,a;取到的高位字节存入th0mov21h,a;取到的
5、高位字节存入(21h)mova,22h;再载入取到的音符码rla;乘2inca;加1movca,@a+dptr;至table取相对的低位字节计数值movtl0,a;取到的低位字节存入tl0mov20h,a;取到的低位字节存入(20h)setbtr0;启动timer0d1:calldelayinc30h;取简谱码指针加1jmpnextend0:clrtr0;停止计数器mova,31h;载入计次指针xrla,#00h;是否按第1次?jnzend1;不是则跳至end1jbp3.4,$;按第2次?calldelay1;消除抖动jnbp3.4,$;放开否?inc31h;计次地址(31h)
6、加1mov30h,#lowsong1;第2首歌指针jmpnextend1:mova,31h;载入计次指针xrla,#01h;是否按第2次?jnzend2;不是则跳至end2jbp3.4,$;按第3次?calldelay1;消除抖动jnbp3.4,$;放开否?inc31h;计次地址(31h)加1mov30h,#lowsong2;第3首歌指针jmpnextend2:mova,31h;载入计次指针xrla,#02h;是否按第3次?jnzend3;不是则跳至end3jbp3.4,$;按第4次?calldelay1;消除抖动jnbp3.4,$;放开否?inc31h;计次地址(31h)加1
7、mov30h,#lowsong3;第4首歌指针jmpnextend3:mova,31h;载入计次指针xrla,#03h;是否按第4次?jnzend4;不是则跳至end4jbp3.4,$;按第5次?calldelay1;消除抖动jnbp3.4,$;放开否?inc31h;计次地址(31h)加1mov30h,#lowsong4;第5首歌指针jmpnextend4:mova,31h;载入计次指针xrla,#01h;是否按第5次?jnzend5;不是则跳至end2jbp3.4,$;按第6次?calld