unsigned char Read_PCF8591_ADC(unsigned char ain) { unsigned char tmp; IIC_Start(); IIC_SendByte(0x90); //PCF8591的写设备地址 IIC_WaitAck(); if(ain == 1) { IIC_SendByte(0x01); //通道1,光敏电阻电压 } else if(ain == 3) { IIC_SendByte(0x03); //通道3,可调电阻电压 } IIC_WaitAck(); IIC_Stop(); DisplaySMG_ADC(); //等待电压转换完成 IIC_Start(); IIC_SendByte(0x91); //PCF8591的读设备地址 IIC_WaitAck(); tmp = IIC_RecByte(); //读出AD采样数据 IIC_SendAck(1); //产生非应答信号 IIC_Stop(); return tmp; }
时间: 2023-05-28 19:07:16 浏览: 74
该函数用于读取PCF8591芯片的ADC转换结果。参数ain表示要读取的通道号,1为通道1,3为通道3。函数通过I2C总线与PCF8591进行通信,先向其写入要读取的通道号,然后等待ADC转换完成,最后读取ADC采样数据并返回。其中DisplaySMG_ADC()函数用于等待ADC转换完成并将结果显示到数码管上,该函数未给出代码。
相关问题
解释这段代码void PCF8591_Init() { IIC_Start(); IIC_SendByte(0x90); IIC_WaitAck(); IIC_SendByte(0x01); IIC_WaitAck(); IIC_Stop(); } unsigned char PCF8951_Read() { unsigned char temp; IIC_Start(); IIC_SendByte(0x91); IIC_WaitAck(); temp=IIC_RecByte(); IIC_SendAck(1); IIC_Stop(); return temp; }
这段代码包含了两个函数,一个是 `PCF8591_Init()`,另一个是 `PCF8951_Read()`。这两个函数作用于 PCF8591 芯片,该芯片是一种集成了 ADC 和 DAC 功能的芯片,可以将模拟信号转换为数字信号并且反之。
函数 `PCF8591_Init()` 的作用是初始化 PCF8591 芯片,具体来说,其实现了以下步骤:
1. 发送起始信号;
2. 发送器件地址 0x90(7 位地址 + 写入位);
3. 等待应答信号;
4. 发送控制字节 0x01,该字节设置了 PCF8591 的工作模式和输入通道;
5. 等待应答信号;
6. 发送停止信号。
函数 `PCF8951_Read()` 的作用是从 PCF8591 芯片中读取数据,具体来说,其实现了以下步骤:
1. 发送起始信号;
2. 发送器件地址 0x91(7 位地址 + 读取位);
3. 等待应答信号;
4. 读取一个字节数据;
5. 发送一个应答信号;
6. 发送停止信号;
7. 返回读取到的数据。
这里需要注意的是,该函数只读取了一个字节的数据,如果需要读取多个字节的数据,需要在调用该函数的地方进行循环。
unsigned char extern_data[20]; 初始化
要初始化一个名为`extern_data`的`unsigned char`类型的全局数组,您可以使用以下语法:
```c
unsigned char extern_data[20] = {0};
```
上述代码将创建一个长度为20的数组,并将所有元素初始化为0。您可以根据需要修改初始化的值。
请注意,此初始化语法仅适用于全局变量或静态变量。如果`extern_data`是在某个函数内部定义的局部变量,您无法在定义时进行初始化。在这种情况下,您可以在函数内部使用循环或`memset`函数来手动初始化数组的每个元素。例如:
```c
void someFunction() {
unsigned char extern_data[20];
memset(extern_data, 0, sizeof(extern_data));
// 其他代码...
}
```
希望这可以帮助到您。如果您有其他问题,请随时提问。