| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 关于作息时间信号机的设计——脉冲波产生 数字时钟 动态显示 铃声控制 时间检测报时 闹钟设计 音乐演奏 -> 正文阅读 |
|
[嵌入式]关于作息时间信号机的设计——脉冲波产生 数字时钟 动态显示 铃声控制 时间检测报时 闹钟设计 音乐演奏 |
作息时间信号机的设计 摘要 本文介绍了一种简易的作息时间信号机的完整设计过程,其能够显示时间并按照学校规定的作息时间自动打铃,整体电路包括了秒脉冲发生电路、计数电路、校时电路、动态显示电路、作息时间检测电路和铃声控制电路的基本模块和整点报时电路、星期显示电路、闹钟电路和音乐演奏电路的扩展模块的具体设计方法。 秒脉冲发生电路:本文利用集成定时器NE555加电阻、电容元件和适当的分频电路实现。首先由NE555集成定时器产生1KHz的时钟信号,再由3个十分频电路对其分频,最终产生一个秒脉冲信号; 计数(计时、计分、计秒)电路:本文采用BCD码输出的计数器,采用置零法,将74LS161级联加适当的门电路构成,分别实现M=24(0~23)和M=60(0~59)的计数。计时和计分电路分别采用其下一级的进位信号作为时钟信号,而计秒电路采用秒脉冲发生电路产出的秒脉冲作为时钟信号; 校时电路:由基本SR触发器与门电路组成,分别对小时的个位,分的十位和个位进行了校时,同时还加入了消抖电路,用于消除输入脉冲的不稳定性,正常计时信号与校正信号可以随时切换; 动态显示电路:本文使用8选1数据选择器(74151),四位二进制地址计数器(74161)和3-8线译码器(74LS137),搭配六位数码管和7段译码器(CD4511)组成,3-8线译码器实现位选,数据选择器将计数器时间的二进制选择出来,通过译码电路再将数字在数码管上显示出来; 作息时间检测电路:本文使用一片可编程逻辑器件GAL16V8编程实现,将计数电路的时、分输出信号作为地址信号,当输入为预定地址值时,输出对应的存放码值,实现作息时间的检测; 铃声控制电路:其包括一片74LS161和一片可编程逻辑器件GAL16V8编程实现,74LS161在秒脉冲的作用下实现M=16(0~15)的计数,用于响铃时间的计时,而GAL16V8实现对铃声类型和响铃时间的控制。 对于星期显示电路,其结合了计数电路与动态显示电路,实现了M=7的计数与显示功能;对于整点报时电路,其在作息时间检测编程中,加入了整点时间对应的地址与输出码值,通过铃声控制电路进行打铃;对于闹钟电路,其可以设置闹钟时间,当到对应时间时,除非手动关闭,否则闹钟打铃一分钟;对于音乐演奏电路,本文采用了AT89C51单片机编程控制扬声器输入的信号频率及其变化,实现了音乐的播放,再与铃声控制电路结合起来,使得铃声不再是单调的单频鸣叫,而是播放出预设音乐。 电路设计完成后,通过Proteus软件来对设计的整体电路进行仿真和调试,较为理想地完成了预设的目标与作息时间信号机的功能,最后通过仿真结果,来总结所设计的电路的优缺点。 关键词:作息时间信号机;校时电路;铃声控制;CUPL语言;AT89C51; 第一章 技术指标 1.1系统功能要求 作息时间信号机的功能是按照学校规定的作息时间自动打铃,全年作息时间不变(双休日正常运行),且只要求人工校对时、分。 1.2系统结构要求 作息时间信号机的系统结构方框图如图1-1所示: 图1-1 作息时间信号机系统结构方框图 ? 1.3技术指标 (1)基础技术指标 ①规定的作息时间表见表1-1: 表1-1 作息时间表 ②铃声分类:根据铃声长短分3类: 长铃:12s; 短铃:7s; 间歇铃:18s内响3s,停3s,共3个周期; 这3种铃声分别用于: 长铃用于起床,早、中、晚餐,午休和熄灯; 短铃用于预备铃、下课、锻炼; 间歇铃用于上课; ③采用24小时制,能够显示时、分、秒; ④手动校准时、分; (2)扩展技术指标 ①显示电路采用动态显示; ②允许用户修改作息时间(项目及顺序不变,仅变动时间); 1.4设计条件 ①电源:直流稳压电源提供+5V电压; ②可供选择的元器件,见附录1; 第二章 整体电路设计 2.1整体方案设计 首先设计秒信号发生器,产生一个秒脉冲信号,这是整体电路的基础;随后以秒脉冲为时钟信号,设计计时电路,下一级的时钟信号为上一级的进位信号,另外,在正常计数的基础上,增加校时电路;接着利用计时电路的输出设计动态显示电路,也利用其设计作息时间检测模块;最后利用作息时间检测的检测结果,设计铃声控制电路; 闹钟电路获取计时电路的实时输出结果,与设定的闹钟时间作比较,相同则响铃;星期显示电路在原有的计时电路与动态显示电路上增加即可;整点报时功能也可以在铃声控制模块上增加即可;音乐演奏电路是利用单片机控制,当由信号驱动扬声器工作时,在单片机的控制下 ,实现扬声器播放声音频率的动态变化,从而演奏出音乐; 图2-1-1 系统结构框图 由于整体电路的设计模块是相互独立而又环环相扣的,单一模块可能用到其它或多个模块的输出结果,因此,需要保证每一个模块准确无误才能继续设计电路,否则难以调试出现的问题; 2.2设计原理 秒信号发生器:利用集成定时器NE555加电阻、电容元件和适当的分频电路实现。555定时器是一种集成芯片,在无稳态模式下可以用于设计脉冲发生器。而分频电路是利用计数器,在一定数量的脉冲后实现电平反转; 计数(计时、计分、计秒)电路:采用BCD码输出的计数器,利用置零法,将74LS160级联加适当的门电路构成。由于计数器的端口具有重新计数的功能,因此可以利用门电路反馈,分别实现M=24(0~23)和M=60(0~59)的计数; 校时电路:由基本SR触发器与门电路组成,构成消抖电路,可以用于消除输入脉冲的不稳定性。由于SR触发器的存在,开关每按压一次,输出信号仅发生一次变化,且不会影响输出的状态; 动态显示电路:使用8选1数据选择器(74151),四位二进制地址计数器(74161)和3-8线译码器(74LS137),搭配六位数码管和7段译码器(CD4511)组成。多个数码管的段码连接在一起,如果数码管全亮,则显示的数字相同,所以为了显示不同的数字,任何时刻,只能有一个数码管显示,其余不显示。利用软件实现数码管轮流显示我们需要的数字,只要更新频率足够快(>100Hz),肉眼看起来,这些数码管是同时显示数字的; 作息时间检测电路:使用一片可编程逻辑器件GAL16V8编程实现,将计数电路的输出信号作为地址信号,当输入为预定地址值时,输出对应的存放码值,实现作息时间的检测; 铃声控制电路:其包括一片74LS161和一片可编程逻辑器件GAL16V8编程实现,74LS161在秒脉冲的作用下实现M=16(0~15)的计数,用于响铃时间的计时,而GAL16V8实现对铃声类型和响铃时间的控制。 闹钟电路:设置闹钟时间,同时实时与当前时间进行比较,当时间相同时,输出高电平驱动扬声器工作; 音乐演奏电路:采用AT89C51单片机编程控制扬声器输入的信号频率及其变化,实现了音乐的播放,再与铃声控制电路结合起来,使得铃声不再是单调的单频鸣叫,而是播放出预设音乐; 整点报时电路和星期显示电路的原理分别与动态显示和铃声控制原理相同,在此不再赘述。 第三章 单元电路设计 3.1时钟源电路 对于作息时间信号机,其内部必须存在一个稳定且标准的时钟,用于时间的计数,本节就介绍了时钟源电路的设计; 3.1.1 设计思想 秒信号发生器是整体电路的重要组成部分,一个标准的秒脉冲决定了计时的稳定性与精度。因此,我们需要设计一种能够满足此要求的秒信号发生器。同时考虑到电路可能同时需要更高频率的脉冲信号,我们采取先产生1KHz的脉冲信号,再对其进行3个十分频的方法实现。 3.1.2 设计原理与设计方案选择 秒信号发生器为计数电路提供1Hz的秒脉冲,亦为其它电路提供所需不同频率的各种时钟信号,我们考虑了以下3种方案:
由于Proteus软件的晶振不容易起振,同时考虑到实际需要,我们采用集成定时器NE555加电阻电容元件和适当的分频电路的方法实现秒脉冲的产生; 3.1.3 具体电路设计 (1)基础电路 由NE555构成的多谐振荡器加分频器产生秒信号,此信号将接到秒计数器74LS160的信号输入端。 由于NE555电路要求R1和R2(本设计电路中所用器件标号)应均大于或等于1kΩ,但R6+R2应小于或等于3.3MΩ,故在本电路中我们选择R1=R2=13.5kΩ,C1=0.01μF,C2=0.04758μF的参数,其输出信号的时间参数是T=TWH+TWL,TWH=0.7(R1+R2)*C2,TWL=0.7*R1*C,因此,振荡器的频率为:F=1/T=1KHz。从而该多谐振荡器从3号引脚输出一个1KHz的脉冲信号。 随后将此1KHz的信号进行3次十分频,最终得到频率为1Hz的秒脉冲。 (2)电路优化 在仿真基础电路时,笔者发现了两个问题:NE555的输出信号存在毛刺且不规整;NE555的输出信号占空比不满足50%; 因此,为消除这两个问题,笔者查阅相关资料,在基础电路的基础上加入了滤波电容和两个二极管,分别解决了这两个问题。 滤波电容在充放电的过程中,很好地消除了输出信号的毛刺;而两个二极管由于其单向导通的特性,实现了输出信号占空比50%的调整。 (3)模块仿真电路图 具体电路图如下图3-1所示: 图3-1 秒脉冲发生器 3.2 数字钟电路的设计 计数器对秒脉冲信号进行计数,将累计结果用24进制表示小时,用60进制表示分钟和秒,这样就可以实现时间的正确计数。另外增设三个校时电路,分别校对校时,分钟的十位和个位。 3.2.1 设计思想 计数电路用于对时间进行记录,输入为秒脉冲信号,输出为动态时间。由于分钟和秒是计到60即进位,而校时仅需计到24即进位,因此笔者将计数电路分为计分、秒电路和计时电路。 因为初始时间很大可能并不是实际的时间,因此需要校时电路将电路时间调整到与实际时间同步。并且在校时期间,需要进行消抖——用于消除输入脉冲的不稳定性,因此,笔者引入了一个SR触发器实现这一目的。 3.2.2 设计原理与设计方案 (1)设计原理 计数电路采用BCD码输出的计数器,利用置零法,将74LS160级联加适当的门电路构成。由于计数器的端口具有重新计数的功能,因此可以利用门电路反馈,分别实现M=24(0~23)和M=60(0~59)的计数;校时电路利用SR触发器,加入校时脉冲和控制信号,分别控制校时速度与控制校时状态。 (2)方案论证 若要实现模60/24的计数,可以由许多方案——置零法、置最大数法等,由于计时电路的特殊性,除了固定模的计数,还需要固定计数初值,即0~59/0~23。因此,我们采用异步清零法进行设计。 (3)具体电路设计 此部分设计电路包括1个74LS160和6个74LS161计数器,其中秒、分是60进制,小时接成24进制。时、分、秒是由两位十进制数来表示,本设计中我们采用74LS161异步置数可以很快调出。
电子钟分和秒的计时采用60进制方式,M=60(00~59),计数规律为00、01、…、58、59、00…,它们的个位为十进制,十位为六进制。 此电路由2个74LS161计数器来实现,当秒计数到59时,即检测个位计数器有进位输出且十位计数器计到5时,十位计数器的置数端为低电平;下一时钟下,十位计数器置零,个位计数器自动回零,然后再重新开始计数,并利用“异步清零”反馈到CP端,此为个位十进制及十位六进制功能实现的方法。以计秒电路为例,电路如下图3-2-1所示: 图3-2-1 计秒电路
小时部分采用二十四进制计数器,当数字钟开始计数时,个位按十进制开始计数,当计到23时,即检测到个位计数器输出3、十位计数器计到2时,个位、十位计数器的置数端均为低电平;此时再来一个脉冲,都置零,返回到00,因此,我们这里采用十位的2和个位的4“与非”后再清零的连接方法,使得计数器在显示23时能及时清零,从而实现二十四进制计数。另外,由于一天只有24小时,当计数达到23:59:59时,就需要清零以重新开始计时。 计时电路如下图3-2-2所示: 图3-2-2 计时电路
一般情况下,数字电子钟开机时并不立即显示当前时间,所以需要一个校时电路来调整以此来获得所需要的时间。根据设计要求,采用自动实现对时和分的校时,为了使校时不干扰计时,在校时电路中还加入了消抖电路.用于消除输入脉冲的不稳定性,确保校时和计时的稳定与准确。 其主要原理是:先截断正常的计数通路,然后再将频率为2Hz的方波信号加到需要校正的计数单元的输入端,校正好后,再转入正常计时状态即可。 根据要求,数字钟应具有自动分校正和时校正功能,另外,为了实现更快校时,笔者对分的十位和个位实现了分开校时。因此,应截断分个位、分十位和时个位的直接计数通路,并采用正常计时信号与校正信号可以随时切换的电路接入其中。下图3-2-3所示即为带有基本RS 触发器的校时电路: 图3-2-3 校时电路 对于上图,与非门74LS00的U13:C片中的第10端为脉冲发生器模块所产生的2Hz的脉冲信号,第U10:D片的第12端则接进位信号(若为小时校正电路,则为分的进位信号,同理,分的十位校时电路则为分的个位的进位信号,分的个位校时电路则为秒的进位信号,当不校时的时候,计时电路将正常计数)。第U13:D片的第11端则为分个位、十位或者小时的个位脉冲输入端。 正常工作时,开关闭合到上端,SR锁存器置“1”,正常计数脉冲通过;当开关闭合到下端,SR锁存器置“0”,正常计数不能通过,而校时脉冲通过,使得时、分计数器可以快速校准。 3.3 动态显示电路的设计 本文以动态显示的方式分别显示出计数电路的时、分和秒。由于人眼的视觉暂留效应,只要数字更新频率足够快,数字就会同时显示在六位数码管上。 3.3.1 设计思路 使用8选1数据选择器(74151),四位二进制地址计数器(74161)和3-8线译码器(74LS137),搭配六位数码管和7段译码器(CD4511)组成。3-8线译码器实现位选,再用数据选择器将计数器时间的二进制选择出来,通过译码电路再将数字在数码管上显示出来。 3.3.2 设计原理与电路设计 (1)设计原理 动态显示电路的原理为:多个数码管的段码连接在一起,如果数码管全亮,则显示的数字相同,所以为了显示不同的数字,任何时刻,只能有一个数码管显示,其余不显示。利用软件实现数码管轮流显示我们需要的数字,只要更新频率足够快(>100Hz),由于人眼的视觉暂留效果,这些数码管看起来是同时显示数字的。 (2)动态显示电路图 六位动态显示电路如下图3-3-1所示 图3-3-1 六位动态显示 六位动态显示由位选部分,译码部分和显示部分组成; 位选部分:将计数电路的输出按次序接入这4片75151数选上,利用74LS161和1KHz的时钟信号,输出高频变化的F0、F1和F2信号,从而实现高速更新; 译码部分:由一片4511和一片74LS137组成,数据选择器将计数器时间的二进制选择出来,通过译码电路再将数字在数码管上显示出来; 显示部分:使用了共阴CC六位数码管,当某个发光二极管的阳极为高电平时,发光二极管点亮; 3.4 作息时间检测电路设计 作为作息时间信号机的一个重要模块,作息时间检测起到了承前启后的作用。其输入为时钟电路的时间,将其与内部预设的对应时间进行对比,从而判断出当前时间是否需要打铃以及打铃的种类,以此来为铃声控制电路提供必要的工作信息。 3.4.1 设计思想与方案论证 该电路需要将所有需要打铃的时间检测出来,分为三类铃声:长铃、短铃和间歇铃。 如果用集成电路来完成组合逻辑设计,电路是非常复杂的,难以实现; 如果用可编程逻辑器件GAL16V8编程实现,则逻辑符号也是较为复杂的,如不够仔细,难免会有错误; 如果用存储器件来实现,电路原理是非常简单,电路连接也是十分简洁的; 因此,综上讨论,我们采用存储芯片来完成。 3.4.2 设计原理与电路设计 (1)设计原理 经过分析讨论,笔者发现——可以将时钟电路的时、分输出信号作为存储器的地址信号,在符合作息时间表且与地址对应的存储位置存放长铃、短铃和间歇铃的控制信息(长铃001、短铃010、间歇铃100),其余时间全部存放000用于区分。 地址与对应码值例如下表3-4-1所示(具体地址与对应码值见附录1): 表3-4-1 时间的地址与其对应存储码值示例
当时钟输入为对应地址时,存储器输出对应的码值,用于对打铃与否和铃声种类的控制;当输出为000时不打铃,当输出为001时打长铃,输出为010时打短铃,输出为100时打间歇铃; (2)电路设计与存储文件 作息时间检测电路如下图3-4-1所示: 图3-4-1 作息时间检测电路 由于时间地址需要用13根地址线来表示,因此选择2764存储器来实现; 其中,A0~A12分别对应输入时钟信号的M0~M6,H0~H5的输出,D0~D2这三位对应输出存储器存储的码值,当需要打长铃时,D0端(CL)输出为高电平,DL、JL为低电平,其余情况依此类推。 存储器存储的文件由WinHex_tk软件生成,其为一款非常不错的16进制编辑器,输入地址对应存放的码值,即可导出并命名为lskz.BIN文件(文件见支撑材料),烧录进2764芯片中。 3.5 铃声控制电路设计 由于铃声种类有三种——长铃、短铃和间歇铃,因此需要打铃时,利用铃声控制电路来控制发出不同的铃声。 3.5.1 设计思想 此电路的关键是根据铃声的要求实现对铃声的控制,其可以利用一片74LS161和一片可编程逻辑器件GAL16V8来实现。 GAL16V8的输入为作息时间检测的输出结果CL、DL和JL,同时利用74LS161进行时间的计数,需要响铃时输出高电平驱动扬声器发声,当响铃结束或不需要响铃时输出低电平。 3.5.2 设计原理与电路设计 (1)设计原理 根据响铃的要求不难发现:铃声最长为间歇铃,至少需要16秒,因此,我们采用74LS161计数器在时钟信号为秒脉冲的作用下实现M=16(0~15)的计数,用于响铃时间的计时。在这16秒中,长铃先响12秒再停止4秒,短铃先响7秒再停止9秒,间歇铃先响3秒再暂停3秒再响3秒再停3秒再响3秒; 而GAL16V8则用CUPL语言编程实现铃声类型和响铃时间的控制; (2)电路设计 铃声控制电路的电路图如下图3-5-1所示: 图3-5-1 铃声控制电路 计数器74LS161在CP为秒脉冲的作用下时间M=16的计数,输出为Q3,Q2,Q1,Q0。 逻辑器件AM16V8的端口12和13实现对计数器的控制,19和14端口实现对扬声器的控制,9和18端口实现扬声器输出音调的控制。各个端口之间的逻辑关系的CUPL编程文件见附录2。 AM16V8内部烧入的LSKZ.jed文件由WinCupl编写,具体内容见附录2。 3.6 星期显示电路设计 由于作息时间信号机是以学校等单位为受众群体而设计的,因此,对每周星期的区别很重要——如根据不同的星期执行不同的课表。本节介绍了利用计数电路和动态显示电路的设计思想来设计星期显示电路的设计方法。 3.6.1设计思想 日期部分为七进制计数器,用1~7的显示来代表星期一到星期日的变化。电路采用74LS160计数器,74LS160本身是四位十进制同步计数器。 3.6.2设计原理和设计方案 (1)计数方案选择 要实现7进制有两种方法:清零(复位法)和置数(预置功能); 复位法:使计数器计数到7时置“0”,即将输出端通过一个与非门接到CR清零端,置数端接高电平(数据输入端为任意值); 置数法:由于日期是从1开始计数,即输出端Q3Q2Q1Q0=0001,故数据输入端需先预置数据,即D3D2D1D0=0001,清零端接高电平或悬空,输出端Q0、Q1、Q2接与非门,再将与非门的输出端接到LOAD置数端。 本设计采用异步置数法,其输出的结果就是7进制计数器。 (2)显示电路 显示电路原理与动态显示电路模块相同,在此不再赘述。 (3)模块电路图 星期显示电路的电路如下图3-6-1所示: 图3-6-1 星期显示电路 74LS160的输入时钟信号为时钟电路小时的进位信号,采用异步置数法实现M=7的计数,利用译码器和数码管动态显示,左边为星期校对电路,其原理与校时电路一样,每按一次,日期增加一天。 3.7 闹钟电路 对于作息时间信号机的用户而言,除了在既定时间响铃以外,也希望可以自己另外设定响铃时间,这就引出了闹钟功能的设计需求。 3.7.1设计思想 用户需提前给定需要闹钟的具体时间,闹钟模块再获取当前时间与既设闹钟时间进行对比,当当前时间为闹钟设定时间时,振铃电路开始工作,除非用户手动关闭闹钟,否则连续振铃一分钟后闹钟才会停止 3.7.2方案论证与电路设计 (1)方案论证 在作息时间检测电路的设计中,我们使用了存储器存储需要响铃时间的地址值,用于检测时间并进行响铃,这大大减少了逻辑电路的复杂程度,仅仅需要一块存储器就可以完成。 而此方案适用于大量固定时间的存储,即适用于不需要经常改变或存储少量打铃时间的情况,而闹钟的时间设定则是经常改变且不需要太多的;若采用存储器实现,改动闹钟设定时间便变得麻烦起来。 因此,考虑到闹钟设定时间并不多,我们采用逻辑电路的方案来设计闹钟模块。仅当设定时间与当前时间相同时,逻辑判断电路才向外输出高电平,驱动扬声器工作,否则不会发出声音。 (2)电路设计 我们将闹钟电路分为三个小模块——闹钟设定电路、时间对比电路和振铃电路,并一一对其设计;
我们采用拨码开关搭配上拉电阻的方式进行闹钟时间的设定,对于单个拨码开关而言,1端口为最高位,4端口为最低位,拨到ON位为1,OFF位为0;例如设定3,对应二进制为0011,则将1、2端口拨到OFF,3、4端口拨到ON; 对应下图3-7-1电路所示,DSW1对应小时的十位,DSW2对应小时的个位,DSW5对应分钟的十位,DSW6对应分钟的个位。 图3-7-1 闹钟设定电路
时间对比电路如下图3-7-2所示,其输入分为两部分,分别是设定时间与实际时间。H*/M*代表实际时间的逻辑值,hh*/mm*代表设定时间的逻辑值(因为Proteus可能不区分大小写,因此此处用不同的字母组合以区分),当所有逻辑值对应相等时,该电路才会输出高电平,驱动扬声器工作。 图3-7-2 时间对比电路
当需要振铃的信号变为高电平时,扬声器即开始工作,但由于振铃的信号电压可能不足以直接驱动扬声器工作,因此需加入驱动电路,利用简单的射极跟随器(电流放大)就可以实现,电路如下图3-7-3所示: 图3-7-3 振铃电路 对于闹钟整体电路而言,通过拨动电路最上方的拨码开关可以设置闹钟,当时钟到达设定时刻时,蜂鸣器发成维持一分钟的蜂鸣,若要停止,断开开关即可将蜂鸣器关闭。 3.8 整点报时模块 在日常活动中,为了及时了解大概时间,往往会需要整点报时,因此,我们设计该模块实现整点报时的功能;此外,由于人们在晚上23:30至第二天6:30之间是处于睡眠状态,因此不设整点报时。 3.8.1 设计思想 该模块使得信号机有整点报时的功能,当时钟显示为07~23之间的整点时,扬声器发出间歇铃的声音,提示用户到达整点;该模块在原有作息时间检测的编程文件中加入了一部分地址及其对应码值,再将响铃信号交由铃声控制电路实现振铃,因此不需要之间物理电路; 3.8.2新增地址及其码值 新增地址及其码值见附录3,对应铃声为间歇铃。 3.9 音乐演奏电路 上述所有电路所用到的扬声器仅仅发出同一种单一频率的声音,显得“呕哑嘲哳难为听”。此音乐演奏模块便可以与扬声器结合起来,实现单一频率的声音变成复杂的变化音调,从而演奏出音乐 3.9.1设计思想与原理 我们采用单片机来实现这一音乐演奏的目标,其设计原理如下:利用程序来控制单处机某个口线出一定频率的方波到蜂鸣器,蜂鸣器就可以发出一定音调的声音,若再利用不同的延时程序改变输出频率,就可以改变音调,进而就可让单片机发出“1”、“2”,“3”,“4”,“5”,“6”,“7”的音乐。 3.9.2电路设计与程序编写 (1)电路设计 通过查找相关资料,我们可以确定电路的结构如下图3-9-1所示,P1.0端口为动态频率输出端口,直接连接在扬声器的正极性端。 图3-9-1 音乐演奏电路 (2)程序编写 我们利用C语言进行编写程序,再导入keil软件进行编译,产生能够驱动51的程序文件。 该程序首先需要定义音乐的高八位和低八位,再设置所需播放音乐的频率变化和持续时间,通过中断程序控制发音的音调,延时程序控制发音的时间长度,最终依次发出对应音符即可。我们通过查找乐谱等方式,编写了《梁祝(片段)》《义勇军进行曲》《虞美人》等音乐播放的控制程序,具体内容见附录4。 第四章 测试与调试 电路的调试是电路设计的重要步骤,在电路设计完成后,需要进行仿真调试才能确定其是否实现了期望的功能或作用,尤其是基础模块电路的调试,其结果的正确与否直接影响了后续电路调试的准确性。 4.1 时钟源电路的调试 运用频率测量器件对NE555集成定时器的输出端口和分频后的端口频率进行测量,通过观察,定时器的输出端口脉冲频率为1000Hz,而经过3次十分频后,脉冲频率分别下降为100Hz、10Hz和1Hz,说明此电路的设计和运行是正确的。 4.2 计数电路和动态显示电路的调试 计数与动态显示电路由于其关系紧密,因此在这里可以联合调试。运行仿真,在校时电路的协助下,分别观察显示时间的变化和进位情况是否与实际相符,动态显示的数字是否完整无误。若出现时间变化错误的情况,主要是由于计数电路的逻辑设计不正确导致的;若出现数码管显示数字错误或不是数字,主要是由于动态显示电路接线错误导致的。 4.4 作息时间检测电路的调试 先将CL、DL和JL的输出端口连接到示波器上,再将时钟电路的时间依次调到打铃的对应时间,观察到达规定时间时,对应的端口是否输出稳定的高电平,而其它端口依旧是低电平。若到规定没有电平抬高或多个电平抬高或电平抬高端口并不是期望的端口,多是由于存储器地址对应码值存放错误导致的,此时应该调整存储文件,检查对应地址存放的码值是否正确。 4.5 铃声控制电路的调试 运行仿真,对要求响铃的时间进行逐一测试,听扬声器播放的声音类型是否正确;可能会出现响长铃的时间,短铃或间歇铃也响,或者出现不该响铃的时间响铃,这些情况主要是由于时间检测或者内部逻辑错误所导致的;对于逻辑错误的情况,可能是逻辑表达式过度简化所导致的,应该重新检测内部存储的逻辑文件,必要时对其进行修改并重新调试。 4.6 闹钟电路的调试 先将闹钟预设到一个任意时间,再通过校时电路将时钟调整到闹钟对应时间,观察扬声器是否工作,再断开开关观察扬声器是否立刻停止工作。若未到预定时间扬声器就工作,或者过了预定时间扬声器依旧工作,应该检查时间对比电路逻辑的正确性。 4.7 音乐演奏电路的调试 运行仿真,聆听扬声器是否正确播放预设的音乐;若没有音乐或音乐不正确,则需要检查电路连接并且进行单片机内部程序的调试;若音乐播放成功,再将其与其它振铃电路联合起来,实现扬声器的音乐演奏。 4.8 总体电路的调测 运行仿真整体电路,观察各个模块的电路是否能够正确协同工作,网络端口的脉冲信号传递是否正确,最终实现作息时间信号机的技术指标。 第五章 设计总结 5.1 设计任务完成情况 本次设计完成了实验所要求的所有基础功能和拓展功能,包括——秒脉冲发生电路、计数电路、动态显示电路、作息时间检测电路和铃声控制电路的基本模块和整点报时电路、星期显示电路、闹钟电路和音乐演奏电路的扩展模块。 5.2 问题与改进 问题1:在仿真脉冲发生电路时,发现了两个问题:NE555的输出信号存在毛刺且不规整;NE555的输出信号占空比不满足50%; 改进:为消除这两个问题,笔者查阅相关资料,在基础电路的基础上加入了滤波电容和两个二极管,分别解决了这两个问题。滤波电容在充放电的过程中,很好地消除了输出信号的毛刺;而两个二极管由于其单向导通的特性,实现了输出信号占空比50%的调整。 问题2:铃声控制模块中,扬声器管脚可以看见电平变化,却不能够发出声音; 改进:GAL器件管脚的输出电压很小(mV级),不能直接驱动扬声器工作,增加射极放大电路即可; 问题3:动态显示电路模块中,六位数码管可以观测到管脚电平变化却无法显示数字; 改进:经过讨论,将六位数码管从共阳换成共阴; 问题4:扬声器播放音乐不能清晰播放出音乐,音调频率变化不正确; 改进:修改调试单片机程序,发现时延错误; 问题5:拨码开关管脚悬空,仿真时管脚显示灰色; 改进:加入上拉电阻,抬高管脚电平,使其不再空接; 问题6:在音乐演奏电路与振铃电路组合时,只有当振铃电路的控制信号为高电平时,音乐演奏电路的频率变化信号才能对扬声器起作用,这样的要求用手动开关难以实现。 改进:采用三极管电子开关电路,音乐演奏直接接入扬声器阳极,但只有当振铃控制信号为高电平时,引脚才能导通,这样就解决了问题。 5.3 心得体会 通过本次电工电子课程设计,我掌握了数字电子技术的基本原理和基本分析方法,熟练掌握基本组合逻辑电路、计数器、译码器、基本锁存器、触发器的功能和触发方式的分析与设计,正确掌握555定时器等集成器件的基本结构特点,能够查阅并选用中小规模集成芯片设计完成基本数字电子电路,并利用proteus软件设计分析简单电子电路,即能够根据设计要求选择恰当的设计方案,对电子电路与系统进行辅助设计、仿真和分析,并进一步按照仿真验证的设计方案加以组装、调试与功能、性能测试,完成设计要求。 此次实验我按照系统框图的顺序一步一步深入设计,由于电路交错复杂,一粗心就会连错,因此一定要对整体电路有清晰的认识且画出草图后再连接电路。电工电子的课程设计并不一定要拘泥于逻辑器件,也可以引入单片机等设备,实现更丰富的功能。此外,如果电路出现仿真错误,在调试的过程中一定要保持耐心和细心,否则会事倍功半,要相信问题一定都会解决的。老师和同学在这次课程设计中也对我帮助很大,在与他们的讨论中,不仅解决了一些瓶颈问题,更加拓展了我的思维,使我受益颇丰。 由于疫情的原因,我们不能返校进行学习,但老师在线上也为我们准备了丰富的学习资料和细致的解答,最后一天的课程总结也演示了同学们的想法和实操视频,使我虽在家中也能身临其境地感受到课堂氛围。通过此次课程设计,我更深入地了解了数字电路的内涵,使得我有信心也有能力继续以后的学习。 参考文献 [1] 薛梅,丁可柯,朱震华,刘艳. 电子系统设计与实践教程[M],北京:人民邮电出版社 [2] 张顺兴.数字电路与系统设计[M],南京:东南大学出版社,190-195 [3] 杨志忠.数字电子技术基础 [M]. 北京:高等教育出版社,2009,7(2):179-181 [4] 朱正伟.数字电路逻辑设计[M].第3版.北京:清华大学出版社, 2018.6. [5] 何希才.常用电子电路应用365例[M].北京:电子工业出版社, 2006.9. [6] 王公望.现代电子电路应运基础[M].西安:西安电子科技大学出版社, 2005.6. 附录 附录0 元件清单
附录1 时间对应地址及其存放码值表格
附录2 LSKZ.jed文件内容 Name???? LSKZ ; PartNo?? 00 ; Date???? 2021/9/17 ; Revision 01 ; Designer Engineer ; Company? NJUPT ; Assembly None ; Location? ; Device?? g16v8a ; /* *************** INPUT PINS *********************/ PIN? 2? =???? DL??????????????????? ; /*???????????????????????????????? */ PIN? 3? =???? CL??????????????????? ; /*???????????????????????????????? */ PIN? 4? =???? JL??????????????????? ; /*??????????? ?????????????????????*/ PIN? 5? =???? Q3??????????????????? ; /*???????????????????????????????? */ PIN? 6? =???? Q2??????????????????? ; /*???????????????????????????????? */ PIN? 7? =???? Q1??????????????????? ; /*???????????????????????????????? */ PIN? 8? =???? Q0??????????????????? ; /*???????????????????????????????? */ PIN? 9? =???? CP100???????????????? ; /*???????????????????????????????? */ PIN? 18 =???? CP1K????????????????? ; /*???????????????????????????????? */ /* *************** OUTPUT PINS *********************/ PIN? 12?? =?? EP????????????????????? ; /*???????????????????????????????? */ PIN? 13?? =?? MR????????????????????? ; /*???????????????????????????????? */ PIN? 14?? =?? DE????????????????????? ; /*????????????????????????? ???????*/ PIN? 15?? =?? K1????????????????????? ; /*???????????????????????????????? */ PIN? 16?? =?? K2????????????????????? ; /*???????????????????????????????? */ PIN? 17?? =?? JLD???????????????????? ; /*???????????????????????????????? */ PIN? 19 ??=?? ZL????????????????????? ; /*???????????????????????????????? */ /* ********LOGIC EQUATIONS******** */ K1=!DL&!CL&!Q3&!Q2&!Q1&!Q0#!DL&!CL&JL&!Q3#!DL&!CL&JL&!Q2#!DL&!CL&JL&!Q1#!DL&!CL&JL&!Q0; K2=!DL&CL&!JL&!Q3#!DL&CL&!JL&!Q2#DL&!CL&!JL&!Q3&!Q2#DL&!CL&!JL&!Q3&!Q1#DL&!CL&!JL&!Q3&!Q0; EP=K1#K2; JLD=JL&(!Q3&!Q2&!Q1#!Q3&!Q2&!Q0#!Q3&Q2&Q1#!Q2&!Q1&!Q0#Q3&Q2&!Q1#Q2&Q1&!Q0); MR=DL#CL#JL; DE=((K1#K2)&!JL#JLD)&MR; ZL=DE&CP100&CP1K; /* ********END******** */ 附录3 ?新增地址及其码值表
附录4 单片机程序——演奏音乐 #include <reg52.h> sbit speaker = P1^0; unsigned char timer0h, timer0l, time; //-------------------------------------- //单片机晶振采用11.0592MHz // 频率-半周期数据表 高八位 本软件共保存了四个八度的28个频率数据 code unsigned char FREQH[] = { 0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音1234567 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, //高音 234567 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF}; //超高音 1234567 // 频率-半周期数据表 低八位 code unsigned char FREQL[] = { 0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, //低音1234567 0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i 0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, //高音 234567 0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16}; //超高音 1234567 //-------------------------------------- /*code unsigned char sszymmh[] = { 3,2,3,5,2,1,6,2,2,5,2,1,6,2, 1,1,3,4,6,2,3,1,3,1,3,2,2,2,2,1,3, 2,1,5,2,4,5,2,3,3,2,1,6,2,2,3,2,1,2, 2,1,1,2,4,5,2,3,3,2,1,2,2,3,6,1,1,1, 2,4,1,2,4,1,3,3,6,2,1,5,2,2,6,2,1,6, 2,1,5,2,1,5,2,4,5,2,3,6,2,1,1,2,1,2, 2,1,5,2,1,3,2,4,2,2,3,3,2,1,5,2,2,1, 3,2,6,2,1,5,2,1,3,2,1,2,2,1,1,2,4,6, 2,3,1,3,1,5,2,1,3,2,1,2,2,2,6,1,1,1, 2,1,1,2,4,6,2,3,1,3,1,5,2,1,3,2,1,2, 2,2,1,2,4,6,2,3,1,3,1,5,2,1,3,2,1,2, 2,2,6,1,1,1,2,1,1,2,4,6,2,3,1,3,1,5, 2,1,3,2,1,2,2,2,6,1,1,1,2,1,1,2,4, 0, 0, 0};*/ //code unsigned char sszymmh[] = {1,2,3,2,2,1,6,1,1,1,2,1,5,1,2,5,2,3,1,3,1,6,2,1,5,2,1,3,2,1,5,2,1,2,2,4,2,2,3,3,2,1,7,1,2,6,1,2,5,1,3,6,1,1,1,2,2,2,2,2,3,1,2,1,2,2,6,1,1,5,1,1,6,1,1,1,2,1,5,1,4,3,2,3,5,2,1,7,1,2,2,2,2,6,1,1,1,2,1,5,1,4,3,1,1,5,1,2,3,1,2,5,1,1,6,1,1,7,1,1,2,2,1,6,1,4,5,1,1,6,1,1,1,2,3,2,2,1,5,2,2,3,2,2,2,2,2,3,2,1,2,2,1,1,2,2,6,1,1,5,1,1,3,1,2,3,1,4,1,2,4,6,1,3,1,2,1,6,1,1,5,1,1,3,1,1,5,1,1,6,1,1,1,2,1,5,1,4, //0, 0, 0};//梁祝 code unsigned char sszymmh[] = {5,1,1, 1,2,3, 1,2,1, 1,2,1, 1,2,1, 5,1,1, 6,1,1, 7,1,1, 1,2,2, 1,2,2, 3,2,1, 1,2,1, 2,2,1, 3,2,1, 5,2,2, 5,2,1, 5,2,2, 3,2,2, 3,2,1, 1,2,2, 3,2,1, 5,2,2, 3,2,1, 2,2,2, 2,2,4, 6,2,2,5,2,2,2,2,2,3,2,2,5,2,1,3,2,2,5,2,1,3,2,1,2,2,1,3,2,1,1,2,1,2,2,1,3,2,2, 5,2,2,6,1,1,1,2,1,1,2,1,3,2,2,3,2,1,5,2,2,5,2,1,2,2,1,2,2,1,2,2,1,6,1,1,6,1,1,2,2,4, 5,1,1,1,2,3,1,2,1,3,2,3,3,2,1,5,2,4,5,2,4, 1,2,2,3,2,1,5,2,1,5,1,1,6,2,2,5,2,2, 3,2,2,1,2,1,5,2,1,5,2,1,5,2,1,3,2,1,1,2,1,5,1,2,1,2,2, 3,1,1,1,1,1,5,2,1,5,2,1,5,2,1,3,2,1,1,2,1,5,1,2,1,2,2,5,1,2,1,2,2,5,1,2,1,2,2,1,2,2, 0, 0, 0};//国歌 /*code unsigned char sszymmh[] = {6,2,3,5,2,1,3,2,2,5,2,2,6,2,1,6,2,2,5,2,1,3,2,4,6,1,3,1,2,1,2,2,2,5,2,1,3,2,1,2,2,4, 6,2,3,2,3,1,2,3,2,1,3,1,7,2,1,6,2,3,5,2,1,3,2,4,2,2,1,5,2,1,5,2,1,3,2,1,2,2,1,3,2,1,1,2,1,7,1,1,6,1,4, 1,2,3,6,1,1,6,2,1,1,2,2,2,2,2,5, 2,1,3,2,1,2,2,4,5,2,3,3,2,1,3,2, 2,5,2,2,6,2,4,2,3,3,2,3,1,1,3,2, 2,3,2,6,2,1,1,3,1,5,2,1,6,2,1,3, 2,4,2,2,1,5,2,1,5,2,1,3,2,1,2,2, 1,3,2,1,1,2,1,7,1,1,6,1,4, 0, 0, 0};//虞美人 */ void t0int() interrupt 1 //T0中断程序,控制发音的音调 { TR0 = 0; //先关闭T0 speaker = !speaker; //输出方波, 发音 TH0 = timer0h; //下次的中断时间, 这个时间, 控制音调高低 TL0 = timer0l; TR0 = 1; //启动T0 } //-------------------------------------- void delay(unsigned char t) //延时程序,控制发音的时间长度 { unsigned char t1; unsigned long t2; for(t1 = 0; t1 < t; t1++) //双重循环, 共延时t个半拍 for(t2 = 0; t2 < 8000; t2++); //延时期间, 可进入T0中断去发音 TR0 = 0; //关闭T0, 停止发音 } //-------------------------------------- void song() //演奏一个音符 { TH0 = timer0h; //控制音调 TL0 = timer0l; TR0 = 1; //启动T0, 由T0输出方波去发音 delay(time); //控制时间长度 } //-------------------------------------- void main(void) { unsigned char k, i; TMOD = 1; //置T0定时工作方式1 ET0 = 1; //开T0中断 EA = 1; //开CPU中断 while(1) { i = 0; time = 1; while(time) { k = sszymmh[i] + 7 * sszymmh[i + 1] - 1; //第i个是音符, 第i+1个是第几个八度 timer0h = FREQH[k]; //从数据表中读出频率数值 timer0l = FREQL[k]; //实际上, 是定时的时间长度 time = sszymmh[i + 2]; //读出时间长度数值 i += 3; song(); //发出一个音符 } } } /*====================================== |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年2日历 | -2025/2/6 8:52:56- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |