一、PCF8591锁存器:

1、74HC573锁存器介绍:

 74HC573是拥有八路输出的透明锁存器,输出为三态门,是一种高性能硅栅​​C​​MOS器件。器件的输入是和标准CMOS输出兼容的,加上拉电阻他们能和LS/ALSTTL输出兼容。

2、74HC573锁存器工作原理:

 如果单片机的总线接口只作一种用途,不需要接锁存器;如果单片机的总线接口要作两种用途,就要用两个锁存器。例如:一个口要控制两个 LED,对第一个 LED 送数据时,“打开”第一个锁存器而“锁住”第二个锁存器,使第二个 LED 上的数据不变。对第二个 LED 送数据时,“打开”第二个锁存器而“锁住”第一个锁存器,使第一个 LED 上的数据不变。如果单片机的一个口要做三种用途,则可用三个锁存器,操作过程相似。然而在实际应用中,我们并不这样做,只用一个锁存器就可以了,并用一根 I/O 口线作为对锁存器的控制之用(接 74HC573 的L,而E可恒接地)。所以,就这一种用法而言,可以把锁存器视为单片机的 I/O 口的扩展器。

1脚是输出使能

11脚是锁存使能

D是输入

Q是输出

H是高电平,L是低

3、74HC573锁存器使用方法:

E是1脚 L是11脚

E接低电平,使芯片内部数据保持器输出端与芯片8位输出端之间连通。

L端的作用是通过高低电平控制8位输入与内部数据保持器输入端的连通与断开。

当 L= 0 时,P0端口的8位数据线与74HC573内部数据保持器的输入端断开。

当 L = 1 时,P0端口的8位数据线与74HC573内部数据保持器的输入端连通

二、AT24C02芯片:

1、I2C简介:

 I2C 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司在八十年代初设计出来的一种简单、双向、二线制、同步串行总线,主要是用来连接整体电路(ICS) ,IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。主要包括启始、停止、读、写、应答信号。这种方式简化了信号传输总线接口。

I2C总线上可以挂多个器件,而每个器件都有唯一的地址,这样可以标识通信目标。数据的通信的方式采用主从方式,主机负责主动联系从机,而从机则被动回应数据。

2、AT24C02简介:

 AT24C02是一个2K位串行CMOS E2PROM, 内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。AT24C02有一个8字节页写缓冲器。该器件通过IIC总线接口进行操作,有一个专门的写保护功能。在单片机上的应用广泛, 可以实现掉电数据不丢失功能。

3、引脚说明:

4、详细操作说明:

① 起始和停止条件:

数据和时钟线都为高则称总线处在空闲状态。当SCL为高电平时SDA的下降沿(高到低)叫做起始条件,SDA的上升沿(低到高)则叫做停止条件。

代码如下:

起始信号:SDA=1保持时间大于4.7us,随后SDA=0保持时间大于4us



/*SDA下降沿*/


void start()


{


    SDA = 1;


    SCL = 1;


    delay();


    SDA = 0;


    delay();


  }


终止信号:SDA=0保持时间大于4us,随后SDA=1保持时间大于4.7us



/*SDA上升沿*/


void end()


{


    SDA = 0; 


    SCL = 1;


    delay();


    SDA = 1;


    delay();


 }


② 位传输:

每个时钟脉冲传送一位数据。SCL为高时SDA必须保持稳定,因为此时SDA的改变被认为是控制信号。位传输见下图:

③ 应答:

总线上的接收器每接收到一个字节就产生一个应答,主器件必须产生一个对应的额外的时钟脉冲,见下图:

 接收器拉低SDA线表示应答,并在应答脉冲器件保持稳定的低电平,当主器件做接收器时,必须发出数据传输结束的信号给发送器,及他在最后一个字节之后的应答脉冲期间不会产生应答信号(不拉低SDA),这种情况下,发送器必须释放SDA线为高以便主器件产生停止条件。

代码如下:



void ack()


{


    uchar i = 0;


    SCL = 1;


    delay();


    while(SDA == 1 && i < 250)i++;


    SCL = 0;            //SCL=0,SDA可以改变


    delay();


 }


④ 器件寻址:

 起始条件使能芯片读写操作后,EEPROM都要求有8位的器件地址信息。对于24C02,随后的3位A2A1A0为器件地址位,必须与硬件输入引脚保持一致。

⑤从总线上读取一个字节的数据:

程序实现:带返回值,先读高位,然后通过移位运算符,一位一位读入



uchar read_byte()


{


    uchar dat = 0, tmp, i;


    SCL = 0;


    delay();


    for(i = 0; i < 8; i++)


    {


        SCL = 1;        //让SDA保持稳定,准备读取


        delay();


        tmp = SDA;        //读取此时SDA的状态


        dat = dat << 1;


        dat = dat | tmp;


        delay();


        SCL = 0;        //释放SDA总线,为下一次读取做准备


        delay();


    }


    return dat;


}


⑥AT24C02写操作:

通过以上几种信号的组合,可以向AT24C02指定单元地址写一字节的数据,可以看出,读写顺序为:起始,写器件地址,应答,写单元地址,应答,写数据,应答,终止。

程序实现:此函数无返回值,有两个形参, 内存单元地址,范围0-255;要写的数据,如0xfe;



void write_AT24C02(uchar unit_addr, uchar dat)


{


    start();


    write_byte(AT24C02_ADDR + 0);    //下一个字节为写,所以是+0


    ack();


    write_byte(unit_addr);


    ack();


    write_byte(dat);


    ack();


    end();


}


⑦AT24C02读操作:

从AT24C02任意单元地址读取数据,可以看出读写顺序为:起始,写器件地址+0(下一个字节为写),应答,写单元地址,应答,起始,写器件地址+1(下一个字节为读取),读取数据,终止。

程序实现:此函数有返回值,一个形参;单元地址,范围:0-255;



uchar read_AT24C02(uchar unit_addr)


{


    uchar dat;


    /*先写数据*/


    start();


    write_byte(AT24C02_ADDR + 0);      //下一个字节为写


    ack();


    write_byte(unit_addr);


    ack();


    start();


    write_byte(AT24C02_ADDR + 1);       //下一个字节为读


    ack();


    dat = read_byte();


    end();


    return dat;


}


⑧延时函数:



void delay()        //短暂5us延时


{


    ;;


}


⑨ I2C初始化:



void I2C_init()                //初始化


{


    SDA = 1;   


    delay();


    SCL = 1;   


    delay();


}


5、具体例子:

向内存单元211,写入数据0xae,然后在从内存单元211中读取出来,送给P1口led显示.





注意:写完后要延时一会才能读取,否则不能成功读取.


void main()


{


    write_AT24C02(211, 0xae);


    delay_10ms();                       //写完后,必须延时一定的时间才可以读取,否则不行


    P1 = read_AT24C02(211);


    while(1);


}


三、PCF8591A/D和D/A转换器:

1、PCF8591简介:

4 个模拟输入、一个输出和一个串行I2C 总线接口。3 个地址引脚A0、A1 和A2 用于编程硬件地址,允许将最多8 个器件连接至I2C总线而不需要额外硬件。该芯片工作电压在2.5V~6V。PCF8591由于其使用的简单方便和集成度高,在单片机应用系统中得到了广泛的应用,这篇文章是介绍IIC通信在AD、DA转换芯片PCF8591中的应用。

下图为其引脚图:

下图为内部框图:

2、PCF8591与AT24C02的对比介绍:

PCF8591是单片、单电源低功耗8位CMOS数据采集器件,具有4个模拟输入、一个输出和一个串行I2C总线接口。3个地址引脚A0、A1 和A2 用于编程硬件地址,允许将最多8个器件连接至I2C总线而不需要额外硬件。器件的地址、控制和数据通过两线双向I2C总线传输。器件功能包括多路复用模拟输入、片上跟踪和保持功能、8位模数转换和8位数模拟转换。最大转换速率取决于I2C总线的最高速率。

AIN端口输入模拟电压,然后PCF8591将转换后的数字量通过I2C总线发送给单片机,或是单片机通过I2C总线给一个数字量,然后PCF8591通过AOUT端口将模拟电压输出。

3、PCF8591的器件地址:

 I2C总线系统中的每一片 PCF8591通过发送有效地址到该器件来激活。该地址包括固定部分和可编程部分。可编程部分必须根据地址引脚 A0、A1和 A2来设置。在 I2C总线协议中地址必须是起始条件后作为第一个字节发送。地址字节的最后一位是用于设置以后数据传输方向的读 /写位。(见下图)

它的地址是由1001和A2、A1、A0组成的,在原理图中可以看出,A2、A1、A0均为0,所以器件地址为0x90/0x91,最后一位是读写方向位,0表示下一个字节往总线上写数据,1表示下一个字节从总线上读取数据.

4、PCF8591的器件控制字格式:

① 最高位默认为0;

② 第6位是选择是否允许模拟电压输出,在DA转换时设置为1,AD转换时设置为0或1均可;

③ 第5/4位是选择模拟电压输出方式,一般选择00单端输入方式;

④ 第3位默认为0;

⑤ 第2位是自动增量使能位,如果自动增量(auto-increment)标志置1,每次A/D 转换后通道号将自动增加;

⑥ 第1/0为是在AD转换时选择哪一个通道输入的电压转换为数字量;

其他的几种方式如下图所示:

5、转换函数:

① AD转换函数:

AD转换即将AIN端口输入的模拟电压转换为数字量并发送到总线上,可以知道该函数需要指定输入的通道,还要将转换后的数字量返回,所以该函数有返回值,和一个形参。

程序实现:



/*读取某一个通道转换后的数字量*/


uchar Read_D(uchar Channel)    


{


  uchar dat;


  start();


  write_byte(0x90);          //器件地址+0


  ack();


  write_byte(Channel);      //控制字0x01表示通道1


  ack();


  start();


  write_byte(0x91);          //器件地址+1,下一个字节要读取


  ack();


  dat=read_byte();          


  ack();


  stop();


//  AD_led=0;               //转换成功显示


  return dat;


}


②DA转换函数

DA转换即将从总线上接收到的数字量通过AOUT输出,该函数无返回值,有一个形参

程序实现:



void Out_A(uchar Digital)              


{


    start();


    write_byte(0x90);               //器件地址+0,下一个字节为写入


    ack();


    write_byte(0x40);               //设置控制字         0100 0000 允许模拟输出,不自增单端


    ack();


    write_byte(Digital);        //将要转换的数字量写入


    ack(); 


    stop();


//  DA_led=0;                           //转换成功显示               


}


6、转换公式

我们可以用一个转换公式,将AD转换后的数字量转换为对应的电压值,在数码管或液晶上显示,公式如下:



#define fun(x) (int)(5*x/255.0*100+0.5)             //数字电压x转换为模拟电压的公式


7、主函数调用



dat1 = Read_D(0x01);            //将通道1(电位器v2)的模拟电压转换的数字量读出


Out_A(dat1);                        //将数字量转换为模拟量输出到led显示


dis_Voltage1(fun(dat1));        //数码管显示电压值


Delay_Ms(5);                        //延时缓冲


这样就可以实时显示输入的电压值了.还可以将电压值输出到LED亮度显示出来.这样就可以作为一个简易的小量程5v的电压表了。

四、运放概述及参数介绍:

运算放大器, 简称“运放“, 英文描述 Operation Amplifier (OA), 是运用非常广泛的一种线性集成电路,其种类繁多,在运用方面不但可对微弱信号进行放大,还可作为反相器、电压比较器、电压跟随器、积分器、微分器等,并可对电信号做加/减法运算,所以它被称为运算放大器。在学习运放的各种电路之前先来了解一下与运放有关的一些参数。

1、放大倍数

运算放大器通常是把较小的电压或电流信号放大成较大的方便后续处理的电压信号,所谓的放大倍数就是指输出信号与输入信号的比值, 单位是“倍“, 如输入电压信号为10mv,经过运放放大后其输出电压为100mv, 那么这里的放大倍数为 10 倍。

2、增益

放大倍数也称为增益, 实际上这是一个概念的两种不同叫法。放大器增益的单位是“分贝" (dB), 增益与放大倍数之间的转换关系请看下一个知识点的讲解。

3、最大输出电压 UoPP

能使输出和输入保持不失真关系的最大输出电压。

4、输入失调电压 Vos

在室温及标准电源电压下, 为了使静态 Uo=0, 而在输入端需要加的补偿电压值称为输入 失调电压 Uos, 它反映电路中的对称程度和电位配置情况。

5、输入失调电流 IOS

在室温及标准电源电压下, 当 Uo=0时 , 两输入端静态电流之差。

6、输入偏置电流 IB

在室温及标准电源电压下, 以 恒流源驱动两输入端, 当 Uo=0时, 两输入端电流的平均值, 即IB= (IB1 +IB2)/2 。

7、开环差模电压增益 Auo

运 放没有接反馈电路时的差模电压放大倍数。Auo 愈高, 所构成的运算电路越稳定, 运算精度也越高。

8、单位增益带宽

增益带宽=增益x带宽,单位增益带宽是指闭环增益为1时所输出的放大倍数变成0.707

倍时,输入信号的频率。

9、最大差模输入电压LJidm

Uidm是指运放两个输入端之间所能承受的最大电压差值。超过该值,输入级某一侧将出

现PN结反向击穿现象。

10、差模输入电阻

开环运放两输入端之间的差模输入信号的动态电阻。

11、最大共模输入电压Uicm

Uicm是共模输入电压范围,是标准电压下,两输入端在相同电位时的最大输入电压。一旦超过Uicm,其共模抑制比将明显下降。

12、共模抑制比CMRR

CMRR定义为运放开环差模电压放大倍数与其共模电压放大倍数之比。

13、共模输入电阻

每个输入端到地的共模动态电阻。

14、转换速率SR

SR表示运放对大信号阶跃输入有多快的反应能力,是在额定大信号输出电压时,运放输出的最大变化速率。

15、全功率带宽fpp

如是指在正弦输入且运放接成电压跟随器状态时,在额定输出电流及规定失真条件下的额定输出电压所对应的带宽。

知识点:放大倍数与增益的转换

定义增益时,电压(电流)增益和功率增益的计算公式是不同的,分别如下:

例如,电压或电流放大倍数为100倍,则增益为20lg[100]=40dB; 功率放大倍数为1000倍,则增益为10lg[l000]=30dB。

使用dB单位有以下几大好处:

(1) 数值变小,读写方便。

电子系统的总放大倍数常常是几千、几万甚至几十万倍,一台收音机从天线收到的信号到送入喇叭放音输出,一共要放大2万倍左右。用dB单位表示要先取对数,数值就小得多了。

(2) 运算方便。

放大器级联时,总的放大倍数是各级相乘,用dB单位时,总增益就是相加。若某功放前级是100倍(20Db),后级是20倍(13dB),那么总功率放大倍数是100x20=2000倍,总增益为20dB+13dB=33dB。

五、反相放大器:

由于运放涉及的理论知识是相当多的,我们不能在这里一一讲解,如果大家感兴趣可参考模拟电路等相关书籍,从本节开始我们讲解运放常用电路的设计方法,如果是一般的单片机外围电路设计的话,掌握以下几节运放基本电路知识就够用了。以下几节使用的原理图都是选取LM258双运放中的一路来讲解,其余运放引脚有可能不同,但用法相同。


单电源运放反相放大器电路如图9.2.1所示。











上面第一个式子中的负号是指相位取反,当输入信号是关于0电位对称的三角波或正弦波时,在运放加入双电源并且能够正常工作的前提下,负号方可起作用。图7.2.1中运放是以单电源形式连接的,其负电源输入端接地。从公式可以看出,当Uin为正值时,Uout为一负值,但是由于整个系统中并没有负电压,所以Uout也不可能输出负电压。但当Uin为负电压时,Uout可输出正常放大倍数后的正电压。


 R2为平衡电阻,用来减小输入偏置电流所带来的失调电压,通常取凡和凡并联后的值(输出失调电压=输入失调电压X闭环增益)。


运放输入端的失调电压有两个主要来源,输入偏置电流(Inputbiascurrent) 和输入失调电压(Inputoffsetvoltage)。对于一个给定的运放,输入失调电压就已经确定了,但是由输入失调电流所带来的失调电压与所采用的电路结构有关,为了在不使用调整电路的情况下减小偏置电流所带来的失调电压,应该使同、反相输入端对地的直流电阻相等,使偏置电流在输入电阻上的压降所带来的失调电压相互抵消。在低内阻信号源放大器中,运放的输入失调电压将成为失调电压误差的主要来源,而对于高内阻信号源放大器,运放的输入偏置电流在信号源内阻上的压降将成为误差的主要来源。





在高输入阻抗的情况下,失调电压可以采用凡的阻值来调整,利用输入偏置电流在其上的压降来对输入失调电压做出补偿,也就是用这个的压降来抵消输入失调电压。


在交流耦合的时候,失调电压显得并不是很重要,这时的主要问题是:失调电压减小了输出电压峰-峰值的线性动态范围。


双电源运放反相放大器电路如图9.2.2所示。

六、同相放大器:

 图9.3.1给出了一个高输入阻抗同相放大器电路,其闭环放大倍数为(R1+Rt)/R1。和反相放大器相比,其最大的不同点在于,其输出信号和输入信号是同相的,其输入阻抗也是相当高的,为运放差模输入阻抗与环路增益的乘积(环路增益=开环增益/闭环增益)。在直流耦合情况下,输入阻抗对于运放电路的影响比起输入电流,主要是由于其在信号源内阻上所带来的压降来说,是在次要地位的。本电路的应用注意事项除了这一点之外,均和反相放大器相同,即在输入端悬浮的状态下,本电路的输出可能饱和。这一点在要求运放输出电压范围能够达

七、电压跟随器:

电压跟随器又叫单位增益放大器、缓冲器、射随等。之所以叫电压跟随器,是因为这个电路的输出端电压与输入端电压始终是一样的,它在电路中起到缓冲、隔离、提高带载能力的作用,该电路在所有的放大器组态电路中具有最高的输入阻抗(其输入阻抗值为开环增益与差模输入阻抗之积和共模输入阻抗相并联)。运放有一个特点就是输入高阻抗,输出低阻抗,这就使得它在电路中可以起到阻抗匹配的作用,能够使后一级的放大电路更好的工作,也正因为这个原因使它对前后级电路起到“隔离”作用。


我们也可以有如下极端的考虑:当输入阻抗很高时,就相当于对前级电路开路;当输出阻抗很低时,就相当于给后级电路一个恒压源,即输出电压不受后级电路阻抗的影响。一个对前级电路相当于开路,输出电压又不受后级阻抗影响的电路也就具备了隔离作用,即使前、后级电路之间互不影响。

八、加法器:

求和电路是反相放大器的一种特殊形式,如图9.5.1所示,其输出电压为三个输入电压加权代数和取反(因为其为反相电路,其每路的增益为负值)。每路输入电压的增益等于其反馈电阻和输入电阻之比。其应用时的注意事项和反相放大电路相同,该电路的特点在于,各个输入之间互相不影响,求和或取平均的功能很容易实现。

九、差分放大器:

差分放大电路是求和电路的发展,它可以减小甚至去除两个输入信号中的共模成分,这种电路在运放电路中经常会用到,如差分对单端的转换、抑制共模信号等。





大家在分析该电路时也可参照反相放大器,它们之间有内在的联系。两个输入端的输入阻抗没有必要相等,反相放大部分的输入阻抗和反相放大器的计算方法相同,同相放大部分的输入阻抗为

,差分输入、单端输出的特殊情况下,两个输入的增益都是R2/R1。在应用中应该注意一点:两端的输入阻抗是不相等的,要注意输入偏置电流引起的误差。

十、微分器:

微分器电路如图9.7.1所示。











图9.7.1用于实现数学上的微分运算,这里给出的电路形式并不是实际的应用形式。由于其6dB/2倍频的交流增益特性,其对高频噪声相当敏感。反馈环路中,R1C1组成了一个等效的低通滤波器,由于其在反馈环中90°的相移,即使对单位增益采取了补偿措施,在这里也可能出现稳定性问题。


对微分器实际应用电路有以下关系式:











 图9.7.2是微分器的实际应用电路,它考虑了稳定性因素和噪声因素,增加了R1和C2。R2-C2在反馈环路上构成了一个6dB/2倍频的高频衰减网络,R1-C1在输入上构成了一个6dB/2倍频衰减网络,这样整个频率特性呈现为12dB/2倍频的高频衰减,抑制了由于高频信号输入运放所带来的噪声。R1C1,R2C2一同在反馈环路上构成了一个网络,如果将其频点设置在运放的单位增益带宽之内,其将提供90°前向相移,以补偿由R2-C1带来的90°相位滞后,提高环路的稳定性。

十一、积分器:

积分器用于实现数学上的积分运算。在本质上,积分器可以看成是一个呈6dB/2倍频频率特性的LPF,积分器必须加入初始化电路,以给电路创造积分的初始化条件。图9.8.1中S的目的就在于此,当S在1位置时,运放工作在单位增益(电压跟随器)状态,电容C1上的电荷被释放掉,使得积分初始值为0;当S在2位置时,运放工作在积分器状态,其输出是输入信号电压幅度对时间的积分与一个常数之积。在使用本电路时要注意两点:运放在单位增益状态下应能稳定;R1,R2的阻值必须相等,以减小输入偏置电压所带来的误差。