I2C总线工作的原理和PCF8591手册,编程实现:将PCF8591的AIN0引脚输入的0~5V模拟电压(由电位器产生)进行A/D转换,并将转换结果输出到P0口(P0口接8个LED),要求P0口的8个灯能实时反映出输入的模拟电压。
时间: 2023-07-16 15:13:51 浏览: 56
I2C总线是一种串行通信协议,它由两条线组成:SDA(数据线)和SCL(时钟线),可以实现多个设备之间的通信。在I2C总线上,每个设备都有一个唯一的地址,用于识别和通信。
PCF8591是一款具有4个模拟输入通道和1个模拟输出通道的8位模数转换器。通过I2C总线与微控制器连接,可以实现模拟信号的采集和输出。
对于本题,我们需要将PCF8591的AIN0引脚输入的0~5V模拟电压进行A/D转换,并将转换结果输出到P0口(P0口接8个LED),以实时反映出输入的模拟电压。具体实现步骤如下:
1.初始化I2C总线,设置PCF8591的地址和模式(单端输入模式)。
2.循环读取AIN0引脚的模拟电压值,并将其转换成数字量。
3.将数字量输出到P0口(通过8个LED进行实时反映)。
4.延时一段时间后,再次读取AIN0引脚的模拟电压值,重复2~4步骤。
以下是C语言的编程实现代码示例:
```c
#include <reg52.h>
#include <intrins.h>
#define PCF8591_ADDR 0x90 //PCF8591的地址
#define LED_PORT P0 //LED接口
unsigned char adc_value; //模拟量转换后的数字量
//延时函数,约为1ms
void Delay1ms() {
unsigned char i, j;
for (i = 0; i < 10; i++)
for (j = 0; j < 124; j++);
}
//向PCF8591写入数据
void Write_PCF8591(unsigned char dat) {
I2C_START(); //起始信号
I2C_SEND(PCF8591_ADDR); //发送设备地址+写信号
I2C_WAIT(); //等待应答
I2C_SEND(0x40); //发送控制字节,选择AIN0通道,单端输入模式
I2C_WAIT(); //等待应答
I2C_SEND(dat); //发送数据
I2C_WAIT(); //等待应答
I2C_STOP(); //停止信号
}
//从PCF8591读取数据
unsigned char Read_PCF8591() {
unsigned char dat;
I2C_START(); //起始信号
I2C_SEND(PCF8591_ADDR); //发送设备地址+写信号
I2C_WAIT(); //等待应答
I2C_SEND(0x40); //发送控制字节,选择AIN0通道,单端输入模式
I2C_WAIT(); //等待应答
I2C_START(); //起始信号
I2C_SEND(PCF8591_ADDR | 0x01); //发送设备地址+读信号
I2C_WAIT(); //等待应答
dat = I2C_READ(); //读取数据
I2C_ACK(); //发送应答信号
I2C_STOP(); //停止信号
return dat;
}
//主函数
void main() {
while (1) {
adc_value = Read_PCF8591(); //读取AIN0引脚的模拟电压值
Write_PCF8591(adc_value); //输出到P0口
LED_PORT = adc_value; //通过8个LED进行实时反映
Delay1ms(); //延时一段时间
}
}
```
需要注意的是,以上代码中的I2C_START()、I2C_SEND()、I2C_WAIT()、I2C_READ()、I2C_ACK()、I2C_STOP()等函数需要根据具体的I2C总线驱动程序进行实现。同时,PCF8591的模拟输入电压范围为0~5V,需要注意输入电压不要超过这个范围。