开始定义全局变量a。变量temp,j,jp。初始化;定时器TMOD=0x0;IE=0x87。外部中断1,2;IT0=1;EX0=1;IT1=1;大循环1从简谱数组中读出音符付给临时变量 temp=sb【i】Y判断简谱是否到达终点 temp=0xffNjp=temp/16点亮二极管 lightTemp=(1< 程序代码: #include uchar timeh,timel;//用于存放定时器的高8位和低8位 uchar code sb[]={//定义送别简谱 0x54,0x32,0x52,0x88,0x64,0x84,0x58,0x54,0x12,0x22,0x34,0x22,0x12,0x28,0x00,0x00, 0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0xf2,0x18,0x00,0x00, 0x64,0x84,0x88,0x74,0x62,0x72,0x88,0x62,0x72,0x82,0x62,0x62,0x52,0x32,0x12,0x28,0x00,0x00, 0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0xf2,0x18,0x00,0x00, 0x54,0x32,0x52,0x88,0x64,0x84,0x58,0x54,0x12,0x22,0x34,0x22,0x12,0x28,0x00,0x00, 0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0xf2,0x18,0x00,0x00 }; //适合12M的晶振定时器初值表,高低8位分开 uchar code chuzhi[]={ 0xff,0xff,//占位 0xFC,0x43,//中央C调1-7 0xFC,0xad, 0xFd,0x0a, 0xFD,0x34, 0xFD,0x82, 0xFD,0xc8, 0xFE,0x06, 0xFe,0x21,//高音 0xFe,0x56, 0xFe,0x85, 0xFe,0x9a, 0xFe,0xc1, 0xFe,0xe4, 0xFf,0x03, 0xFc,0x0c //0xF8,0x18,//高八度1-7 }; void timer0() interrupt 1 //定时器0中断服务程序 { TH0=timeh; //将timeh赋给计时器的高8位 TL0=timel; //将timel赋给计时器的低8位 fm=~fm; //定时器每次到时将蜂鸣器反相 } void delay(uint z) //延时165MS,即十六分音符 { } void delay1(uint z) { } void main() { uint temp; //存放简谱数组中的每一个音符的临时变量 uint lightTemp; //存放音符 uchar i=0; uchar jp; //jp用于取出temp中的高8位和低8位 IT0=1; //INT0 uint y; for(z;z>0;z--) for(y=112;y>0;y--);//大致时间 //延时1MS uint y; for(z;z>0;z--) for(y=19000-a;y>0;y--);//大致时间 IT1=1; //INT1 TMOD=0x01;//设置定时器T0工作于方式1 IE=0x87; //允许T0中断 while(1) { temp=sb[i]; if(temp==0xff) break; jp=temp/16; //取数的高4位,音频数值 lightTemp=(1< timeh=chuzhi[jp*2];//构造定时器初值高8位 timel=chuzhi[jp*2+1]; //构造定时器初值低8位 TR0=1; //开定时器 } else { TR0=0; //关定时器 fm=1; //关蜂鸣器 } delay(temp); //取数的低4位,节拍(音符总时延) TR0=0; //唱完一个音停5MS fm=1; delay1(5); i++;
单片机课程设计报告(利用蜂鸣器播放音乐)(3)
2019-01-27 13:41
单片机课程设计报告(利用蜂鸣器播放音乐)(3).doc
将本文的Word文档下载到电脑
下载失败或者文档不完整,请联系客服人员解决!