基于PCF8591的AD—DA的程序设计。本设计是通过PCF8591芯片选择通道1将滑动变阻器的电压记过A/D转换,有单片机读回,并在数码管显示,比且有这个数据再经过D/A转换成模拟电压驱动发光二极管。发光二极管的亮度与数码管显示的电压值相对。
1. PCF8591芯片
PCF8591是单片、单电源低功耗8位CMOS数据采集器件,具有4个模拟输入、一个输出和一个串行I2C总线接口。3个地址引脚A0、A1和A2用于编程硬件地址,允许将最多8个器件连接至I2C总线而不需要额外硬件。器件地址、控制和数据通道通过两线双向I2C总线传输。
器件功能包括多路复用模拟量输入、片上跟踪和保持功能、8位模数转换和8位数模转换。最大转换速率取决于I2C总线的最高速率。
我实现的AD转换是使用通道0将滑动变阻器两端的电压 AIN0~AIN3:模拟信号输入端。
A0~A2:引脚地址端。
VDD、VSS:电源端。(2.5~6V) SDA、SCL:I2C 总线的数据线、时钟线。 OSC:外部时钟输入端,内部时钟输出端。
EXT:内部、外部时钟选择线,使用内部时钟时 EXT 接地。 AGND:地。
AOUT:D/A 转换输出端。 VREF:基准电源端。
地址:I2C总线系统中的每一片PCF8591通过发送有效地址到该器件来激活。该地址包括固定部分和可编程部分。可编程部分必须根据地址引脚A0、A1和A2来设置。在I2C总线协议中地址必须是起始条件后作为第一个字节发送。地址字节的最后一位是用于设置以后数据传输方向的读/写位。(见下图)
控制字:发送到PCF8591的第二个字节将被存储在控制寄存器,用于控制器件功能。控制寄存器的高板字节用于允许模拟输出,和将模拟输入编程为单端过查分输入。低半字节选择一个有高板字节定义的模拟输入通道。如果自动增量标志置1,每次A/D转换后通道号将自动增加。
如果自动增量模式是使用内部振荡器的应用中所需要的,那么控制字中模拟输出允许标志应置1。这要求内部振荡器持续运行,因此要防止振荡器启动延时的转换错误结果。模拟输出标志可以在其他时候复位以减少静态功耗。
D/A转换:发送给PCF8591的第三个字节被存储到DAC数据寄存器,并使用片上D/A转换器转换成对应的模拟电压。这个D/A转换器由连接至外部参考电压的具有256个接头的电阻分压电路和选择开关组成。模拟输出电压由自动清零单位增益放大器缓冲。这个缓冲放大器可通过设置控制寄存器的模拟输出允许标志来开户或关闭。在激活状态,输出电压保持到新的数据字节被发送。
A/D转换:A/D转换器采用逐次逼近转换技术。在A/D转换周期将来临时片上D/A抓换器和高增益比较器。一个A/D转换周期总是开始于发送一个有效读模式地址给PCF8591之后。A/D转换周期在应答时钟脉冲的后沿被触发,并在传输前一次转换结果时执行。一旦一个转换周期被触发,所选通道的输入电压采样将保存到芯片被转换为对应的8为二进制码。
2. 74HC573芯片
74HC573为八位制3态非反转透明锁存器,具有高性能硅门CMOS器件。管脚图如下: 1脚三态允许控制端低电平有效 D0~D7为数据输入端
/Q0~/Q7为数据输出端
3. 74LS138芯片
74LS138为3线—8线译码器,引脚图如下:
工作原理:①当一个选通端(E1)为高电平,另两个选通端((/E2))和/(E3))为低电平时,可将地址端(A0、A1、A2)的在Y0至Y7对应的输出端以低电平译出。:A2A1A0=110时,则Y6输出端输出低。
②利用 E1、E2和E3可级联扩展成 24 线;若外接一个还可级联扩展成 32 线。 ③若将选通端中的一个作为数据输入端时,74LS138还可作。 ④可用在8086的电路中,。 引脚功能:
A~C:地址输入端 STA(G1):选通端
/STB(/G2A)、/STC(/G2B):选通端(低电平有效) /Y0~/Y7:输出端(低电平有效) VCC:电源正 GND:地
4. 电路图 5. 源程序代码
#include #define uchar unsigned char #define uint unsigned int #define PCF8591 0x90 //PCF8591 地址 bit write=0; //写24c02的标志 sbit SCL=P1^5; //串行时钟输入端 sbit SDA=P3^6; //串行数据输入端 sbit LS138A=P2^0;//138译码器的3位 控制数码管的 sbit LS138B=P2^1; sbit LS138C=P2^2; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数显管字模 void delay() //延时4-5个微秒 {;;} void delay_1ms(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--) ; } void start()//开始信号 { SDA=1; delay(); SCL=1; delay(); SDA=0; delay(); } void stop() //停止信号 { SDA=0; delay(); SCL=1; delay(); SDA=1; delay(); } void respons()//应答 相当于一个智能的延时函数 { uchar i; SCL=1; delay(); while((SDA==1)&&(i<250)) i++; SCL=0; delay(); } void init() //初始化 { SDA=1; delay(); SCL=1; delay(); } uchar read_byte() { uchar i,k; SCL=0; delay(); SDA=1; delay(); for(i=0;i<8;i++) { SCL=1; delay(); k=(k<<1)|SDA;//先左移一位,再在最低位接受当前位 SCL=0; delay(); } return k; } void write_byte(uchar date) //写一字节数据 { uchar i,temp; temp=date; for(i=0;i<8;i++) { temp=temp<<1; //左移一位 移出的一位在CY中 SCL=0; //只有在scl=0时sda能变化值 delay(); SDA=CY; delay(); SCL=1; delay(); } SCL=0; delay(); SDA=1; delay(); } void write_add(uchar control,uchar date) { start(); write_byte(PCF8591); //10010000 前四位固定 接下来三位全部被接地了 所以都是0 最后一位是写 所以为低电平 respons(); write_byte(control); respons(); write_byte(date); respons(); stop(); } uchar read_add(uchar control) { uchar date; start(); write_byte(PCF8591); respons(); write_byte(control); respons(); start(); write_byte(PCF8591+1); //把最后一位变成1,读 respons(); date=read_byte(); stop(); return date; } uchar DAC(uchar light) { start(); write_byte(PCF8591); respons(); write_byte(0x40); //写入控制位,使能DAC输出 respons(); write_byte(light); respons(); stop(); return(1); } void display(uchar ge,uchar shi,uchar bai) { P0=0xff; LS138A=1; //第一位 LS138B=1; LS138C=1; P0=table[ge]; delay_1ms(5); P0=0xff; LS138A=0; //第二位 LS138B=1; LS138C=1; P0=table[shi]; delay_1ms(5); P0=0xff; LS138A=1; //第三位 LS138B=0; LS138C=1; P0=table[bai]+0x80; delay_1ms(5); } void main() { uchar num,ge,shi,bai; uint a; init(); while(1) { display(ge,shi,bai); num=read_add(0x40); a=(num*98+num*5/10)/51; bai=a/100; shi=a%100/10; ge=a%10; DAC(num); } } 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- xiaozhentang.com 版权所有 湘ICP备2023022495号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务