鲁东大学毕业设计
A0~A3:地址选择端。
VDD、VSS:电源端。(一般2.5~6V) SDA、SCL:I2C总线的数据、时钟线。 OSC:外部时钟输入端,内部时钟输出端。
EXT:内部、外部时钟选择线。(使用 内部时钟时EXT接地)
AGND:模拟信号地输入端。 AOUT:D/A 转换信号输出端。 VREF:基准电源端。
3.3.2 器件地址[6]
PCF9591芯片采用典型的I2C总线接口器件寻址方法,即总线地址由器件地址、引脚地址和方向位组成。飞利蒲公司规定其芯片地址为1001。可选引脚地址为A2、A1、A0,系统中最多可接8个芯片。总线操作时,主控器发送的第一字节由器件地址、引脚地址和方向位组成。控制字节存放在控制寄存器中,用于实现器件的各种功能,如模拟信号由哪几个通道输入等。总线操作时为主控器发送的第二字节。其格式如下所示:
MSB LSB 0 X X X 0 X X X D7 D6 D5 D4 D3 D2 D1 D0
其中:D1、D0 两位是A/D通道编号:00通道0,01通道1,10通道2,11通道3
D2 自动增益选择(有效位为1)
D5、D4 模拟量输入选择:00为四路单数入、01为三路差分输入、10为单端与差分配合输入、11为两差分输入
D6 模拟输出允许有效(A/D转换时,模拟输出允许为0)
在进行数据操作时,首先是主控器发出起始信号,然后发出读寻址字节,被控器做出应答后,主控器从被控器读出第一个数据字节,主控器发出应答,主控器从被控器读出第二个数据字节,主控器发出应答,一直到主控器从被控器中读出第n个数据字节,主控器发出非应答信号,最后主控器发出停止信号。
3.3.3 D/A转换与A/D转换[7]
D/A转换数据操作格式如下:
S SLAW A CONBYT A Data1 A Data2 A … Data n A P Data1-data n 为待转换的二进制数,S为启动,SLAW为主机发送的PCF8591地址选择字,CONBYT是主机发送的转换控制字,P为停止信号;图中黑底为主机发送,白底PCF8591产生,D/A转换时D6位为1。逻辑操作时序图如下:
9
鲁东大学毕业设计
图14 PCF8591D/A转换时序图
图15 D/A转换数据特征
PCF8591的A/D转换为逐次比较型,周期中借用DAC及高增益比较强。A/D转换中,一旦采样周期触发,所选通道的采样数据便保存在保持电路中,并转换为八位二进制。控制字中自动增量选择位为1,一次转换后自动选择下一通道。上电复位后读出的第一个字节为80H。其数据操作格式如下:
S SLAW A Data0 A Data1 A Data2 A … Data n A P Data 0-data n 为A/D转换结果,分别和前一个数据读期间所采样的模拟电压对应。上电复位后控制字为00H,A/D转换时须进行控制字的写操作。逻辑操作时序图如下:
-
图16 PCF8591 A/D转换时序图
10
鲁东大学毕业设计
图17 单端输入的A/D转换数据特征
4 I2C总线通信系统仿真
仿真调试基本步骤[9]:
(1) 打开keil 软件,新建keil项目,选择51单片机作CPU,新建C语言或汇编
文件,导入SOURCE GROUP 1中,在Option for target 对话框中选择Output选项卡中Creat hex file选项和DBUG选项中的Use:Proteus vsm simulator选项。 (2) 在Proteus IsIs中,选择51单片机左键单击,打开Edit Component对话框,
设置晶体振荡频率12Mhz,在Proteus IsIs菜单栏中选File—Save design选项,保存设置。在Proteus IsIs菜单栏中打开Debug下拉菜单,选Use Remote Debug Monitor选项,和Keil联合调试。 (3) 在Keil菜单栏选择Debug—start/stop Debug session选项,进入调试环境,
调出IsIs界面,观察信号变化。
4.1 I2C总线扩展E2PROM与I/O口
如图18所示总线接有两个单片机,分别控制E2PROM与I/O口芯片,实现各自的功能。I2C总线外接两片储存芯片24C02,由单片机1控制,写地址分别为0xa0,0xa2,读地址分别为0xa1,0xa3。向第一片24C02中00地址写入0x55(85),01地址写入0xAA(170)。用一个开关选择其中一个地址的数据给数码管显示。显示子程序如下: void display(int k) {
P2=0x01; P0=tab[k/1000]; delay();
11
鲁东大学毕业设计
P2=0x02;
P0=tab[k00/100]; delay(); P2=0x04;
P0=tab[k0/10]; delay(); P2=0x08; P0=tab[k]; delay(); }
另外接一个PCF8574I/O扩展芯片,由单片机2控制,它将四个开关的状态信息传递给四个LED显示。当其中某个开关状态变化,对应LED状态改变。基于I2C总线和I/O扩展芯片PCF8574,可实现两根线控制八个LED。其实现程序见附录。
图18 I2C总线扩展E2PROM与I/O口
12
鲁东大学毕业设计
4.2 I2C总线接PCF8591
PCF8591的D/A、A/D转换基于Proteus和Keil软件仿真电路图如下图[8]:
图19 PCF8591的D/A、A/D转换Proteus电路图
单片机与PCF8591芯片进行串行通信,将通道0输入的模拟信号转换为数字信号,处理后用数码管显示,采用定时器中断的方式来处理显示程序,当模拟信号变化时,数码管显示数据跟随变化。定时器1,方式1(16位),其定时中断程序如下: void Timer1_isr(void) interrupt 3 using 1//定时器1执行数码管动态扫描 {
static unsigned int count,j; TH1=0xff; TL1=0x00; j++; if(j==30) {j=0;ADFlag=1;
} //定时置位AD采样标志位
//重新赋值
13