历史上的今天
今天是:2025年07月17日(星期四)
2020年07月17日 | 【蓝桥杯单片机组】PCF8591 关于蓝桥杯坑爹I2C的吐槽
2020-07-17 来源:eefocus
根据datasheet的时序:

编程步骤:初始化AD,给AD传送采样通道与输入方式(写过程,上图)
(1)打开总线
(2)发送ADDRESS(BIT0 = 0)
(3)等待PCF应答
(4)发送控制位(控制参考下图)
(5)等待PCF应答
(6)结束总线
附:控制位

地址位:

综上所述:初始化PCF8591时的代码如下:
void PCF8591_init() //wirte:fig.16 in datasheet
{
EA = 0;
IIC_Start();
IIC_SendByte(0x90); //Address byte:fixed part + programmable part + R/W
while(!IIC_WaitAck());
// IIC_WaitAck();
IIC_SendByte(0x03); //Control byte CH3
while(!IIC_WaitAck());
// IIC_WaitAck();
IIC_Stop();
EA = 1;
somedelay(10);
}
----------------------------------------------------------------------------------------------------------------------------
编程步骤:(读数部分:根据下图,是一个读数据过程)

(1)开始总线
(2)发送地址位(BIT0 = 1)
(3)等待PCF的应答
(4)读数据
(5)向PCF回应“1”表示收到
(6)结束总线
综上所述:以下为读数代码
unsigned char PCF8591_adc() //read:fig.17 in datasheet
{
unsigned char vo;
EA = 0;
IIC_Start();
IIC_SendByte(0x91); //Address byte:fixed part + programmable part + R/W
while(!IIC_WaitAck());
// IIC_WaitAck();
vo = IIC_RecByte(); //read data
IIC_Ack(1); //ack
IIC_Stop();
EA = 1;
somedelay(10);
return vo;
}
注意在读写过程中关闭EA,防止时序被打乱,
附:主程序:
#include #include "init.h" #include "iic.h" #include "display.h" void Delay500ms(); //@11.0592MHz void sendchar(unsigned char dat); sfr AUXR = 0x8E; //IAP15F2K61S2单片机特殊功能寄存器 unsigned char vol = 0; unsigned char ms500flag = 0; void main() { cls_buzz(); Timer0Init(); PCF8591_init(); UartInit(); while(1) { display1(vol); if(ms500flag == 1) { ms500flag = 0; vol = PCF8591_adc(); // sendchar(vol); } } } void T0_isr() interrupt 1 { static int i = 0; TL0 = 0x00; //设置定时初值 TH0 = 0xB8; //设置定时初值 i++; if(i >= 25) //0.5S { ms500flag = 1; i = 0; } } --------------------------------------------------------------------------分割线---------------------------------------------------------------------------- 2017-2-27 程序还是有点问题,感觉在软件延时上,因为使用的IAP15的运行速度为1T,所以需要修改iic.h中对somenop的定义: #define somenop {_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();} //4 对,就他妈这么多个nop,但是还他妈有错,读数一直显示正常,知道将电位器调节到65以下的时候,就开始乱跳,原因还没找到,估计还是延时时间的问题。 2017-3-2 好了,修改好了,群里也有人碰到了同样的问题 解决方法:将读数据后的应答改成 IIC_Ack(0); 另外,数了一下亲测可用的NOP,33个nop,记住!!!!!!
史海拾趣
|
CVC-OMS:OMS处理过程是一个实时的处理过程,它采用语音抽取技术来选择并获取感兴趣的语音信息,从而减小了背景噪音的干扰。在捕获有小的失真的语音信息的时候,容易产生在统计上相对比较稳定的非白噪声(Colored Noise),OMS对这类信号尤其有用,对 ...… 查看全部问答> |
|
国家公务员考试11月29日开考,共有104万人争1.5万职位,又创历史新高,成为名副其实的国家第一考。 金融危机以来,有关“国进民退”的问题引起了企业、舆论和市场的关注与担忧。但与此同时,还有一种“国进民退”少受到人们的重视,这就是就业中的 ...… 查看全部问答> |
|
TAPI下使用linedrop无法挂断来电?函数返回正确~100分,等待高手~~~ 用TAPI来做一个modem来电显示的程序,现在碰到了一个问题,使用linedrop无法挂断来电,但是可以挂断自己播出的电话。 LONG CTapiLine::HangupCall( void ) { LONG retcode = 0; ...… 查看全部问答> |
|
最近需要使用摄像头去视频,并通过硬编码器编码显示在本地并同时上传服务器,开到这款开发板有MFC硬解码支持,但是需自己添加相关的组建,根据三星提供的手册重新制作了NK.BIN,但是编译的时候出错,不知道哪位大侠有这方面的经验,看看以下问题怎 ...… 查看全部问答> |
|
介绍 了一种用 于电子鼻研究 的 F e 0 系列气敏传感器阵列动态测试 .控制和识别系统 ;该系统 能够 同时采集 6路 0 ~2 . 5 V的模拟电压信号,测量系统温度、硬件对传感器进行温度补偿,同时具有液晶显示和语音功能;加 ...… 查看全部问答> |
|
我做过一个数据采集与传输的方案,要求能完成16路AD信号的采样,并通过SPI传递给主芯片(LM3S系列) 具体要求是:完成每路AD信号采样200点,采样精度不低于10位,采样及数据传输耗时不超过25ms 当时的对比方案有两个 方案一:2片AD78H90 ...… 查看全部问答> |




