基于单片机的电子音乐盒的设计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。基于单片机的电子音乐盒的设计tlcd
相关推荐
,8EH MOV DS1302_DATA,00H LCALL WRITE MOV DS1302_ADDR,80H MOV DS1302_DATA,80H LCALL WRITE GWAIT: LCALL DISPLAY JNB ,GWAIT SETG1: LCALL DISPLAY JNB ,SETG2 JNB ,GADDYEAR AJMP SETG1 GADDYEAR: MOV R7,66H
P 27P 28P 32P 33P 34P 35P 36P 37P 38P 39T11589 C 51I N T 012R E S E T9RD17WR16E A /V P P31A L E /P30P S E N29V C C40GND20P 1 . 0 P 1 . 1 P 1 . 2 P 1 . 3P 1 . 4P 1 . 5P 1 . 6P 1 . 7abcdefgABCD744710
方案二: 采用 AT89S52 单片机 AT89S52 是美国 ATMEL 公司生产的低功耗、高性能 CMOS 8 位单片机,片内含 8k bytes 的可反复擦写的只读程序存储器 (PEROM)和256 bytes 的随机存取数据存储器 (RAM ),器件采用 ATMEL 公司的高密度、非易失性存储技术生产,与标准 MCS51 指令系统及 8052 产品引脚兼容,片内置通用 8位中央处理器
分频接至 ADC0809 的 CLK端。 接 ADC0809 的启动控制输入端口 STAR 和地址锁存控制信号端口 ALE, 、 分别连接 ADC0809 的输出允许控制端口 OE、转换结束信号脉冲输出端口。 , 口连接串口通信模块。 其原理图如图 : 9 西华大学 课程设计说明书 图 中央控制器原理图 量程自动 转换模块 量程自动转换电路框图如图 4所示.被测量程判断器判断出被测量的范围
“1010”;另外, “*”,“”字号码, MT8870 输出的 8421 码分别为 “1011”和 “1100”。 有些技术资料会出现错误,包括比较权威的手册,所以在 本次 实验中,记录下测量的每一组数据后,才把这些数据应用于程序当中。 为了使单片机 AT89C51 获取有效数据, MT8870的 STD 有效端经反相后接 CPU 的 INT0 引脚。 当 MT8870 获取有效双音多频信号后
会更多的出现,而单片机和智能理论的结合,将来不但更多的改进现行智能温度测量与控制电器,而且将会产生全新的智能温度测量与控制电器。 3 总体设计 系统硬件框图 本系统由单片机 AT89C5温度检测电路、键盘显示及报警电路、时钟电路、温度控制电路等部分组成。 系统中采用了 新型 元 件,功能强、精度高、硬件电路简单。 本文是基于先进的单片机控制技术,在低耗能下可实现对炉温的精确控制。