基于51单片机AT89C51的小型音乐喷泉控制系统设计

wx供重浩:创享日记
对话框发送:单片机小喷泉
获取完整无水印论文报告(内含电路原理图和程序)


根据目前音乐喷泉的发展现状,介绍了一个以AT89C51单片机为核心的小型音乐喷泉控制系统。给出了一个简洁的单片机控制电路,分析了输出地址,描述了不同类型的输出电路和输入电路;介绍了从特定构造的喷池中获得决定喷池动作的喷池数据的原理;给出了主程序框图和看门狗子程序。采用程序控制来控制花型。音频信号还影响灯光色彩和灯光光线明暗的变化。从而使灯光色彩、灯光的闪烁和喷泉水姿随音乐节奏而变化。

在这里插入图片描述


第1章 绪 论

(详见下载)


第2章 音乐喷泉控制系统硬件设计

2.1 控制系统硬件总体设计方案
该音乐喷泉控制系统的总体结构如图2.1所示,由音乐输入系统、数模转换系统、单片机控制系统和输出控制系统等组成。
在这里插入图片描述
2.2音乐信号的采集

前面已经介绍过,本文的研究针对的是采用外部音源的喷泉系统,因此在对音乐信号进行特征识别前首先要完成对模拟音乐信号的采集。音乐信号的采集主要包括音频放大和 A/D 转换两个过程,下面分别进行分析。

2.2.1 音频放大电路的设计

外部音源信号的幅度一般较弱,因此必须要对原信号进行放大处理后才能送入A/D 转换器。本文选择了 LM386 芯片设计音频放大电路。LM386 是美国国家半导体公司(NS)推出的系列功率放大集成电路的一种,LM386 具有功耗低、工作电压范围宽、所需外围元件少等特点,在电子设备的音频放大电路设计中应用非常广泛,它使用了 10 只晶体管构成了输入级、电压增益和电流驱动级。其中 T1~T6 组成 PNP 型复合差分放大器,T5、T6 为镜像恒流源,作为 T3、T4 的有源负载,使输入级有稳定的增益。电压增益级由接成共发射极状态的 T7 承担,其负载也使用了恒流源,整个集成功放的开环增益主要由该级决定。T8、T9 复合为一个 PNP 管,和 T10 共同组成互补对称射极输出电路,以供给负载以足够的电流。D1、D2 提供了 T8、T9、T10 所需的偏置,使末级偏置在甲乙类状态。R5~R7 构成内部反馈环路。从图 3.2.1 可以看出,LM386 采用双列 8 脚封装结构,它的工作电压范围为 4~12V,静态电流 4mA,最大输出功率 660mW,最大电压增益 46dB,增益带宽 300kHz,谐波失真 0.2%。
在这里插入图片描述
在 LM386 的 DataSheet 上,提供了两种典型放大电路的设计方案。一种是在LM386 的 1 脚和 8 脚之间不接其他元件,此时放大电路的增益仅由内部电阻R5~R7决定,为 20 倍数(26dB),这种方式外部电路元件最少,也最为经济。另一种通过在 1 脚和 8 脚之间串接不同的阻容元件,改变放大电路的交流反馈量,从而改变放大电路的闭环增益。音乐信号的放大采集如图 2.2.2 所示。外部音源(声卡、CD 机等)的模拟音乐信号分左、右声道分别进入放大电路,经过信号放大后,得到幅值放大后的音频信号。从图 3.2.2 可以看出放大电路的具体设计。在 LM386 的 1 脚和 8 脚之间串接一个 10 微法的电容 C4,使内部电阻 R6 被交流旁路,放大电路的增益能达到最大值,200 倍数(46dB)。再对音频放大电路的外围电路进行设计,电路中电容 C1、C6 作为隔直电容,电位器 P1 用于调节音量的大小,元件 R2、C5 有助于旁路高频噪音和改善输出的音质。电容 C3 作为去耦电容,一方面是本集成电路的蓄能电容,另一方面旁路掉该器件的高频噪声。电容 C2 则是作为旁路电容,将信号的中高频噪音旁路到地。经过放大电路的音频信号就送入 A/D 转换器进行采样,这里 A/D转换器要设置为双极性,即能接收负信号。
在这里插入图片描述
2.2.2 采样定理
采样是指用一较高频率的开关脉冲对模拟信号进行取样,取出脉冲到来时刻所对应的模拟信号的幅度,这样就可以得到一连串幅度变化的离散脉冲。用这些离散脉冲序列代替原来时间上连续的信号,也就是在时间上将模拟信号离散化。
如图 3.2.2 所示,在对音乐信号进行放大处理后,就要通过 A/D 转换将模拟信号采集进计算机,这就是音乐信号的采样。我们在对一个连续的音乐信号进行采样时,为了使采样后的样本序列能够包含足够的信息以使其能够较正确地重现原来的模拟信号,在采样时应当使采样频率满足采样定理的要求。采样定理的描述为“对一个模拟信号进行离散化时,只要满足采样频率fs 大于或等于被采样信号的最高频率fm的2 倍,就可以通过理想的低通滤波器,从样本值序列信号中无失真地恢复出原始模拟信号”,这里的fm称为香农频率,这个采样定理又称为香农采样定理。实际应用中为了较好的防止频谱混叠失真,采样频率一般要稍大于信号最高频率的 2 倍。比如乐曲的音域频段如果在 50Hz~4000Hz 内,就要将 A/D 转换器的采样频率选定为 10kHz,才能满足香农采样定理的要求。

2.3 单片机电路
单片机要采集音乐信号,并据此调节I/O口的输出来控制水泵和彩灯。主芯片选用AT89C51单片机。AT89C51单片机是一个低功耗,高性能的51内核的CMOS 8位单片机,片内含8K空间的可反复擦写1000次的Flash只读存储器,具有256bytes的随机存取数据存储器(RAM),32个I/O口,1个看门狗定时器,3个16位可编程定时器,具有ISP功能,能够满足设计要求。使用简单且价格非常低廉。故系统的主控制器采用此方案。
在这里插入图片描述
2.3.1 单片机的概述
AT89C51是美国ATMEL公司生产的低电压,高性能CMOS 8位单片机,片内含4K bytes的可反复擦写的只读程序存储器(PEROM)和128 bytes的随机存取数据存取器(RAM),器件采用ATMEL公司的ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元。AT89C51提供一下标准功能:4K字节Flash闪速存储器,128字节内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个双全工串行通信口,片内震荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。

单片机有四个数据输出端口,P0口、P1口、P2口、P3口。由于P3口还有许多特殊功能,如读写控制、串行通信、外部中断等功能,所以P3口不用作数据输入输出端口。P0口具有很强的带负载的能力,除了用作地址总线低八位以外,还兼作访问外接扩展程序内存时数据总线以及与A/D转换器ADC0809L连接的资料线。P1口、P2口带负载能力相对比教弱,而P2口需要用作访问外接内存的高八位地址线,因此P2口也不作为数据输入输出口,剩下的P1口作为资料输出口。

2.3.2 时钟电路的设计
AT89C51芯片内部有一个高增益反相放大器,用于构成振荡器。反相放大器的输入端为XTAL1,输出端为XTAL2两端跨接石英晶体及两个电容就可以构成稳定的自激振荡器,如图2—13所示:
在这里插入图片描述
2.4 AD转换电路
输入的电压为交流模拟量,不能直接送入单片机进行处理。因此首先采用全桥整流,滤波。使其成为直流信号,再采用全桥整流,滤波。使其成为直流信号,再采用了ADC电路。其中AD芯片为ADC0832。ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。芯片转换时间仅为32 s,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性强。独立的芯片使能输入,使多器件挂接和处理器控制变得更加方便。通过DI数据输入端,可以轻易的实现通道功能的选择。串行通信节约单片机I/O资源。
ADC0809各引脚功能:ADC0809采用双列直插式封装,共有28条引脚。
(1)IN0—IN7(8条) IN0—IN7为8路模拟电压输入线,用于输入被转换的模拟电压;
(2)地址输入和控制(4条) ALE为地址锁存允许输入线,高电平有效。当ALE线为高电平时,ADDA、ADDB和ADDC三条地址线上的地址信号得以锁存,经译码后控制8路模拟开关工作,ADDA、ADDB和ADDC 为地址输入线,用于选择IN0—IN7上的哪一路模拟电压送给比较器进行A/D转换。
(3)数字量输出及控制线(11条)“START”为“启动脉冲”输入线,该线上的正脉冲由CPU送来,宽度应大于100ns,上升沿清零SAR,下降沿启动ADC工作。EOC为转换结束输出线,该线上的高电平表示A/D转换已结束,数字量已锁入“三态输出锁存器”。OE为“输出允许”线。
(4)电源线及其他(5条) CLOCK为时钟输入线,用于为ADC0809提供逐次比较所需的时钟脉冲序列。VCC为+5电源输入线,GND为地线。VREF(+)和VREF(-)为参考电压输入线,用于给电阻阶梯网络供给标准电压。VREF(+)常与 VCC 相连VREF(-)常接地或负电源电压。

2.4.1 ADC0809与单片机89C51的连接
ADC0809的时钟信号来自单片机89C51的ALE信号,89C51采用12MHz时钟频率,ALE为2MHz,经四分频后为500KHz作为ADC0809的时钟频率。用P2.7控制A/D转换的启动与转换结束后数字量的读取。ADC0809的地址锁存允许管脚(ALE)H和启动管脚(START)相连。由P2.7和WR信号经或非门提供的信号使P0.2—P0.0提供的3位通道地址送入ADC0809进行锁存,用以选取通道号。转换结束信号EOC作为查询信号。具体接口电路如图2-4所示。
在这里插入图片描述
2.4.2输入电路
在这里,输入电路是指能对乐曲启停、乐曲节奏和声音强弱等进行检测并将检到的信号以电平、脉冲或数字形式送至单片机的电路。为说明简单计,这里仅介绍能反映乐曲启停的奏曲信号电路。因为有了它,音乐已不再仅是背景音乐,音乐已用来控制整个喷池的动作与否,因而已达到了音乐喷泉的最基本要求。奏曲信号电路的框图如图2.4.2所示。左右两路立体声信号经混合后送限幅放大电路放大,这样即使是极弱的乐曲信号也能有足够强度媳信号输出。整流滤波电路用以将信号转为单向信号。电压比较器用以将大于基准电压的单向信号变换成低电平有效的奏曲信号由之端输出。通过调整基准电压,可使电路既不受干扰的影响又灵敏度最大。奏曲信号电路的输出经R3送至光耦4N35在单片机P1.5引脚产生一低电平信号。
在这里插入图片描述
2.5潜水泵调速硬件方案设计(详见下载)

2.6灯光硬件方案设计(详见下载)

2.7解决系统时间滞后硬件电路设计
由于单片机采集数据并处理需要一定的时间,加上电机响应和水柱显示也需要一定的时间。电机由一种转速到另一种转速的响应时间可以查电机参数得到,电动机的响应时间为0.04S,单片机采集处理数据程序约为100句,约为0.6ms,水柱的显示延时可以通过水闸效应计算出来,经计算总延时约为0.2S。提出两种解决方案。
方案一:采用预处理,即把要控制的音乐元素提前编辑好,提前控制。
方案二:采用把音乐延时播放,即在音乐源与音响间加延时电路,调节参数,使音乐与水柱的变化同步。
音乐元素提前预处理一般使用在工控机等数字处理能力非常强的控制系统中,使用单片机一般实现不了这个预处理目标。因此采用延时电路[6]把音乐延时播放,选择方案二。


第3章 喷泉控制系统软件设计

程序采用模块化结构,所有用到的常数或数组都用EQU或DATA或DB伪指令定义与命名,以使程序易于修改、调试和升级。本系统将TO溢出中断用于软件看门狗。

3.1喷池数据
喷池数据是用以对喷池内的水泵、电磁阀和彩灯等进行开与关控制的数据。一组可循环使用的这种数据,就决定了喷泉和彩灯的一个特定的变化形态。这组喷池数据可称为花样数据。对一个特定构造的喷池,这种花样数据可编写出很多。下面以图3.1为例说明花样数据的编排方法。假设希望外圈喷头每隔一定时间顺次增喷2个喷头,且从2个经4步顺时针增至8个后,再顺次以同样的方向同样的速度每次减喷2个喷头,即从8个喷头经4步减至0。以后不断按上述规律循环变化。在这期间,里圈和中心喷头一直不喷。在不考虑其它控制的情况下,图4.1喷池只需2个输出寄存器,其各位控制喷头定义如下:
在这里插入图片描述
以上各位若为1时相应的喷头喷水,为0时不喷水,则外圈喷头数据应为:(详见下载)

若该花样数据定义为HYSJ01则数据定义如下:(详见下载)

每次将花样数据输出时都是顺次取一列输出的,且可循环取用。显然这样的花样数据可以编不少,还可将两个以上的数据搭配起来,组成新的更复杂一些的花样数据。

3.2主程序框图
程序重新设置后,进入0000H开始的主程序,其流程图如图3.2所示。可以看出:P1.4上的开关K决定是否测试输出通道;乐曲是否演奏决定了喷池是否有动作,即P1.5的电平;拔码开关的设定值决定了延时多少倍的0.1秒时间,即喷池动作改变的时间间隔:奏曲每停一次(大多数乐曲奏曲中间不会停),下次再奏曲就换一组花样数据,若用完了最后一组,以后就从头再取。也就是多个乐曲依次轮流循环使用编制好的喷池花样数据。
在这里插入图片描述
3.3 控制潜水泵软件设计模块(详见下载)
3.4控制电磁阀软件设计模块(详见下载)
3.5 歌曲存储模块(详见下载)
3.6灯光控制模块
LC182是音频调制彩灯控制专用芯片,其内部分配器频率的高低受音频信号大小的调制,特别适用于声光音响控制场合,可直接驱动驱动众多发光二极管闪光,也可驱动交流彩色电灯作循环闪光。LC182为四路驱动输出。他们的内部均有信号整流电路。压控振荡器,脉冲分配器。在本系统中,单片机便开启LC182时,LC182四路输出依次变为高电平,其循环频率约为0.5~1HZ,一有音乐信号的输入,彩灯的循环频率随音频信号的大小而变化,其最高循环频率为15HZ。

LUMP:
	   MOV   DPTR,  #0EF00H	;      初始化2#8155,PA口为基本输出口
                                    PB口为基本输出口,PC口输入口
	    MOV   A,     #1H
	    MOVX @DPTR, A
       INC   DPTR
	    INC   DPTR;                 指向2#8155PC口
	    MOV  A,   #01H
	    MOVX @DPTR, A
	    RET

3.7看门狗子程序(详见下载)

3.8实验仿真
仿真是利用计算机对实际额屋里模型或数学模型进行试验(虚拟仪器的虚拟实验),通过这样的模型试验来随一个实际系统的性能和工作状态进行分析和研究。
近年来计算机仿真技术取得了快速的发展,同时推动了单片机仿真技术的进步。目前,用于单片机仿真的工具很多,有些主要用于软件仿真,侧重于算法的验证;有些用于硬件仿真的工具对CPU的仿真能力有限,至于对CPU外围的硬件仿真更是无能为力。Proteus在单片机CPU和外围器件方面表现出卓越的仿真能力使其成为目前最好的仿真工具之一。
Proteus的显著特点如下:
(1)全部满足单片机软件仿真系统的标准,并在同类产品中有明显优势;
(2)具有模拟电路仿真、数字电路仿真、单片机及外围电路组成的系统仿真的功能;
(3)目前支持的单片机类型有:68000系列、51系列、AAVR系列等;
(4)支持大量的存储器和外围设备。
由于实验室条件原因本设计仿真部分不能在实验室完成,因此仅在此将使用Proteus来实现本设计仿真的步骤进行描述如下:
第一步:打开Proteus 6 Professional绘图界面。
第二步:添加所需元件并连接电路图。本设计所需元件有:AT89C51、LED灯、水泵、电磁阀、扬声器等。
第三步:添加仿真文件。
第四步:单击开始图标,开始仿真。此时喷泉开始运行,根据运行状态进行源代码的调试。

(附录及其它详见下载)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/4974.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java_Spring:9. 基于 XML 的 AOP 配置

目录 1 环境搭建 1.1 第一步:准备必要的代码 1.2 第二步:拷贝必备的 jar 包到工程的 lib 目录 1.3 第三步:创建 spring 的配置文件并导入约束 1.4 第四步:配置 spring 的 ioc 1.5 第五步:抽取公共代码制作成通知 …

数据结构与算法笔记--数据结构与算法基本知识

目录 1--数据结构 2--算法 3--算法分析 4--实例1:普通算法与秦九韶算法的运算效率比较 5--实例2:最大子列和问题 5-1--暴力求解法 5-2--分而治之 5-3--动态规划 5-4--完整代码 1--数据结构 定义:所有数据元素以及数据元素之间的关系…

JS手写Promise(详细过程)

PS:JS手写Promise方法的整理在下一篇文章 手写Promise的API(resolve,reject,then,catch,finally,all)_Eric加油学!的博客-CSDN博客 1、基础版Promise 首先,通过一个简单的Promise例子回顾其使用 const promise new Promise((resolve, rej…

为什么诚信是项目管理的关键部分?

由于有许多需要指导的活动部件和风险,管理一个新项目可能是一项具有挑战性的工作。在一些对质量有着严格要求的行业,项目结构、设定目标、跟踪状态、风险管理和资源管理等项目管理原则尤为重要,而领导这项工作的是诚信。那么,究竟…

IP 归属用 Ip2region 就够了

文章目录Ip2region 简介是什么特性支持的编程语言案例实操依赖获取IP输入流转化解析IP测试抖音、微博、小红书等各平台相继上线" 网络用户IP地址显示功能", 境外显示 国家, 境内显示到 省市,且该功能无法关闭,IP地址为强…

【新2023Q2模拟题JAVA】华为OD机试 - 分苹果

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:分苹果 题目 AB两个人把苹果…

第16章_变量、流程控制与游标

第16章_变量、流程控制与游标 🏠个人主页:shark-Gao 🧑个人简介:大家好,我是shark-Gao,一个想要与大家共同进步的男人😉😉 🎉目前状况:23届毕业生&#xf…

ClickHouse学习笔记(三):MergeTree 原理解析

文章目录1、简介2、MergeTree 创建方式与存储结构2.1、MergeTree 的创建方式2.2、MergeTree 的存储结构3、MergeTree 数据分区3.1、分区目录的命名规则3.2、分区目录合并过程4、一级索引4.1、索引粒度4.2、索引生成4.3、索引查询5、二级索引6、数据存储7、数据标记8、协同总结8…

BootStrap4:栅格系统

1、container容器 container:固定宽度的容器container-fluid:响应式容器 2、栅格选项 Bootstrap4 总共有五个栅格等级,每个响应式分界点隔出一个等级 Ps:.row上带有margin-left: -15px;margin-right: -15px;属性,你…

【22年蓝桥杯】十三届蓝桥杯真题JavaB组解析+代码(带你复习知识点)(一)

试题 A: 星期计算 【填空题】 答案:7 解析:直接对所给数进行取余,然后直接再加6(注意:不能直接让20^226再对7进行取余操作,这是不对的,这个6可以看成已经取余过了。) 直接取余的话可…

Linux系统安装部署及配置Grafana

TOC 用于 UI 展示 wget https://dl.grafana.com/oss/release/grafana-8.0.3-1.x86_64.rpm1 安装 grafana 1.1 下载安装 wget https://dl.grafana.com/oss/release/grafana-8.0.3-1.x86_64.rpmsudo yum install grafana-8.0.3-1.x86_64.rpm1.2 启动&状态查看 sudo syst…

PHP初级教程------------------(3)

目录 文件包含 文件包含的作用 文件包含四种形式 文件加载原理 Include和require区别 文件加载路径 文件嵌套包含 函数 函数的基本概念 函数定义语法 函数命名规范 参数详解 形参 实参 默认值 引用传递 函数体 函数返回值 ​作用域 静态变量 可变函数 匿名函数 闭包 伪类型 文件…

作为一个数学专业的学生,我是怎么看待编程的?

1.概况 博主的专业是数学与应用数学,简称应数。虽然后面跟了个应用数学,但是这个专业应该是本科阶段最接近数学的专业了。我认为这个专业使我具有如下的几个优势: 数学的学习使我具有较强的思维能力。编程本质上就是通过写代码的方式来解决…

大数据Flink进阶(八):Apache Flink架构介绍

Apache Flink架构介绍 一、Flink组件栈 在Flink的整个软件架构体系中,同样遵循这分层的架构设计理念,在降低系统耦合度的同时,也为上层用户构建Flink应用提供了丰富且友好的接口。

山东大学机器学习大作业

数据处理与可视化这里是DLRM模型数据集预处理模块:args.ln_emb ln_emb.tolist() m_spa args.arch_sparse_feature_sizeln_emb np.asarray(ln_emb)num_fea ln_emb.size 1 # num sparse num dense featuresm_den_out ln_bot[ln_bot.size - 1]Sparse fea 26, D…

Java设计模式-3、单例模式

单例模式 单例模式属于创建型模式,⼀个单例类在任何情况下都只存在⼀个实例, 构造⽅法必须是私有的、由⾃⼰创建⼀个静态变量存储实例,对外提供⼀ 个静态公有⽅法获取实例。 优点是内存中只有⼀个实例,减少了开销,尤…

代码随想录|day26|回溯算法part03● 39. 组合总和● 40.组合总和II● 131.分割回文串

今天的练习基本就是回溯法组合问题,这一节只要看labuladong即可。 组合问题: 39. 组合总和---------------------形式三,元素无重可复选 链接:代码随想录 一次对,同样在进入下次循环时,注意startindex是从j…

欧莱雅校招负责人张泽宇:拥抱Z世代,探索新玩法

作为校招HR,你在雇主品牌创新实践的路上做过什么尝试? 2020年,欧莱雅正式推出了全新的雇主品牌价值主张 —— 敢为敢超越,就是欧莱雅(Freedom to go beyond, thats the beauty of L’ORAL),鼓励…

使用ChatGPT进行AI对话

1.ChatGPT简介 ChatGPT是美国人工智能研究实验室OpenAI新推出的一种人工智能技术驱动的自然语言处理工具,使用了Transformer神经网络架构,也是GPT-3.5架构,这是一种用于处理序列数据的模型,拥有语言理解和文本生成能力&#xff0c…

C/C++ 日期 时间 函数总结

使用C标准库 有四个与时间相关的类型&#xff1a;clock_t、time_t、size_t 和 tm。类型 clock_t、size_t 和 time_t 能够把系统时间和日期表示为某种整数 头文件 #include <time.h> #include <stdio.h> tm 结构: struct tm {int tm_sec; // 秒&#xff0c;…