基于单片机的电子音乐盒的设计tlcd内容摘要:

ay1ms(500)。 break。 } } } 音 乐播放 程序 流程图 开 始创 建 新 的 频 率 表计 算 歌 曲 长 度读 音 符根 据 音 符 对 应 求 出发 音 长 度蜂 鸣 器 发 声判 断 音 符 是 否 读 完或 暂 停 键 是 否 按 下否蜂 鸣 器 停 止 发 音结 束是 14 图 9 音乐播放程序流程图 音乐播放程序 void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed) { unsigned int NewFreTab[12]。 //新的频率表 unsigned char i,j。 unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength。 unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD。 for(i=0。 i12。 i++) // 根据调号及升降八度来生成新的频率表 { j = i + Signature。 if(j 11) { j = j12。 NewFreTab[i] = FreTab[j]*2。 } else NewFreTab[i] = FreTab[j]。 if(Octachord == 1) NewFreTab[i]=2。 else if(Octachord == 3) NewFreTab[i]=2。 } SoundLength = 0。 while(Sound[SoundLength] != 0x00) //计算歌曲长度 { SoundLength+=2。 } Point = 0。 Tone = Sound[Point]。 Length = Sound[Point+1]。 // 读出第一个音符和它时时值 LDiv0 = 12020/Speed。 // 算出 1 分音符的长度 (几个 10ms) 15 LDiv4 = LDiv0/4。 // 算出 4 分音符的长度 LDiv4 = LDiv4LDiv4*SOUND_SPACE。 // 普通音最长间隔标准 TR0 = 0。 TR1 = 1。 while(Point SoundLengthamp。 amp。 K1==1) //歌曲代码未放完且暂停键未被按下 { SL=Tone%10。 //计算出音符 SM=Tone/10%10。 //计算出高低音 SH=Tone/100。 //计算出是否升半 CurrentFre = NewFreTab[SignTab[SL1]+SH]。 //查出对应音符的频率 if(SL!=0) { if (SM==1) CurrentFre = 2。 //低音 if (SM==3) CurrentFre = 2。 //高音 Temp_T = 65536(50000/CurrentFre)*10/(12020000/SYSTEM_OSC)。 //计算计数器初值 Sound_Temp_TH0 = Temp_T/256。 Sound_Temp_TL0 = Temp_T%256。 TH0 = Sound_Temp_TH0。 TL0 = Sound_Temp_TL0 + 12。 //加 12 是对中断延时的补偿 } SLen=LengthTab[Length%10]。 //算出是几分音符 XG=Length/10%10。 //算出音符类型 (0 普通 1 连音 2 顿音 ) FD=Length/100。 LDiv=LDiv0/SLen。 //算出连音音符演奏的长度 (多少个 10ms) if (FD==1) LDiv=LDiv+LDiv/2。 if(XG!=1) if(XG==0) //算出普通音符的演奏长度 if (SLen=4) LDiv1=LDivLDiv4。 else LDiv1=LDiv*SOUND_SPACE。 else LDiv1=LDiv/2。 //算出顿音的演奏长度 else LDiv1=LDiv。 if(SL==0) LDiv1=0。 16 LDiv2=LDivLDiv1。 //算出不发音的长度 if (SL!=0) { TR0=1。 for(i=LDiv1。 i0。 i) //发规定长度的音 { while(TF1==0)。 TH1 = Sound_Temp_TH1。 TL1 = Sound_Temp_TL1。 TF1=0。 } } if(LDiv2!=0) { TR0=0。 BeepIO=0。 for(i=LDiv2。 i0。 i) //音符间的间隔 { while(TF1==0)。 TH1 = Sound_Temp_TH1。 TL1 = Sound_Temp_TL1。 TF1=0。 } } Point+=2。 Tone=Sound[Point]。 Length=Sound[Point+1]。 } BeepIO = 0。 } 电路 仿真 调试 原理图的绘制 仿真平台为 Proteus 软件, Proteus 软件是世界上著名的 EDA 工具 (仿真软件 ),能完成原理图布图、代码调试到单片机与外围电路协同仿 真,一键切换到 PCB设计它不仅具有其它 EDA 工具软件的仿真功能,还能仿真单片机及外围器件,17 是目前最好的仿真单片机及外围器件的工具。 PROTEUS 电路设计是在 PROTEUS ISIS 环境中绘制的,该编辑环境具有良好的人机交互界面,功能强大极易上手。 首先通过桌面进入主程序,绘制原来图的主要任务是从元件库中选取绘制电路所需要的元件。 可以通过点击选择器顶端左侧的 “P”或者通过命令打开,我们常用的是按钮;在查找到并放置完所有需要的器件后,我们需要接着连接元件,即在 PROTEUS ISIS 的编辑窗口布线。 PROTEUS ISIS 中没有布线模式,但用户可以在任意时刻放置连线和编辑连线。 在完成绘制所需的电路图前,用户需要放置并连接断轴。 在电路原理图中放置两种通用的端子,一种是接地端子一种是电源端子。 当在 PROTEUS ISIS 编辑窗口放置元件时,每一元件都有唯一的元件标号及元件值与之对应。 原件号是PROTEUS ISIS 的实时注释功能自动标注的,这一功能可在菜单中设置选择是否开启。 PROTEUS ISIS 中也支持块操作,当用户需要对电路中的某一部分进行操作时,可以使用该功能。 系统共支持块移动、块复制、块旋转、块删除等实用功能,充分利用这些功能可以极大的提高我们绘图的效率。 我们绘制完所有的元件后,最后进行统一标注, PROTEUS ISIS 支持注释功能,可以把我们所绘制的原理图中的器件根据我们的需要添加上特殊的注释,以表示特定的含义。 根据设计电路绘制完后的电路图如图 所示。 18 仿真结果 图 10 仿真图 通过 Protues 仿真结果,这次课程设计的要求已全部满足。 19 参考文献 [1] 阎石 .数字电子技术基础(第四版) [M].高等教育出版社 . [2] 张毅刚等 .MCS51 单片机应用设计 .哈尔滨工业电子出版社, 1996 [3] 何立民 .单片机应用技术选编 .北京航空航天大学出版社, 2020 [4] 张友德等 .单片微型机原理应用与实验,复旦大学出版社, 1996 [5] 邬宽明 .单片机外围器件实用手册 .北京航空航天大学出版社, 1998 20 附录 键盘扫描头文件: ifndef _key_H_ define _key_H_ define uchar unsigned char uchar k。 void delay1(void) //延时程序 { uchar i,j。 for(i=20。 i0。 i) for(j=248。 j0。 j)。 } void Getch ( ) { uchar X,Y,Z。 P1=0xff。 P1=0xf3。 //先对 P0 置数 行扫描 if(P1!=0xf3) //判断是否有键按下 { delay1()。 //延时 ,软件去干扰 if(P1!=0xf3) //确认按键按下 X = P3。 { X=P1。 //保存行扫描时有键按下时状态 P1=0xfc。 //列扫描 Y=P1。 //保存列扫描时有键按下时状态 Z=X|Y。 //取出键值 switch ( Z ) //判断键值(那一个键按下) { case 0xf9: k=0。 break。 //对键值赋值 case 0xf5: k=1。 break。 case 0xfa: k=2。 break。 case 0xf6: k=3。 break。 } } } } LCD 显示头文件 ifndef _lcdshow_H_ define _lcdshow_H_ define uchar unsigned char define uint unsigned int 21 define LCDPORT P0 uchar code tab[]=Press key。 uchar code tab1[]=Select song。 uchar code tab2[]=First Song。 uchar code tab3[]=butterfly。 uchar code tab4[]=Second Song。 uchar code tab5[]=Jingle bell。 uchar code tab6[]=Third Song。 uchar code tab7[]=Yesterday。 uchar code tab8[]=Forth Song。 uchar code tab9[]=Youth League。 sbit LCDE=P2^2。 sbit LCDRW=P2^1。 sbit LCDRS=P2^0。 void Delay() { uint uiCount。 for(uiCount=0。 uiCountuiCount++)。 } void WriteCMD(uchar Commond)//LCD 写指令函数 { Del。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。