基于51单片机的函数发生器和示波器解析
- 格式:docx
- 大小:2.07 MB
- 文档页数:17
目录1 引言 (1)1.1 题目要求及分析 (1)1.1.1 示意图 (1)1.2 设计要求 (1)2 波形发生器系统设计方案 (2)2.1 方案的设计思路 (2)2.2 设计框图及系统介绍 (2)2.3 选择合适的设计方案 (2)3 主要硬件电路及器件介绍 (4)3.1 80C51单片机 (4)3.2 DAC0832 (5)3.3 数码显示管 (6)4 系统的硬件设计 (8)4.1 硬件原理框图 (8)4.2 89C51系统设计 (8)4.3 时钟电路 (9)4.4 复位电路 (9)4.5 键盘接口电路 (10)4.7 数模转换器 (11)5 系统软件设计 (12)5.1 流程图: (12)5.2 产生波形图 (12)5.2.1 正弦波 (12)5.2.2 三角波 (13)5.2.3 方波 (14)6 结论 (16)主要参考文献 (17)致谢....................................................... 错误!未定义书签。
1引言1.1题目要求及分析题目:基于51单片机的波形发生器设计,即由51单片机控制产生正弦波、方波、三角波等的多种波形。
1.1.1示意图图1:系统流程示意图1.2设计要求(1) 系统具有产生正弦波、三角波、方波三种周期性波形的功能。
(2) 用键盘控制上述三种波形(同周期)的生成,以及由基波和它的谐波(5次以下)线性组合的波形。
(3) 系统具有存储波形功能。
(4) 系统输出波形的频率范围为1Hz~1MHz,重复频率可调,频率步进间隔≤100Hz,非正弦波的频率按照10次谐波来计算。
(5) 系统输出波形幅度范围0~5V。
(6) 系统具有显示输出波形的类型、重复频率和幅度的功能。
2波形发生器系统设计方案设计并制作一个波形信号发生器,能够产生正弦波、方波、三角波的波形,其中不使用DDS和一些专用的波形产生芯片。
并让系统的频率范围在1Hz~1MHZ可调节,在频率范围在1HZ~10KHz时,步进小于或等于10Hz,在频率范围在10KHz~1MHz时,步进小于或等于100Hz,并且电压在0~5V范围,能够实时的显示波形的类型、频率和幅值。
51单片机延时函数在嵌入式系统开发中,51单片机因其易于学习和使用、成本低廉等优点被广泛使用。
在51单片机的程序设计中,延时函数是一个常见的需求。
通过延时函数,我们可以控制程序的执行速度,实现定时器功能,或者在需要的时候进行延时操作。
本文将介绍51单片机中常见的延时函数及其实现方法。
一、使用for循环延时这种方法不精确,但是对于要求不高的场合,可以用来估算延时。
cvoid delay(unsigned int time){unsigned int i,j;for(i=0;i<time;i++)for(j=0;j<1275;j++);}这个延时函数的原理是:在第一个for循环中,我们循环了指定的时间次数(time次),然后在每一次循环中,我们又循环了1275次。
这样,整个函数的执行时间就是time乘以1275,大致上形成了一个延时效果。
但是需要注意的是,这种方法因为硬件和编译器的不同,延时时间会有很大差异,所以只适用于对延时时间要求不精确的场合。
二、使用while循环延时这种方法比使用for循环延时更精确一些,但是同样因为硬件和编译器的不同,延时时间会有差异。
cvoid delay(unsigned int time){unsigned int i;while(time--)for(i=0;i<1275;i++);}这个延时函数的原理是:我们先进入一个while循环,在这个循环中,我们循环指定的时间次数(time次)。
然后在每一次循环中,我们又循环了1275次。
这样,整个函数的执行时间就是time乘以1275,大致上形成了一个延时效果。
但是需要注意的是,这种方法因为硬件和编译器的不同,延时时间会有差异,所以只适用于对延时时间要求不精确的场合。
三、使用定时器0实现精确延时这种方法需要在单片机中开启定时器0,并设置定时器中断。
在中断服务程序中,我们进行相应的操作来实现精确的延时。
这种方法需要使用到单片机的定时器中断功能,相对复杂一些,但是可以实现精确的延时。
创新性实验研究报告实验项目名称_简易函数信号发生器四、实验内容1、运用keil软件对程序进行编写,运行程序,并进行程序修改。
2、运用protues软件进行硬件电路仿真设计。
3、将程序下载到仿真单片机中,并观测输出波形。
4、对程序进行修改,再次运行仿真软件,直到输出理想的波形。
5、仿照仿真软件进行硬件电路的焊接。
6、将程序下载到单片机,并用示波器测试输出波形。
7、对程序进行修改,直到输出满意的波形为止。
3、实验步骤1、首先打开keil软件.2、运用keil软件对程序进行编写,程序见附件。
3、打开protues软件.4、运用protues软件对硬件电路进行设计。
9C51单片机是该信号发生器的核心,具有2个定时器,32个并行I/O口,1个串行I/O口,5个中断源。
由于本设计功能简单,数据处理容易,数据存储空间也足够,因为我们采用了片选法选择芯片,进行芯片的选择和地址的译码。
在单片机最小最小系统中,单片机从P1口接收来自键盘的信号,并通过P0口输出控制信号,通过DA转换芯片最终由示波器显示输出波形。
单片机引脚分配如下:�XTAL1,XTAL2:外接晶振,产生时钟信号。
�RST:复位电路;�P2口:8位数字信号输出输出,外接DAC0832;�P3.6口和P3.7口:DAC0832的时钟信号;单片机模块单片机输出的是数字信号,因为要得到模拟信号的波形就必须对其进行数模转换。
我们采用了DAC0832数模转换器,该芯片具由8位输入锁存器、8位DAC寄存器、8位D/A转换器及转换控制电路四部分构成。
由于其输出为电流输出,因为外加运算放大器LM324使之转换为电压输出。
最后通过示波器显示输出的波形。
数模转换模块运放模块整体硬件电路图五、实验结果与分析1、实验现象、数据记录仿真波形2、对实验现象、数据及观察结果的分析与讨论:经过观察调试,再观察,再调试,最终输出的波形较为理想。
此次试验经过一系列的调试,最终输出的波形为正弦波、方波、三角波。
基于51单片机的简易函数信号发生器的设计与分析郭 辉(阜阳师范学院信息工程学院,安徽阜阳,236037)摘要:函数信号发生器设计与分析是单片机实践中的一重要实验。
本文采用Proteus 对函数信号发生器的原理图进行设计,并通过Keil 软件编程验证该设计的可行性,通过调节按键,该简易函数信号发生器可以正确输出正弦波、锯齿波、梯形波、矩形波,并可以通过按键对相应波形的频率进行调节,最终通过Proteus 制作出该电路的PCB 原理图。
本设计对单片机项目设计与实现具有一定的指导意义。
关键词:信号发生器;AT89C51;Proteus ;Keil ;PCB 中图分类号:TP368.1 文献标识码:BDesign and analysis of a simple function signal generator based on 51 single chip microcomputerGuo Hui(College of Information Engineering,Fuyang Teachers' College,Fuyang Anhui,236037)Abstract :This paper uses the principle of figure Proteus function signal generator is designed,and the feasibility of the design is verified by Keil software programming,by adjusting the key,the simple function signal generator can output sine wave,Ju Chibo,trapezoidal wave,rectangular wave,and can be adjusted through the key corresponding to the frequency of the waveform, eventually produced by Proteus PCB principle diagram of the circuit.Keywords :signal generator;AT89C51;Proteus;Keil;PCB 0 引言Proteus 软件为英国Labcenter electronics 公司开发的EDA 工具软件。
基于AT89S51单片机的数字信号发生器【摘要】智能仪器的出现,极大地扩充了传统仪器的应用范围。
智能仪器凭借其体积小、功能强、功耗低等优势,迅速地在家用电器、科研单位和工业企业中得到了广泛的应用。
本系统是基于AT89S51单片机设计的数字式波形发生器。
采用AT89S51作为系统的控制核心,外围电路采用数字/模拟转换电路(DAC0832),运放电路(MC1458),按键,ISP接口等。
通过按键控制切换产生正弦波,锯齿波,三角波,方波,各类型信号的频率统一为100HZ,而幅值在-5V~+5V范围内可调。
本设计电路原理简单,性能较好,具有一定的实用性和参考价值。
【关键词】单片机 ,波形发生器,D/A电路DIGITAL SIGNAL GENERATOR DESIGN BASED ON AT89S51【ABSTRACT】The emergence of intelligent machines, which greatly expanded the scope of application of traditional instruments. Intelligent instrument, with its small size, powerful, low-power advantages of home appliances quickly, research institutes and industrial enterprises has been widely used.The system is a digital waveform generator based on single chip computer. AT89S51 is used as a control core. The system is composed by digital/analog conversion (DAC0832),imply circuit (MC1458),button ISP inferface and LED lights. It can generate square triangle and sine wave,with LED display .The frequency of various types of signal unity of 100HZ, but the amplitude in the-5V ~ +5 V range adjustable. The circuit design is simple, better performance, has some practical and reference value.【KEY WORDS】the single chip computer , the signal generator , D/A conversion目录绪论 (9)1. 波形发生器现状 (9)2. 单片机在波形发生器中的运用 (9)第一章系统设计 (10)1. 系统要求 (11)2. 系统方案选择与论证 (11)3. 系统设计原理与思路 (11)第二章硬件电路的设计 (12)1. AT89S51的介绍 (12)2. 资源分配 (15)3. 最小单片机系统的设计 (15)4. 各模块电路的设计 (17)5. ISP接口 (23)第三章软件设计 (24)1. 主程序的设计 (25)2. 锯齿波程序的设计 (25)3. 三角波程序的设计 (26)4. 正弦波程序的设计 (27)5. 方波程序的设计 (28)第四章测试仿真 (29)1. 软件仿真 (29)2. 仿真结论分析 (30)3. 硬件测试结论分析 (31)绪论1.波形发生器现状波形发生器作为一种常用的应用电子仪器设备,传统的波形发生器可以完全用硬件电路搭建,如应用555振荡电路可以产生正弦波,三角波,方波等波形,传统的波形发生器多采用这种方式设计,这种方式不应用单片机,但是这种方式存在波形质量差,控制难,可调范围小,电路复杂和体积大等缺点,在科学研究和生产实践中,如工业过程控制,生物医学,地震模拟震动等领域往往需要低频信号源,而由硬件搭建的波形发生器效果往往达不到好的效果,而且低频信号源所需要的RC很大,大电阻,大电容在制作上有困难,参数的精度也难以保证,而且体积大,漏电,体积大是该类波形发生器的显著缺点。
一款基于51单片机的简易示波器设计
随着电子通信以及教学事业的发展,示波器的应用越来越广泛,它在教学中所起到的作用越来越重要,示波器可以测量信号的幅度,频率以及波形等等,但是高精度的示波器非常昂贵,对于非盈利事业的教学组织来说无疑不合适,所以提出了一种以单片机为控制核心的简易示波器设计方案。
它由前向控制部分,数据采集和存储部分,51 单片机控制部分以及按键和MS12864R 显示部分
组成。
1 简易数字示波器的工作原理以及总体框架
本设计硬件电路部分由单片机控制系统电路,前向输入调理电路,模数转换
和存储电路,以及按键显示电路组成。
其工作的基本思路就是以单片机为控制核心,让AD 芯片完成数据的离散化,采集数据经过缓冲暂存于存储器里面,
当波形显示时,单片机从存储器的读使能端读取采集数据存于数组中,然后进行相应的数据处理并把所存取得数据按一定的顺序打在液晶显示器相应的位置上,从而再现波形信号;其中输入调理电路由阻抗变换电路,信号抬升电路以及频率测量电路构成,阻抗变换电路是为了提高输入阻抗,信号抬升是为了使信号的幅度满足AD 芯片的输入幅度要求,频率测量电路主要是测量周期性信号
的频率。
总体设计框图如图1 所示。
2 硬件设计
2.1 前端信号的处理
本模块具有两大功能,一是输入信号位置的变换;二是信号波形的变换。
信号位置的变换主要由阻抗变换电路,信号抬升电路构成,阻抗变换采用
ua741 构建的阻随放大电路,信号抬升电路采用ua741 构成的加法电路,信号
位置的处理主要是对被测输入信号在幅度与偏移方面进行线性处理,使信号在。
51单片机示波器方案引言示波器是一种广泛应用于电子工程领域的测量仪器,用于显示电压随时间的变化情况。
其主要功能是将电压信号转换为图形显示,帮助工程师进行信号分析和故障排除。
本文讨论基于51单片机的示波器方案,介绍其工作原理、硬件组成和软件实现。
工作原理示波器通过逐点采样并记录电压信号的值,然后将这些点连接起来绘制成波形图。
要实现这个过程,需要以下几个步骤:1.采样:示波器需要以一定的频率对电压信号进行采样。
这可以通过51单片机的ADC(模数转换器)模块实现。
通常,快速采样会增加细节,但也会增加数据处理的复杂性。
2.数字化:采样得到的模拟电压值需要转换为数字值,以便存储和处理。
51单片机内部的ADC模块负责将模拟电压转换为数字值,并提供给微处理器使用。
3.存储:示波器需要一个存储器来缓存采样数据。
51单片机通常具有一些RAM用于数据存储。
如果需要长时间记录大量数据,可以使用外部存储器,如EEPROM或SD卡。
4.显示:通过显示模块将数字波形数据转换为可视化图形。
这可以通过将示波器连接到计算机显示器或LCD屏幕来实现。
5.控制:通过用户界面控制示波器的操作,例如选择采样率、触发电平和时间范围等。
这可以通过使用按钮、旋钮或键盘来实现。
硬件设计1. 51单片机51单片机是一种经典的、广泛应用于嵌入式系统开发的微控制器。
它包括一个微处理器核心、存储器、输入输出口和时钟电路。
2. ADC模块ADC模块用于将模拟电压转换为数字值。
51单片机通常具有一个或多个ADC通道,可以选择合适的通道进行采样。
3. 存储器示波器需要一个存储器来缓存采样数据。
51单片机通常具有一定量的内部RAM用于数据存储。
如果需要更大的存储空间,可以考虑使用外部存储器,如EEPROM或SD卡。
4. 显示模块显示模块将数字波形数据转换为可视化图形。
可以使用计算机显示器或LCD屏幕来显示波形。
5. 用户界面用户界面用于控制示波器的操作,包括选择采样率、触发电平和时间范围等。
基于单片机的函数信号发生器的设计与实现首先,我们需要确定信号发生器的基本功能和要支持的信号类型。
常见的信号类型包括正弦波、方波、三角波和锯齿波等。
我们可以设计一个菜单界面,通过按键或旋钮选择需要生成的信号类型。
选择信号类型后,用户可以调节频率、幅度和相位等参数,生成相应的信号。
接下来,我们需要设计硬件电路。
基于单片机的函数信号发生器需要一个DA转换芯片来实现数字信号到模拟信号的转换。
我们可以选择常用的模数转换芯片,比如R-2R电阻网络型DA转换芯片。
通过电阻网络的调节,我们可以将单片机输出的数字信号转换为对应的模拟信号。
另外,我们还需要考虑信号的放大和滤波问题。
常见的做法是使用运放作为信号的放大器,通过运放的增益调节,我们可以将信号放大到合适的幅度。
同时,我们还需要滤波电路来去除高频噪声和谐波,以保证输出信号的质量。
在硬件设计完成后,我们需要进行软件编程。
我们可以选择一种合适的单片机,根据其开发环境和编程语言进行开发。
常见的单片机包括51单片机、AVR单片机和STM32等。
我们可以使用C语言或汇编语言编写程序,通过定时器和IO口控制输出信号的频率和幅度。
在软件编程中,我们需要实现信号类型的选择、频率、幅度和相位的调节,以及信号输出的控制。
可以根据用户的选择,生成对应的数字信号,并通过DA转换芯片转换成模拟信号。
同时,我们还可以在程序中添加一些附加功能,比如保存设置、显示当前参数等。
最后,我们需要进行整体调试和测试。
我们可以通过示波器来观察输出信号的波形和频谱,以验证信号发生器的功能和性能。
如果有问题,我们可以通过调整电路和程序进行调试和优化。
总之,基于单片机的函数信号发生器的设计与实现是一个相对复杂和庞大的项目。
它需要我们对单片机的原理和编程有一定了解,同时还需要具备一定的电路设计和调试能力。
但是,通过这个项目的实践,我们可以提高我们的技术能力和创新能力,在电子领域中取得更多的成就。
《智能仪器仪表设计基础》课程设计报告单位:自动化学院学生姓名:汪连升专业:测控技术与仪器班级:0821001学号:2010212950指导老师:耿道渠成绩:设计时间:2013 年5月重庆邮电大学自动化学院制一、题目:基于单片机的多波形信号发生器设计二、指导教师:耿道渠三、设计要求:设计一个信号发生器,实现如下功能:(1)可产生正弦波、方波、三角波、脉冲等波形;(2)通过按钮或键盘选定输出波形;(3)波形频率可设定;(4)波形可通过液晶屏显示。
四、给定条件:1、8051单片机最小系统;2、ADC,DAC器件;五、设计:1、方案论证,并确定设计方案2、给出信号发生器的整体设计框图3、硬件电路设计4、软件设计(画出程序流程图,并给出相应模块程序代码)5、完成设计报告六、具体设计过程及实验结果:七、设计的心得体会:八、附件:(可选)完成心率波、指数上升和指数下降波形;九、参考书目:给出主要参考书目(如:《单片机原理与应用》、《电子测量技术》、《单片机C语言程序设计》等),包括作者,书目名称,出版社等。
基于51单片机的波形发生器引言波形发生器是能够产生大量的标准信号和用户定义信号,并保证高精度、高稳定性、可重复性和易操作性的电子仪器。
函数波形发生器具有连续的相位变换、和频率稳定性等优点,不仅可以模拟各种复杂信号,还可对频率、幅值、相移、波形进行动态、及时的控制,并能够与其它仪器进行通讯,组成自动测试系统,因此被广泛用于自动控制系统、震动激励、通讯和仪器仪表领域。
本系统通过对51单片机的控制,用DA-AD等模块实现了正弦波、方波、三角波和锯齿波的产生,同时可以通过按键实现波形的选择和波形频率的改变。
在实现波形的发生的同时又实现了波形图线的显示,通过NoKia5110对AD实时采集数据的显示、波形类型和波形频率的显示。
摘要:本系统采用单片C8052为控制核心,通过其端口实现数字量的输出,然后由DAC0832把数字量转换成模拟量;但是DAC芯片输出的是电流信号,本系统用LM324运放把电流信号转换为电压信号。
然后利用LM358搭建一个同相比例放大器,将转换后的电压信号按可调比例放大一定倍数。
波形显示利用NoKia5110液晶屏,显示其波形、频率和实时的图像。
显示其图像的时候我们利用ADC0804模数转换芯片将产生的模拟信号转换为数字信号,把AD实时读取到的值等比例显示到液晶屏上。
本系统通过按键实现波形的选择以及波形频率的改变。
关键字:STC89C52 DAC0832 Nokia5110 ADC0804 LM324 独立按键一、设计题目分析(一)设计任务:设计制作一个波形发生器,该波形发生器能产生正弦波、方波、三角波和由用户编辑的特定形状波形。
图1(二)设计功能:1、实现正弦波、三角波、方波、锯齿波的产生;2、实现波形的频率可调;3、实现波形类型、频率的显示;4、实现波形实时图像的显示。
(三)设计方案:方案一:通过软件控制51单片机实现波形的数字输出,然后通过DA实现波形的数模转换,最后通过Nokia5110实现显示。
方案二:通过硬件搭建积分电路实现方波、正弦波、三角波、锯齿波的产生,通过控制源信号的频率改变实现波形频率的改变。
方案三:通过FPGA编程实现波形的产生于频率的改变,通过软件控制FPGA 逻辑整列完成。
(四)方案分析:方案一硬件设计简单,主要通过软件来控制;方案二硬件设计复杂,不便于控制,对输出波形的频率控制也存在很大的误差。
方案三虽然控制实现容易,但是很少人接触过这个FPGA,所以学习起来相对困难。
因此我们这里选择方案一。
二、总体系统方案设计题目要求实现的任务是设计并制作一个函数信号发生器,能够产生正弦波、方波、三角波,要求必须用51单片机和AD-DA芯片,频率可调(范围不定),能够实时的显示波形的类型及其频率,同时实现波形的实时数据图像显示。
现在对方案一进论证和验证。
(一)总体设计思路根据题目的要求,经过仔细的考虑各种要素,制定了整体方案:以STC89C51单片机为控制核心,P0口接DAC0832信号输入并进行数模转换,P2口接矩阵键盘,P1口接液晶显示器Nokia5110,由程序控制P0口产生波形(分别是正弦波、方波、三角波),再由按键控制产生波形的种类及频率在一定范围内可调。
由运放LM324实现DAC0832输出电流到电压的转换,即实现数字信号到模拟信号的转换,同时由LM358搭建的同相放大器将电压波形放大。
在Nokia5110上实时的显示波形的频率,同时我们通过ADC0804读取放大器出来的电压信号,把对应的电压信号对应比例显示到液晶屏上,绘制出波形。
我们通过按键确定,一旦按键按下后,就把当时的波形对应的参数改变显示。
图2系统总体框图(二)单元设计电路1、电源模块:电源通过充电电池提供7.2V电源,然后经过一个470uf的大电容滤波,滤波出来后经过一个5V稳压芯片,稳压源的输出与输入都接一个10uf和一个100nf 电容滤波,减小电源纹波等。
稳压出来的5V电压经过开关,开关后接一个指示灯LED,用于显示电源接通。
5V电源给芯片,等器件供电。
5V后面通过一个3.3V稳压芯片,同样稳压源的输出与输入都接一个10uf 和一个100nf电容滤波,这样出来的3.3V电容给Nokia5110提供电源。
图 3 电源模块2、串口通信模块:串口通信模块通过一个DB9接口与电脑相连接,通过一个MAX232芯片和单片机的P31、P30端口相连接,该电路主要用于单片机的程序下载,与单片与电脑的通信,方便调试。
图4串口通信3、DAC0832数模转换电路:DAC0832的WR1、WR2、XFER接地,TLE和VREF接高电平,其CS片选端接单片机的P23口。
其数据段接锁存器的输出端。
图 5 DAC08324、ADC0804模数转换电路:ADC0804数模转化的CS、RD、WR、INTR分别接单片机的P24、P25、P26、P32;其数据段接单片机的P0口,用于读取模数转换结果。
图 6 ADC08045、Nokia5110液晶显示电路:5110有RST、CS、DC、DIN、CLK五个控制口分别接单片机的P12、P13、P14、P15、P16。
电源连接3.3V电源7LED背光口接一个滑动变阻器用一个调节5110的背光。
图7 Nokia5110液晶6、放大设计电路:一级运算放大器主要用与把电流转换为电压信号,二级运算放大为同相放大器用于把电压信号放大。
图8 运放电路7、整体电路设计:将以上电路图组建起来,就得到总电路图,如图9所示图9 整体设计电路(三)软件设计1、主程序流程图图10 主程序流程图2、中断程序选读取AD然后向DAC端口赋值模数转换,不同的定时周期实现不同的频率波形输出。
3、正弦波的产生过程通过手动的方法计算出输出各点的电压值,形成数组sintab[100],反复顺序输出这组数据到DAC0832,就在系统输出端得到正弦波。
4、方波的产生过程按照设定的周期值改变输出的电压(分别向DAC0832输0x00或0xff)。
5、锯齿波的产生过程将一个周期(360度)分为128个点递增,当128个点输出后再从0开始输出数据到DAC0832,就在系统输出端得到锯齿波。
6、三角波的产生过程将三角波的一个周期(360度)分为256个点,相邻点等差,前128个点递增,后128个点递减,分别把数据到DAC0832,就在系统输出端得到三角波。
7、程序代码#include<reg52.h>#include<math.h>#include <intrins.h>#include "LCD5510_V1.H"#define PI 3.14sbit LOCK = P3^7; //锁存功能sbit Wave =P2^0;sbit up =P2^1;sbit down =P2^2;sbit DAC_cs=P2^3;sbit AD_CS=P2^4;sbit AD_RD=P2^5;sbit AD_WR=P2^6;sbit AD_INT=P1^0;unsigned int temp=0;char flag_display;int i=0;unsigned int AD_data=0;void DrawPoint(int x,int y);char flag;unsigned char code SIN[100]={127,135,143,151,159,166,174,181,188,195,202,208,214,220,225,230,234,238,24 2,245,248,250,251,252,253,254,253,252,251,250,248,245,242,238,234,230,225,220,214,208,202,195,188,18 1,174,166,159,151,143,135,127,119,111,103,95,88,80,73,66,59,52,46,40,34,29,24,20,16,12,9,6,4,3,2,1,0,1,2,3,4,6,9,12,16,20,24,29,34,40,46,52,59,66,73,80,88,95,103,111,119};int Set_Hz; //频率void zhengxian();void sanjiao();void juchi();void fangbo();void scan();void LCD_clr_row(unsigned char num);/***************************************************************** **** 名称: Time0_Init()* 功能: 定时器的初始化,11.0592MZ晶振,50ms* 输入: 无* 输出: 无***************************************************************** ******/void Time0_Init(){TMOD = 0x01;TH0 =(65536-Set_Hz)/256;TL0 =(65536-Set_Hz)%256;IE = 0x82;TR0 = 1;}void AD_start(){AD_CS=0;//允许AD转换AD_WR=0;_nop_();AD_WR=1;//AD开始转换while(AD_INT);//等待转换结束AD_CS=1;//禁止转换}void AD_read(){AD_CS=0;//允许读取AD_RD=0;//读取转换结果_nop_();AD_data=P0;AD_RD=1;AD_CS=1; //停止AD读取}/*****主函数****************************************************************************/void main(void){unsigned char j=0;unsigned int y=0;int temp[4]={0,0,0,0};Set_Hz=1000;flag=1;DAC_cs=0;flag_display=1;LCD5510_Init();Time0_Init();while(1){i++;scan();temp[3]=temp[2];temp[2]=temp[1];temp[1]=temp[0];temp[0]=AD_data;y=temp[4];if(flag!=4){if(y<temp[3]) y=temp[3];if(y<temp[2]) y=temp[2];if(y<temp[1]) y=temp[1];if(y<temp[0]) y=temp[0];}else y=AD_data;y=(y<<5)>>8;DrawPoint(i,y);}}/***************************************************************** **** 名称: Time0_Int()* 功能: 定时器中断,中断中实现Count 加一* 输入: 无* 输出: 无***************************************************************** ******/void Time0_Int() interrupt 1{TH0 =(65536-Set_Hz)/256;TL0 =(65536-Set_Hz)%256;TR0 = 0;AD_start();AD_read();switch(flag){case 1: zhengxian(); break;case 2: sanjiao(); break;case 3: juchi(); break;case 4: fangbo(); break;default : break;}if(flag_display==1){flag_display=0;switch(flag){case 1: LCD_clr_row(0); LCD_clr_row(1); LCD_prints(0, 0, "ZX F");if(Set_Hz==1000) LCD_prints(5, 0, "10HZ");if(Set_Hz==1050) LCD_prints(5, 0, "9.5HZ");if(Set_Hz==1100) LCD_prints(5, 0, "9HZ");if(Set_Hz==1150) LCD_prints(5, 0, "8.6HZ");if(Set_Hz==1200) LCD_prints(5, 0, "8.3HZ");if(Set_Hz==1250) LCD_prints(5, 0, "8HZ");if(Set_Hz==1300) LCD_prints(5, 0, "7.8HZ"); break;case 2:LCD_clr_row(0);LCD_clr_row(1); LCD_prints(0, 0, "SJ F");if(Set_Hz==1000) LCD_prints(5, 0, "7.8HZ");if(Set_Hz==1050) LCD_prints(5, 0, "7.4HZ");if(Set_Hz==1100) LCD_prints(5, 0, "7.1HZ");if(Set_Hz==1150) LCD_prints(5, 0, "6.8HZ");if(Set_Hz==1200) LCD_prints(5, 0, "6.5HZ");if(Set_Hz==1250) LCD_prints(5, 0, "6.2HZ");if(Set_Hz==1300) LCD_prints(5, 0, "6HZ");break;case 3:LCD_clr_row(0); LCD_clr_row(1); LCD_prints(0, 0, "JC F");if(Set_Hz==1000) LCD_prints(5, 0, "3.9HZ");if(Set_Hz==1050) LCD_prints(5, 0, "3.7HZ");if(Set_Hz==1100) LCD_prints(5, 0, "3.5HZ");if(Set_Hz==1150) LCD_prints(5, 0, "3.4HZ");if(Set_Hz==1200) LCD_prints(5, 0, "3.2HZ");if(Set_Hz==1250) LCD_prints(5, 0, "3.1HZ");if(Set_Hz==1300) LCD_prints(5, 0, "3HZ");break;case 4:LCD_clr_row(0); LCD_clr_row(1); LCD_prints(0, 0, "FB F");if(Set_Hz==1000) LCD_prints(5, 0, "7.8HZ");if(Set_Hz==1050) LCD_prints(5, 0, "7.4HZ");if(Set_Hz==1100) LCD_prints(5, 0, "7.1HZ");if(Set_Hz==1150) LCD_prints(5, 0, "6.8HZ");if(Set_Hz==1200) LCD_prints(5, 0, "6.5HZ");if(Set_Hz==1250) LCD_prints(5, 0, "6.2HZ");if(Set_Hz==1300) LCD_prints(5, 0, "6HZ");break;default : break;}}if(i>83){i=0;LCD_clr_row(2); LCD_clr_row(3);LCD_clr_row(4); LCD_clr_row(5);}TR0 = 1;}///Y的0-31各点用来显示波形32-47用来显示文字/** 函数:DrawPoint* 功能:在(x,y)坐标上绘制点,屏幕左下角坐标为(0,0)* 输入参数:x:横坐标值,Range:0-83* y:纵坐标值,Range:0-47* 返回参数:当超过规定范围,默认为0*/void DrawPoint(int x,int y){int YIndex = 0;int bitIndex = 0;if(x>83)x=0;if(y>47)y=0;y = 47-y; //坐标变换YIndex = y/8;bitIndex = y%8;LCD_pos_byte(x,YIndex);LCD_write_dat(0x00|(1<<(bitIndex))&0xff);}/******正弦波函数*****/void zhengxian(){static int i=0;LOCK=1;P0= SIN[i]*0.5;LOCK=0;if(i<100)i++;else i=0;}/*******三角波*********/ void sanjiao(){static int m=0,n=0;LOCK=1;P0=2*m;LOCK =0;if(n<=m&&m<=64){n=m;m++;}else if(m>0){n=m;m--;}else{n=m=0;}}/****锯齿波函数******/ void juchi(){static int m=0;LOCK=1;P0=2*m;LOCK=0;if(m<64){m=m+1;}else{ m=0;}}/******方波函数*******/void fangbo(){static int m=0,n=0;if(n<=m&&m<64){n=m;LOCK=1;P0=0xf0;LOCK=0;m++;}else if(m>=0){n=m;LOCK=1;P0=0x00;LOCK=0;m--;}else m=n=0;}/*****键盘扫描函数*********/ void scan(){if(Wave==0) //波形选择{while(!Wave);if(flag==4){flag=1;}else flag++;flag_display=1;}if(up==0) //频率增加{while(!up);Set_Hz=Set_Hz+50;if(Set_Hz>1300){Set_Hz=1000;}flag_display=1;}if(down==0) //频率减少{while(!down);Set_Hz=Set_Hz-50;if(Set_Hz<1000){Set_Hz=1300;}flag_display=1;}}(四)硬件实物和测试结果图1、实物电路和正弦波形显示:(五)总结本次的设计中利用STC89C51、DAC0832和ADC0804以及放大器完成电路的设计,用开关来控制各种波形的转换和波形频率,用单片机输出后,经过数模转换器生成波形,最终可以通过示波器观察。