九层妖塔 起于垒土
【蓝桥杯】—{模块}—{PCF8591_8位A/D and D/A转换器Part_2}
- 一、原理图
- 二、Notes
- 三、IIC总线启动和停止条件
- 1、时序图
- 2、Template:
- 3、Notes:
- 四、IIC发送与等待应答
- 1、Template:
- 2、Notes:
- 五、通过I2C总线发送和接收数据
- 1、Template:
- 六、通过IIC总线读取PCF8591_ADC结果
- 1、Template:
- 七、PCF8591—DAC输出
- 1、Template:
一、原理图
二、Notes
● IIC 即Inter-Integrated Circuit(集成电路总线),一种简单、双向、二进制、同步串行总线。
●IIC是一种多向控制总线,即多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。这种方式简化了信号传输总线接口。
●PCF9591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。
●PCF具有4个模拟输入、1个模拟输出和1个串行I2C总线接口。
三、IIC总线启动和停止条件
1、时序图
2、Template:
//-------------------------------IIC总线启动条件--------------------------//
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
Delay6us();
SDA = 0;
Delay6us();
SCL = 0;
}
//-------------------------------IIC总线停止条件--------------------------//
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
Delay6us();
SDA = 1;
Delay6us();
}
3、Notes:
●仅将官方驱动中的延时改为Delay6us()
。
四、IIC发送与等待应答
1、Template:
//-------------------------------IIC发送应答----------------------------//
void IIC_SendAck(bit ackbit)
{
SCL = 0; //在SCL为0时改变SDA
SDA = ackbit; // 0:应答,1:非应答
Delay6us();
SCL = 1;
Delay6us();
SCL = 0;
SDA = 1;
Delay6us();
}
//-----------------------------IIC等待应答-----------------------------//
bit IIC_WaitAck(void)
{
bit ackbit;
SCL = 1;
Delay6us();
ackbit = SDA;
SCL = 0;
Delay6us();
return ackbit;
}
2、Notes:
●应答过程:
①发送器将总线置为高电平
②来自主机的SCL也产生与应答有关的额外时钟脉冲。
③应答的设备必须在应答时钟脉冲期间拉低SDA线,以使SDA线在应答时钟脉冲的高电平期间稳定为低电平。
④将SDA线置为空闲状态-高电平。
五、通过I2C总线发送和接收数据
1、Template:
//-------------------------通过I2C总线发送数据------------------------//
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++)
{
SCL = 0; //在SCL为0时改变SDA
Delay6us();
if(byt & 0x80) SDA = 1;
else SDA = 0;
Delay6us();
SCL = 1;
byt <<= 1;
Delay6us();
}
SCL = 0;
}
//-----------------------从I2C总线上接收数据-----------------------------//
unsigned char IIC_RecByte(void)
{
unsigned char i, da;
for(i=0; i<8; i++)
{
SCL = 1; //高电平时进行数据读取
Delay6us();
da <<= 1;
if(SDA) da |= 1;
SCL = 0;
Delay6us();
}
return da;
}
六、通过IIC总线读取PCF8591_ADC结果
1、Template:
//--------------------------通过IIC总线读取PCF8591_ADC结果----------------//
uchar IIC_PCF8591_ADC(void)
{
uchar temp;
IIC_Start();
IIC_SendByte(0x90); //地址字节 1001 0000 向PCF8591写数据
IIC_WaitAck(); //等待应答
IIC_SendByte(0x43); //控制字节 0100 0011 模拟输出使能—四路单端输入-通道3
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0x91); //地址字节 1001 0001 向PCF8591写数据
IIC_WaitAck(); //等待应答
temp = IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return temp;
}
七、PCF8591—DAC输出
1、Template:
//--------------------------------PCF8591——DAC输出----------------//
void IIC_PCF8591_DAC(uchar dat)
{
IIC_Start();
IIC_SendByte(0x90); //地址字节 1001 0000 向PCF8591写数据
IIC_WaitAck(); //等待应答
IIC_SendByte(0x43); //控制字节 0100 0011 模拟输出使能—四路单端输入-通道3
IIC_WaitAck();
IIC_SendByte(dat); //dat-输出数模转换数据
IIC_WaitAck();
IIC_Stop();
}