一、PCF8591介绍
- 模拟-数字转换器(ADC):PCF8591包括一个4通道、8位分辨率的模拟-数字转换器。这意味着它可以将4个独立的模拟输入信号转换为8位的数字输出信号。
- 数字-模拟转换器(DAC):PCF8591还包含一个8位的数字-模拟转换器。这意味着它可以将一个8位的数字输入信号转换为一个模拟输出信号。
- I2C接口:PCF8591通过使用I2C接口(Inter-Integrated Circuit interface),一种字节级的双向串行协议,可以连续不断的与微控制器进行交流,无需任何中间数据传输设备。
二、根据手册写代码
2.1 IIC设备地址
可以发现开发板上A2、A1、A0都接地了,也就是设备地址为 1001000R/W
2.2 实现DA功能
void PCF8591_DA(u8 output){
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x40); // 发送让PCF8591实现DA功能指令
IIC_WaitAck();
IIC_SendByte(output); // 发送要产生多大的电压0~0V,255~5V
IIC_WaitAck();
IIC_Stop();
}
2.3 实现AD功能
u8 PCF8591_AD(){
u8 AD;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x03);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0x91); //器件地址
IIC_WaitAck();
AD=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
AD=Median_Avereage(AD);
return AD;
}
三、示例代码
#include <stc15f2k60s2.h>
#include <iic.h>
unsigned char code dat[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99,
0x92, 0x82, 0xf8, 0x80, 0x90,
0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};
void Delay(unsigned int t)
{
while(t--);
}
void selectHC573(unsigned char num)
{
switch(num)
{
case 4:
P2=(P2 & 0x1f) | 0x80;
break;
case 5:
P2=(P2 & 0x1f) | 0xa0;
break;
case 6:
P2=(P2 & 0x1f) | 0xc0;
break;
case 7:
P2=(P2 & 0x1f) | 0xe0;
break;
case 0:
P2=(P2 & 0x1f) | 0x00;
break;
}
}
void system_Init()
{
selectHC573(5);
P0=0x00;
selectHC573(0);
}
void display_SMG_Bit(unsigned char dat, unsigned pos)
{
/*消影法2*/
P0=0xff;
selectHC573(7);
selectHC573(0);
P0=0x01<<(pos-1);
selectHC573(6);
selectHC573(0);
P0=dat;
selectHC573(7);
selectHC573(0);
}
void display_D_SMG(int dat1)
{
display_SMG_Bit(dat[2],1);
Delay(300);
display_SMG_Bit(dat[0],2);
Delay(300);
display_SMG_Bit(dat[2],3);
Delay(300);
display_SMG_Bit(dat[3],4);
Delay(300);
display_SMG_Bit(dat[16],5);
Delay(300);
display_SMG_Bit(dat[dat1 / 100],6);
Delay(300);
display_SMG_Bit(dat[((dat1 / 10) % 10)],7);
Delay(300);
display_SMG_Bit(dat[dat1 % 10],8);
Delay(300);
}
void PCF8591_WRITE(unsigned char date)
{
IIC_Start();
IIC_SendByte(0x90); //器件地址
IIC_WaitAck();
IIC_SendByte(0x40); //控制字节
IIC_WaitAck();
IIC_SendByte(date); //D\A的D
IIC_WaitAck();
IIC_Stop();
}
unsigned char PCF8591_READ(unsigned char read_addr)
{
unsigned char dat;
IIC_Start();
IIC_SendByte(0x90); //器件地址
IIC_WaitAck();
IIC_SendByte(read_addr); //控制字节
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0x91); //器件地址
IIC_WaitAck();
dat=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return dat;
}
void main()
{
unsigned char dat,i;
system_Init();
PCF8591_WRITE(0xf0);
dat=PCF8591_READ(0x00);
while(1)
{
i++;
PCF8591_WRITE(0x00);
if(i==200){
dat=PCF8591_READ(0x01);
// 0x01是光敏电阻,0X03是电位器
i=0;
}
display_D_SMG(dat);
}
}