基于51单片机简易电子琴设计报告(编辑修改稿)内容摘要:

据的高 4位代表音符对应的序列号,低 4 位代表节拍数 //例如 0x82,表示第八个音符 ,延时两个节拍 uchar code Music_One[]={ 0x02,0x82,0x16,0x32,0x54,0x02,0x52,0xA6,0x32,0x54,0x02,0x52,0x64,0x74,0xB6,0x64,0x52,0x5C,0x32,0x22,0x16,0x12,0x14,0x32,0x22,0x26,0x12,0x94,0x22,0x32,0x2C,0x32,0x52,0x36,0x22,0x14,0x54,0xAC,0x92,0xA2,0x96,0xA2,0x96,0x82,0x3C,0x54,0x36,0x22,0x14,0x54,0xAC,0x92,0xA2,0x16,0x12,0x14,0x22,0x32,0x2C,0x02,0x82,0x16,0x32,0x56,0x12,0xA6,0x32,0x56,0x52,0x66,0x72,0xB6,0x62,0x1C, 0xff}。 void PlayMusic(void) { uchar yinfu,jiepai,yinfu_led。 uchar i,j。 //循环变量 uchar *p1=Music_One,*p2=MusicYinFu。 //p1 开始指向第一首歌 //p2 去歌曲的音符和节拍 for(i=0。 *(p1+i)!=0XFF。 i++) { yinfu=((*(p1+i))4)。 //取出音符对应的序号 ,如 //Music_One[2]=0x82, 音符代表MusicYinFu[8] jiepai=((*(p1+i))amp。 0X0F)。 //取出节拍数 yinfu_led=yinfu%7。 //音符对应 LED 显示号 if(yinfu!=0) { th0=*(p2+(yinfu1)*2)。 tl0=*(p2+(yinfu1)*2+1)。 TR0=1。 ET0=1。 } else //如 Music_One[1]=0x02,这里的音符为 0,表停顿 18 { TR0=0。 Beep=1。 } for(j=jiepai。 j0。 j) { led=LED_Dis[yinfu_led1]。 Delayms(180)。 //一 拍延时时间 key_scan()。 if(KeyNo==23) //退出播放 {ET0=1。 break。 } else if(KeyNo==22)//下一曲 { if(p1==Music_One) 若正在播放第一首,那么下一曲就是第二首 {ET0=0。 p1=Music_Two。 } else if(p1==Music_Two)//若是第二首,下一首是第三首 {ET0=0。 p1=Music_Three。 } else {ET0=0。 p1=Music_One。 }//同理 i=0。 KeyNo=26。 //一定要改变 KeyNo 的值,否则只播放一个音符 Delayms(1000)。 //歌曲切换,停顿一下 break。 //跳出之前播放的歌曲,以使播放下一曲 } } if(*(p1+i+1)==0XFF) //判断歌曲是否播放完毕 { 19 ET0=0。 Beep=0。 //暂停一下 if(p1==Music_One) //如果刚刚结束第一首歌,播放第二首歌 { i=0。 p1=Music_Two。 Delayms(2020)。 } else if(p1==Music_Two) //如果刚刚结束第二首歌,播放第三首歌 { i=0。 p1=Music_Three。 Delayms(2020)。 } else //如果刚刚结束第三首歌,播放第一首歌 { i=0。 p1=Music_One。 Delayms(3000)。 } } TR0=0。 ET0=0。 if(KeyNo==23) { ET0=1。 20 break。 } } ET0=1。 } : N Y KeyNo21 KeyNo21 KeyNo==23 程序框图: 5 程序实现: void Record_yinfu() { uchar keystate,i=0。 主程序 检测是否有按键按下 LED指示灯亮 按键扫描 关定时器关 定时器开启,播放按键所对应的音符,同时 LED灯显示那个音符按下 播放已按下的键,播放完毕后,绿色LED指示灯灭 存储按下键的键值,以及按下键的时间 21 uchar history[100]={0}。 //记录按下的键音 ,初始化 led_zhishi=1。 //开灯 while(KeyState())。 //等待按键释放 while(1) { keystate=KeyState()。 //按键状态检测 if(keystate) { key_scan()。 if(KeyNo==23) Recordonoff=~Recordonoff。 //退出录音 else if(KeyNo21)//音符键 { do //这里用 do while 循环能使音符播放随按键松开而停止,//同时计时也是随按键松开而停止计时,这样能比较准确计算按键按下的时间 { key_scan()。 if(KeyNo21) { yuzhi=(KeyNo+3)%7。 //判断 DO RE MI FA... YinFu_DiZhongGao_Flag(KeyNo)。 th0=Tone_Delay_Table[KeyNo]/256。 tl0=Tone_Delay_Table[KeyNo]%256。 TR0=1。 TR1=1。 history[i*2]=KeyNo。 //存储按键的键的音符 history[i*2+1]=Record_Timer。 //存储按键按下不松的时间 22 } keystate=KeyState()。 }while(keystate)。 //如果按键松开,表示按下的一个音符结束 i++。 //接下来按的键就是下一个音符 } } else//表示没键按下,那得关闭定时器, led 灭 { led=0x00。 Record_Timer=0。 //按键按下定时数清零,下一个按键按下后从新计时 TR0=0。 TR1=0。 } if(!Recordonoff)//按下录音播放键,回放按下的音符 { for(i=0。 history[i*2+1]!=0。 i++)//history[i*2+1]存的是按键对//应的音符 { yuzhi=(history[i*2]+3)%7。 //判断 DO RE MI FA... YinFu_DiZhongGao_Flag(history[i*2])。 //判断是中高低音 th0=Tone_Delay_Table[history[i*2]]/256。 tl0=Tone_Delay_Table[history[i*2]]%256。 TR0=1。 TR1=1。 for(history[i*2+1]。 history[i*2+1]0。 history[i*2+1]) Delayms(10)。 //history[i*2+1]中存放的是按键按 //下的时间次数,一次表示一个 10ms,因为中断时间是 10ms Delayms(10)。 //音符之间延时一下 led=0x00。 } TR0=0。 //回放完了就关掉定时器 23 TR1=0。 for(i=0。 i100。 i++) //清除录音数据 history[i]=0。 led_zhishi=0。 //关闭指示灯 while(KeyState())。 //等待按键释放 break。 //跳出死循环,回到主程序 } } } 硬件调试主要是针对单片机部分进行的调试。 在上电之前,先确保电路中不存在断路或短路情况,这一工作是整个调试工作的第一步,也是非常重要的一个步骤。 在这部分调试中主要使用的工具是万用表,用来完成检测电路中是否存在断路或者短路情况的任务。 注意焊点之间,确保焊点没有短接在一起,同时注意焊点的美观,确保没有开路以及短路的现象出现。 在确保硬件。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。