程控放大器的设计方案

合集下载

基于单片机的程控放大器设计

基于单片机的程控放大器设计

基于单片机的程控放大器设计单片机是一种集成电路,它可以通过编程实现各种功能。

在现代电子技术中,单片机被广泛应用于各种电子设备中,包括程控放大器。

程控放大器是一种电子设备,它可以通过编程实现各种放大器功能,例如音频放大器、视频放大器等。

本文将介绍基于单片机的程控放大器设计。

1. 程控放大器的基本原理程控放大器是一种电子设备,它可以通过编程实现各种放大器功能。

它的基本原理是利用单片机控制放大器的各种参数,例如增益、频率响应等。

通过编程,可以实现各种放大器功能,例如音频放大器、视频放大器等。

2. 单片机的基本原理单片机是一种集成电路,它可以通过编程实现各种功能。

它的基本原理是利用微处理器、存储器、输入输出接口等组成一个完整的系统。

通过编程,可以实现各种功能,例如控制电机、控制灯光等。

3. 基于单片机的程控放大器设计基于单片机的程控放大器设计需要考虑以下几个方面:(1)单片机的选择:选择适合的单片机是设计的第一步。

需要考虑单片机的性能、存储器容量、输入输出接口等因素。

(2)放大器电路的设计:放大器电路是设计的核心部分。

需要考虑放大器的增益、频率响应等参数。

(3)单片机程序的设计:单片机程序是设计的关键部分。

需要编写程序实现放大器的各种功能。

(4)测试与调试:测试与调试是设计的最后一步。

需要对设计的程控放大器进行测试与调试,确保其正常工作。

4. 程控放大器的应用程控放大器可以应用于各种电子设备中,例如音频放大器、视频放大器等。

它的优点是可以通过编程实现各种功能,具有灵活性和可扩展性。

5. 总结基于单片机的程控放大器设计是一种先进的电子技术,它可以通过编程实现各种放大器功能。

设计时需要考虑单片机的选择、放大器电路的设计、单片机程序的设计、测试与调试等方面。

程控放大器可以应用于各种电子设备中,具有灵活性和可扩展性。

程控放大器的设计与实现

程控放大器的设计与实现

程控放大器的设计与实现摘要本文介绍了一种可通过程序改变增益的放大器。

它与ADC相配合,可以自动适应大范围变化的模拟信号电平。

系统以89S51单片机作微处理器,运用NE5532芯片组成运放电路,采用CD4052芯片担任增益切换开关,通过软件控制开关的闭合或断开来达到改变电路的增益。

文章首先对系统方案进行论证,然后对硬件电路和软件设计进行了说明,最后重点阐述了系统的调试过程,并且对调试过程中遇到的问题以及解决方案进行了详细说明。

该系统设计达到了预期要求,实现了最大放大60db的目的。

关键词程控放大器;运算器放大器;单片机;增益The Design and Realization of Program-Controll AmplifierAbstractThis article introduces a amplifier which changes the gain through the software. It coordinates with ADC and adapts the simulated signal level with wide range change automatically. The system uses the 89s51 SCM as the core. The NE5532 chip composes the operational circuit and the CD4052 chip composes the gain switch. The gain of the circuit is changed by software which can control switch closed or disconnect.The article first demonstrates the system plan, then introduces the hardware and the software, finally explains the debugging process of the system with emphasis. It also especially analogizes the problem in the debugging process and the resolutions. This system design has achieved anticipative request and realized enlarged 60db most greatly the goal.Key wordsProgram-controlled amplifier; operational Amplifier; SCM; gain前言在计算机数控系统中,模拟信号在送入计算机进行处理前,必须进行量化,即进行A/D 转换[ 1 ]。

程控增益放大器的几种通用设计方法

程控增益放大器的几种通用设计方法

程控增益放大器的几种通用设计方法1. 引言1.1 引言程控增益放大器是一种常用的电子元器件,能够对输入信号进行放大,从而实现信号处理和传输。

在现代电子技术领域,程控增益放大器应用广泛,可以用于音频放大、信号采集、通信系统等多个领域。

在设计程控增益放大器时,需要考虑到电路的稳定性、放大倍数、输出功率等因素。

根据不同的需求和应用场景,可以采用不同的设计方法来实现。

本文将介绍几种通用的设计方法,包括反馈电路设计、桥式电路设计和共源共漏极电路设计。

通过深入研究这些设计方法,可以帮助工程师们更好地理解程控增益放大器的原理和工作方式,从而在实际应用中更加灵活地进行设计和调试。

希望本文能为读者提供有益的参考和指导,帮助他们在工程实践中取得更好的成果。

2. 正文2.1 设计方法一:反馈电路设计反馈电路是程控增益放大器设计中常用的一种方法。

通过在放大器的输入端和输出端之间引入反馈回路,可以有效地控制放大器的增益、带宽和稳定性。

反馈电路分为正反馈和负反馈两种类型,其中负反馈是应用最为广泛的一种。

在设计反馈电路时,首先需要选择合适的放大器结构和反馈类型。

常用的放大器结构包括电压放大器、电流放大器和功率放大器。

而在选择反馈类型时,需要考虑到设计的目的和性能要求,比如希望增加放大器的带宽就需要采用带宽增强型反馈电路。

在设计反馈电路时,还需要注意反馈回路的稳定性和相位裕度。

通过合理设计反馈网络中的元件参数,可以提高放大器的稳定性和抑制干扰。

还需要考虑反馈电路的线性度和降噪能力,以确保放大器输出的信号质量。

反馈电路是一种有效的设计方法,可以帮助提高放大器的性能和稳定性。

在实际应用中,设计者需要根据具体需求选择合适的反馈类型和参数,以实现最佳的设计效果。

2.2 设计方法二:桥式电路设计桥式电路设计是一种常用的程控增益放大器设计方法,具有较好的性能和稳定性。

在桥式电路设计中,通过合理选择电阻和电容的数值,可以实现放大器的特定增益和频率响应。

基于单片机的程控放大器设计

基于单片机的程控放大器设计

基于单片机的程控放大器设计引言:程控放大器是一种能够通过控制电子元件的放大倍数的放大器。

它可以根据输入信号的大小来自动调整放大倍数,以便在不同场景下提供最佳音频输出。

本文将介绍基于单片机的程控放大器的设计原理和实现方法。

一、设计原理基于单片机的程控放大器的设计原理基于负反馈原理。

在放大器电路中,通过将一部分输出信号反馈到输入端,可以有效地控制放大倍数。

单片机作为控制核心,通过对输入信号进行采样和处理,然后控制反馈电路中的放大倍数,以达到自动调节的目的。

二、设计步骤1. 硬件设计:a. 选择合适的单片机:根据需求选择具备足够计算能力和IO口数量的单片机。

b. 连接放大器电路:将单片机的IO口与放大器电路进行连接,以实现对反馈电路的控制。

c. 添加输入和输出接口:将音频输入和输出接口与放大器电路相连接,以实现信号的输入和输出功能。

2. 软件设计:a. 初始化设置:在单片机上进行初始化设置,包括IO口的配置、时钟的设置等。

b. 采样输入信号:使用单片机的ADC模块对输入信号进行采样,获取输入信号的大小。

c. 处理输入信号:对采样到的输入信号进行处理,如滤波、放大等操作。

d. 计算放大倍数:根据处理后的输入信号大小,计算出对应的放大倍数。

e. 控制反馈电路:通过单片机的IO口控制反馈电路中的放大倍数,实现自动调节功能。

f. 输出信号:将经过放大后的信号输出到音频输出接口,以供外部设备使用。

三、实现方法1. 硬件实现:a. 选择合适的单片机:根据需求选择性能稳定、易于编程的单片机。

b. 连接放大器电路:根据放大器电路的设计原理,将单片机的IO 口与反馈电路进行连接。

c. 添加输入和输出接口:根据需求添加音频输入和输出接口,以实现信号的输入和输出功能。

2. 软件实现:a. 编写初始化代码:根据单片机的型号和规格,编写初始化代码,进行IO口和时钟的配置。

b. 编写采样代码:使用单片机的ADC模块进行输入信号的采样,获取输入信号的大小。

基于单片机的程控放大器设计

基于单片机的程控放大器设计

基于单片机的程控放大器设计
程控放大器是一种能够通过数字信号控制放大器增益的电路,它可以实现对信号的精确控制,广泛应用于音频放大器、电视机、电脑音响等领域。

本文将介绍一种基于单片机的程控放大器设计方案。

设计方案
本设计方案采用单片机AT89C51作为控制核心,通过数字信号控制放大器的增益,实现对信号的精确控制。

具体实现步骤如下:
1. 信号输入:将音频信号输入到放大器的输入端口。

2. 放大器控制:将单片机输出的数字信号转换为模拟信号,通过运放实现对放大器的控制。

3. 增益控制:通过单片机控制放大器的增益,实现对信号的精确控制。

4. 输出信号:将控制后的信号输出到扬声器或其他设备。

设计要点
1. 单片机选择:本设计方案采用AT89C51单片机,具有较高的性能和稳定性,能够满足程控放大器的控制要求。

2. 放大器选择:本设计方案采用TL071运放作为放大器,具有高
增益、低噪声、低失真等优点,能够满足音频放大器的要求。

3. 增益控制:本设计方案采用数字信号控制放大器的增益,通过单片机控制放大器的反馈电阻,实现对信号的精确控制。

4. 输出保护:为了保护扬声器或其他设备,本设计方案采用输出保护电路,能够有效避免输出过载和短路等问题。

总结
基于单片机的程控放大器设计方案,能够实现对信号的精确控制,具有较高的性能和稳定性,广泛应用于音频放大器、电视机、电脑音响等领域。

本文介绍了一种基于单片机的程控放大器设计方案,希望能够对读者有所帮助。

程控放大器的设计与实现

程控放大器的设计与实现

程控放大器的设计与实现摘要本文介绍了一种可通过程序改变增益的放大器。

它与ADC相配合,可以自动适应大范围变化的模拟信号电平.系统以89S51单片机作微处理器,运用NE5532芯片组成运放电路,采用CD4052芯片担任增益切换开关,通过软件控制开关的闭合或断开来达到改变电路的增益.文章首先对系统方案进行论证,然后对硬件电路和软件设计进行了说明,最后重点阐述了系统的调试过程,并且对调试过程中遇到的问题以及解决方案进行了详细说明。

该系统设计达到了预期要求,实现了最大放大60db的目的。

关键词程控放大器;运算器放大器;单片机;增益The Design and Realization of Program—Controll AmplifierAbstractThis article introduces a amplifier which changes the gain through the software。

It coordinates with ADC and adapts the simulated signal level with wide range change automatically。

The system uses the 89s51 SCM as the core。

The NE5532 chip composes the operational circuit and the CD4052 chip composes the gain switch. The gain of the circuit is changed by software which can control switch closed or disconnect.The article first demonstrates the system plan, then introduces the hardware and the software,finally explains the debugging process of the system with emphasis。

程控增益放大器的几种通用设计方法

程控增益放大器的几种通用设计方法

程控增益放大器的几种通用设计方法1、负反馈设计方法负反馈设计是一种通用的方法,可以用于实现各种不同的放大器,包括程控增益放大器。

其主要思想是在电路中添加一个反馈回路,将反馈信号与输入信号进行比较,然后根据差异制定控制策略,调整输出信号和放大器的增益。

负反馈电路可以降低电路的失真和噪声,并提高增益的稳定性和线性度。

2、差分设计方法差分设计也是一种常用的设计方法,可用于实现高增益、高速度、低噪声和宽带的放大器。

差分设计是指将输入信号分成两路,分别与两个相反极性的放大器级联,再通过一个差分输出极限电路把它们重新组合成一个差分输出信号。

差分放大器可以在差分方式下提高信号的共模抑制比,并将噪声和失真降到最小。

3、可变增益设计方法可变增益设计是一种典型的程控放大器设计方法。

它主要是通过改变放大器的增益系数,从而调整输出信号的大小。

可变增益主要有两种方式:电子开关和可变电压控制器。

电子开关是一种开关式单管放大器,其具有极高的带宽、快速响应和较低的噪声;可变电压控制器则是一种器件,利用其基端的电流来控制器件的输出阻抗,从而调整放大器的增益。

宽带设计方法是一种用于实现大带宽的放大器的设计方法。

它主要是通过优化放大器的频率响应和增益平坦度,从而实现高带宽。

宽带放大器一般采用直接耦合放大器,其特点是带宽宽、响应快、噪声低和失真小。

为了降低失真,还可以采用负载拉调和反馈电路。

5、电容-电阻设计方法电容-电阻设计方法是一种常用的放大器设计方法,适合于高阻抗、低功耗的放大器。

电容-电阻放大器主要是利用电容和电阻对输入信号进行滤波和分离,从而实现对输出信号进行放大。

电容-电阻放大器的特点是带宽小、增益稳定性好、噪声低、输出振荡小。

程控放大器的设计方案

程控放大器的设计方案

长江大学电子系统设计竞赛参赛方案作品名称程控放大器姓名周健(电气1083)、高秀龙(电气1083)所在院系电子信息学院完成时间2011.5.29程控放大器摘要:本设计以LF353、ATMEGA16、DAC0832芯片为核心,加以其它辅助电路实现对宽带电压放大器的电压放大倍数、输出电压进行精确控制。

放大器的电压放大倍数从0.5倍到127.5倍,以±0.5倍为最小步进可设定增益步进,控制误差不大于5%,放大器的带宽大于200KHz。

键盘和显示电路实现人机交互,完成对电压放大倍数和输出电压的设定和显示。

关键字:程控放大器、高精度、控制电压、电压变换、D/A、A/D。

一、系统方案设计与论证1、方案的比较程控放大器在信号调整与控制电路具有广泛的用途,如音响设备中音量的控制,电子设备中信号的准确放大,信号处理电路中输出信号的自动稳幅等。

准确程控增益可调放大器的实现方法通常有以下几种方案可供选用。

方案一:利用可程控的模拟开关和电阻网络构成放大器的反馈电阻,通过接入不同的电阻来实现放大器的放大倍数改变,以达到程控增益的目的。

此方案的优点是控制简单,电路实现较为容易。

缺点是多路模拟开关使用频率较低,其导通电阻对信号传输精度影响较为明显,漂移较大,输入阻抗不高,对于较为精确的控制其影响难以进行后期修正,切换时抖动引起的误差比较大,切换速度较慢。

控制精度增加一位,电阻网络就增加一级,电阻网络的电阻选择也较为困难,很难做到高精度控制。

方案二:利用数字电位器作为放大器的反馈电阻,实现放大器的放大倍数改变。

此方案和方案一原理基本相同,都是通过调节反馈电阻来实现对增益的控制,不同的是选用数字电位器来实现,缺点是数字电位器为了扩大使用电压范围,内部附加了由振荡器组成的充电泵,因而会产生有害的高频噪声,它同样不能满足高精度控制要求。

方案三:利用电流型DAC自身的乘法功能,可以实现程控放大器。

此方案实现较为容易,控制精确较高,一般不能做到宽频使用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

长江大学电子系统设计竞赛参赛方案作品名称程控放大器姓名周健(电气1083)、高秀龙(电气1083)所在院系电子信息学院完成时间2011.5.29程控放大器摘要:本设计以LF353、ATMEGA16、DAC0832芯片为核心,加以其它辅助电路实现对宽带电压放大器的电压放大倍数、输出电压进行精确控制。

放大器的电压放大倍数从0.5倍到127.5倍,以±0.5倍为最小步进可设定增益步进,控制误差不大于5%,放大器的带宽大于200KHz。

键盘和显示电路实现人机交互,完成对电压放大倍数和输出电压的设定和显示。

关键字:程控放大器、高精度、控制电压、电压变换、D/A、A/D。

一、系统方案设计与论证1、方案的比较程控放大器在信号调整与控制电路具有广泛的用途,如音响设备中音量的控制,电子设备中信号的准确放大,信号处理电路中输出信号的自动稳幅等。

准确程控增益可调放大器的实现方法通常有以下几种方案可供选用。

方案一:利用可程控的模拟开关和电阻网络构成放大器的反馈电阻,通过接入不同的电阻来实现放大器的放大倍数改变,以达到程控增益的目的。

此方案的优点是控制简单,电路实现较为容易。

缺点是多路模拟开关使用频率较低,其导通电阻对信号传输精度影响较为明显,漂移较大,输入阻抗不高,对于较为精确的控制其影响难以进行后期修正,切换时抖动引起的误差比较大,切换速度较慢。

控制精度增加一位,电阻网络就增加一级,电阻网络的电阻选择也较为困难,很难做到高精度控制。

方案二:利用数字电位器作为放大器的反馈电阻,实现放大器的放大倍数改变。

此方案和方案一原理基本相同,都是通过调节反馈电阻来实现对增益的控制,不同的是选用数字电位器来实现,缺点是数字电位器为了扩大使用电压范围,内部附加了由振荡器组成的充电泵,因而会产生有害的高频噪声,它同样不能满足高精度控制要求。

方案三:利用电流型DAC自身的乘法功能,可以实现程控放大器。

此方案实现较为容易,控制精确较高,一般不能做到宽频使用。

方案四:利用新型单片集成电压控制放大器实现程控放大器。

此方案实现也较为容易,控制电路成本较低,使用频率受限于放大器本身。

方案五:利用D/A转换器与仪表放大器一起可组成程控增益放大器。

该方案电路简单,增益可调范围大,稳定性好,性价比高,其增益由输入数字量控制,电路很容易和计算机或单片机相连,组成自动测试系统。

2、方案确定分析上述五种方案的优缺点,在满足要求的条件下,方案五具有更大的优越性和灵和性,因此我们采用D/A转换器与仪表放大器一起可组成程控增益放大器。

二、放大器的基本原理1、D/A转换器原理图一D/A转换器原理电路图如图一所示,从V REF端看进去,无论各个开关在什么位置,R-2R网络是个恒阻值R,流入R-2R网络的电流即为I TOTAL=V REF/R, 对于一个N位的MDAC来说,MSB处的2R上流过的电流大小为121I TOTAL,MSB-1处的2R流过的电流为1 22I TOTAL,MSB-2处的电流为123I TOTAL,……,在LSB上流过的电流为12NI TOTAL。

根据运放虚断的特有(V REF R⁄)×(D2N⁄)=−V OUT R FB⁄;R FB通常集成在DAC内部,从而保证和R是相等的,这样可以得到V OUT=−V REF×D2N⁄。

2、D/A转换器构成的程控增益放大器原理根据DAC的原理可知,它是一种电压输入电压输出的关系。

将待放大的模拟信号从V REF输入,就构成了一个增益小于1的放大器,其增益为A K= (1+R X R⁄)D2N⁄,为了实现放大,在接一级或多级放大。

设后级放大2x倍,则放大器的增益为A K=(1+R X R⁄)D×2X−N,其中D是给定的数字量范围为0到2N,从而构成了程控放大/衰减器。

三、系统的硬件设计与实现1、电源部分运放LF353选用±12v的双电源供电,ATmega16工作电压为+5v,电路如下:2、D/A转换器构成的放大电路电路设计如下:当输入信号十分微弱时,通常会淹没在噪声中,为此采用具有高共模抑制比、高输入阻抗、低噪声、宽频带宽特性的运算放大器LF353作为输入缓冲,它单位带宽可达4MHz, 完全满足系统频带宽10Hz到200KHz的要求,共摸抑制比高达100dB,等效输入噪声小于16nV/Hz,能有效抑制共模干扰引入的误差,提高信噪比和系统的精度;放大部分采用8位的DAC0832实现的数字量程控放大,其增益为:A K=12.8×(1+9R R⁄)×D256=0.5D其中D给定的范围从1到255,因此可以实现从0.5倍到127.5倍,最小步进为0.5倍的程控放大。

满足系统增益1倍到100倍,最大步进10倍的设计要求。

3、V PP测量电路采用采样保持集成电路LF398和电压比较器LF353等组成的峰值采样保持电路,输入采样信号频率可达1MHz。

该电路通过控制信号实现对峰值采样,小于原峰值时,电容保持其原峰值,否则保持其新峰值。

其原理是:输入的电压进入采样集成,对电容充电,电压达到最大值(峰值)之后,输出的电压和输入的电压作比较,产生控制信号控制LF398的逻辑控制脚电压,使其采样保持输入信号的峰值。

使用ATmega16内部含有8 路复用的单端输入通道的10位ADC进行模数转换。

10 位精度、0.5 LSB 的非线性度、±2 LSB 的绝对精度、65 - 260 µs的转换时间、最高分辨率时采样率高达15 kSPS、可选的2.56V ADC参考电压、ADC⁄%<0.5%,理论上能满足系统误差要求。

转换结束中断,其误差为12104、显示电路此部分采用4个独立键盘完成功能的选择、放大倍数及增益步进的设置。

信号的幅值大小、放大倍数、步进大小以及工作模式等通过12864液晶进行显示,实现了友好的操作界面。

5、系统控制电路采用ATMEL公司的一款8位单片机ATMEG16来完成信号放大倍数的控制、信号峰值的检测以及显示数值功能,其电路设计如下:系统电路图四、软件程序设计1.12864的驱动时序2、按键驱动时序3、DAC0832的驱动时序4、测量V PP子程序流程图5、按键响应程序流程图INT0中断函数流程图定时器1中断函数流程图6、系统程序流程图附录:附录1:主要元器件清单表附录2:程序源代码/*名称:Atmega16-程控放大器源代码*/ /*时钟:8MHZ */ /*交互器件:LCD128*64、DAC0832、按键*4、模拟量输入*2 */ /*最后修改:2011-5-28 */ #include <avr/io.h>#include <avr/interrupt.h>#define uchar unsigned char#define uint unsigned int#define RS_H() PORTD|=_BV(0); //H=数据; L=指令#define RS_L() PORTD&=~_BV(0);#define RW_H() PORTD|=_BV(1); //H=读; L=写#define RW_L() PORTD&=~_BV(1);#define E_H() PORTD|=_BV(3); //输入使能#define E_L() PORTD&=~_BV(3);#define PSB_H() PORTD|=_BV(4); //H=并口; L=串口#define PSB_L() PORTD&=~_BV(4);#define RST_H() PORTD|=_BV(5); //Reset Signal 低电平有效#define RST_L() PORTD&=~_BV(5);#define DAC_H() PORTA|=_BV(3); //DAC0832输入使能#define DAC_L() PORTA&=~_BV(3);#define ok 0x01 //按键定义#define change 0x02#define add 0x03#define reduce 0x04uchar digit[10]={"0123456789"}; //数字表volatile uchar state = 0; //指令状态值volatile uchar frame = 0; //当前界面状态量volatile uchar key = 0; //键值volatile uchar key_state1 = 0; //进入中断时的按键状态volatile uchar key_state2 = 0; //按键是否弹起volatile uchar key_time = 0; //按键是长按还是短按volatile uint Data_in = 1000; //输入幅度值,这样可以避免过多的浮点数运算volatile uint Data_out = 1000; //输出幅度值,这样可以避免过多的浮点数运算volatile uint multiple_set = 10; //倍数初值设定,这样可以避免过多的浮点数运算volatile uint amplitude_set =1000; //幅值初值设定,这样可以避免过多的浮点数运算volatile float multiple_real =1; //实际放大倍数void delay_ms(uint num){uint i,j;for(i=0;i<num;i++)for(j=0;j<400;j++);}void delay_us(uint num){uint i;for(i=0;i<num;i++);}void DAC0832() //利用DA实现程控放大{static uint temp = 2;static uchar state_new = 1; //防止设定的倍数对反馈产生干扰if(state==1) //确定倍数设定{state = 0;state_new = 0;temp = (uchar)((multiple_set*2)/10);//写给DAC0832的值要对放大倍数乘以2}else if(state==2) //确定幅值设定{state = 0;state_new = 0;temp = (uchar)(amplitude_set*2/Data_in); //写给DAC0832的值要对放大倍数乘以2//由于Data_in单位是ms ,amplitude_set单位是s}else state_new = 1;if(temp>255) temp = 255;PORTB = (uchar)(temp);DAC_L();delay_us(5);DAC_H();if(!state){if((multiple_real*2)<(float)(temp-1)&&temp<255) temp += 1; //temp-1可保留一定死区,增加稳定性else if((multiple_real*2)>(float)(temp+1)&&temp>0) temp -= 1;//temp+1可保留一定死区,增加稳定性}}void Check_Busy() //128*64忙检测{PORTC=0XFF;DDRC = 0x00;RS_L();RW_H();E_H();while(0X80 & PINC);E_L();DDRC = 0xff;}void Write_cmd(uchar cmd) //对128*64写指令{Check_Busy();RS_L();RW_L();E_H();PORTC=cmd;delay_us(2);E_L();}void Write_data(uchar data) //对128*64写数据{Check_Busy();RS_H();RW_L();E_H();PORTC=data;delay_us(2);E_L();}void Write_char(uchar addr,uchar ch) //对128*64指定位置写字符{Write_cmd(addr);Write_data(ch);}void Write_str(uchar addr,uchar *s) //对128*64指定起始位置写字符串{Write_cmd(addr);while(*s)Write_data(*s++);}void describe() //开机说明{Write_cmd(0x30);Write_cmd(0x01); //清屏Write_str(0x80,"输入幅值: <5V");Write_str(0x90,"输出幅值: <5V");Write_str(0x88,"放大范围:0.5-128");Write_str(0x98,"倍数步进:0.5");delay_ms(4000);}void display_Data_in() //显示输入幅度{uchar i,j,k,l;i=Data_in/1000;j=(Data_in%1000)/100;k=(Data_in%100)/10;l=Data_in%10;Write_cmd(0x80);Write_data(digit[i]);Write_data('.');Write_data(digit[j]);Write_data(digit[k]);Write_data(digit[l]);}void display_Data_out() //显示输出幅度{uchar i,j,k,l;i=Data_out/1000;j=(Data_out%1000)/100;k=(Data_out%100)/10;l=Data_out%10;Write_cmd(0x84);Write_data(digit[i]);Write_data('.');Write_data(digit[j]);Write_data(digit[k]);Write_data(digit[l]);}void display_multiple() //实际放大倍数显示{uchar i,j,k,l,m;uint temp;temp = (uint)(multiple_real*100);i=temp/10000;j=(temp%10000)/1000;k=(temp%1000)/100;l=(temp%100)/10;m=temp%10;Write_cmd(0x90);Write_data(digit[i]);Write_data(digit[j]);Write_data(digit[k]);Write_data('.');Write_data(digit[l]);Write_data(digit[m]);}void Show_multiple_set() //倍数设定值显示{uchar i,j,k,l;i=multiple_set/1000;j=(multiple_set%1000)/100;k=(multiple_set%100)/10;l=multiple_set%10;Write_cmd(0x9c);Write_data(digit[i]);Write_data(digit[j]);Write_data(digit[k]);Write_data('.');Write_data(digit[l]);}void Show_amplitude_set() //幅度设定值显示{uchar i,j,k,l;i=amplitude_set/1000;j=(amplitude_set%1000)/100;k=(amplitude_set%100)/10;l=amplitude_set%10;Write_cmd(0x9d);Write_data(digit[i]);Write_data('.');Write_data(digit[j]);Write_data(digit[k]);Write_data(digit[l]);}void Show_menu1() //主菜单1 {frame = 0;Write_cmd(0x01); //清屏Write_char(0x83,'V');Write_char(0x87,'V');Write_str(0x89,"> 倍数设定");Write_str(0x99," 幅值设定"); }void Show_menu2() //主菜单2 {frame = 1;Write_cmd(0x01); //清屏Write_char(0x83,'V');Write_char(0x87,'V');Write_str(0x89," 倍数设定");Write_str(0x99,"> 幅值设定");}void Show_multiple() //设定倍数界面{frame = 2;Write_cmd(0x01); //清屏Write_char(0x83,'V');Write_char(0x87,'V');Write_str(0x88,"倍数设定:");Write_str(0x98,"步进5");Show_multiple_set();}void Show_amplitude() //设定幅值界面{frame = 3;Write_cmd(0x01); //清屏Write_char(0x83,'V');Write_char(0x87,'V');Write_str(0x88,"幅值设定:");Write_str(0x98,"步进0.5");Show_amplitude_set();}void Frame_multiple()//倍数设定界面中有按键按下{static uchar stepping=1;switch(key){case ok: Show_menu1(); state = 1; break; //确定倍数设定case change:if(key_time==1) Show_menu1();else{if(stepping==1){Write_str(0x98,"步进0.5");stepping=2;}else{Write_str(0x98,"步进5 ");stepping=1;Show_multiple_set();}break; //key = change;case add:if(stepping==1){multiple_set += 50;if(amplitude_set>1250) amplitude_set = 1250;}else{multiple_set += 5;if(multiple_set>1280) multiple_set = 1280;}Show_multiple_set();break; //key = reduce;case reduce:if(stepping==1){if(multiple_set>50) multiple_set -= 50;}{if(multiple_set>5) multiple_set -= 5;}Show_multiple_set();break; //key = add;}}void Frame_amplitude()//输出幅值设定界面中有按键按下{static uchar stepping=1; //1对应0.5 2对应0.05 3对应0.005switch(key){case ok: Show_menu1(); state = 2; break; //确定幅值设定case change: if(key_time==1) Show_menu2();else{if(stepping==1){Write_str(0x98,"步进0.05 ");stepping=2;}else if(stepping==2){Write_str(0x98,"步进0.005");stepping=3;}else if(stepping==3){Write_str(0x98,"步进0.5 ");stepping=1;}Show_amplitude_set();}break; //key = change;case add:if(stepping==1){amplitude_set += 500;if(amplitude_set>3000) amplitude_set = 3000; //令最大输出幅值}else if(stepping==2){amplitude_set += 50;if(amplitude_set>3000) amplitude_set = 3000; //令最大输出幅值}else{amplitude_set += 5;if(amplitude_set>3000) amplitude_set = 3000; //令最大输出幅值}Show_amplitude_set();break; //key = reduce;case reduce:if(stepping==1){if(amplitude_set>500) amplitude_set -= 500;}else if(stepping==2){if(amplitude_set>50) amplitude_set -= 50;}else{if(amplitude_set>5) amplitude_set -= 5;}Show_amplitude_set();break; //key = add;}}void Frame_main1() //主菜单1中有按键按下{switch(key){case ok: Show_multiple(); break; //设定倍数case change: Show_menu2(); break; //key = change;case reduce: Show_menu2(); break; //key = reduce;case add: Show_menu1(); break; //key = add;}}void Frame_main2() //主菜单2中有按键按下{switch(key){case ok: Show_amplitude(); break; //设定幅值case change: Show_menu1(); break; //key = change;case reduce: Show_menu2(); break; //key = reduce;case add: Show_menu1(); break; //key = add;}}void Init_12864() //初始化128*64{delay_ms(5);PSB_H();RST_H();Write_cmd(0x30); //选择基本指令集Write_cmd(0x01); //清除显示,并且设定地址指针为00HWrite_cmd(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位Write_cmd(0x0c); //开显示,关游标}int main(){DDRA = 0x0C;DDRB = 0XFF;DDRC = 0XFF;DDRD = 0XFF;PORTA = 0XFF;PORTB = 0XFF;PORTD = 0XFF;TIMSK |= _BV(TOIE0); //使能定时器0溢出中断GICR |= _BV(INT0); //使能外部中断0MCUCR |= _BV(ISC01); //INT0的下降沿产生异步中断请求TCCR0=0X03; //定时器0 64分频,8MHZ时8us加1,定时器250时2ms一次中断,采样达到500次/STCCR1B = _BV(CS12); //定时器1 256分频,8MHZ时64us加1TCNT0=5; //2ms一次中断PORTB = 0x02;DAC_L();delay_us(5);DAC_H();Init_12864();describe();Show_menu1();sei();while(1){display_Data_in();display_Data_out();display_multiple();delay_ms(200); //数据刷新率:5次/秒if(key_state2){switch(frame){case 0x00: Frame_main1(); break; //当前在主界面状态1case 0x01: Frame_main2(); break; //当前在主界面状态2case 0x02: Frame_multiple(); break; //当前在设定倍数界面case 0x03: Frame_amplitude(); break; //当前在设定幅值界面default: break;}key = 0;key_state2 = 0;}}}SIGNAL(SIG_OVERFLOW0) //定时器0中断函数,8位{TCNT0=5;ADMUX = 0x40; // 参考电压选择AVCC,右对齐,通道0ADCSRA = 0xcf; //ADC使能,转换开始,中断允许,128分频给ADC时钟}SIGNAL(SIG_OVERFLOW1) //定时器1中断函数,16位{uchar temp;temp = PINA;temp = temp&0xf0;if(temp != 0xf0) //是按键{key_state1 = 1; //确定有按键MCUCR |= _BV(ISC01)|_BV(ISC00); //INT0上升沿中断TCNT1 = 0; //开始测量按下时长switch(temp){case 0x70: key = ok; break;case 0xB0: key = change; break;case 0xD0: key = reduce; break;case 0xE0: key = add; break;default: break;}}TIMSK &= ~_BV(TOIE1); //关闭定时器1溢出中断}SIGNAL(SIG_INTERRUPT0) //外部中断0函数{uint temp;if(key_state1==0) //按键按下{TCNT1 = 65222; //利用定时器延时20msTIMSK |= _BV(TOIE1); //允许定时器1溢出中断}else{key_state1 = 0;key_state2 = 1; //得到按键值,时长MCUCR &= ~_BV(ISC00); //INT0的下降沿产生异步中断请求temp = TCNT1;if(temp<15625) key_time = 0; //小于1s,短按else if(temp>31250) key_time = 1; //大于2s,长按}}SIGNAL(SIG_ADC) //ADC转换完成函数{static uchar ADC_flag = 1;uint temp1,temp2;if(ADC_flag) //通道0转换完成{ADC_flag = 0;temp1 = ADCL;temp2 = ADCH&0x03;Data_in =(uint)((unsigned long)(temp1 + temp2*256)*5000/1024);ADMUX = 0x41; // 参考电压选择AVCC,右对齐,通道1ADCSRA = 0xcf; //ADC使能,转换开始,中断允许,128分频给ADC 时钟}else //通道1转换完成{ADC_flag = 1;temp1 = ADCL;temp2 = ADCH&0x03;Data_out = (uint)((unsigned long)(temp1 + temp2*256)*5000/1024);ADMUX = 0x00; //关闭ADCADCSRA = 0x00;multiple_real = (float)Data_out/(float)Data_in;DAC0832();}}。

相关文档
最新文档