项目9 信号发生器的设计_第1页
项目9 信号发生器的设计_第2页
项目9 信号发生器的设计_第3页
项目9 信号发生器的设计_第4页
项目9 信号发生器的设计_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电子工业出版社单片机控制技术项目式教程(C语言版)2021/5/91电子工业出版社项目9信号发生器的设计2021/5/92能了解D/A转换器的相关技术指标;能理解DAC0832的工作原理与应用方法;能掌握DAC0832与51单片机的接口方法;能掌握信号发生器的硬件电路的分析与设计方法;能熟练编写信号发生器产生各种波形信号的单片机控制程序。学习目标2021/5/93叙述D/A转换器的技术指标要求;叙述DAC0832的工作原理;设计单片机控制的信号发生器的工作电路;编写信号发生器产生各种波形信号的单片机控制程序。工作任务2021/5/94任务9.1灯光亮度调节器的设计任务9.2信号发生器的设计项目拓展串行D/A转换芯片PCF8591在实验板上的应用项目小结思考与训练项目9信号发生器的设计2021/5/95任务9.1灯光亮度调节器的设计D/A转换的功能就是将数字量转换成模拟量。基本的D/A转换器由电压基准或电流基准、精密电阻网络、电子开关及全电流求和电路构成。9.1.1D/A转换器的基本原理

1.D/A转换器的分类按工作方式分:并行D/A转换器(权电阻D/A转换器、R-2RT型D/A转换器) 串行D/A转换器 间接D/A转换器2021/5/96按D/A转换的分辨率分:低分辨率D/A转换器 中分辨率D/A转换器高分辨率D/A转换器按模拟量输出方式分:电流输出D/A转换器

电压输出D/A转换器按模拟电子开关电路的不同分:

CMOS开关型D/A转换器(速度要求不高) 双极型开关D/A转换器电流开关型(速度要求较高)ECL电流开关型(转换速度更高)2021/5/972.D/A转换器的组成D/A转换器由数码寄存器、模拟电子开关电路、解码网络、求和电路及基准电压等几部分组成。以R-2RT型D/A转换器为例,其由基准电压Vref、T型(R-2R)电阻网络、位切换开关和运算放大器组成。2021/5/983.D/A转换器的工作原理数字量是用代码按数位组合起来表示的,对于有权码,每位代码都有一定的位权。为了将数字量转换成模拟量,必须将每1位的代码按其位权的大小转换成相应的模拟量,然后将这些模拟量相加,即可得到与数字量成正比的总模拟量,实现数字—模拟转换。2021/5/99R-2RT型D/A转换器工作原理:图9.1R-2RT型D/A转换器原理电路2021/5/910图示的电路是一个3位二进制数的D/A转换电路,每位二进制数控制一个开关S。当第i位的数码为“0”时,开关Si打在左边;当第i位的数码为“1”时,开关Si打在右边。当S0接通时,I0′=I0〞=I0,I1′=I0′+I0〞=2I0同理

I1′=I1〞=I1

,I2′=2I1

I2′=I2〞=I2

,I=2I2推出I0

=I/8,I1

=I/4,I2

=I/2∑I=I0+I1+I2

=(1/8+1/4+1/2)I

=-Uref(1/8+1/4+1/2)/R2021/5/911将上式推广到n位二进制数的转换,可得一般表达式

∑I=-Uref(a0/2n+a1/2n-1+…+an-1/21+an/20)/R

则输出电压为

Uo=(∑I)Rf=-Uref(a0/2n+a1/2n-1+…+an-1/21+an/20)Rf/R

输出电压会因器件误差、集成运放的非理想特性而产生一定的转换误差。

2021/5/912一般D/A转换器:UOUT

=B×Ur其中:Ur为常量,由参考Uref决定。B为输入数字量,为二进制数。B可为8位、12位、16位等,由DAC芯片型号决定。当B为n位时:B=bn-1bn-2…b1b0=bn-1×2n-1+bn-2×2n-2+…+b1×21+b0×20

式中,bn-1为最高位;b0为最低位。

2021/5/9131.分辨率分辨率是D/A转换器对输入量变化敏感程度的描述,与输入数字量的位数有关。如果数字量的位数为n,则D/A转换器的分辨率为1/2n。即数/模转换器能对满刻度的1/2n输入量作出反应。9.1.2D/A转换器的技术性能指标

分辨率=输出模拟量的满量程值/2n如:8位数的分辨率为1/256,10位数分辨率为1/1024通常用D/A转换器输入数字量的位数来表示分辨率。D/A转换器常可分为8位、10位、12位三种。2021/5/9142.精度如果不考虑D/A的转换误差,D/A转换的精度为其分辨率的大小。因此,要获得一定精度的D/A转换结果,首要条件是选择有足够分辨率的D/A转换器。转换速度是DAC每秒可以转换的次数,其倒数为转换时间。转换时间是指从输入数字量到转换为模拟量输出所需的时间。当D/A转换器的输出形式为电流时,转换时间较短;当D/A转换器的输出形式为电压时,转换时间要加上运算放大器的延迟时间而长一点,一般在几十微秒内。3.转换速度2021/5/9154.建立时间建立时间是指从输入数字量变化到输出达到终值误差±(1/2)LSB(最低有效位)时所需的时间,即输入的数字量变化后,输出模拟量稳定到相应的数字范围内所需的时间。通常以建立时间来表示转换速度。输入编码形式是指D/A转换电路输入的数字量的形式。如二进制码、BCD码等。5.输入编码形式2021/5/9166.线性度线性度是指D/A转换器的实际转移特性与理想直线之间的最大误差,或最大偏移。通常给出在一定温度下的最大非线性度,一般为0.01%~0.03%。大部分D/A转换芯片是电压型输出,一般为5~10V;也有高压输出型的,为24~30V。有一些是电流型的输出,低者为20mA左右,高者可达3A。7.输出电平8.尖峰尖峰是输入的数字量发生变化时产生的瞬时误差。通常尖峰的转换时间很短,但幅度很大。在许多场合是不允许有尖峰存在的,应采取措施予以消除。2021/5/917正确了解D/A转换器件的技术性能参数,对于合理选用转换芯片、正确设计接口电路十分重要。

D/A转换器的性能指标很多,但在选用合适的芯片型号时主要考虑的是它的分辨率、精度和转换速度。2021/5/918

目前单片机系统常用的D/A转换器的转换精度有8位、10位、12位等,与单片机的接口方式有并行接口、串行接口。9.1.3DAC0832芯片及其与单片机接口电路

1.DAC0832芯片介绍(1)DAC0832的性能

8位D/A转换器,单电源供电,在+5~+15V范围均可正常工作。基准电压的范围为±10V;电流建立时间为1μs;CMOS工艺,低功耗(仅为20mW)。2021/5/919DAC0832主要特性:输出电流线性度可在满量程下调节;转换时间(电流建立时间)为1μs;数据输入可采用双缓冲、单缓冲或直通方式;增益温度补偿为0.02%FS/℃;每次输入数字为8位二进制数;低功耗,20mW;逻辑电平输入与TTL兼容;基准电压的范围为±10V;单电源供电,可在+5~+15V

内正常工作。2021/5/920(2)DAC0832的内部结构2021/5/921该转换器由输入寄存器和DAC寄存器构成两级数据输入锁存。使用时数据输入可以采用两级锁存(双锁存)形式,或单级锁存(一级锁存,一级直通)形式,或直接输入(两级直通)形式。此外,由3个与门电路可组成寄存器输出控制逻辑电路,该逻辑电路的功能是进行数据锁存控制。当=0时,输入数据被锁存;当=1时,锁存器的输出跟随输入的数据。

D/A转换电路是一个R-2RT型电阻网络,可实现8位数据的转换。2021/5/922

(3)DAC0832的引脚

DAC0832为20引脚、双列直插式封装。Vcc:电源线。DAC0832的电源可以在+5~+15V内变化。典型使用时用+15V电源。AGND和DGND:AGND为模拟量地线,DGND为数字量地线。使用时,这两个接地端应始终连在一起。CS:片选输入信号,低电平有效。只有当CS=0时,这片DAC0832才被选中。DI0~DI7:8位数字量输入端。应用时,如果数据不足8位,则不用的位一般接地。2021/5/923ILE:输入锁存允许信号,高电平有效。只有当ILE=1时,输入数字量才可能进入8位输入寄存器。WR1:写信号1,低电平有效,控制输入寄存器的写入。ILE和WR1信号控制输入寄存器是数据直通方式还是数据锁存方式:当ILE=1且WR1=0时,为输入寄存器直通方式;当ILE=1且WR1=1时,为输入寄存器锁存方式。WR2:写信号2,低电平有效,控制DAC寄存器的写入。XFER:数据传送控制输入信号,低电平有效,控制数据从输入寄存器到DAC寄存器的传送。WR2和XFER信号控制DAC寄存器是数据直通方式还是数据锁存方式:当WR2=0且XFER=0时,为DAC寄存器直通方式;当WR2=1或XFER=1时,为DAC寄存器锁存方式。2021/5/924Vref:参考电压线。Vref接外部的标准电源,与芯片内的电阻网络相连接,该电压可正可负,范围为-10~+10V。Iout1和Iout2:电流输出端。Iout1为DAC电流输出1,当DAC寄存器中的数据为0xFF时,输出电流最大,当DAC寄存器中的数据为0x00时,输出电流为0。Iout2为DAC电流输出2。DAC转换器的特性之一是Iout1+Iout2=常数。在实际使用时,总是将电流转为电压来使用,即将Iout1和Iout2加到一个运算放大器的输入端。2021/5/925Rfb:运算放大器的反馈电阻端,电阻(15kΩ)已固化在芯片中。因为DAC0832是电流输出型D/A转换器,为得到电压的转换输出,使用时需在两个电流输出端接运算放大器,Rfb即为运算放大器的反馈电阻。图9.5运算放大器的接法2021/5/926(4)DAC0832的工作原理

将数字量的每一位按权值分别转换成模拟量,再通过运算放大器求和相加,D/A转换器内部有一个解码网络,以实现按权值分别进行D/A转换。(5)DAC0832的输出

DAC0832是电流输出型D/A转换器。图9.6DAC0832单极性电压输出电路单极性输出运放:Vout=-Iout1×Rfb=-B×Vref/2562021/5/927双极性输出运放:Vout=-(Vout1/R+Vref/2R)×2R=-2Vout1-Vref=2B×Vref/256-Vref=B×Vref/128-Vref=Vref×(B-128)/128图9.7DAC0832双极性电压输出电路当Vref为正,数字量在0x01~0x7F之间变化时,Vout为负值;当数字量在0x80~0xFF之间变化时,Vout为正值。

2021/5/928(1)直通方式下的接口电路直通方式是数据直接输入(两级直通)的形式。两个8位数据寄存器都处于数据接收状态,LE1=1,LE2=1,ILE=1,而WR1、WR2、CS和XFER均为0。输入数据直接送到内部D/A转换器去转换。2.DAC0832与51单片机的接口电路

DAC0832的工作方式:直通方式、单缓冲方式和双缓冲方式2021/5/929图9.8直通方式下89C51与DAC0832的连接图2021/5/930(2)单缓冲方式下的接口电路单缓冲方式是单级锁存(一级锁存,一级直通)形式,就是使DAC0832的两个8位数据寄存器中有一个处于直通方式,而另一个处于受控的锁存方式,或者两个8位数据寄存器处于同时受控的方式,即同时送数,同时锁存。

①在单缓冲工作方式下,可以将8位DAC寄存器置于直通方式。为此,应将WR2和XFER接地,而输入寄存器的工作状态受单片机的控制。2021/5/931WR=0,P2.7=0,DAC0832的地址为0x7FFF,将数字量0x08转换为模拟量的程序:#defineDAC0832XBYTE[0x7FFF]DAC0832=0x08;或output(0x7FFF,0x08);2021/5/932②两个输入寄存器同时受控的连接方法,WR1和WR2一起接89C51的WR,CS和XFER共同接89C51的P2.7,因此两个寄存器的地址相同。2021/5/933(3)双缓冲方式下的接口电路

双缓冲方式的数据输入可以采用两级锁存(双锁存)的形式,就是把DAC0832的两个锁存器都接成受控锁存方式。DAC0832的WR1、WR2、CS和XFER都受单片机送来的信号的控制。

当WR=0,P2.7=0,P2.6=1,8位输入寄存器处于送数状态,

8位DAC寄存器处于锁存状态,不能进行D/A转换。

2021/5/934双缓冲方式下89C51与两片DAC0832的连接图2021/5/935如DAC0832的8位输入寄存器地址为0x7FFF,WR=0,P2.7=1,P2.6=0,8位DAC寄存器处于送数据状态,开始进行D/A转换。DAC0832的8位DAC寄存器的地址为0xBFFF,将一个数字量转换为模拟量的程序:

#defineDAC0832_1XBYTE[0xBFFF]#defineDAC0832_2XBYTE[0x7FFF]DAC0832_1=0x08;DAC0832_2=0x08;或output(0xBFFF,0x08);output(0x7FFF,0x08);

2021/5/9361.任务要求9.1.4灯光亮度调节器的设计

用AT89C51单片机和DAC0832控制一个发光二极管,使发光二极管的亮度逐渐变暗,再逐渐变亮,不断循环。2.任务分析改变发光二极管的亮度,就要改变通过发光二极管的电流。方法很多,利用AT89C51控制DAC0832数模转换芯片,DAC0832的输出转换成电压去驱动发光二极管。当DAC0832的输入数字量变化时,输出电压改变,通过发光二极管的电流变化,发光二极管的亮度就改变。2021/5/9373.任务设计(1)器件选择器件名称数量(只)AT89C5116MHz晶体122pF瓷片电容210uF电解电容110kΩ电阻1470Ω电阻1uA4711DAC08321发光二极管LED12021/5/938(2)硬件原理图设计DAC0832单缓冲方式,P2和P0决定地址,片选信号CS低电平有效,P2.7为0,DAC0832的地址为0x7FFF。

2021/5/939(3)软件程序设计:#include<reg51.h>#include<absacc.h>#defineuintunsignedint#defineucharunsignedchar#defineDAC0832XBYTE[0x7FFF]//延时子程序voidDelayMS(uintx){uchart;while(x--)for(t=0;t<120;t++);}//主程序控制灯光亮度变化voidmain(){uchari;while(1){for(i=256;i>0;i--){AC0832=i;DelayMS(1);}for(i=0;i<256;i++){AC0832=i;DelayMS(1);}}}

2021/5/940(4)软硬件联合调试在Protus环境下,将编译好的软件下载到AT89C51中运行,可以看到LED灯如任务要求的一样先由亮逐渐变暗,再由暗逐渐变亮。2021/5/9411.任务要求任务9.2信号发生器的设计

用单片机AT89C51和D/A转换芯片DAC0832组成的信号发生器生成要求周期和幅度(0V~+5V)的锯齿波、三角波、方波或正弦波。2.任务分析锯齿波:向DAC0832反复送入0x00~0xFF数据,就会生成幅度为0V~+5V的锯齿波三角波:向DAC0832反复送入0x00~0xFF和0xFF~0x00数据,就会生成幅度为0V~+5V的三角波方波:向DAC0832送入一定时长的0x00和一定时长的0xFF,就会生成幅度为0V~+5V的方波2021/5/942波形的周期与单片机的机器周期和程序中的延时长短相关。正弦波:等时间间隔分割正弦信号,计算出分割时刻的信号幅值,将幅值对应的数字量存储到ROM中,然后用查表的方法取出这些取样值,送到DAC0832转换后输出,那么输出信号就是正弦波形。

如:波形频率为50Hz的正弦波信号,正弦波信号以5°作为1个阶梯,则分成360°/5°=72份,时间间隔为20ms/72=0.278ms。当参考电压为-5V时,72个采样值、输出电压值、正弦值、角度如表9.2所示。2021/5/943XsinX输出电压输入数字量0°~90°90°~180°180°~270°270°~360°0°0.00002.500V0x7F0xFF0x7F0x005°0.08722.718V0x8A0xFE0x750x0110°0.17362.934V0x950xFD0x6A0x0215°0.25883.147V0xA00xFA0x5F0x0420°0.34203.355V0xAB0xF70x540x0725°0.42263.557V0xB50xF30x4A0x0C30°0.50003.750V0xBF0xED0x400x1135°0.57363.934V0xC80xE70x360x1740°0.64284.107V0xD10xE10x2D0x1E45°0.70714.268V0xD90xD90x250x2550°0.76604.415V0xE10xD10x1E0x2D55°0.81924.548V0xE70xC80x170x3660°0.86604.665V0xED0xBF0x110x4065°0.90934.773V0xF30xB50x0C0x4A70°0.93974.849V0XF70xAB0x070x5475°0.96594.915V0xFA0xA00x040x5F80°0.98484.962V0xFD0x950x020x6A85°0.99624.991V0xFE0x8A0x010x7590°1.00005.000V0xFF0x7F0x000x7F表9.2正弦波数据表2021/5/9443.任务设计(1)器件选择器件名称数量(只)AT89C5116MHz晶体122pF瓷片电容210uF电解电容110kΩ电阻110kΩ可变电阻11kΩ电阻1uA4711DAC08321数字电压表1示波器12021/5/945(2)硬件原理图设计DAC0832工作于单缓冲方式,地址为0x7FFF。Vref接-5V电压,输出的单极性电压在0~+5V之间变化。

2021/5/946(3)软件程序设计:①产生锯齿波的源程序如下:#include<reg51.h>#include<absacc.h>#defineuintunsignedint#defineucharunsignedchar#defineDAC0832XBYTE[0x7FFF]//延时子程序voidDelayMS(uintx){uchart;while(x--)for(t=0;t<120;t++);}//

主程序生成锯齿波voidmain(){uchari;

while(1)

{for(i=0;i<256;i++)

DAC0832=i;

DelayMS(1);

}}

2021/5/947②产生三角波的源程序如下:

#include<reg51.h>#include<absacc.h>#defineuintunsignedint#defineucharunsignedchar#defineDAC0832XBYTE[0x7FFF]//延时子程序voidDelayMS(uintx){uchart;while(x--)for(t=0;t<120;t++);}//

主程序生成三角波voidmain(){uchari;

while(1)

{for(i=0;i<256;i++)

DAC0832=i;

for(i=254;i>0;i--)

DAC0832=i;

DelayMS(1);

}}2021/5/948③产生正弦波的源程序如下:#include<reg51.h>#include<absacc.h>#defineuintunsignedint#defineucharunsignedchar#defineDAC0832XBYTE[0x7FFF]2021/5/949//初始化正弦波波形数据数组ucharcodedata[]={0x7F,0x8A,0x95,0xA0,0xAB,0XB5,0xBF,0xC8,0xD1,0xD9,0xE1,0xE7,0xED,0xF3,0xF7,0xFA,0xFD,0xFE,0xFF,0xFE,0xFD,0xFA,0xBF,0xF3,0xED,0xE7,0xE1,0xD9,0xD1,0xC8,0xBF,0xB5,0xAB,0xA0,0x95,0x8A,0x7F,0x75,0x6A,0x5F,0x54,0x4A,0x40,0x36,0x2D,0x25,0x1E,0x17,0x11,0x0C,0x07,0x04,0x02,0x01,0x00,0x01,0x02,0x04,0x07,0x0C,0x11,0x17,0x1E,0x25,0x2D,0x36,0x40,0x4A,0x54,0x5F,0x6A,0x75};2021/5/950//延时子程序voidDelayMS(uintx){uchart;while(x--)for(t=0;t<120;t++);}//主程序生成正弦波voidmain(){uchari;while(1){for(i=0;i<72;i++)DAC0832=data[i];DelayMS(1);}}

2021/5/951(4)软硬件联合调试将上面相应波形的程序编译为*.hex文件后,在Proteus绘制的原理图中,将*.hex文件加载到单片机AT89C51中运行,在虚拟示波器上可以看到对应的波形图。在Proteus仿真运行过程中可能会提示CPU过载,这时虚拟示波器可能会无法实时显示波形,可将虚拟示波器通道A中指向1的黄色旋钮从1开始先正向旋转一圈,再反向旋转一圈,这样会使虚拟示波器尽快刷新显示波形。

2021/5/9521.PCF8591简介项目拓展串行D/A转换芯片PCF8591在实验板上的应用

PCF8591是一个单片集成的具有I2C总线接口的8位A/D及D/A转换器,有4路A/D输入,1路D/A输出。PCF8591的输入输出地址、控制和数据信号都是通过I2C总线以串行的方式进行传输。

2021/5/953PCF8591的主要特性:单独供电PCF8591的操作电压范围+2.5V~+6V低待机电流通过I²C总线串行输入/输出PCF8591通过3个硬件地址引脚寻址PCF8591的采样率由I²C总线速率决定4个模拟输入可编程为单端型或差分输入自动增量频道选择PCF8591的模拟电压范围从VSS到VDD

PCF8591内置跟踪保持电路8-bit逐次逼近A/D转换器通过1路模拟输出实现DAC增益

2021/5/9542.PCF8591内部结构框图2021/5/9553.PCF8591引脚功能引脚序号引脚名称引脚功能1AIN0模拟量输入端口2AIN13AIN24AIN35A0模拟通道选择地址6A17A28VSS负电源电压9SDAI²C总线数据信号10SCLI²C总线时钟信号11OSC外部时钟输入端,内部时钟输出端12EXT内部、外部时钟选择线,使用内部时钟时EXT接地13AGND模拟信号地14Vref基准电源电压15AOUTD/A转换模拟量输出端16VDD正电源电压2021/5/9564.PCF8591工作原理PCF8591采用典型的I2C总线接口器件寻址方法,即总线地址由器件地址(1001)、引脚地址(由A0~A2接地或+5V来确定,接地代表0,接+5V代表1)、方向位(即R/W)组成。在I2C总线系统中最多可接8个这样的器件。D7D6D5D4D3D2D1D01001A2A1A0R/W表9.5PCF8591总线地址2021/5/957

R/W=1表示读操作,R/W=0表示写操作。如果将A0~A2接地,则读地址为91H;写地址为90H。地址字节:由器件地址、引脚地址、方向位组成,它是通信时主机发送的第一字节数据。控制字节:用于控制PCF8951的输入方式、输入通道、D/A转换等,是通信时主机发送的第二字节数据,其格式如下表。

D7D6D5D4D3D2D1D0未用(写0)D/A输出允许位0为禁止1为允许A/D输入方式选择位00:4路单端输入01:3路差分输10:单端与差分11:2路差分输入未用(写0)自动增益选择位

0为禁用1为启用AD通道选择位00:选择通道001:选择通道110:选择通道211:选择通道32021/5/958D/A转换的数据输入和A/D转换的数据输出都是通过I2C总线串行输入和输出的。因此PCF8951中I2C总线的通信格式包括写数据格式和读数据格式。PCF8591的I2C总线写数据格式:第一字节第二字节第三字节写入器件地址(90H)写入控制字节要写入的数据向PCF8591写入格式(高位在前)PCF8591的I2C总线读数据格式:第一字节第二字节第三字节第四字节写入器件地址(90H写)写入控制字节写入器件地址(91H读)读出一字节数据从PCF8591读数据格式(高位在前)2021/5/9595.I2C总线

(1)I2C总线数据位的传输I2C总线上每传输一个数据位必须产生一个时钟脉冲,I2C总线上数据传输的有效性要求SDA线上的数据必须在时钟线SCL的高电平期间保存稳定,数据线的改变只能在时钟线为低电平期间。

I2C总线由2根线:串行数据线(SDA)和串行时钟线(SCL)。总线上的每一个器件都有一个唯一的地址。2021/5/960(2)I2C总线数据的传输数据传输中的应答:相应的应答位由接收方(从机)产生,在应答的时钟脉冲期间,发送方(主机)应释放SDA线(使其为高电平)。在应答过程中,接收方(从机)必须将数据线SDA拉低,使它在这个时钟脉冲的高电平期间保持稳定的低电平。数据传输的字节格式:发送到SDA线上的每一个字节必须为8位,每次发送的字节数量不受限制,从机在接收完一个字节后向主机发送一个应答位,主机在收到从机应答后才会发送第二字节数据,发送数据时先发数据的最高位。2021/5/961(3)I2C总线的传输协议主机写数据到从机的通信格式:1234567NN-1主机产生起始位发从机地址90H等待从机应答发送数据等待从机应答发送数据等待从机应答。。。。停止位2021/5/962主机从从机中读数据的通信格式:1234567NN-1主机产生起始位发从机地址91H等待从机应答接收从机发出的数据向从机应答接收从机发出的数据向从机应答。。。。主机产生停止位2021/5/9636.实验板上锯齿波信号的输出(1)STC89C52控制PCF8591生成锯齿波信号的电路设计将U15的J23的19和20脚用杜邦线与J8的SDA和SCL脚连接。

2021/5/964(2)生成锯齿波的软件设计①主程序main.c://PCF8591的DA转换程序

#include<reg52.h>#include"i2c.h"#defineAddWr0x90//写数据地址#defineAddRd0x91//读数据地址//锯齿波数据表,表格数值越多,波形越平滑unsignedcharcodetab[]={0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250};//定义全局变量externbitack;2021/5/965//写入DA转换数值,dat表示需要输入转换的DA数值,从0-255bitWriteDAC(unsignedchardat,unsignedcharnum){unsignedchari;Start_I2c();//启动总线

SendByte(AddWr);//发送器件地址

if(ack==0)return(0);SendByte(0x40);//发送器件子地址

if(ack==0)return(0);for(i=0;i<num;i++){SendByte(dat);//发送数据

if(ack==0)return(0);}Stop_I2c();}2021/5/966//主程序main(){unsignedchari;while(1)

{for(i=0;i<26;i++)WriteDAC(tab1[i],1);}}2021/5/967②I2C头文件i2c.h:#ifndef__I2C_H__#define__I2C_H__#include<reg52.h>//头文件的包含#include<intrins.h>#define_Nop()_nop_()//定义空指令//启动总线voidStart_I2c();//结束总线voidStop_I2c();//字节数据传送函数

voidSendByte(unsignedcharc);#endif2021/5/968③I2C程序i2c.c://函数是采用软件延时的方法产生SCL脉冲,晶振频率是12MHz,即机器周期为1us#include"i2c.h"#define_Nop()_nop_()//定义空指令bitack; //应答标志位sbitSDA=P2^1;sbitSCL=P2^0;、//启动总线voidStart_I2c(){SDA=1;//发送起始条件的数据信号

_Nop();SCL=1;

_Nop();//起始条件建立时间大于4.7us,延时_Nop();_Nop();_Nop();_Nop();2021/5/969SDA=0;//发送起始信号

_Nop();//起始条件锁定时间大于4μ_Nop();_Nop();_Nop();_Nop();SCL=0;//钳住I2C总线,准备发送或接收数据

_Nop();_Nop();}//结束总线voidStop_I2c(){SDA=0;//发送结束条件的数据信号

_Nop();//发送结束条件的时钟信号

SCL=1;//结束条件建立时间大于4μ_Nop();_Nop();_Nop();_Nop();_Nop();SDA=1;//发送I2C总线结束信号

_Nop();_Nop();_Nop();_Nop();}20

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论