基于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单片机的函数信号发生器
小组成员1
小组成员2
小组成员3
专业电子信息工程
任课教师
2011年11
基于51单片机的函数信号发生器
1.系统设计项目
系统利用AT89C52单片机采用程序设计方法产生锯齿波、三角波、正弦波、方波四种波形,再通过D/A转换器DAC0832将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,通过键盘来控制四种波形的类型选择、频率变化,最终输出显示其各自的类型以及数值。
2.设计要求
1)、利用单片机采用软件设计方法产生四种波形
2)、四种波形可通过键盘选择
3)、波形频率可调
4)、需显示波形的种类及其频率
3.系统总体设计框图
4.器件选择
1)单片机AT89C52单片机是一种高性能8位单片微型计算
机。
它把构成计算机的中央处理器CPU、存储器、寄存器、
I/O接口制作在一块集成电路芯片中,从而构成较为完整的计
算机、而且其价格便宜。
89C51单片机最小系统
由单片机采用编程方法产生三种波形、通过DA转换模块DAC0832在进过滤波放大之后输出波形如下
波形产生电路
2)显示采用LCD液晶显示器1602。
其功率小,效果明显,
显示编程容易控制,可以显示字母。
液晶显示
3)键盘独立式键盘具有硬件与软件相对简单的特点,其缺
点是按键数量较多时,要占用大量口线。
5.系统总图
6.调试
利用multisim软件进行测试
元件清单:AT89C52 DAC0832 液晶1602 12M晶振开关按键4个等等。
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,并设置定时器中断。
在中断服务程序中,我们进行相应的操作来实现精确的延时。
这种方法需要使用到单片机的定时器中断功能,相对复杂一些,但是可以实现精确的延时。
基于单片机的波形发生器设计摘要:本文用单片机作为核心芯片,设计出一款高精度频率信号发生器,具有体积小功率低等优点。
为了实现幅度可控的功能,选用了2个数模转换器片完成此功能,其中一个用来产生波形,另外一个设计成程控放大器进行改变幅度,它的放大倍数通过转换器的数字端口来实现,根据设定的输出幅值,单片机只需要通过公式换算出给予的对应电平。
所有要输出的参数都能通过液晶屏显示。
关键词:信号发生器;单片机;数模转换器1、引言在波形发生器的发展中,高频率的波形发生器技术大部分都掌握在外国手中,我国的波形发生器也有很大突破,在中低端频率的波形发生器中,我国的成本低,波形发生器效果好,远比国外,但是在高端波形发生器中,还是落后于国外。
波形发生器在现代测算领域和教学领域有着很大的应用,产生的频率大小,幅度大小,相位调节,能产生大量的波形,对于各种调试,调控,实验,工业使用,自动控制都有着重大的意义。
2、方案设计本此设计是用单片机为控制主体,对系统进行初始化主要完成对键盘的控制、液晶显示的控制。
使用51系列的单片机,它有着32个接口,且STC系列的单片机可以在工作的过程中进行编程、调试,能很方便的实现程序在下载过程中进行整机的调试。
3、硬件设计(1)液晶显示模块用STC12C5A60S2的P0口作为数据线,用P1.2、P1.1、P1.0分别作为LCD 的EN、R/W、RS。
其中EN是下降沿触发的片选信号,R/W是读写信号,RS是寄存器选择信号。
(2)键盘模块本按键模块使用的是多位独立按键,按键一端接IO口,一端接地,由于单片机的IO口都有内部上拉,因此当按键没有按下的时候,IO检测到的时候高电平,当按键按下的时候,相当于IO短接地,因此这时候单片机检测到的电平为低电平,通过检测不同时刻的IO口状态就可以判断按下的是那个按键。
4个按键分别代表以下功能,第一为功能按键,可以切换不同参数设置界面,第二个为切换按键,可以切换波形、频率和幅值等参数进行设置,第三个为增加按键,第四个为减少按键。
创新性实验研究报告实验项目名称_简易函数信号发生器四、实验内容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单片机的示波器方案,介绍其工作原理、硬件组成和软件实现。
工作原理示波器通过逐点采样并记录电压信号的值,然后将这些点连接起来绘制成波形图。
要实现这个过程,需要以下几个步骤: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. 用户界面用户界面用于控制示波器的操作,包括选择采样率、触发电平和时间范围等。
《智能仪器仪表设计基础》课程设计报告单位:自动化学院学生姓名:汪连升专业:测控技术与仪器班级: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以及放大器完成电路的设计,用开关来控制各种波形的转换和波形频率,用单片机输出后,经过数模转换器生成波形,最终可以通过示波器观察。