您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 基于CPLD与51单片机的定时器与音乐播放器
《电子系统设计》课程设计报告0基于CPLD与51单片机的定时器与音乐播放器马大康06007122万树06007113覃朋060071102009.12《电子系统设计》课程设计报告1一、系统简介本系统利用CPLD和51单片机联合实现了倒计时器和音乐播放器的功能。作为《电子系统设计》的课程设计,本系统充分利用了两块开发板上的资源,并实现了可编程器件与单片机之间的串口异步通信,器件连接方便,并有良好的人机交互界面。二、系统结构框图与思路51单片机串口通信倒计时器初值1602液晶MAXIICPLD拨码开关设置倒计时初值独立按键模式选择数码管拨码开关暂停与停止4位数码管蜂鸣器图1系统结构框图PIN_18VCCClk0INPUTPIN_42PIN_43PIN_44PIN_45PIN_48PIN_49PIN_50VCCKeyDetect[6..0]INPUTPIN_51VCCnRstINPUTPIN_30PIN_31PIN_32PIN_37PIN_38PIN_39PIN_40PIN_41VCCDataIn[7..0]INPUTPIN_23PIN_21PIN_29PIN_27PIN_28PIN_22PIN_24SEG[6..0]OUTPUTPIN_118LCD_ENOUTPUTPIN_120RSOUTPUTPIN_119RWOUTPUTPIN_108PIN_109PIN_110PIN_111PIN_112PIN_113PIN_114PIN_117DB8[7..0]OUTPUTPIN_7TxDOUTPUTPIN_107TxDoneOUTPUTPIN_52speakerOUTPUTDB[2..0]SEG[6..0]converterinst3Clk_Div_Key100s00s11s22ParameterValueKeyDetect[6..0]Clk0KeyValue[2..0]keyboardinst7Clk0nRstWRDataIn[7..0]TxDTxDoneSerialBlockinst10Clk0KeyValue[2..0]EN_SerialEN_MusicModeControllerinst9ENClk0speakerMusicBlockinst11clk_50MrstKey_Value[2..0]LCD_ENRSRWDB8[7..0]LCD_TopinstnRstClk0Clk0Clk0图2CPLD内部功能模块划分及连接经过对两块开发板板上资源的对比,我们发现,CPLD板上的资源较为丰富,尤其是其8个独立按键和1602液晶屏,十分适合人机交互,因此我们选择用CPLD开发板作为主控板。单片机板上拥有4个七段数码管,显示变化的数字十分方便,可以构成1~60分钟可变初值的倒计时器。由于之前的实验中已经实现了在CPLD中嵌入简易的UART,因此可以利用CPLD上的8个拨码开关设定倒计时器的初值,并通过异步串行通信传输给单片《电子系统设计》课程设计报告2机。单片机上的拨码可以实现对倒计时器进行暂停、清零。除此之外,由于CPLD板上已有蜂鸣器,可以播放预先存入的歌曲,并通过板上的其他按键控制音乐的暂停与继续播放。介于上述分析,设计的系统结构框图如图1所示,CPLD中功能模块的划分如图2所示。操作流程:CPLD板上:Key1—进入倒计时器模式,设定倒计时器初值(通过8个拨码),液晶屏上显示“D-counterSettimeneeded”。Key2—发送倒计时器初值到单片机,单片机开始倒计时,液晶屏上显示“D-counterD-countering”Key3—进入音乐盒模式,播放音乐《喀秋莎》。Key4—暂停音乐播放单片机板上:在倒计时过程中,将拨码开关1向上拨,倒计时暂停,向下拨后继续倒计时。在倒计时过程中,按下CPLD板上的Key1后(此时为设定初值模式),将拨码开关2向上拨,倒计时器清零,此时可对其重新置初值。三、功能模块的实现1、异步串行发送模块想要在CPLD中嵌入异步串行通信模块,就必须对异步串行通信协议有深入的理解,由于系统中只用到了发送模块,这里仅对发送模块的设计做介绍。在空闲时,发送1。当发送使能WR为高电平且发送缓冲寄存器为高电平时,向发送缓冲寄存器中写入待发送的数据。当发送移位寄存器为空时,将发送缓冲寄存器中的值置入发送移位寄存器,并将TxDone变为低电平,表示发送一个字节的周期开始,此时不能向发送寄存器中置数。发送周期开始首先发送一个低电平作为起始位,接着从数据的低位开始发送数据,发送结束后发送高电平作为结束位,并将TxDone变为高电平,表示发送一个字节结束。整个模块的状态图如图3所示。S0:写发送缓冲寄存器S3:停止S2:发送一帧数据S1:写发送移位寄存器!nRstWR==1&&YBufEm==1TShfEm==1BitCnt10BitCnt==10图3Clk0nRstWRDataIn[7..0]TxDTxDoneSerialBlockinst10VCCClk_50MINPUTpin_nameOUTPUTpin_name1OUTPUTVCCnRstINPUTVCCWRINPUTVCCDataIn[7..0]INPUT《电子系统设计》课程设计报告3图4标准的UART设计是将系统时钟分频成16×Baudrate的频率,然后每个16个这样的时钟周期发送一位数据。我们这里的设计与标准设计有些不同,我们直接把系统时钟分频成波特率时钟,然后每个周期发送一位数据,这样的效果与原先相同,但在编程上轻松了许多。2、按键检测模块图5通过在每个时钟的上升沿检测引脚的值,经过延时再判断达到消抖的作用,再将其转化为键值输出。3、液晶显示模块图6LCD_Top模块内部由时钟分频模块与LCD驱动模块构成,其中时钟分频模块负责将50M的系统时钟分频成500Hz的LCD驱动时钟。LCD驱动模块主要负责产生控制信号并发送显示数据。LCD驱动模块的状态流程图如下图所示。!nRstClear_LCDSet_Display写入第一行起始地址根据键值将对应的显示数据赋给Data_First_Buf写第一行的DDRAM写入第二行起始地址根据键值将对应的显示数据赋给Data_First_Buf写第二行的DDRAM空闲图74、蜂鸣器模块KeyDetect[6..0]Clk0KeyValue[2..0]keyboardinst7Clk_Div_Key100s00s11s22ParameterValueVCCKey_Detect[6..0]INPUTVCCClk0INPUTKeyValue[2..0]OUTPUTclk_50MrstKey_Value[2..0]LCD_ENRSRWDB8[7..0]LCD_TopinstVCCClk_50MINPUTVCCnRstINPUTVCCKey_Value[2..0]INPUTLCD_ENOUTPUTRSOUTPUTRWOUTPUTDB[7..0]OUTPUT《电子系统设计》课程设计报告4图8蜂鸣器演奏音乐模块较为简单,我们参考实验指导书中的代码,将《梁祝》的谱换成了《喀秋莎》。5、定时器模块定时器模块在单片机中,其程序流程图如下:串口初始化串口有接收中断产生?YesFlag=1关串口中断读接收缓存器拨码1为低电平?YesNo倒计时计数减一拨码2为低电平?送数码管显示NoNo图10ENClk0speakerMusicBlockinst11VCCClk_50M10INPUTVCCENINPUTspeakerOUTPUT《电子系统设计》课程设计报告5在这块单片机板上做倒计时器有两个缺陷:第一,我们采用的是软件定时的方式,精确度不如硬件电路高;第二,此开发板的按键和拨码没有直接接到单片机的I/O口上,而是通过锁存器挂在总线上,这就决定了使用按键只有采取查询的方法,而不能采用中断的方法。因此在倒计时的过程中,每延时1秒前需要查询按键的值来实现暂停或停止的功能,指令也是需要执行时间的,这样会使延时时间超过1s,而且数码管略微有些闪烁。不过,经过缩短延时1s程序的时间,我们将每秒钟的误差控制在了1/30秒。四、系统调试过程本系统由三人共同合力完成,具体分工如下:马大康负责完成了串口通信模块、液晶显示模块和按键控制模块,并撰写了最终的设计文档。万树负责完成了单片机上倒计时模块以及乐谱的输入,覃朋负责完成了蜂鸣器模块。系统的调试是按照先单独模块测试,再组合拼接整体调试的步骤进行的,整个过程有条不紊,系统的总体设计也根据单独模块测试的情况与原先计划做出了相应调整。比如原先是计划利用USB接口实现PC与CPLD板的通信,在PC上自行开发小软件以控制CPLD板上的资源。但由于USB模块(FT245)没有在计划的时间内调试成功,我们就放弃了此方案,改用CPLD板上的按键来控制整个系统,这样并不影响系统的整体功能。1、串口通信模块的调试由于考虑到在CPLD中实现UART并非易事,并且要实现我们系统的目标最好的方法就是利用串口通信,因此我们率先尝试了此模块。该模块的调试时间表如下:12.9~12.13深入学习了串口通信协议,编写了verilog代码,并在QuartusII软件中仿真成功。这里的仿真是指通过自行设计的发送模块TxUnit向自行设计的接收模块RxUnit发送数据,接收到的数据无误。12.21实现了CPLD板与PC机之间的通信,通过拨码设置发送数据,PC端的串口调试工具接收到数据无误。12.26实现了CPLD板与单片机板的通信。在软件编写过程中,我们参考了很多资料,观摩了别人写的一些代码。本想利用别人的代码加以改进,但未能成功。我想原因有二:第一,从网上下载的代码可靠性值得怀疑,其本身有无经过验证还不清楚。第二,自身阅读verilog代码能力还需加强,不知是不是因为软件中不能写中文注释的原因,很多代码没有注释,阅读起来相当吃力。由于接触verilog时间不长,面对长篇的代码常常抓不住重点,从头到尾都读完了,却弄不清每个状态都实现了什么功能。在修改代码未果的情况下,我决定,与其花时间阅读那么冗长的代码,不如先花时间把串口通信的协议(尤其是接收模块的操作)吃透,然后尝试自己编写代码,这样代码中的每一步自己都知道是什么意思,出了错解决起来也方便。通过此次的串口模块程序的编写,我初步掌握了利用状态机编写时序的方法,摒弃了烦琐的条件判断语句(网上部分代码就是如此编写的,十分不规范),十分具有锻炼意义。从软件调通到实现CPLD和PC机的通信没有花太长时间,于是便开始准备CPLD和单片机间的通信。由于两块开发板上的RS232口均为母口,因此我在网《电子系统设计》课程设计报告6上购买了一根公对公的串口线。当我迫不及待地将两块板子连接起来时,什么反应也没有。我这时有些不知所措,因为CPLD可以发送数据给PC,PC也能发送数据给单片机,波特率都是9600,为什么将两者直接连接就不行了呢?出问题的值可能有一个地方,那就是我够买的那根公头对公头的串口线。难道线是断的,这商家也太不厚道了吧,应该不会。这时在我脑海中突然浮现出串口通信最基本的那张示意图:我之前一直认为TxD与RxD的交叉应该是在传输线中完成的,但会不会传输线里没有完成呢?于是我拿起万用表测量了公对公串口线的两个2脚,发现这两个脚是导通的,也就是说串口线中没有实现信号的交叉!再对着两块板子的原理图看了一下,TxD都接的是各自的串口座2脚,RxD都接的是各自的串口座3脚,这样的话相当于把两个发送的TxD管脚连接在了一起,要实现通信是根本不可能的。后来在网上一查,原来串口线有直连线与交叉线两种之分,(估计直连线是单纯做延长用的),而公对公的线没有交叉线,需要定制。不怕出问题,怕的是出了问题找不到问题的原因,既然找到了原因,就有方法解决。于是我来到了创新实验室,先用两根导线将RxD与TxD连接起来,并将两块开发板共地。打开电源后,按下按键,单片机成功接收到了CPLD发送的数据。这证明了之前的不成功完全是因为硬件电路的问题。为了使最后的作品方便展示,两根导线显然不够稳定。于是我将那根公对公的串
本文标题:基于CPLD与51单片机的定时器与音乐播放器
链接地址:https://www.777doc.com/doc-2568955 .html