单片机的DA 接口应用 用0832单片机控制生成正弦波频率和幅值可调Word格式.docx
《单片机的DA 接口应用 用0832单片机控制生成正弦波频率和幅值可调Word格式.docx》由会员分享,可在线阅读,更多相关《单片机的DA 接口应用 用0832单片机控制生成正弦波频率和幅值可调Word格式.docx(24页珍藏版)》请在冰豆网上搜索。
领会单片机应用系统的软、硬件调试方法和系统的研制开发过程,为进一步的科研实践活动打下坚实的基础。
三、系统硬件图
3.1系统的硬件电路原理图
系统的硬件电路图如图1所示,从图中可以看到该电路主要有时钟电路、复位电路、D/A转换电路和运算放大电路等组成。
电源电路有设备提供,在原理图上不再说明,本文简单介绍电源电路的组成原理。
图1系统硬件电路原理图
3.2最小系统原理图
18051单片机:
图28051引脚图
2时钟电路
该电路主要有电容C1、C2和晶振Y1组成。
其组成原理图如图3所示,图中XTAL1为芯片内部振荡电路的输入端,XTAL2为芯片内部振荡电路的输出端。
图3时钟电路
3复位电路
单片机通常采用的复位方式有上电复位和按钮复位两种。
本次设计用的复位方式是按钮电平复位。
其原理图如图4所示。
当按下按钮SW时,电容对R6迅速放电,RESET端变为高电平,RESET松开后,电容通过电阻R6进行充电,RESET端恢复为低电平。
图4复位电路
3.3电压放大电路
电压放大电路主要有LM358组成,LM358内部包括有两个独立的、高增益、内部频率补偿的双运算放大器,适合于电源电压范围很宽的单电源使用,也适合用于双电源工作模式。
电压放大电路组成如图5所示。
图5电压放大电路
四、程序流程图
本设计程序流程图如下:
子程序流程图:
图6程序流程图
五、系统说明与分析
5.1设计步骤
1.理解设计任务要求(通过阅读有关资料及调查研究);
2.对总体方案进行分析、论证;
3.系统硬件电路的设计;
4.系统控制软件的设计;
1)以功能明确、相互界面能清晰分割的软件程序为基础,确定主程序流程框图;
2)以主程序流程框图为基础,确定各模块程序算法及实现的功能,进一步确定各模块程序流程框图;
3)根据软件流程框图,用AT89C51汇编语言编写主程序和延时子程序;
4)系统软、硬件的调试;
5)编写课程设计说明书;
6)答辩验收。
5.2D/A转换器与MCS-51单片机接口
模数转换器(D/A)就是一种把数字信号转换成为模拟电信号的器件。
D/A转换是单片机应用测控系统典型的接口技术内容,D/A转换接口设计的主要任务是选择D/A集成芯片,配置外围电路及器件,实现数字量到模拟量的线性转换。
一D/A转换器的基本原理与分类
D/A转换器用来将数字量转换成模拟量。
它的基本要求是输出电压VO应该和输入数字量成正比,即:
VO=D*VR其中,VR为参考电压。
每一个数字量都是数字代码的按位组合,每一位数字代码都有一定的“权”,对应一定大小的模拟量。
为了将数字量转换成模拟量,应该将其每一位都转换成相应的模拟量,然后求和既可得到与数字量成正比的模拟量。
D/A转换器可分成两大类:
1.直接D/A转换器是指直接将输入的数字信号转换为输出的模拟信号。
2.间接D/A转换器是先将输入的数字信号转换为某种中间量,然后再把这种中间量转换成为输出的模拟信号。
其中,间接D/A转换方式在集成D/A转换器中很少使用。
二D/A的转换器的主要指标
1.分辨率
这里指最小输出电压(对应的输入数字量只有最低有效位为“1”)与最大输出电压(对应的数字输出信号所有有效位全为“1”)之比,例如对于10位D/A转换器,其分辨率为:
0.0001。
分辨率越高,转换时,对应数字输入信号最低位的模拟信号电压数值越小,也就越灵敏,有时,也用数字输入信号的有效位数来给出分辨率。
例如,单片集成D/A转换器AD7541的分辨率为12位,单片集成D/A转换器DAC0832的分辨率为8位等。
2.线性度
通常用非线性误差的大小表示D/A转换器的线性度。
并且,把理想的输入/输出特性的偏差与满刻度输出之比的百分数,定义为非线性误差。
例如,单片集成D/A转换器AD7541的线性度(非线性误差)为小于等于0.02%FSR(FSR为满刻度的英文缩写)。
3.转换精度
转换精度以最大的静态转换误差的形式给出。
这个转换误差应该是非线性误差、比例系数误差以及漂移误差等综合误差。
但是有的产品说明中,只是分别给出各项误差,而不给出综合误差。
精度和分辨率是两个不同的概念。
精度是指转换后所得的实际值对于理想值的接近程度,而分辨率是指能够对转换结果以后影响的最小输入量,对于分辨率很高的D/A转换器并不一定具有很高的精度
4.建立时间
对于一个理想的D/A转换器,其数字输入信号从一个二进制数变到另一个二进制数时,其输出模拟信号电压,应立即从原来的输出电压跳到与新的数字信号相对应的新的输出电压。
但是在实际的D/A转换器中,电路中的电容、电感和开关电路会引起电路时间延迟。
所谓建立时间,系指数模拟转换器中的输入代码有满度值的变化时,其输出模拟信号电压(或模拟信号电流)达到满刻度值的1/2LSB(或满刻度值差百分之多少)时所需的时间。
5.3D/A转换器选择要点及辅助电路
选择D/A转换芯片时,主要考虑芯片的性能、结构及应用特性。
在性能上必须满足D/A转换的要求;
在结构和应用特性上应满足接口方便、外围电路简单、价格低廉等要求。
一、D/A转换器的选择要点
1.D/A转换芯片主要性能指标的选择
在D/A接口设计的实际应用中,在选择时主要考虑的是用位数(8位、12位)表示的转换精度和转换时间。
2.D/A转换芯片的主要结构特性与应用特性选择
D/A转换器的特性虽然主要表现为芯片内部结构的配置状况,但这些配置状况对D/A转换接口电路设计带来很大影响,主要有:
1)数字输入特性数字输入特性包括接收数的码制、数据格式以及逻辑电平等。
目前批量生产的D/A转换芯片一般都只能接收自然二进制数字代码。
2)数字输出特性目前多数D/A转换器件均属电流输出器件,手册上通常给出的输入参考电压及参考电阻之下的满码(全l)输出电流I0。
另外还给出最大输出短路电流以及输出电压允许范围。
3)锁存特性及转换控制D/A转换器对数字量输出是否具有锁存功能将直接影响与CPU的接口设计。
如果D/A转换器没有输入锁存器,通过CPU数据总线传送数字量时,必须外加锁存器,否则只能通过具有输出锁存功能的I/O给D/A送入数字量。
4)参考源D/A转换中,参考电压源是唯一影响输出结果的模拟参量,是D/A转换接口中的重要电路,对接口电路的工作性能、电路的结构有很大影响使用内部带有低漂移精密参考电压源的D/A转换器不仅能保证有较好的转换精度,而且可以简化接口电路。
3.D/A转换器模拟输出电压的极性
所有的D/A转换器件的输出模拟电压Vo,都可以表达成为输入数字量D(数字代码)和模拟参考电压VR的乘积。
由于目前绝大多数D/A输出的模拟量均为电流量,这个电流量要通过一个反相输入的运算放大器才能转换成模拟电压输出。
在这种情况下,模拟输出电压Vo与输入数字量D和参考电压VR的关系为:
当参考电压VR极性不变时,要想得到双极性的模拟输出,就必须采取四象限工作的D/A接口电路,该接口电路输出的模拟电压V0为:
不论参考电压VR的极性如何,都可以获得双极性的电压输出,在参考电压极性不变时,输出模拟电压的极性完全取决于输入数字量二进制码的最高位(MSB)。
5.4典型的D/A转换器芯片DAC0832性能介绍
DAC0830/0831/0832是8位分辩率的D/A转换集成芯片,与微处理器完全兼容。
这个系列的芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到了广泛的应用这类D/A转换器由8位输入锁存器、8位DAC寄存器、八位D/A转换电路及转换控制电路构成。
DAC0832的应用特性与引脚功能
DAC0830系列芯片是一种具有两个输入数据寄存器的8位DAC,是一个8位D/A转换器芯片,单电源供电,从+5V~+15V均可正常工作。
其主体部分为由T型状态。
而模拟开关控制标准电源在T型电阻网络所产生的电流。
输入的数字量通过两级缓冲器送到D/A转换电路。
通过对这两级缓冲器进行控制,可以实现直通、单缓冲、双缓冲三种工作方式。
如果控制信号使得两级缓冲器一直处于选通状态,则DAC0832工作在直通方式;
当输入寄存器、DAC寄存器中有一个直接选通,另一个受控制,则它工作在单缓冲方式;
当输入寄存器、DAC寄存器都受控制时,它工作在双缓冲方式。
DAC0832属于电流型输出的D/A转换器。
这些电流经外部运算放大器实现I-V变换输出模拟电压。
模拟电压根据不同的外接电路又可分为单极性和双极性。
DAC0832是8位芯片,采用CMOS工艺和R-2RT形电阻解码网络,转换结果为一对差动电流I01和I02输出,其主要性能参数为:
·
分辨率:
8位
单电源供电:
+5V-+15V
参考电压:
-10V—+10V
转换时间:
1us
满刻度误差;
士1LSB
数据输入电平与TTL电平兼容
电流稳定时间1us;
可单缓冲、双缓冲或直接数字输入;
只需在满量程下调整其线性度;
低功耗,200mW。
1)DAC0832内部结构和引脚
DAC0832的内部结构如图7所示:
图7DAC0832的内部结构图
DAC0832引脚如图8所示,它采用20线双列直插式封装,引脚功能如下:
(1)D7~D0——转换数据输入。
(2)CS——片选信号(输入),低电平有效。
(3)ILE——数据锁存允许信号(输入),高电平有效。
(4)WR1——第一信号(输入),低电平有效。
该信号与ILE信号共同控制输入寄存器是数据直通方式还是数据锁存方式:
当ILE=1和XFER=0时,为输入寄存器直通方式;
当ILE=1和WR1=1时,为输入寄存器锁存方式。
(5)WR2——第2写信号(输入),低电平有效.该信号与信号合在一起控制DAC寄存器是数据直通方式还是数据锁存方式:
当WR2=0和XFER=0时,为DAC寄存器直通方式;
当WR2=1和XFER=0时,为DAC寄存器锁存方式。
图80832引脚图
(6)XFER——数据传送控制信号(输入),低电平有效。
(7)Iout2——电流输出“1”。
当数据为全“1”时,输出电流最大;
为全“0”时输出电流最小。
(8)Iout2——电流输出“2”。
DAC转换器的特性之一是:
Iout1+Iout2=常数。
(9)RFB——反馈电阻端
即运算放大器的反馈电阻端,电阻(15KΩ)已固化在芯片中。
因为DAC0832是电流输出型D/A转换器,为得到电压的转换输出,使用时需在两个电流输出端接运算放大器,RFB即为运算放大器的反馈电阻。
(10)Vref——基准电压,是外加高精度电压源,与芯片内的电阻网络相连接,该电压可正可负,范围为-10V~+10V。
(11)DGND——数字地
(12)AGND——模拟地
2)DAC0832工作方式
DAC0832利用WR1、WR2、ILE、XFER控制信号可以构成三种不同的工作方式。
(1)直通方式——WR1=WR2=0时,数据可以从输入端经两个寄存器直接进入D/A转换器。
(2)单缓冲方式——两个寄存器之一始终处于直通,即WR1=0或WR2=0,另一个寄存器处于受控状态。
(3)双缓冲方式——两个寄存器均处于受控状态。
这种工作方式适合于多模拟信号同时输出的应用场合。
其中,所谓单缓冲方式就是使DAC0832的两个输入寄存器中有一个(多位DAC寄存器)处于直通方式,而另一个处于受控锁存方式。
单缓冲方式连接如图9所示:
图9单缓冲方式连接图
为使DAC寄存器处于直通方式,应使WR2=0和XFER=0。
为此可把这两个信号固定接地,或如电路中把WR2与WR1相连,把XFER与CS相连。
为使输入寄存器处于受控锁存方式,应把WR1接80C51的WR,ILE接高电平。
此外还应把CS接高位地址线或地址译码输出,以便于对输入寄存器进行选择。
在多路D/A转换的情况下,若要求同步转换输出,必须采用双缓冲方式。
DAC0832采用双缓冲方式时,数字量的输入锁存和D/A转换输出是分两步进行的。
第一,CPU分时向各路D/A转换器输入要转换数字量并锁存在各自输入寄存器中。
第二,CPU对所有的D/A转换器发出控制信号,使各路输入寄存器中的数据进入DAC寄存器,实现同步转换输出。
如下图10为两片DAC0832与8031的双缓冲方式连接电路,能实现两路同步输出。
DAC0832转换器输出可以分电流输出和电压输出两种形式,通常均需通过运算放大器进变换。
按电压输出时,还可分单极性和双极性两种形式
5.58051单片机简要介绍
8051单片机包含中央处理器(CPU)、存储器(程序存储器ROM和数据存储器RAM)、定时/计数器、并行I/O接口(P1、P2、P3、P0共4个8位口)、一个双工串行接口和5个中断源等几大单元及数据总线、地址总线和控制总线三大总线等结构组成。
8051与DAC0832的双缓冲方式接口电路如图10所示。
DAC0832的电压输出方式如图11所示
图108051与DAC0832的双缓冲方式接口电路
图10DAC0832的电压输出方式
MCS-51系列单片机中的8031、8051及8751均采用40Pin封装的双列直接DIP结构,右图是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。
现在我们对这些引脚的功能加
以说明:
MCS-51系列单片机的内部结构示意图如图12所示。
图12MCS-51系列单片机的内部结构示意图
Pin20:
接地脚。
Pin40:
正电源脚,正常工作或对片内EPROM烧入程序时,接+5V电源。
Pin19:
时钟XTAL1脚,片内振荡电路的输入端。
Pin18:
时钟XTAL2脚,片内振荡电路的输出端。
8051的时钟有两种方式,一种是片内时钟振荡方式,但需在18和19脚外接石英晶体(2-12MHz)和振荡电容,振荡电容的值一般取10p-30p。
另外一种是外部时钟方式,即将XTAL1接地,外部时钟信号从XTAL2脚输入。
输入输出(I/O)引脚:
Pin39-Pin32为P0.0-P0.7输入输出脚,Pin1-Pin1为P1.0-P1.7输入输出脚,Pin21-Pin28为P2.0-P2.7输入输出脚,Pin10-Pin17为P3.0-P3.7输入输出脚。
Pin9:
RESET/V
pd
复位信号复用脚。
当8051通电,时钟电路开始工作,在RESET引脚上出现24个时钟周期以上的高电平,系统即初始复位。
初始化后,程序计数器PC指向0000H,P0-P3输出口全部为高电平,堆栈指针写入07H,其它专用寄存器被清“0”。
RESET由高电平下降为低电平后,系统即从0000H地址开始执行程序。
然而,初始复位不改变RAM(包括工作寄存器R0-R7)的状态。
Pin30:
ALE/
当访问外部程序器时,ALE(地址锁存)的输出用于锁存地址的低位字节。
而访问内部程序存储器时,ALE端将有一个1/6时钟频率的正脉冲信号,这个信号可以用于识别单片机是否工作,也可以当作一个时钟向外输出。
更有一个特点,当访问外部程序存储器,ALE会跳过一个脉冲。
如果单片机是EPROM,在编程其间,
将用于输入编程脉冲。
Pin29:
当访问外部程序存储器时,此脚输出负脉冲选通信号,PC的16位地址数据将出现在P0和P2口上,外部程序存储器则把指令数据放到P0口上,由CPU读入并执行。
Pin31:
EA/V
pp
程序存储器的内外部选通线,8051和8751单片机,内置有4kB的程序存储器,当EA为高电平并且程序地址小于4kB时,读取内部程序存储器指令数据,而超过4kB地址则读取外部指令数据。
如EA为低电平,则不管地址大小,一律读取外部程序存储器指令。
显然,对内部无程序存储器的8031,EA端必须接地。
·
在对8751的EPROM进行编程时,EA/Vpp
脚还需加上用于编程的电压。
5.6数码显示部分
八段LED数码管由8个发光二极管组成。
基中7个长条形的发光管排列成“日”字形,另一个圆点形的发光管在显示器的右下角作为显示小数点用,它能显示各种数字及部份英文字母。
LED数码管有两种不同的形式:
一种是8个发光二极管的阳极都连在一起的,称之为共阳极LED数码管;
另一种是8个发光二极管的阴极都连在一起的,称之为共阴极LED数码管。
四位八段数码管的引脚结构如下图13所示:
图13四位八段数码管的引脚结构
其中S1,S2,S3,S4为字位选择端口,A,B,C,D,E,F,G,DP为字形选择端口。
在单片机应用系统中,数码管显示常用两种方法:
静态显示和动态扫描显示。
所谓静态显示,就是每一个显示器都要占用单独的具有锁存功能的I/O接口用于笔划段字形代码。
这样单片机只要把要显示的字形代码发送到接口电路,就不用管它了,直到要显示新的数据时,再发送新的字形码。
动态扫描显示接口是单片机中应用最为广泛的一种显示方式之一。
其接口电路是把所有显示器的8个笔划段A-H同名端连在一起,而每一个显示器的公共极COM是各自独立地受I/O线控制。
CPU向字段输出口送出字形码时,所有显示器接收到相同的字形码,但究竟那个显示器亮,则取决于COM端,而这一端是由I/O控制的,所以就可以自行决定何时显示哪一位了。
所谓动态扫描就是指我们采用分时的方法,轮流控制各个显示器的COM端,使各个显示器轮流点亮。
在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约1ms),尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。
六、源程序
1、主程序
/*******************************************************
//DAC0832波形控制试验
//功能:
根据按键控制输出频率和幅值可调的正弦波
*******************************************************/
#include<
reg52.h>
math.h>
intrins.h>
#include"
key.c"
#definePI3.14
#defineDataNum256//定义一个周期的点数
//#defineDAC0832XBYTE[0x7fff]//定义端口地址
sbitWRI=P3^6;
//定义写信号的IO口
sbitCS=P2^7;
//定义片选信号的IO口
//数码管显示的编码
u_charcodenumber_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xc1,0X8e};
//显示共阳极的0~9,全灭,U,F
/********延时***************/
voiddelay_us(u_inttime)
{
do
{
time--;
}
while(time>
1);
}
//毫秒级延时程序
voiddelay_ms(u_inttime)
while(time!
=0)
delay_us(1000);
}
}
//外部中断0的服务程序
voidint0_sever(void)interrupt0using1
u_chari;
g_keys=1;
view_state();
INT0=1;
i=INT0;
while(~i);
//等待P32恢复
//外部中断1的服务程序
voidint1_sever(void)interrupt2using1
g_keys=2;
INT1=1;
i=INT1;
//等待P33恢复
//演示数码管显示数字=定时器1的中断服务
/******************************************/
voidtime1_sever(void)interrupt1using2
{
u_charbuffer[4],i;
TR0=0;
buffer[3]=number_code[qian];
buffer[2]=number_code[bai];
buffer[1]=number_code[shi];
buffer[0]=number_code[ge];
P1=0xff;
P2|=0x0f;
for(i=0;
i<
4;
i++)
switch(i)
{
case0:
P1=buffer[0];
P2&
=0xfe;
delay_ms
(1);
P2|=0x0f;
break;
case1:
P1=buffer[1];
=0xfd;
case2:
P1=buffer[2];
=0xfb;
case3:
P1=buffer[3];
=0xf7;
default:
}
TH0=0xd8;
//预置计数0初值