摘 要
函数发生器主要作为实验用信号源,是现今各种电子电路实验设计应用中必不可少的仪器设备之一。本次设计的主要目的就是为了学习基于单片机的函数发生器的工作原理,设计出一个低频的函数发生器。从事本次设计不仅可以让我对函数发生器的原理有更深的了解,而且也对单片机的知识有更深的掌握。
单片机有很多种类,而且制作函数发生器的方案繁多,本次设计是以AT89C51单片机为核心,选用DAC0832为数模转换芯片,并辅以必要的模拟电路,设计出了一个基于AT89C51单片机的函数信号发生器。其设计内容主要包括单片机最小系统的设计、DA转换模块的设计、键盘控制模块的设计及LCD显示模块的设计。其中DA转换模块包括2块DAC0832芯片和OP07运放电路,第一块DA芯片的输出作为第二块DA芯片的参考电压,而第一块DA芯片的2.5V参考电压由MC1403芯片的输出来提供;键盘控制模块采用3个按键来选择波形类型及调节频率、幅值;显示模块则采用LCD1602来显示波形类型、频率及幅值;最终将设计好的函数发生器的输出接上示波器,在示波器上显示实际输出的波形。
本设计最终能达到预期的效果,能实现电压步进0.1V,方波能够任意调节占空比以及在LCD1602上显示波形类型、电压和频率,并且可以通过示波器来观察其输出的波形。 关键词:AT89C51 单片机 DAC0832 LCD1602 按键
ABSTRACT
Function as the main generators by signals. Electronic circuits is now the design in the application of the necessary equipment. The design of the main purpose is to learn revivification function of the generators works, a low frequency function of the generators. in this design could not only allow me to the principle functions of programme,there is more, but also for a more monolithic integrated circuits to learn.
Monolithic integrated circuits there are many varieties, and the production function of the generators, the design is AT89c51 monolithic integrated circuits to the selection of a module dac0832 the chips, and supported by the simulation circuits, and devised a function of the signal based on at89c51 monolithic integrated circuits generators. The design includes monolithic integrated circuits to the system design, and D/A the module for the design, the keyboard control module of the design and LCD modules display design. One of D/A the modules including two dollars and op07 dac0832 the discharge of the D/A, the chip is the D/A chip of the voltage and the first piece of D/A chips 5v reference by 2. the voltage mc1403 chip of the output to provide; keyboard control in three key to select the type and frequency, wave of value displays module lcd1602;is used to indicate the type and frequency and wave be; Eventually will be designed to function of the generators output meet on oscilloscope, in the wave is varied in the practical output.
The design of the will to achieve the desired results can be achieved step 3 1v voltage and waves to any regulation of free and lcd1602 than on the type of signal wave, voltage and frequency, and may, by the wave is varied to observe the output. 【Key words】AT89C51MCU DAC0832 LCD1602 KEY
目 录
第1章 绪论 .............................................................................................................................. 1
1.1 课题背景 ........................................................................................................................................ 1 1.2 设计要求及内容 ........................................................................................................................... 2
1.2.1 设计要求 ............................................................................................................................. 2 1.2.2 设计内容 ............................................................................................................................. 2 1.3 方案论证 ........................................................................................................................................ 2
1.3.1信号发生电路方案论证 ................................................................................................... 2 1.3.2单片机的选择论证 ............................................................................................... 3 1.3.3 显示方案论证 ...................................................................................................... 3 1.3.4键盘方案论证 ....................................................................................................... 3
第2章 单片机概述 .................................................................................................................... 4
2.1 单片机的发展历史及趋势 ........................................................................................................ 4 2.2 AT89C51单片机结构简介 ......................................................................................................... 5
2.2.1 AT89C51的基本特性 ....................................................................................................... 5 2.2.2 AT89C51单片机的外部引脚介绍 ................................................................................ 6
第3章 系统硬件设计 ................................................................................................................ 8
3.1各模块硬件设计 ............................................................................................................. 8
3.1.1系统总体设计 ....................................................................................................... 8 3.1.2单片机最小系统设计 ........................................................................................... 9 3.1.3位DA转换器DAC0832 .................................................................................... 10 3.1.4 2.5V基准电压模块设计 .................................................................................... 14 3.1.5系统显示功能设计 ............................................................................................. 15 3.1.6系统按键功能设计 ............................................................................................. 19
第4章 系统软件设计 .............................................................................................................. 20
4.1 Keil C51开发环境简介 ................................................................................................ 20
4.1.1 Keil uVision3环境介绍 ...................................................................................... 20 4.1.2 利用Keil uVision3创建新项目 ........................................................................ 21 4.2系统软件流程设计 ....................................................................................................... 22
4.2.1系统软件总体设计 ............................................................................................. 22 4.2.2子系统软件设计 ................................................................................................. 23 4.2.3系统详细流程 ..................................................................................................... 26
第5章 设计结果 ...................................................................................................................... 27
5.1液晶显示模块 ............................................................................................................... 27 5.2示波器显示模块 ........................................................................................................... 28 结 论 ........................................................................................................................................ 30 致 谢 ........................................................................................................................................ 31 参考文献 .................................................................................................................................... 32
函数发生器的研究与实现
第1章 绪论
1.1 课题背景
本次设计的主要是学习基于单片机的函数发生器的工作原理,制作出一个低频的函数信号发生器。
在科学研究、工程教育及生产实践中,如工业过程控制、教学实验、机械振动试验、动态分析、材料试验、生物医学等领域,常常需要用到低频信号发生器。函数发生器作为一种通用的电子仪器,在生产、科研、测控、通讯等领域都得到了广泛的应用。但市面上能看到的此类仪器在频率精度、带宽、波形种类及程控方面都已不能满足许多方面实际应用的需求。我们长期使用的信号发生器,大部分是由模拟电路构成的,这类仪器作为信号源,频率可达上百MHz,在高频范围内其频率稳定性高、可调性好。但用于低频信号输出时,它所需要的RC值很大,参数准确度难以保证。而且其体积大,损耗也大。前人研制了采用8031单片机及程序存储器构成的最小系统组成的数字式低频信号发生器,它在低频范围内性能好,但是体积较大,价格较贵。随着大规模集成电路技术的发展,集成度不断提高,使得微型机的速度和性能大为提高,可靠性增加,成本降低。MCS-51就是将具有存储程序、处理数据以及与外设交换信息的功能电路集成在一块芯片中,并符合一定系统结构而构成的单片机。
单片机有很多种类,而且制作函数发生器的方案繁多,本次设计是以AT89C51单片机为核心,选用DAC0832为数模转换芯片,并辅以必要的模拟电路,设计出了一个基于AT89C51单片机的函数信号发生器。其设计内容主要包括单片机最小系统的设计、DA转换模块的设计、键盘控制模块的设计及LCD显示模块的设计。其中DA转换模块包括2块DAC0832芯片和OP07运放电路,第一块DA芯片的输出作为第二块DA芯片的参考电压,而第一块DA芯片的2.5V参考电压由MC1403芯片的输出来提供;键盘控制模块采用3个按键来选择波形类型及调节频率、幅值;显示模块则采用LCD1602来显示波形类型、频率及幅值;最终将设计好的函数发生器的输出接上示波器,在示波器上显示实际输出的波形。
本设计最终能达到预期的效果,能实现电压步进0.1V,方波能够任意调节占空比以及在
1
函数发生器的研究与实现
LCD1602上显示波形类型、电压和频率,并且可以通过示波器来观察其输出的波形。
1.2 设计要求及内容
1.2.1 设计要求
1)、利用单片机采用软件设计方法产生三种波形(三角波、方波、正弦波)
2)、三种波形可通过键盘选择 3)、波形频率可调
4)、需显示波形的种类及其平率 5)、失真系数不能过高
1.2.2 设计内容
经过考虑,设计的内容是利用AT89C51单片机采用程序设计方法产生三角波、方波、正弦波三种波形,再通过D/A转换器DAC0832将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,通过键盘来控制三种波形的类型选择、频率变化,最终输出显示其各自的类型以及数值。
1.3 方案论证
1.3.1信号发生电路方案论证
方案一:通过单片机控制D/A,输出三种波形。此方案输出的波形不够稳定,抗干扰能力弱,不易调节。但此方案电路简单、成本低。
方案二:使用传统的锁相频率合成方法。通过芯片IC145152,压控振荡器搭接的锁相环电路输出稳定性极好的正弦波,再利用过零比较器转换成方波,积分电路转换成三角波。此方案,电路复杂,干扰因素多,不易实现。
方案三:利用MAX038芯片组成的电路输出波形。MAX038是精密高频波形产生电路,能够产生准确的三角波、方波和正弦波三种周期性波形。但此方案成本高,程序复杂度高。以上三种方案综合考虑,选择方案一。
2
函数发生器的研究与实现
1.3.2单片机的选择论证
方案一:AT89C51单片机是一种高性能8位单片微型计算机。它把构成计算机的中央处理器CPU、存储器、寄存器、I/O接口制作在一块集成电路芯片中,从而构成较为完整的计算机、而且其价格便宜。
方案二:C8051F005单片机是完全集成的混合信号系统级芯片,具有与8051兼容
的微控制器内核,与MCS-51指令集完全兼容。除了具有标准8052的数字外设部件,片内还集成了数据采集和控制系统中常用的模拟部件和其他数字外设及功能部件,而且执行速度快。但其价格较贵。以上两种方案综合考虑,选择方案一
1.3.3 显示方案论证
方案一:采用LED数码管。LED数码管由8个发光二极管组成,每只数码管轮流显示各自的字符。由于人眼具有视觉暂留特性,当每只数码管显示的时间间隔小于1/16s时人眼感觉不到闪动,看到的是每只数码管常亮。使用数码管显示编程较易,但要显示内容多,而且数码管不能显示字母
方案二:采用LCD液晶显示器1602。其功率小,效果明显,显示编程容易控制,可以显示字母。以上两种方案综合考虑,选择方案二。
1.3.4 键盘方案论证
方案一:矩阵式键盘。矩阵式键盘的按键触点接于由行、列母线构成的矩阵电路的交叉处。当键盘上没有键闭合时,所有的行和列线都断开,行线都呈高电平。当某一个键闭合时,该键所对应的行线和列线被短路。
方案二:编码式键盘。编码式键盘的按键触点接于74LS148芯片。当键盘上没有闭合时,所有键都断开,当某一键闭合时,该键对应的编码由74LS148输出。以上两种方案综合考虑,选择方案一。
3
函数发生器的研究与实现
第2章 单片机概述
2.1 单片机的发展历史及趋势
单片机出现的历史并不长,但发展十分迅猛。它的产生与发展和微处理器的产生和发展大体相同,自1971年Intel公司首先推出4位微处理器以来,它的发展到目前为止大致可分为4个阶段:
(1) 单片机发展的初级阶段(20世纪70年代初~70年代中期)。1971年11月Intel公司首先设计出集成度为2000只晶体管/片的4位微处理器Intel 4004,并配有RAM、ROM和移位寄存器,构成了第一台MCS-4微处理器。随后又设计出了8位微处理器Intel8008,在此期间Fairchild公司也设计出了8位微处理器F8。这些微处理器虽然还不是真正的单片机,但从此拉开了研制单片机的序幕。
(2) 低性能单片机阶段(20世纪70年代中期~80年代初期)。以1976年Intel公司推出的MCS-48系列为代表,采用将8位CPU、8位并行I/O端口、8位定时器/计数器、RAM和ROM等集成在一块半导体芯片上的单片结构,虽然其寻址范围有限,也没有串行I/O端口,RAM、ROM容量小,中断系统也较简单,但功能可满足一般工业控制和智能化仪表等的需要。这种采用将CPU与计算机外围电路集成到一块芯片上的技术,标志着单片机的诞生。从而导致了计算机领域中开始出现两大分支:通用计算机系统和嵌入式系统。
(3) 高性能单片机阶段(20世纪80年代初期~90年代初期)。这一阶段推出的8位单片机普遍带有串行口,有多级中断处理系统,多个16位定时器/计数器。片内RAM、ROM的容量加大,寻址范围可达64KB,个别片内还带有A/D转换接口。这一阶段中最具典型性的产品为1980年Intel公司推出的MCS-51系列单片机,其他代表产品有Motorola公司的6801和Zilog公司的Z8等。这类单片机的运算速度大幅度提高,增加了外围电路功能,强化了智能控制的特征,拓宽了单片机的应用范围,使之能用于智能终端、局域网络的接口等。因而,它是目前国内外单片机产品的主流,各制造公司还在不断的改进和发展它。
4) 8位单片机巩固发展阶段及16位、32位单片机不断推出阶段(20世纪90年代
4
函数发生器的研究与实现
至今)。此阶段单片机在集成度、功能、速度、可靠性、应用领域等方面向更高水平发展。如:CPU的位数有8位、16位、32位,而结构上采用双CPU结构或内部流水线结构,以提高处理能力和运算速度;时钟频率高达20MHz甚至更高,使指令执行速度相对加快;提高新型的串口总线结构,为系统的扩展和配置打下了良好的基础;增加新的特殊功能部件,如监视定时器WDT、DMA传输、PWM输出、可编程计数阵列PCA、调制解调器、通信控制器、浮点运算单元等;半导体制造工艺的不断进步,使芯片向高集成度、低功耗方向发展。此阶段单片机内集成的功能越来越强大,并朝着片上系统方向发展,单片机在大量数据的实时处理、高级通信系统、数字信号处理、复杂工业过程控制、高级机器人以及局域网等各方面得到大量应用。
随着技术的进步,早期的8位中、低档单片机逐渐被淘汰,但8位单片机并没有消失,尤其是51系列单片机不仅没有消失,反而还呈现快速发展的趋势。目前,单片机正朝着高性能和多品种方向发展,将进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方向发展。
2.2 AT89C51单片机结构简介
2.2.1 AT89C51的基本特性
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
AT89C51单片机有40个管脚,分成两排,每一排各有20个脚,其中左下角标有箭头的为第1脚,然后按逆时针方向依次为第2脚、第3脚……第40脚。在40个管脚中,其中有32个脚可用于各种控制,比如控制小灯的亮与灭、控制电机的正转与反转、控制电梯的升与降等,这32个脚叫做单片机的“端口”,在单片机技术中,每个端口都有一个特定的名字,比如第一脚的那个端口叫做“P1.0”。
5
函数发生器的研究与实现
AT89C51单片机的主要特性:与MCS-51兼容 ,4K字节可编程闪烁存储器。寿命:1000写/擦循环。数据保留时间:10年,全静态工作:0Hz-24Hz,三级程序存储器锁定,128*8位内部RAM,32可编程I/O线,两个16位定时器/计数器,5个中断源,可编程串行通道,低功耗的闲置和掉电模式,片内振荡器和时钟电路
2.2.2 AT89C51单片机的外部引脚介绍
AT89C51单片机的外部引脚的排列及名称如图2.1所示:
图2.1AT89C51单片机的外部引脚
图2.1所示管脚描述如下: ·VCC:提供掉电空闲正常工作电压。
·GND:接地。 ·P0口:P0口是开漏双向口,可以写为1使其状态为悬浮用作高阻输入。P0也可以在访问外部程序存储器时作地址的低字节,在访问外部数据存储器时作数据总线,此时通过内部强上拉输出1。
·P1口:P1口是带内部上拉的双向I/O口,向P1口写入1时,P1口被内部上拉为高电平,
6
函数发生器的研究与实现
可用作输入口。当作为输入脚时,被外部拉低的P1口会因为内部上拉而输出电流。其中P1.0用作定时/计数器2的外部计数输入/时钟输出;P1.1用作定时/计数器2重装载/捕捉/方向控制。·P2口:P2口是带内部上拉的双向I/O口,向P2口写入1时,P2口被内部上拉为高电平,可用作输入口。当作为输入脚时,被外部拉低的P2口会因为内部上拉而输出电流。在访问外部程序存储器和外部数据时,分别作为地址高位字节和16位地址(MOVX @DPTR),此时通过内部强上拉传送1。当使用8位寻址方式(MOV@Ri)访问外部数据存储器时,P2口发送P2特殊功能寄存器的内容。
·P3口:P3口是带内部上拉的双向I/O口。向P3口写入1时,P3口被内部上拉为高电平,可用作输入口。当作为输入脚时被外部拉低的P3口会因为内部上拉而输出电流,P3口还具有以下特殊功能:RxD(P3.0):串行输入口,TxD(P3.1):串行输出口 INT0(P3.2):外部中断0
INT1(P3.3):外部中断T0(P3.4):定时器0外部输入 T1(P3.5):定时器1外部输入 WR(P3.6):外部数据存储器写信号 RD(P3.7):外部数据存储器读信号
·RST:当晶振在运行中只要复位管脚出现2个机器周期高电平即可复位。内部有扩散电阻连接到Vss,仅需要外接一个电容到Vcc即可实现上电复位。
·ALE:地址锁存使能,在访问外部存储器时,输出脉冲锁存地址的低字节,在正常情况下,ALE输出信号恒定为1/6振荡频率。并可用作外部时钟或定时,注意每次访问外部数据时一个ALE脉冲将被忽略。ALE可以通过置位SFR的auxlilary.0禁止,置位后ALE只能在执行MOVX指令时被激活。
·PSEN:当执行外部程序存储器代码时,PSEN每个机器周期被激活两次.在访问外部数据存储器时PSEN无效,访问内部程序存储器时PSEN无效。
·EA/VPP:在访问整个外部程序存储器时EA必须外部置低,如果EA为高时将执行内部程序,除非程序计数器包含大于片内FLASH的地址。该引脚在对FLASH编程时提供5V/12V编程电压(Vpp),如果保密位1已编程EA在复位时由内部锁存。 ·XTAL1:反相振荡放大器输入和内部时钟发生电路输入。 ·XTAL2:来自反向振荡器的输出。
7
函数发生器的研究与实现
第3章 系统硬件设计
3.1各模块硬件设计
硬件设计是系统设计非常重要的一部分,这关系到系统能否正常运行,每一个模块的设计都关系到整体。本章将详细地介绍系统各个模块的设计,包括单片机最小系统、DA转换模块、液晶显示模块和按键控制模块等。
3.1.1系统总体设计
本设计总体框图如图3.1所示:
2.5V基准电压DAC0832DAC0832AT89C51单片机LCD1602显示波形输出键盘控制
图3.1系统总体框图
系统总体框图主要包括以下几个部分:
单片机部分:本设计选用AT89C51单片机作为控制核心。
DA转换部分:本设计采用2块DAC0832芯片,其中一块的输出用于另一块DA的基准 基准电压部分:第一块DA的2.5V基准电压通过MC1403芯片来实现。
显示部分:本设计采用LCD1602来显示波形的类型、幅值的大小、频率的大小。 键盘部分:本设计采用3个独立按键来控制波形类型的选择、幅值大小的改变及频率大小的改变。
8
函数发生器的研究与实现
3.1.2单片机最小系统设计
本设计以AT89C51单片机为核心,要使AT89C51单片机正常工作,必须满足它的基本条件,这就是最小工作系统,如图3.2所示:
图3.2 AT89C51单片机最小系统
小工作系统包括如下几部分:
电源:单片机使用的是5V电源,其中正极接40引脚(Vcc),负极接20引脚(GND)。 晶振电路:晶振是晶体振荡器的简称,单片机是一种时序电路,必须提供脉冲信号才能正常工作。AT89C51单片机内部有一个用于构成振荡器的高增益反相放大器。引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。外接晶体谐振器以及电容C1和C2构成并联谐振电路,接在放大器的反馈回路中。对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性。因此,此系统电路的晶体振荡器的值为11.0592MHz,电容值约为30μF。在焊接刷电路板时,晶体振荡器和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好地保证震荡器稳定和可靠地工作。单片机内部已经集成了振荡器;使用晶体振荡器,接18(XTAL2)、19(XTAL1)脚。只要买来晶振、电容,按图接上即可。
9
函数发生器的研究与实现
复位电路:单片机复位电路是指单片机的初始化操作。单片机启运运行时,都需要先复位,其作用是使CPU和系统中其他部件处于一个确定的初始状态,并从这个状态开始工作。因而,复位是一个很重要的操作方式。
单片机的复位操作使单片机进入初始化状态,其中包括使程序计数器PC=0000H,这表明程序从0000H地址单元开始执行。单片机冷启动后,片内RAM为随机值,运行中的复位操作不改变片内RAM区中的内容,21个特殊功能寄存器复位后的状态为确定值,见表3.1。 表3.1 寄存器复位后状态表 特殊功能寄存器 A B PSW SP DPL DPH P0—P3 IP IE 初始状态 00H 00H 00H 07H 00H 00H FFH ***00000B 0**00000B 特殊功能寄存器 TMOD TCON TH0 TL0 TH1 TL1 SBUF SCON PCON 初始状态 00H 00H 00H 00H 00H 00H 不定 00H 0********B 按图中画法连好9脚(RST),单片机即可上电初始化。复位电路的工作原理是:通电时,电容两端相当于是短路,于是RST引脚上为高电平,然后电源通过电阻对电容充电,RST端电压慢慢下降,降到一定程度,即为低电平,时间不少于5ms。复位后单片机才开始正常工作。
EA引脚:31引脚一般接到正电源端。
3.1.3位DA转换器DAC0832
(1)DAC0832芯片引脚介绍
DAC0832是双列直插式8位D/A转换器。能完成数字量输入到模拟量(电流)输出的转换。图3.3和图3.4分别为DAC0832的引脚图和内部结构图。其主要参数如下:分辨
10
函数发生器的研究与实现
率为8位,转换时间为1μs,满量程误差为±1LSB,参考电压为(+10~-10)V,供电电源为(+5~+15)V,逻辑电平输入与TTL兼容。从图4中可见,在DAC0832中有两级锁存器,第一级锁存器称为输入寄存器,它的允许锁存信号为ILE,第二级锁存器称为DAC寄存器,它的锁存信号也称为通道控制信号/XFER。
图3.3中,当ILE为高电平,片选信号/CS和写信号/WR1为低电平时,输入寄存器控制信号为1,这种情况下,输入寄存器的输出随输入而变化。此后,当/WR1由低电平变高时,控制信号成为低电平,此时,数据被锁存到输入寄存器中,这样输入寄存器的输出端不再随外部数据DB的变化而变化。
对第二级锁存来说,传送控制信号/XFER和写信号/WR2同时为低电平时,二级锁存控制信号为高电平,8位的DAC寄存器的输出随输入而变化,此后,当/WR2由低电平变高时,控制信号变为低电平,于是将输入寄存器的信息锁存到DAC寄存器中。
图3.3 DAC0832引脚图
图3.3中其余各引脚的功能定义如下: 1、DI7~DI0:8位的数据输入端,DI7为最高位。
2、IOUT1:模拟电流输出端1,当DAC寄存器中数据全为1时,输出电流最大,当DAC
寄存器中数据全为0时,输出电流为0。
3、IOUT2:模拟电流输出端2,IOUT2与IOUT1的和为一个常数,即IOUT1+IOUT2
11
函数发生器的研究与实现
=常数。
4、RFB:反馈电阻引出端,DAC0832内部已经有反馈电阻,所以RFB端可以直接接到
外部运算放大器的输出端,这样相当于将一个反馈电阻接在运算放大器的输出端和输入端之间。
5、VREF:参考电压输入端,此端可接一个正电压,也可接一个负电压,它决定0至
255的数字量转化出来的模拟量电压值的幅度,VREF范围为(+10~-10)V。VREF端与D/A内部T形电阻网络相连。 6、VCC:芯片供电电压,范围为(+5~15)V。 7、AGND:模拟量地,即模拟电路接地端。 8、DGND:数字量地。
图3.4 DAC0832内部结构图
(2)DAC0832的工作方式
DAC0832可处于三种不同的工作方式:
1、直通方式 :当ILE接高电平,CS、WR1、WR2和XFER都接数字地时,DAC处于直通方式,8位数字量一旦到达DI7~DI0输入端,就立即加到8位D/A转换器,被转换成模拟量。例如在构成波形发生器的场合,就要用到这种方式,即把要产生基本波形的数据存在ROM中,连续取出送到DAC去转换成电压信号。
12
函数发生器的研究与实现
2、单缓冲方式 :只要把两个寄存器中的任何一个接成直通方式,而用另一个锁存器数据,DAC就可处于单缓冲工作方式。一般的做法是将WR2和XFER都接地,使DAC寄存器处于直通方式,另外把ILE接高电平,CS接端口地址译码信号,WR1接CPU的WR信号,这样就可以通过一条MOVX指令,选中该端口,使CS和WR1有效,启动D/A转换。
3、双缓冲方式 :主要在以下两种情况下需要用双缓冲方式的D/A转换。需在程序的控制下,先把转换的数据输入输入缓存器,然后在某个时刻再启动D/A转换。这样,可先选中CS端口,把数据写入输入寄存器;再选中XFER端口,把输入寄存器内容写入DAC寄存器,实现D/A转换。在需要同步进行D/A转换的多路DAC系统中,采用双缓冲方式,可以在不同的时刻把要转换的数据打入各DAC的输入寄存器,然后由一个转换命令同时启动多个DAC转换。先用3条输出指令选择3个端口,分别将数据写入各DAC的输入寄存器,当数据准备就绪后,再执行一次写操作,使XFER变低同时选通3个D/A的DAC寄存器,实现同步转换。
(3)DAC0832与单片机连接及外围电路的设计
图3.5 第一片DAC0832外接转换电路
13
函数发生器的研究与实现
图3.6 第二片DAC0832外接转换电路
本次函数发生器的设计采用双AD技术。即用第一片DAC0832芯片的输出作为第二片DAC0832的基准电压,通过改变单片机对第一片DAC0832的输入来改变其输出,从而改变第二片DAC0832的基准电压,从而控制第二片DAC0832的输出电流,由此可见,幅值的大小可由单片机来控制。同样单片机也与第二片DAC0832相连接,通过单片机查表频率的改变和定时器初值的改变来控制波形频率的大小。由于DAC0832是电流输出型,在输出端需接一个电流电压转换电路和一个负电压转换为正电压转换电路即可输出0~Vref的电压值。其电路图如图3.5、图3.6所示:
3.1.4 2.5V基准电压模块设计
本设计采用MC1403芯片实现2.5V电压基准,其引脚图如图3.7所示:
图3.7 MC1403引脚图
MC1403是低压基准芯片。一般用作8~12bit的D/A芯片的基准电压等一些需要基本精准的基准电压的场合。输出电压:2.5V+/-25mV,输入电压范围:4.5V~40V,输出电
14
函数发生器的研究与实现
流:10mA。因为输出是固定的,所以电路很简单。就是Vin接电源输入,GND接底,Vout加一个0.1uf~1uf的电容就可以了。Vout一般用作8~12bit的D/A芯片的基准电压。
3.1.5系统显示功能设计
本设计采用LCD1602来显示波形的类型、幅值及频率。LCD1602液晶显示模块,它可以显示两行,每行16个字符,采用单+5V电源供电,外围电路配置简单。LCD1602管脚如图3.8所示:
图3.8接口管脚功能表如表3.2所示:
图3.8 LCD1602芯片管脚图
15
函数发生器的研究与实现 表3.2 LCD1602管脚功能表
引脚号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 (1)LCD1602主要管脚介绍:
符号 Vss Vdd V0 RS R/W E DB DB DB DB DB DB DB DB LEDA LEDK 状态 输入 输入 输入 三态 三态 三态 三态 三态 三态 三态 三态 输入 输入 功能 电源地 电源+5V 对比度控制端 寄存器选择 读、写操作 使能信号 数据总线 数据总线 数据总线 数据总线 数据总线 数据总线 数据总线 数据总线 背光+5V 背地光 V0:液晶显示器对比度调整端,接地电源时对比度最高,对比度过高时会产生‘鬼影’,使用时可以通过一个10K的电位器调整对比度。
RS:寄存器选择,高电平时选择数据寄存器;低电平时选择指令寄存器。
R/W:读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址;当RS为高电平R/W为高电平R/W为低电平时可以写入数据。
E:使能端,当E端由高电平跳变成低电平时,液晶模块执行指令。 (2)LCD1602控制指令:
LCD1602有11个控制指令,如表3.3所示:
16
函数发生器的研究与实现 表3.3 LCD1602指令对应功能表
指令 清屏 归位 输入方式设置 显示开关控制 光标、画面位移 功能设置 CGRAM地址设置 DDRAM地址设置 读BF及AC值 写数据 读数据 清屏指令表如表3.4所示:
功能 清DDRAM和AC值 AC=0,光标、画面回HOME位 设置光标、画面移动方式 设置显示、光标及闪烁开、关 光标、画面移动,不影响DDRAM 工作方式设置 设置CGRAM地址。A5~A0=0~3FH DDRAM地址设置 读忙标志BF值呵地址计时器AC值 数据写入DDRAM或CGRAM内 从DDRRAM或CGRAM 表3.4 LCD1602清屏指令表
RS 0 R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 0 0 0 0 1 显示开关控制如表3.5所示:
表3.5 显示开关控制表
RS 0 R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 0 1 D C B 功能:设置显示、光标及闪烁开、关;
其中:D显示开关:D=1开,D=0关。C光标开关:C=1开,C=0关。 B闪烁开关:B=1开,B=0关。 光标、画面位移控制如表3.6所示:
表3.6 LCD1602光标、画面位移控制表
RS 0
R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 17
1 S/C R/L * * 函数发生器的研究与实现
功能:光标、画面移动,不影响DDRAM。
其中:S/C=1:画面平移一个字符位;S/C=0:光标平移一个字符位;
R/L=1:右移;R/L=0:左移。 功能设置如表3.7所示:
表3.7 LCD1602功能设计表
RS 0 R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 1 DL N F * * 功能:工作方式设置(初始化指令)
其中:DL=1,8位数据接口;DL=0,四位数据接口; N=1,两行显示;
N=0,一行显示; F=1,5 10点阵字符;F=0,5 7点阵字符。 读写控制时序如表3.8所示:
表3.8 LCD1602读写控制时序
RS 0 0 1 1 (3)LCD1602与单片机连接图如下: R/W 0 1 0 1 E 下降沿 功能 写指令代码 高电平 读忙标志和AC码 下降沿 高电平 写数据 读数据
图3.9 LCD1602与单片机连接电路图
18
函数发生器的研究与实现
3.1.6系统按键功能设计
此函数发生器采用三个按键与LCD1602配合使用来调节输出信号的各个参数。如图3.10所示,三个按键分别赋予的意义为:“+”键、“—”键、功能键。
“+键”功能键“—”键
图3.10 按键分布与功能图
“功能键”是选择输出波形需要调节的参数,“+”键和“—”键则是增加或者减小输出波形幅值或频率。操作时必须观察LCD1602上显示的内容再按键来调节相应参数。LCD1602上显示的内容如图3.11所示。
(1)G:M——“+”键和“—”键调节输出波形类型,改变的是mode 的值(方波为0,三角波为1,正弦波为2)。
(2)G:F— —“+”键和“—”键调节输出信号频率,改变的是定时器的值。
(3)G:A— —“+”键和“—”键调节输出信号幅值,改变的是A的值(0.0~5.0V, 步进为0.1V)
Mode:F A:X.XVM.A F:XXXXXHZ
图3.11 LCD1602显示内容示意图
说明:按动“功能键”会使G的值在0、1、2之间循环切换。
19
函数发生器的研究与实现
第4章 系统软件设计
4.1 Keil C51开发环境简介
4.1.1 Keil uVision3环境介绍
Keil C51是KEIL公司推出的51系列单片机C语言软件开发系统,对于多数单片机的应用开发,Keil C51是一款非常优秀的软件。Keil C51软件支持功能强大的集成开发调试工具和丰富的库函数,生成的目标代码效率很高,多数语句的汇编代码很紧凑,且容易理解,在开发大型软件时更能体现高级语言的优势
Keil uVision3是Keil C51 for Windows的集成开发环境,可以用开编译C源代码、汇编源程序、连接和重定位目标文件和库文件、创建HEX文件、调试目标程序等。它集编辑、编译、仿真于一体,并且支持汇编语言。Keil uVision3提供的多功能的文件操作环境,包括一个内藏式编辑室,它是标准的文件编辑器,具有十分强大的文件编辑功能,例如文件块的移动、剪切、复制、查找、删除等,它支持鼠标操作,也有快捷键。在Keil uVision3中,用户可以同时打开多个窗口对多个不同的文件进行处理,这一特性有利于使用C51进行结构化的多模块程序设计。在模块化编程时,如果同时打开多个不同文件,可以在Keil uVision3中分别进行编辑处理。Keil uVision3的主菜单栏涵盖了几乎所有的C51编辑、编译以及调试等功能方式,共有11个选项,分别是File、Edit、View、Project、Debug、Flash、Peripherals、Tool、SVCS、Windows和Help。下面分别对各菜单的列表项所指向的功能进行说明。 (1)文件(File)菜单
文件菜单命令主要用于对文件的一些操作,如新建、打开、关闭、输出等。文件菜单的“Device Database”选项用于修改Keil支持的51系列芯片的型号的设定。 (2)编辑(Edit)菜单
编辑菜单命令主要包括剪切、复制、粘贴、查找、替换等编辑操作和书签管理命令。 (3)视图(View)菜单
视图菜单命令用于控制Keil的界面显示,使用视图菜单中的命令可以显示或隐藏Keil的各个窗口和工具栏。
20
函数发生器的研究与实现
(4)项目(Project)菜单
项目菜单命令包括项目的创建、打开、关闭、维护、目标环境设定、编译等命令。 (5)调试(Debug)菜单
调试菜单命令用于软件仿真环境下的调试,提供断点、单步、跟踪等操作指令。 (6)烧写(Flash)菜单
烧写菜单命令主要用于程序下载到EEPROM的控制。 (7)外设(Perpherals)菜单
外设菜单是外围模块菜单命令,用于控制芯片的复位和片内功能模块的控制。 (8)工具(Tools)菜单
工具菜单主要用于支持第三方调试系统,包括Gimpel Software公司的PC-Lint和西门子公司的Easy-Case.
(9)软件版本控制系统(SVCS)菜单
软件版本控制系统菜单命令用于设置和运行软件版本控制系统。 (10)窗口(Windows)菜单
窗口菜单命令用于设置窗口的排版方式,与Windows的窗口管理兼容。 (11)帮助(Help)菜单
帮助菜单用于提供软件帮助信息和版本说明。
4.1.2 利用Keil uVision3创建新项目
Keil uVision3中的项目是一个特殊结构的文件,它包含应用开发系统相关所以文件的相互关系,在Keil uVision3中,主要使用项目来进行应用系统的开发。创建一个新项目的详细步骤为:
1、选择菜单命令Project|New Project,弹出“Creat New Project”对话框。 2、在对话框中选择新项目要保存的路径和文件名,单击“保存”按钮即可。Keil uVision3的项目文件扩展名为.uv2。
3、单击“保存”按钮后,弹出“Select Device for Target”对话框。用户需要在左侧的芯片列表中选择调试使用的51系列单片机型号,使对话框右侧的“Descripion”文本框可以查看选中单片机型号的说明。
4、单击“Select Device for Target”对话框中的“确定”按钮,程序会询问是否将标
21
函数发生器的研究与实现
准51初始化程序加入到项目中,选择“是”,程序会自动复制标准51初始化程序到项目所在目录并将其加入项目文件。
5、下面需要向项目中添加文件。选中项目窗口中的文件组后单击鼠标右键,在弹出的菜单中选择Add Files to Group”项添加所需文件。
6、如果没有现成的程序,就需要新建一个程序文件。单击新建文件的快捷按钮,屏幕中出现一个新的文字编辑窗口,这样就可以在新的窗口中输入需要的程序了。
4.2系统软件流程设计
4.2.1系统软件总体设计
系统软件总体设计,初始化时输出的是方波,显示方波的幅值和频率。通过按键可以选择调节频率还是调节幅值以及选择输出正弦波和三角波。流程图如图4.1所示:
主程序开始初始化调用按键程序调用显示程序刷新显示内容
图4.1主程序流程图
22
函数发生器的研究与实现
4.2.2子系统软件设计
1、外部中断0
本设计采用外部中断0控制波形类型的选择以及幅值频率的增加,当程序检测到外部中断0时,执行相应的操作。其程序流程图如图4.2所示:
开始关中断是波形控制变换波形否频率控制是增加频率否调用频率控制程序是幅值控制幅值增加否调用幅值控制程序关中断中断返回
图4.2 外部中断0程序流程
23
函数发生器的研究与实现
2、外部中断1
本设计采用外部中断1控制波形类型的选择以及幅值频率的减小,当程序检测到外部中断1时,执行相应的操作。其程序流程图如图4.3所示:
开始关中断是波形控制变换波形否频率控制是增加频率否调用频率控制程序是幅值控制幅值增加否调用幅值控制程序关中断中断返回
图4.3 外部中断1程序流程
24
函数发生器的研究与实现
3、定时器0
本设计采用定时器0来控制波形频率的改变,通过装初值来改变定时从而改变频率。其流程图如图4.4所示定时中断:
开始关中断关定时器装初值开定时器开中断关中断
图4.4 定时器0程序流程
25
函数发生器的研究与实现
4.2.3系统详细流程
系统详细流程图如图4.5所示:
开始初始化单片机各端口、初始化定时器、初始化液晶无按键按下时液晶默认显示方波的幅值、频率,且当前为模式选择状态“+”键按下功能键按下“-”键按下程序跳至三角波产生程序处执行频率控制模式幅值控制模式程序跳至正弦波产生程序处执行通过“+”“-”按键来改变频率的大小通过“+”“-”按键来改变幅值的大小液晶显示当前波形幅值、频率的大小结束
图4.5 系统详细流程图
26
函数发生器的研究与实现
第5章 设计结果
5.1液晶显示模块
本设计要求在液晶上显示波形的类型、波形的幅值大小和频率大小。下面将一一展示三种波形的显示情况。
(1)、方波的显示如图5.1所示:
Mode:F A:5.0VA F:65486
图5.1 方波的显示图
图5.2所示液晶上A代表波形的幅值,此时按“+”、“—”按键可以改变赋值的大小。其中Mode:F表示当前的波形类型为方波,而液晶第二行的F表示计数器的计数初值,计数初值的改变导致频率的改变。 (2)、三角波的显示情况如图5.2所示:
Mode:S A:4.5VA F:65486
图5.2 三角波的显示图
图5.3所示液晶上A代表波形的幅值,M表示波形类型选择模式,此时按“+”、“—”按键可以选择波形的类型。其中Mode:S表示当前的波形类型为三角波,同样液晶第二行的F表示计数器的计数初值,计数初值的改变导致频率的改变。 (3)、正弦波的显示情况如图5.3所示:
Mode:Z A:4.5VA F:65486
图5.3 正弦波的显示图
图5.3所示液晶上A代表波形的幅值,M表示波形类型选择模式,此时按“+”、“—”
27
函数发生器的研究与实现
按键可以选择波形的类型。其中Mode:Z表示当前的波形类型为正弦波,同样液晶第二行的F表示计数器的计数初值,计数初值的改变导致频率的改变,此时若按功能键,则液晶第二行的M变为A或F(A为幅值改变模式,F为频率改变模式)。
5.2示波器显示模块
示波器主要用于显示函数发生器输出的波形,用它可以检测函数发生器是否正常工
作。
(1)、方波显示情况如图5.4所示:
图5.4示波器上的方波显示效果图
图5.4中示波器的垂直刻度每格为2V,其中方波所占2.5格,所以它的幅值为5V。图中所示的只是方波显示的瞬间情况,然而通过函数发生器的按键可以改变波形的幅值和频率从而导致波形形状的不同。 (2)、三角波显示情况如图5.5所示:
图5.5 示波器上三角波的显示效果图
图5.5示波器的垂直刻度每格为2V,其中三角波所占2.5格,所以它的幅值为5V。图中所示的只是三角波显示的瞬间情况,然而通过函数发生器的按键可以改变波形的幅值和频率从而导致波形形状的不同。
28
函数发生器的研究与实现
(3)正弦波显示情况如图5.6所示:
图5.6示波器上正弦波的显示效果图
图5.6所示波器的垂直刻度每格为2V,其中三角波所占2.5格,所以它的幅值为5V。图中所示的只是正弦波显示的瞬间情况,然而通过函数发生器的按键可以改变波形的幅值和频率从而导致波形形状的不同。
29
函数发生器的研究与实现
结 论
经过了几个月的努力,我的毕业设计终于完成了。通过这次设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能提高自己的实际动手能力和独立思考的能力,同时在设计的过程中发现了自己的不足之处。
其实函数发生器的设计技术有很多,而且已经很成熟。我本次的设计基本上利用的是前人的技术,谈不上什么创新,而且性能远不如市场上销售的成品。但是唯一有所创新的就是利用两块DAC0832芯片来设计函数发生器,因为一般都是利用一块DA芯片。我希望我的设计技术在将来能够更加完善一点,能够在函数发生器设计的这个领域占有一席之地。通过这次毕业设计,我学会了画流程图,原理图,也加深了模拟电路,数字电路的学习,毕业后不管是继续深造还是参加工作这些知识都将会在学习和工作上给我很大的帮助。
30
函数发生器的研究与实现
致 谢
大学的读书生活在这个季节即将划上一个句号,而于我的人生却只是一个逗号,我将面对又一次征程的开始。大学期间的求学生涯,在师长、亲友的大力支持下,走得辛苦却也收获满囊,在论文即将付梓之际,思绪万千,心情久久不能平静。 伟人、名人为我所崇拜,可是我更急切地要把我的敬意和赞美献给一位平凡的人,我的指导老师。我不是您最出色的学生,而您却是我最尊敬的老师。您治学严谨,学识渊博,思想深邃,视野雄阔,为我营造了一种良好的精神氛围。授人以鱼不如授人以渔,置身其间,耳濡目染,潜移默化,使我不仅接受了全新的思想观念,树立了宏伟的学术目标,领会了基本的思考方式,从论文题目的选定到论文写作的指导,经由您悉心的点拨,再经思考后的领悟,常常让我有“山重水复疑无路,柳暗花明又一村”。
感谢我的爸爸妈妈,焉得谖草,言树之背,养育之恩,无以回报,你们永远健康快乐是我最大的心愿。在论文即将完成之际,我的心情无法平静,从开始进入课题到论文的顺利完成,有多少可敬的师长、同学、朋友给了我无言的帮助,在这里请接受我诚挚谢意!
同时也感谢学院为我提供良好的做毕业设计的环境。
最后再一次感谢所有在毕业设计中曾经帮助过我的良师益友和同学,以及在设计中被我引用或参考的论著的作者。
31
函数发生器的研究与实现
参考文献
[1] 彭楚武,张志文.微机原理与接口技术(第二版)湖南大学出版社
[2] 刘坤. 51单片机C语言应用开发技术大全[M].人民邮电出版社,2008.09. [3] 寇戈,蒋立平.模拟电路与数字电路(第二版)电子工业出版社 [4] 康华光.电子技术基础(第五版)高等教育出版社
[5] 张毅刚.新编MCS-51单片机应用设计[M]. 哈尔滨工业大学出版社,2003. [6] 余小平 奚大顺主编 电子系统设计基础篇(第二版) 北京航空航天大学出版社 [7] 杨丽君.智能数字式低频信号发生器(J).电工技术杂志,1999. [8] 徐阳.基于单片机的低频信号发生器设计(J).长江大学学报,2008.5. [9] 王晓光.单片机在低频信号发生器中的应用(J).工业仪表与自动化,2003.2. [10] 陈坚.单片机低频信号发生器(J). 华东地质学院学报,1999.
[11] 戚勇.数字式低频信号发生器的软件设计(J).山东理工大学学报,2007. [12] 黄智伟.全国大学生电子设计竞赛训练教程.电子工业出版社,2005.01.
[13] 程全.基于AT89C52实现的多种波形发生器的设计[J].周口师范学院学报, 2005.22(5):57~58.
[14] 庄海军,数字函数信号发生器的设计与实现[D],江南大学硕士论文,2008. [15] Jing guo xin,Based on DDS technology function generator design and implementation [M], an
experimental science and technology, 2006 the first B12 period.
32
函数发生器的研究与实现
附录A
#include sbit F_la=P3^1; //高电平时锁存,低电平时直通 P1口 sbit A_la=P3^0; //高电平时锁存,低电平时直通 P1口 sbit k1=P3^2; sbit k2=P3^3; sbit k3=P3^4; sbit lcd_en=P2^4; sbit lcd_rs=P2^3; char fangbo[]=\"F\"; //输出波形 char sanjiao[]=\"S\"; char zhengxian[]=\"Z\"; char F1[]=\"F\"; //模式选择 char A1[]=\"A\"; char M1[]=\"M\"; char h1[]=\" Mode: A: . v\"; char h2[]=\" F: Hz\"; void delay00(uint k); //函数申明 void write_com(uchar com); void write_data(uchar data0); void init00(); uchar ii,ll; //P1口作为第一个DAC0832的数据输入,输出100HZ的方波、三角波、 正弦波(一个周期32个点) //选择波形 //LCD1602使能信号E位定义 //LCD1602读/写(H/L)控制信号RS位定义 //ii表示字符串第i位,ll表示字符串长度 uchar code sin[256]={ 0x80,0x83,0x86,0x89,0x8D,0x90,0x93,0x96, //正弦信号码表 0x99,0x9C,0x9F,0xA2,0xA5,0xA8,0xAB,0xAE, 0xB1,0xB4,0xB7,0xBA,0xBC,0xBF,0xC2,0xC5, 0xC7,0xCA,0xCC,0xCF,0xD1,0xD4,0xD6,0xD8, 33 函数发生器的研究与实现 0xDA,0xDD,0xDF,0xE1,0xE3,0xE5,0xE7,0xE9, 0xEA,0xEC,0xEE,0xEF,0xF1,0xF2,0xF4,0xF5, 0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD, 0xFD,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFD, 0xFD,0xFC,0xFB,0xFA,0xF9,0xF8,0xF7,0xF6, 0xF5,0xF4,0xF2,0xF1,0xEF,0xEE,0xEC,0xEA, 0xE9,0xE7,0xE5,0xE3,0xE1,0xDE,0xDD,0xDA, 0xD8,0xD6,0xD4,0xD1,0xCF,0xCC,0xCA,0xC7, 0xC5,0xC2,0xBF,0xBC,0xBA,0xB7,0xB4,0xB1, 0xAE,0xAB,0xA8,0xA5,0xA2,0x9F,0x9C,0x99, 0x96,0x93,0x90,0x8D,0x89,0x86,0x83,0x80, 0x80,0x7C,0x79,0x78,0x72,0x6F,0x6C,0x69, 0x66,0x63,0x60,0x5D,0x5A,0x57,0x55,0x51, 0x4E,0x4C,0x48,0x45,0x43,0x40,0x3D,0x3A, 0x38,0x35,0x33,0x30,0x2E,0x2B,0x29,0x27, 0x25,0x22,0x20,0x1E,0x1C,0x1A,0x18,0x16, 0x15,0x13,0x11,0x10,0x0E,0x0D,0x0B,0x0A, 0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02, 0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02, 0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, 0x0A,0x0B,0x0D,0x0E,0x10,0x11,0x13,0x15, 0x16,0x18,0x1A,0x1C,0x1E,0x20,0x22,0x25, 0x27,0x29,0x2B,0x2E,0x30,0x33,0x35,0x38, 0x3A,0x3D,0x40,0x43,0x45,0x48,0x4C,0x4E, 0x51,0x55,0x57,0x5A,0x5D,0x60,0x63,0x66, 0x69,0x6C,0x6F,0x72,0x76,0x79,0x7C,0x80 }; uchar mode,M,N,N3,A,k=5,gong,fen,Ax; uint d; //每次调用都会清屏,显示字符串 void LCD_1602_str(uchar hang1,char *ttt1,uchar hang2,char *ttt2) { 34 函数发生器的研究与实现 } init00(); //初始化函数 for(ll=0,ii=0;ttt1[ii];ii++,ll++); write_com(0x80+hang1); for(ii=0;ii 时其ascII码为0,所以此时跳出循环,从而求出字符串长度ll //显示第一行字符串 //地址指针指向下一行首列 write_com(0x80+0x40+hang2); for(ll=0,ii=0;ttt2[ii];ii++,ll++); for(ii=0;ii 时其ascII码为0,所以此时跳出循环,从而求出字符串长度ll write_data(ttt2[ii]); //在上次显示内容的基础上替换特定位置的字符串, void LCD_1602_t(uchar hang1,char *ttt1,uchar hang2,char *ttt2) { } //在特定的位置替换为一位数字(必须是0~9的数字,否则显示的将不是想要显示的数字) void LCD_1602_num(uchar hang1,uchar nnn1,uchar hang2,uchar nnn2) for(ll=0,ii=0;ttt1[ii];ii++,ll++); write_com(0x80+hang1); for(ii=0;ii //求第二行字符串长度,当ttt1[i]为最后一位\\0时//显示第二行字符串 //显示第一行字符串 //求第一行字符串长度,当ttt1[ii]为最后一位\\0 时其ascII码为0,所以此时跳出循环,从而求出字符串长度ll 其ascII码为0,所以此时跳出循环,从而求出字符串长度ll write_data(ttt2[ii]); 35 函数发生器的研究与实现 { } //延时子程序 void delay00(uint k) { } //写指令子程序 void write_com(uchar com) { } //写数据子程序 void write_data(uchar data0) { lcd_rs=1; //RS为H,RW为L时为写数据,开发板硬 件已将RW接地了,所以不用控制RW了 lcd_rs=0; P0=com; //RS为L,RW为L时为写指令,开发板硬件 //送指令代码到P0口 已将RW接地了,所以不用控制RW了 delay00(1); lcd_en=1; delay00(1); lcd_en=0; delay00(1); lcd_rs=1; //延时1ms,时序要求 //使能信号给高脉冲,使得1602读取P0口上 uint x,y; for(x=k;x>0;x--) for(y=10;y>0;y--); write_com(0x80+hang1); write_data(nnn1+48); //将数字转化为ascII码,数字+48=相应数字的 //地址指针指向下一行首列 ascII码 write_com(0x80+0x40+hang2); write_data(nnn2+48); 的指令,高脉冲的脉宽有要求,不同厂家的1602要求也不一样 36 函数发生器的研究与实现 } P0=data0; delay00(1); lcd_en=1; delay00(1); lcd_en=0; delay00(1); lcd_rs=1; //送数据到P0口 //使能信号给高脉冲,使得1602读取P0口上 的数据,高脉冲的脉宽有要求,不同厂家的1602要求也不一样 //初始化子程序 void init00() { 显示;C=1显示光标,C=0不显示光标;B=1光标闪烁,B=0光标不闪烁 指针加一,光标加一,N=0写入一个字符后地址指针减一,光标减一;S=1写入一个字符后,整屏左移(N=1)或者右移(N=0),以得到光标不移动而屏幕移动的效果,S=0写入一个 字符后整屏显示但不移动。 器 } write_com(0x01); //显示清屏 write_com(0x80); //数据指针设置,0x80+地址码(0~27H, 40~67H),00H~0fH和40H~4fH为可显示区间,其余区间为寄存 write_com(0x06); //0x06为当写一个字符后地址指针加一,且 光标加一,整屏不移动。000001NS:N=1写一个字符后地址 write_com(0x38); write_com(0x0c); //设置1602为16X2显示,5X7点阵,8为 //设置显示开/关及光标设置,0x0c为开显 数据口 示,不显示光标但不闪烁。00001DCB:D=1,开显示,D=0关 37 函数发生器的研究与实现 //用DAC0832输出方波(0)、三角波(1)、正弦波(2) void fout(void) { switch(mode) //根据模式来输出 { case 0: //方波 { if(N<=128) { F_la=0; F=0x00; F_la=1; } else { F_la=0; F=0xff; F_la=1; } N=N+8; break; } case 1: { if(M==0) { N3=N3+16; F_la=0; F=N3; F_la=1; if(N3==240) { M=1; } //三角波 38 函数发生器的研究与实现 } } } { } if(M==2) { } if(M==1) M++; break; //避免刚到240就被减16,保证每个点之间都间隔定时时间T N3=N3-16; F_la=0; //直通 F=N3; F_la=1; //锁存 if(N3==0) { } M=0; case 2: //正弦波 F_la=0; //直通 F=sin[N]; F_la=1; //锁存 N=N+8; break; } default:break; //用另一个DAC0832控制基准电压 void aout(void) { A_la=0; //锁存器直通 F=A; //送数据到P1口,准备转换数据 A A_la=1; //锁存数据 39 函数发生器的研究与实现 } //初始化函数 void init(void) //初始化函数 { F=0; // 数模初始值为0 } //延时程序 void delay(uint m) { } //按键设置 void key(void) { k3=1; if(k3==0) { delay(10); if(k3==0) { gong++; uint x,y; for(x=m;x>0;x--) for(y=110;y>0;y--); EA=1; //中断允许 TMOD=0x11; //定时器0,1的方式都是1 TH0=(-293)>>8; //定时器0初值装入,12MHz定时312us,中断频率32*100=3200Hz (一个周期32点) TL0=(-293); ET0=1; //中断0允许 TR0=1; //定时器0开 EX0=1; IT0=0; IT1=0; //开外部中断0 //低电平触发 //低电平触发 EX1=1; //开外部中断1 40 函数发生器的研究与实现 } } } while(!k3); if(gong==3) gong=0; if(gong==0) LCD_1602_t(19,fangbo,0,M1); LCD_1602_t(19,fangbo,0,F1); LCD_1602_t(19,fangbo,0,A1); if(gong==1) if(gong==2) //显示系统调节状态 //测试主函数 void main(void) { init(); LCD_1602_str(0,h1,19,h1); LCD_1602_str(19,h1,0,h2); A=255; LCD_1602_t(19,fangbo,0,M1); while(1) { key(); //显示输出波型 if(mode==0) LCD_1602_t(5,fangbo,19,fangbo); LCD_1602_t(5,sanjiao,19,sanjiao); LCD_1602_t(5,zhengxian,19,zhengxian); if(mode==1) if(mode==2) //显示输出信号幅值A if(A>=130) 41 函数发生器的研究与实现 } } Ax=A-5; Ax=A; Ax=0; else if(A==0) LCD_1602_num(12,Ax*0.1/5,19,0); LCD_1602_num(14,(Ax/5)%10,19,0); //显示定时器初值(如果显示的是实际输出频率就好了,后续工作) LCD_1602_num(19,A,7,d/10000); LCD_1602_num(19,A,8,d/1000%10); LCD_1602_num(19,A,9,d/100%10); LCD_1602_num(19,A,10,d/10%10); LCD_1602_num(19,A,11,d%10); //定时器0中断服务程序 void time0() interrupt 1 { 周期32,DAC出来就是100Hz) TL0=(-200); */ EA=0; ET0=0; //中断0允许 TR0=0; //定时器0关 /* //****100Hz**** TH0=(-200)>>8; //293定时器0初值装 入,12MHz定时312us,中断频率32*100=3200Hz(一个 TH0=(-d)>>8; //31231定时器0初值装入,12MHz定时31250us,中断频率TL0=(-d); ET0=1; //中断0允许 TR0=1; //定时器0开 32*1=32Hz(一个周期32,DAC出来就是1Hz) 42 函数发生器的研究与实现 } fout(); EA=1; //输出100Hz方波 //外部中断0,中断服务程序,增加输出信号幅值A //k为幅值或者频率步进增益(分为1、10、100),gong功能键用于控制调节状态(控制波形(0)、频率(1)、赋值(2)) void ex0() interrupt 0 { } EA=0; //关总中断 if(gong==0) { } if(gong==1) //频率控制(1) { } if(gong==2) //幅值(2) { } delay(500); EA=1; //开总中断 if(A==255) A=0; A+=5; if(A==125) A=k+A; //步进0.1v aout(); //调用函数实现幅值A步进 d=d+10;// fen++; //F_N(); mode++; if(mode==3) mode=0; //控制波形(0) //外部中断1,中断服务程序,减小输出信号幅值A 43 函数发生器的研究与实现 void ex1() interrupt 2 { } EA=0; //关总中断 if(gong==0) { } if(gong==1) //频率控制(1) { d=d-50; //fen--; } if(gong==2) //幅值(2) { } delay(500); EA=1; //开总中断 if(A==0) A=255; A=A-k; //步减0.1v aout(); //调用函数实现幅值A步进 mode--; if(mode>2) //从0减到255时赋值为3,实现循环 mode=2; //控制波形(0) 44 函数发生器的研究与实现 附录B R2VCCJLCD1123P2310k45P246P007P018P029P0310P0411P0512P0613P07141516R11kVCC J1654321CON6VCCS1P32JP1J387654321CON8D0D1D2D3D4D5D6D7J9P101P112P123P134P145P156P167P178RES9CSDA110CSDA211P3212P3313P3414CSF15LE116LE217XTAL218XTAL11920CON20VCCJ10P00P01P02P03P04P05P06P07VppALEPSENP27P26P25P24P23P22P21P201234567891011121314151617181920CON20P10P11P12P13P14P15P16P17J512345678CON8P10P11P12P13P14P15P16P1712345678U1P10P11P12P13P14P15P16P17INT1INT0T1T0EA/VPX1X2RESETRDWR89S51RXDTXDALE/PPSEN10113029CSDA1CSDA2ALEPSENP00P01P02P03P04P05P06P07P20P21P22P23P24P25P26P2739383736353433322122232425262728P00P01P02P03P04P05P06P07VCCP00P01P02P03P04P05P06P0712345678910kS2P33S3P34插针J2654321插针J487654321插针VCCP3313P3212CSF15P3414CON6插针C1C2C3C4C5C6C7C81602常开开关key1C110uRESR35.1kVCCCc130pCY112MHZCc230pVpp311918RES9LE217LE116CON8插针复位电路单片机J11J687654321CON8P10P11P12P13P14P15P16P1721CON2VCCVCCUDA1VCCCSDA1123P134P125P116P107Vref18Rfb1910/CSVCC/WR1ILEGND/WR2DI3/XFERDI2DI4DI1DI5DI0DI6VREFDI7RfbIOUT2GNDIOUT1ADC083220191817161514131211R520kVCC插针J1221-12P14P15P16P171362OP07Rfb1174R92kU28R131k2VCC7CON2插针J2021U56Vref238OP074插针J1621Vref1CON2CSDA1插针J2121Vref2CON2插针VCCJ2321CON2Vref1J2521CON2VCC1456U12INNCNCNCMC1403OUTNCNCGND2Vref1783Vref1C7104VCCJ8C8104+C134.7uF87654321CON8+C124.7uFCON2插针J17+9电压步进+9UDA2CSDA2123P134P125P116P107Vref28Rfb2910/CSVCC/WR1ILEGND/WR2DI3/XFERDI2DI4DI1DI5DI0DI6VREFDI7RfbIOUT2GNDIOUT1ADC083220191817161514131211R620k-12P14P15P16P17134VCCL1R720kVCC-12磁珠插针2.5V基准插针21P10P11CON2P12插针P13J18+9P142P151P16P17CON2C4104+9C9CAPR102k+9U386R141k26finput38Rfb21OP0747插针J1921插针J2221Vref2C10CAPU42OP077finputCON2插针J2421CON2插针CSDA2频率步进J2621CON2+9R8-12CON2插针-1220kC11CAP+9L2磁珠 45 因篇幅问题不能全部显示,请点此查看更多更全内容