




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于CPLD与51单片机的定时器与音乐播放器马大康 万树覃朋2009.12一、系统简介本系统利用CPLD和51单片机联合实现了倒计时器和音乐播放器的功能。作为电子系统设计的课程设计,本系统充分利用了两块开发板上的资源,并实现了可编程器件与单片机之间的串口异步通信,器件连接方便,并有良好的人机交互界面。二、系统结构框图与思路图1系统结构框图图2 CPLD内部功能模块划分及连接经过对两块开发板板上资源的对比,我们发现,CPLD板上的资源较为丰富,尤其是其8个独立按键和1602液晶屏,十分适合人机交互,因此我们选择用CPLD开发板作为主控板。单片机板上拥有4个七段数码管,显示变化的数字十分方便,可以
2、构成160分钟可变初值的倒计时器。由于之前的实验中已经实现了在CPLD中嵌入简易的UART,因此可以利用CPLD上的8个拨码开关设定倒计时器的初值,并通过异步串行通信传输给单片机。单片机上的拨码可以实现对倒计时器进行暂停、清零。除此之外,由于CPLD板上已有蜂鸣器,可以播放预先存入的歌曲,并通过板上的其他按键控制音乐的暂停与继续播放。介于上述分析,设计的系统结构框图如图1所示,CPLD中功能模块的划分如图2所示。操作流程:CPLD板上:Key1进入倒计时器模式,设定倒计时器初值(通过8个拨码),液晶屏上显示“D-counterSet time needed”。Key2发送倒计时器初值到单片机,
3、单片机开始倒计时,液晶屏上显示“D-counterD-countering”Key3进入音乐盒模式,播放音乐喀秋莎。Key4暂停音乐播放单片机板上:在倒计时过程中,将拨码开关1向上拨,倒计时暂停,向下拨后继续倒计时。在倒计时过程中,按下CPLD板上的Key1后(此时为设定初值模式),将拨码开关2向上拨,倒计时器清零,此时可对其重新置初值。三、功能模块的实现1、异步串行发送模块想要在CPLD中嵌入异步串行通信模块,就必须对异步串行通信协议有深入的理解,由于系统中只用到了发送模块,这里仅对发送模块的设计做介绍。在空闲时,发送1。当发送使能WR为高电平且发送缓冲寄存器为高电平时,向发送缓冲寄存器中写
4、入待发送的数据。当发送移位寄存器为空时,将发送缓冲寄存器中的值置入发送移位寄存器,并将TxDone变为低电平,表示发送一个字节的周期开始,此时不能向发送寄存器中置数。发送周期开始首先发送一个低电平作为起始位,接着从数据的低位开始发送数据,发送结束后发送高电平作为结束位,并将TxDone变为高电平,表示发送一个字节结束。整个模块的状态图如图3所示。图3图4标准的UART设计是将系统时钟分频成16Baudrate的频率,然后每个16个这样的时钟周期发送一位数据。我们这里的设计与标准设计有些不同,我们直接把系统时钟分频成波特率时钟,然后每个周期发送一位数据,这样的效果与原先相同,但在编程上轻松了许多
5、。2、按键检测模块图5通过在每个时钟的上升沿检测引脚的值,经过延时再判断达到消抖的作用,再将其转化为键值输出。3、液晶显示模块图6LCD_Top模块内部由时钟分频模块与LCD驱动模块构成,其中时钟分频模块负责将50M的系统时钟分频成500Hz的LCD驱动时钟。LCD驱动模块主要负责产生控制信号并发送显示数据。LCD驱动模块的状态流程图如下图所示。图74、蜂鸣器模块图8蜂鸣器演奏音乐模块较为简单,我们参考实验指导书中的代码,将梁祝的谱换成了喀秋莎。5、定时器模块定时器模块在单片机中,其程序流程图如下:图10在这块单片机板上做倒计时器有两个缺陷:第一,我们采用的是软件定时的方式,精确度不如硬件电路
6、高;第二,此开发板的按键和拨码没有直接接到单片机的I/O口上,而是通过锁存器挂在总线上,这就决定了使用按键只有采取查询的方法,而不能采用中断的方法。因此在倒计时的过程中,每延时1秒前需要查询按键的值来实现暂停或停止的功能,指令也是需要执行时间的,这样会使延时时间超过1s,而且数码管略微有些闪烁。不过,经过缩短延时1s程序的时间,我们将每秒钟的误差控制在了1/30秒。四、系统调试过程本系统由三人共同合力完成,具体分工如下:马大康负责完成了串口通信模块、液晶显示模块和按键控制模块,并撰写了最终的设计文档。万树负责完成了单片机上倒计时模块以及乐谱的输入,覃朋负责完成了蜂鸣器模块。系统的调试是按照先单
7、独模块测试,再组合拼接整体调试的步骤进行的,整个过程有条不紊,系统的总体设计也根据单独模块测试的情况与原先计划做出了相应调整。比如原先是计划利用USB接口实现PC与CPLD板的通信,在PC上自行开发小软件以控制CPLD板上的资源。但由于USB模块(FT245)没有在计划的 时间内调试成功,我们就放弃了此方案,改用CPLD板上的按键来控制整个系统,这样并不影响系统的整体功能。1、串口通信模块的调试由于考虑到在CPLD中实现UART并非易事,并且要实现我们系统的目标最好的方法就是利用串口通信,因此我们率先尝试了此模块。该模块的调试时间表如下:12.912.13深入学习了串口通信协议,编写了veri
8、log代码,并在QuartusII 软件中仿真成功。这里的仿真是指通过自行设计的发送模块TxUnit向自行设计的接收模块RxUnit发送数据,接收到的数据无误。12.21实现了CPLD板与PC机之间的通信,通过拨码设置发送数据,PC端的串口调试工具接收到数据无误。12.26 实现了CPLD板与单片机板的通信。在软件编写过程中,我们参考了很多资料,观摩了别人写的一些代码。本想利用别人的代码加以改进,但未能成功。我想原因有二:第一,从网上下载的代码可靠性值得怀疑,其本身有无经过验证还不清楚。第二,自身阅读verilog代码能力还需加强,不知是不是因为软件中不能写中文注释的原因,很多代码没有注释,阅
9、读起来相当吃力。由于接触verilog时间不长,面对长篇的代码常常抓不住重点,从头到尾都读完了,却弄不清每个状态都实现了什么功能。在修改代码未果的情况下,我决定,与其花时间阅读那么冗长的代码,不如先花时间把串口通信的协议(尤其是接收模块的操作)吃透,然后尝试自己编写代码,这样代码中的每一步自己都知道是什么意思,出了错解决起来也方便。通过此次的串口模块程序的编写,我初步掌握了利用状态机编写时序的方法,摒弃了烦琐的条件判断语句(网上部分代码就是如此编写的,十分不规范),十分具有锻炼意义。从软件调通到实现CPLD和PC机的通信没有花太长时间,于是便开始准备CPLD和单片机间的通信。由于两块开发板上的
10、RS232口均为母口,因此我在网上购买了一根公对公的串口线。当我迫不及待地将两块板子连接起来时,什么反应也没有。我这时有些不知所措,因为CPLD可以发送数据给PC,PC也能发送数据给单片机,波特率都是9600,为什么将两者直接连接就不行了呢?出问题的值可能有一个地方,那就是我够买的那根公头对公头的串口线。难道线是断的,这商家也太不厚道了吧,应该不会。这时在我脑海中突然浮现出串口通信最基本的那张示意图:我之前一直认为TxD与RxD的交叉应该是在传输线中完成的,但会不会传输线里没有完成呢?于是我拿起万用表测量了公对公串口线的两个2脚,发现这两个脚是导通的,也就是说串口线中没有实现信号的交叉!再对着
11、两块板子的原理图看了一下,TxD都接的是各自的串口座2脚,RxD都接的是各自的串口座3脚,这样的话相当于把两个发送的TxD管脚连接在了一起,要实现通信是根本不可能的。后来在网上一查,原来串口线有直连线与交叉线两种之分,(估计直连线是单纯做延长用的),而公对公的线没有交叉线,需要定制。不怕出问题,怕的是出了问题找不到问题的原因,既然找到了原因,就有方法解决。于是我来到了创新实验室,先用两根导线将RxD与TxD连接起来,并将两块开发板共地。打开电源后,按下按键,单片机成功接收到了CPLD发送的数据。这证明了之前的不成功完全是因为硬件电路的问题。为了使最后的作品方便展示,两根导线显然不够稳定。于是我
12、将那根公对公的串口线从中间剪断,其中有10根线,我找到每根线对应是几针,再将两边的2针与3针交叉连接起来。由于CPLD开发板上是将地与1针相连,而单片机开发板上是将地与5针相连,这两根线需要缠在一起,因此这根线的两头并不等价,一头固定接单片机,另一头固定接CPLD。这根自制的串口交叉线完成后,经过检验无误,我们的串口通信模块算是成功完成了。2、液晶模块、键盘模块的调试液晶模块的调试也并不轻松,起初和大家一样,我们花了很长时间阅读把实验指导书中给的代码,并把其烧到了板子里进行测试,液晶屏并没有被点亮,于是我们放弃了修改那冗长的代码,在另一份代码上进行修改。12.1412.15学习了1602液晶屏
13、的控制方法,并修改了一份已有的verilog代码,将其烧入板子后成功的在液晶屏上显示了“madakangisfromee”。12.27确定了整个程序的框架,编写了键盘模块(可以采集按键、消抖并输出键值),改进了之前编写的液晶模块,使其能够根据键值显示不同的文字。在这一阶段其实也走了一段小小的弯路。在我的液晶模块中,需要显示的字符是作为模块的参数的,因此最初我的想法是通过实例化时的参数传递将不同键值对应的文字传递给液晶模块,因为verilog中也有现成的参数传递语句,如defparam。但这种想法经实践检验既不可行也不科学:首先,如果你有5种字符串要显示,你就必须实例化5个液晶显示模块,而这5个
14、module实例无法公用同样的输出,也就是说如果想要这样实现的话还必须在5个module实例后加一个数据选择器,这样确实非常的繁琐。其次,即使实现了,也非常地耗费LE。因此我放弃了这样的方案。后来我还是对module本身做了修改,将要显示的文本存为不同的parameter,然后在给显示数据寄存器赋值时,加一个case语句判断,根据不同的键值选择不同的parameter,成功实现了通过按键改变屏幕显示的功能。3、倒计时器的调试本来倒计时器的调试倒是一帆风顺,只是在添加暂停与停止功能时,无意中改动了一个变量的类型,将原先的int型改为了unsigned char,导致参数调用时不匹配,计数减到0时
15、会数码管就开始出现乱码了。不过后来还是发现了这个问题。4、蜂鸣器的调试采用6MHz作为基频,由于所选歌曲的最短的音符为四分音符,如果将全音符的持续时间设为1s的话,还需要一个4Hz的分频即可。为了减小输出的偶次谐波分量,输出到扬声器的波形应为对称方波,因此在扬声器前要加一个二分频。表中给出了各音阶频率时计数器不同的预置数。采用加载预置数实现分频的方法比采用反馈复零法节约资源,实现起来也容易一些。对于乐曲中的休止符,只要令分频系数设为0,即初始值为2e14-1=16383即可,此时扬声器将不会发出声。通过对梁祝中的音阶建立的理解,得出预置数的计算公式。即预置数=16383-6MHz/音节对应的频率2 由此为基础便可以建立完整的音阶。由于一般音乐中高音4以后就很少用到,所以未对这些进行计算。通过对所选歌曲喀秋莎曲谱的研究,对每个音所演奏
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年巡演活动场地租赁合同附安全巡查与应急响应条款
- 白茶美容养颜课件
- 解读改革开放简史全文内容解读
- 口罩机专业知识培训课件
- 营造良好环境共助心理健康世界精神卫生日关注儿童心理健康主题教育课件
- 2025年度全国范围品牌手机省级代理销售合同
- 2025年度重型货车租赁及大宗货物运输合同
- 2025年度智慧社区APP研发与生活服务一体化解决方案合同
- 2025尤洁与刘磊年度婚姻解除及财产分割协议书
- 2025年度高空作业平台销售与全方位保养维修合同
- 医院患者病情评估制度
- 钢栏杆安装工程施工方案
- 2025年幼儿教师师德培训案例集
- GB/T 33130-2024高标准农田建设评价规范
- 养老院老人权益保护制度
- 高空作业车安全知识培训
- 吉林大学《计算机网络(双语)》2021-2022学年期末试卷
- 《解除保护性止付申请书模板》
- 2024年云网安全应知应会考试题库
- 高层建筑火灾扑救
- 南京大学介绍
评论
0/150
提交评论