用勇气来改变可以改变的事情,用胸怀来接受不可改变的事情,用智慧来分辨两者的不同
-------李开复
写到AD/DA转换的时候,突然想到了李开复老师这句语录,曾经确实也陪伴着自己走过了苦涩的时光!要么去改变自己,要么去随波逐流,然后淹没在丛流中!
相信有很多人都是从郭天祥的《51单片机C语言教程》和视频入门单片机的,我也一样!同时,还有很多人在看着郭天祥的书入门的路上!记得自己当初大一看到他书的第五章AD/DA转换的时候,就放弃过学习单片机一段时间,为什么?因为书中讲了许多有关模电啊,数电以及转换原理等的东西,才大一完完全全看不懂呀!后来才发现,入门单片机根本不需要去懂这些,会用AD/DA转换芯片,学了数电模电后,慢慢也就了解了!可谓被书坑了啊!当然,直到今日我依然很敬佩和感谢郭天祥的啊!
-----------------------------------------------------------------------------------------------------------
本小节目录:
11.1,简介PCF8591 引脚结构
11.2,PCF8591芯片的地址字节和控制字节
11.3,PCF8591的A/D及D/A转换模式协议及C语言程序
11.4,PCF8591与单片机的原理图
11.1)简述PCF8591
许多单片机开发实验板都使用了PCF8591芯片,讲解AD/DA,其芯片能在IIC总线协议下,仅用时钟线SCL和数据线SDA就可以实现与单片机通信,同时具有程序较简单、可维护性好、易实现系统扩展、可靠性高等优点。
图 1 PCF8591引脚图
1,8位A/D及D/A转换器。有4路A/D转换输入,1路D/A模拟输出。既可以作A/D转换也可以作D/A转换。可见性价比还是蛮高的呀!
2,电源电压典型值为5V,AIN0~AIN3:模拟信号输入端,A0~A3:引脚地址端。
VDD、VSS:电源端。(2.5~6V)
3,SDA、SCL:IIC总线的数据线、时钟线。
4,OSC:外部时钟输入端,内部时钟输出端,(一般悬空)
5,EXT:内部、外部时钟选择线,使用内部时钟时EXT接地。
6,AGND:模拟信号地;AOUT:D/A转换输出端;VREF:基准电源端。
11.2)PCF8591芯片的地址字节和控制字节
1)地址字节
图 2 地址字节(截图于数据手册)
Fixed part:固定部分 programmable part:可编程部分
由图2可知,1,其高4位固定为1001,为芯片地址,不可以改变
2,A2,A1,A0引脚接高,低电平可得到三位编码,与1001形成7位编码,即为该器件地址码,
3,R/W(—)为读写标志位,1为读,0为写
解释:使用各种单片机开发板学习时,需特别注意:看原理图中A2,A1,A0到底是分别接高,还是低电平了!才能在写程序时,发送地址;例如金沙江,锐志的实验板A2,A1,A0就全接了低电平,则写和读地址分别为:0x90,和0x91;而麦光的实验板A2,A1接了低电平,A0接了高电平则写和读地址分别为:0x92,0x93。
2)控制字节
图 3 控制字节(由于图长,只截部分图,具体请下载数据手册)
1,为模拟输出允许标志(设置为1时激活)
2,为模拟输入控制位(完整数据手册还有01,10,11),00为四路单端输入;01为三路查分输入; 10为单端与差分混合输入;11为两路差分输入
3,模拟输入通道选择端: 00:通道0;
01:通道1;
10:通道2;
11:通道3;
11.3)PCF8591的A/D及D/A转换模式协议及C语言程序
图4 A/D转换,读模式协议
/* *************************************************************************************
函数名称:ReadADC()
函数功能:读取AD转换程序
入口参数:Channel 表示需要转换的通道,范围从0-3
出口参数:Val ,返回值范围0-255
特别提醒:发送器件地址完后必须由主机发送非应答信号,否则读操作将失败!
****************************************************************************************/
uchar8 ReadADC(uchar8 Channel)
{
uchar8 Val;
IIC_Start(); //发起始信号,启动总线
IIC_WriteByte(AddWr); //发送器件地址
IIC_NoAck(); //主机发送非应答信号
IIC_WriteByte(0x40|Channel); //发送器件子地址
IIC_Rd_Ack(); //从机应答
IIC_Start();
IIC_WriteByte(AddRd);
IIC_NoAck(); //主机发送非应答信号
Val= IIC_ReadByte();
Delayms(5);
IIC_NoAck(); //主机发送非应答信号
IIC_Stop(); //发终止信号,结束总线
return(Val);
}
图5 D/A转换,写模式协议
/* **************************************************************************************
函数名称:WriteDAC()
函数功能:写入DA转换程序
入口参数:dat,表示需要转换的DA数值,范围是0-255
出口参数:NO
特别提醒:
******************************************************************************************/
bit WriteDAC(uchar8 dat)
{
IIC_Start(); //启动总线
IIC_WriteByte(AddWr); //发送器件地址
IIC_Rd_Ack(); //从机发送应答信号
IIC_WriteByte(0x40); //发送器件子地址
IIC_Rd_Ack(); //从机发送应答信号
IIC_WriteByte(dat); //发送数据
IIC_Rd_Ack(); //从机发送应答信号
IIC_Stop(); //发终止信号,结束总线
return 0;
}
11.4)PCF8591与单片机的原理图
图6 麦光电子PCF8591与单片机连接图
1,A0接高电平,A1,A2接低电平
2,Aout端连接了一个LED和一个1K电阻,用于DA转换实验
3,将AGND和EXT接地,OSC悬空。
4,SCL和SDA分别连接单片机P3.6,P3.7
5,AIN0连接了一个可调变位器,用于AD转换实验
完整程序和PCF8591数据手册,如有需要者请在下面下载!如有不对,请批评并指出!本人将不胜感激!
于2014年04月07日 夜
shihlin_812989226 2014-4-15 16:08
谢谢分享!