基于51单片机具有存储记忆节拍功能的电子琴源程序

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

☆飞翔的蚂蚁☆☆飞翔的蚂蚁☆基于51单片机有存储功能的电子琴源程序#includereg51.h//包含51单片机寄存器定义的头文件sbitP14=P1^4;//将P14位定义为P1.4引脚sbitP15=P1^5;//将P15位定义为P1.5引脚sbitP16=P1^6;//将P16位定义为P1.6引脚sbitP17=P1^7;//将P17位定义为P1.7引脚unsignedcharkeyval;//定义变量储存按键值sbitsound=P3^7;//将sound位定义为P3.7sbitP31=P3^0;//将P31位定义为P3.1引脚sbitP34=P3^4;//将P34位定义为P3.4引脚sbitP35=P3^5;//将P35位定义为P3.5引脚unsignedintC;//全局变量,储存定时器的定时常数unsignedintf;//全局变量,储存音阶的频率unsignedchars;//全局变量,储存节拍//以下是C调低音的音频宏定义#definel_dao262//将“l_dao”宏定义为低音“1”的频率262Hz#definel_re286//将“l_re”宏定义为低音“2”的频率286Hz#definel_mi311//将“l_mi”宏定义为低音“3”的频率311Hz#definel_fa349//将“l_fa”宏定义为低音“4”的频率349Hz#definel_sao392//将“l_sao”宏定义为低音“5”的频率392Hz#definel_la440//将“l_a”宏定义为低音“6”的频率440Hz#definel_xi494//将“l_xi”宏定义为低音“7”的频率494Hz//以下是C调中音的音频宏定义#definedao523//将“dao”宏定义为中音“1”的频率523Hz#definere587//将“re”宏定义为中音“2”的频率587Hz#definemi659//将“mi”宏定义为中音“3”的频率659Hz#definefa698//将“fa”宏定义为中音“4”的频率698Hz#definesao784//将“sao”宏定义为中音“5”的频率784Hz#definela880//将“la”宏定义为中音“6”的频率880Hz#definexi987//将“xi”宏定义为中音“7”的频率53//以下是C调高音的音频宏定义#defineh_dao1046//将“h_dao”宏定义为高音“1”的频率1046Hz#defineh_re1174//将“h_re”宏定义为高音“2”的频率1174Hz#defineh_mi1318//将“h_mi”宏定义为高音“3”的频率1318Hz#defineh_fa1396//将“h_fa”宏定义为高音“4”的频率1396Hz#defineh_sao1567//将“h_sao”宏定义为高音“5”的频率1567Hz☆飞翔的蚂蚁☆☆飞翔的蚂蚁☆#defineh_la1760//将“h_la”宏定义为高音“6”的频率1760Hz#defineh_xi1975//将“h_xi”宏定义为高音“7”的频率1975Hz/**************************************************************函数功能:软件延时子程序**************************************************************/voiddelay20ms(void){unsignedchari,j;for(i=0;i100;i++)for(j=0;j60;j++);}/*******************************************函数功能:节拍的延时的基本单位,延时200ms******************************************/voiddelay(){unsignedchari,j;for(i=0;i250;i++)for(j=0;j250;j++);}/*******************************************函数功能:输出音频入口参数:F******************************************/voidOutput_Sound(void){C=(50000/f)*10;//计算定时常数TH0=(8192-C)/32;//可证明这是13位计数器TH0高8位的赋初值方法TL0=(8192-C)%32;//可证明这是13位计数器TL0低5位的赋初值方法TR0=1;//开定时T0for(s=0;s2;s++)delay();//延时200ms,播放音频TR0=0;//关闭定时器sound=1;//关闭蜂鸣器keyval=0xff;//播放按键音频后,将按键值更改,停止播放}/*******************************************函数功能:主函数******************************************/voidmain(void)☆飞翔的蚂蚁☆☆飞翔的蚂蚁☆{unsignedcharn,m,k,x,z;unsignedcharpu[41];//定义数组pu[]用于存储键盘扫描结果while(1){m=0;//对m付初值n=0;//对n付初值k=0;//对k付初值x=0;//对x付初值EA=1;//开总中断ET0=1;//定时器T0中断允许ET1=1;//定时器T1中断允许TR1=1;//定时器T1启动,开始键盘扫描TMOD=0x10;//分别使用定时器T1的模式1,T0的模式0TH1=(65536-500)/256;//定时器T1的高8位赋初值TL1=(65536-500)%256;//定时器T1的高8位赋初值while(n!=1&&m40)//无限循环{P34=0;//点亮P3.4口的LED灯用作扫描键盘时的指示灯P35=1;//关闭P3.5口的LED灯用作播放时的指示灯switch(keyval){case1:f=dao;//如果第1个键按下,将中音1的频率赋给fOutput_Sound();//转去计算定时常数pu[m]=dao;//将键盘扫描的结果付数组pu[]的元素m++;//付值完毕m自动加1用于对数组的下一个元素付值break;case2:f=l_xi;//如果第2个键按下,将低音7的频率赋给fOutput_Sound();//转去计算定时常数pu[m]=l_xi;//将键盘扫描的结果付数组pu[]的元素m++;//付值完毕m自动加1用于对数组的下一个元素付值break;case3:f=l_la;//如果第3☆飞翔的蚂蚁☆☆飞翔的蚂蚁☆个键按下,将低音6的频率赋给fOutput_Sound();//转去计算定时常数pu[m]=l_la;//将键盘扫描的结果付数组pu[]的元素m++;//付值完毕m自动加1用于对数组的下一个元素付值break;case4:f=l_sao;//如果第4个键按下,将低音5的频率赋给fOutput_Sound();//转去计算定时常数pu[m]=l_sao;//将键盘扫描的结果付数组pu[]的元素m++;//付值完毕m自动加1用于对数组的下一个元素付值break;case5:f=sao;//如果第5个键按下,将中音5的频率赋给fOutput_Sound();//转去计算定时常数pu[m]=sao;//将键盘扫描的结果付数组pu[]的元素m++;//付值完毕m自动加1用于对数组的下一个元素付值break;case6:f=fa;//如果第6个键按下,将中音4的频率赋给fOutput_Sound();//转去计算定时常数pu[m]=fa;//将键盘扫描的结果付数组pu[]的元素m++;//付值完毕m自动加1用于对数组的下一个元素付值break;case7:f=mi;//如果第7个键按下,将中音3的频率赋给fOutput_Sound();//转去计算定时常数pu[m]=mi;//将键盘扫描的结果付数组pu[]的元素m++;//付值完毕m自动加1用于对数组的下一个元素付值break;case8:f=re;//如果第8个键按下,将中音2的频率赋给fOutput_Sound();//转去计算定时常数pu[m]=re;//将键盘扫描的结果付数组pu[]的元素☆飞翔的蚂蚁☆☆飞翔的蚂蚁☆m++;//付值完毕m自动加1用于对数组的下一个元素付值break;case9:f=h_re;//如果第9个键按下,将高音2的频率赋给fOutput_Sound();//转去计算定时常数pu[m]=h_re;//将键盘扫描的结果付数组pu[]的元素m++;//付值完毕m自动加1用于对数组的下一个元素付值break;case10:f=h_dao;//如果第10个键按下,将高音1的频率赋给fOutput_Sound();//转去计算定时常数pu[m]=h_dao;//将键盘扫描的结果付数组pu[]的元素m++;//付值完毕m自动加1用于对数组的下一个元素付值break;case11:f=xi;//如果第11个键按下,将中音7的频率赋给fOutput_Sound();//转去计算定时常数pu[m]=xi;//将键盘扫描的结果付数组pu[]的元素m++;//付值完毕m自动加1用于对数组的下一个元素付值break;case12:f=la;//如果第12个键按下,将中音6的频率赋给fOutput_Sound();//转去计算定时常数pu[m]=la;//将键盘扫描的结果付数组pu[]的元素m++;//付值完毕m自动加1用于对数组的下一个元素付值break;case13:f=h_la;//如果第13个键按下,将高音6的频率赋给fOutput_Sound();//转去计算定时常数pu[m]=h_la;//将键盘扫描的结果付数组pu[]的元素m++;//付值完毕m自动加1用于对数组的下一个元素付值break;case14:f=h_sao;//如果第14个键按下,将高音5☆飞翔的蚂蚁☆☆飞翔的蚂蚁☆的频率赋给fOutput_Sound();//转去计算定时常数pu[m]=h_sao;//将键盘扫描的结果付数组pu[]的元素m++;//付值完毕m自动加1用于对数组的下一个元素付值break;case15:f=h_fa;//如果第15个键按下,将高音4的频率赋给fOutput_Sound();//转去计算定时常数pu[m]=h_fa;//将键盘扫描的结果付数组pu[]的元素m++;//付值完毕m自动加1用于对数组的下一个元素付值break;case16:f=h_mi;//如果第16个键按下,将高音3的频率赋给fOutput_Sound();//转去计算定时常数pu[m]=h_mi;//将键盘扫描的结果付数组pu[]的元素m++;//付值完毕m自动加1用于对数组的下一个元素付值break;case17:n=1;//跳出循环break;}}while(pu[k]!=0)//播放通过按键写入的音乐{P34=1;//关闭P3.4口的LED灯用作扫描键盘时的指示灯P35=0;//打开P3.5口的LED灯用播放时的指示灯f=pu[k];Output_Sound();k++;}for(z=0;z41;z++){pu[z]=0;}}}/**************************************************************☆飞翔的蚂蚁☆☆飞翔的蚂蚁☆函数功能:定时器T0的中断服务子程序,使P3.7引脚输出音频方波**************************************************************/voidTime0_serve(void)interrupt1using1{TH0=(8192-C)/32;//可证明这是13位计数器TH0高8位的赋初值方法TL0=(8192-C)%32;

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功