谁知道pcf8591是怎么采集的,程序怎么写啊

作者&投稿:鄢凯 (若有异议请与网页底部的电邮联系)
~ PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I2C总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。
PCF8591的功能包括多路模拟输入、内置跟踪保持、8-bit模数转换和8-bit数模转换。PCF8591的最大转化速率由I2C总线的最大速率决定。
我不知道你所说的采集是指数据接收还是指ad或是da数据采集。我给你三个例程da、ad和数据接收。
下面是一个DA转换的例子:
02.//程序功能:通过DA转换把输出电压逐渐增大,使加在上面的发光二级管慢慢变亮
03.// 到最亮后再变暗,如此循环
04.
05.#include <reg51.h>
06.
07.#define uchar unsigned char
08.#define uint unsigned int
09.#define PCF8591 0x90 //PCF8591 地址
10.
11.
12.sbit SCL=P2^1; //串行时钟输入端
13.sbit SDA=P2^0; //串行数据输入端
14.
15.void delay() //延时4-5个微秒
16.{;;}
17.
18.void delay_1ms(uint z)
19.{
20. uint x,y;
21. for(x=z;x>0;x--)
22. for(y=110;y>0;y--)
23. ;
24.}
25.
26.void start()//开始信号
27.{
28. SDA=1;
29. delay();
30. SCL=1;
31. delay();
32. SDA=0;
33. delay();
34.}
35.
36.void stop() //停止信号
37.{
38. SDA=0;
39. delay();
40. SCL=1;
41. delay();
42. SDA=1;
43. delay();
44.}
45.
46.
47.void respons()//应答 相当于一个智能的延时函数
48.{
49. uchar i;
50. SCL=1;
51. delay();
52. while((SDA==1)&&(i<250))
53. i++;
54. SCL=0;
55. delay();
56.}
57.
58.void init() //初始化
59.{
60. SDA=1;
61. delay();
62. SCL=1;
63. delay();
64.}
65.
66.void write_byte(uchar date) //写一字节数据
67.{
68. uchar i,temp;
69. temp=date;
70. for(i=0;i<8;i++)
71. {
72. temp=temp<<1; //左移一位 移出的一位在CY中
73. SCL=0; //只有在scl=0时sda能变化值
74. delay();
75. SDA=CY;
76. delay();
77. SCL=1;
78. delay();
79. }
80. SCL=0;
81. delay();
82. SDA=1;
83. delay();
84.}
85.
86.
87.
88.void write_add(uchar control,uchar date)
89.{
90. start();
91. write_byte(PCF8591); //10010000 前四位固定 接下来三位全部被接地了 所以都是0 最后一位是写 所以为低电平
92. respons();
93. write_byte(control);
94. respons();
95. write_byte(date);
96. respons();
97. stop();
98.
99.}
100.
101.
102.
103.
104.void main()
105.{
106.
107. uchar a;
108. init();
109. while(1)
110. {
111. write_add(0x40,a);
112. delay_1ms(5);
113. a++;
114. if(a>250)
115. a=0;
116. }
117.}
下面是一个ad的例子:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define PCF8591 0x90 //PCF8591 地址

bit write=0; //写24c02的标志
sbit SCL=P2^1; //串行时钟输入端
sbit SDA=P2^0; //串行数据输入端
sbit LS138A=P2^2;//138译码器的3位 控制数码管的
sbit LS138B=P2^3;
sbit LS138C=P2^4;

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数显管字模

void delay() //延时4-5个微秒
{;;}

void delay_1ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--)
;
}

void start()//开始信号
{
SDA=1;
delay();
SCL=1;
delay();
SDA=0;
delay();
}

void stop() //停止信号
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
}

void respons()//应答 相当于一个智能的延时函数
{
uchar i;
SCL=1;
delay();
while((SDA==1)&&(i<250))
i++;
SCL=0;
delay();
}

void init() //初始化
{
SDA=1;
delay();
SCL=1;
delay();
}

uchar read_byte()
{
uchar i,k;
SCL=0;
delay();
SDA=1;
delay();
for(i=0;i<8;i++)
{
SCL=1;
delay();
k=(k<<1)|SDA;//先左移一位,再在最低位接受当前位
SCL=0;
delay();
}
return k;

}

void write_byte(uchar date) //写一字节数据
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1; //左移一位 移出的一位在CY中
SCL=0; //只有在scl=0时sda能变化值
delay();
SDA=CY;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1;
delay();
}

void write_add(uchar control,uchar date)
{
start();
write_byte(PCF8591); //10010000 前四位固定 接下来三位全部被接地了 所以都是0 最后一位是写 所以为低电平
respons();
write_byte(control);
respons();
write_byte(date);
respons();
stop();

}

uchar read_add(uchar control)
{
uchar date;
start();
write_byte(PCF8591);
respons();
write_byte(control);
respons();
start();
write_byte(PCF8591+1); //把最后一位变成1,读
respons();
date=read_byte();
stop();
return date;

}

void display(uchar ge,uchar shi,uchar bai)
{
P0=0xff;
LS138A=1; //第一位
LS138B=1;
LS138C=1;
P0=table[ge];
delay_1ms(5);
P0=0xff;
LS138A=0; //第二位
LS138B=1;
LS138C=1;
P0=table[shi];
delay_1ms(5);
P0=0xff;
LS138A=1; //第三位
LS138B=0;
LS138C=1;
P0=table[bai];
delay_1ms(5);

}

void main()
{
uchar num,ge,shi,bai;
init();
while(1)
{

display(ge,shi,bai);
num=read_add(0x40);
ge=num;
num/=10;
shi=num;
num/=10;
bai=num;
}
}
至于接收数据很简单:
写数据只需要按照时序图

1.先将SCL置0(只有它为0的时候SDA才允许变化)

2.改变SDA是数值(就是你当前要穿的一位是0还是1)

3.把SCL置1(此时芯片就会读取总线上的数据)


为什么用pcf8591不用ADC0808
性能好。PCF8591是一个单片集成、单独供电、低功耗、性能好,8-bitCMOS数据获取器件。其比ADC0808性能好,所以用它,ADC0808是含4位A\/D的转换器而PCF8591最高用到8位A\/D。

普中科技STC单片机开发板中PCF8591怎么选择利用光敏电阻和热敏电阻进行...
4个输入,可以通过软件配置寄存器来选择输入端。先熟悉芯片资料,再根据原理图就弄明白了。

PCF8591 AD程序问题
pcf8591 是个IIC 的 DA AD转换器 IIC 你应该了解吧 必须有地址~ 上面的 90 和91 就是读写的地址了~

在51单片机上,pcf8951和xpt2046有什么区别?
你这里应该写错了,应该是PCF8591而不是PCF8951,PCF8591和XPT2046都是AD转换芯片,都是4个通道,PCF8591是IIC通讯接口,XPT2046是SPI通讯接口,XPT2046是专为触摸屏控制设计而成的AD转换电路,SPI接口,读写还是很方便的,代码量要少一些。PCF8591是IIC接口,按照IIC通讯协议来编程,读写相对复杂一些。从...

pcf8591采样(51)
先确定是数据采集的问题还是显示的问题, 把每次Pc8591_Read的结果都存到数组里面. 看看采样值是否正确或者都跟显示的值一样. 如果一样说明显示本身没有问题.根据你的描述Pc8591_Read不放定时器正常, 不放定时器的时候是多长时间运行一次? 定时器的定时时间是多长? 有没有可能定时器的时间对Pc8591_...

dht11可以加pcf8591
不可以。DHT11是网易公司推出的一款有已校准数字信号输出的温湿度传感器。PCF8591是普芯电子推出的一个单片集成、单独供电、低功耗、8-bitCMOS数据获取器件。因为不是一个公司制造的是无法进行装配的。

请教一个PCF8591转换的问题
A0 A1 A2是用来设定器件的“从地址”用的。也可以接1(+5V),这样,该器件就有8种地址可供你选用。

单片机问题PCF8591这种转换器怎么用?编程时0x90 0x91 0x40这些地址都怎...
PCF8591是4路AD和1路DA的转换器,通过I2C总线与单片机通信交换信息,要从I2C总线读取1个字节的数据,必须发送1个字节的器件地址和1个字节的控制字,之后才能接收数据,上面的时序图就是这个意思,如果你的单片机有I2C硬件接口,程序会简单的多,如果没有那就要用软件模拟,程序相对复杂。I2C总线不是几句...

pcf8591第一个字节包含前一次读周期的转换结果什么意思
如果要不断地测量的话, num=read (0x40); 这一句要下移到 while(1)循环里面。 你现在这样,上电读取一次AD的值,以后只是不断显示原来的值,再也不会读新的AD值。

请教proteus中光敏电阻LDR和PCF8591怎么连接?
51基本型单片机因其内部不含A\/D转换器和I²C接口,PCF8591只能通过模拟I²C方式与51单片机连接,具体连接和相关例程可以上网搜寻模拟I²C相关资料,LDR则可与PCF8591的模拟量输入口连接。

莲湖区17351727013: 谁知道pcf8591是怎么采集的,程序怎么写啊 -
延骂唯妙: PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件.PCF8591具有4个模拟输入、1个模拟输出和1个串行I2C总线接口.PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591...

莲湖区17351727013: PCF8591是如何从外面采集数据的(通过I^2C总线),它显示或存为模拟量还是数字量 -
延骂唯妙: 1.先将SCL置0(只有它为0的时候SDA才允许变化)2.改变SDA是数值(就是你当前要穿的一位是0还是1)3.把SCL置1(此时芯片就会读取总线上的数据) 可以做到模拟量和数字量同步显示.PCF8591是一个单片集成、单独供电、低功耗、...

莲湖区17351727013: pcf8591 ad采样不能连续取值,单独对某一个通道连续取几次,就第一次的值是正确的,其他的都乱七八糟的!对整体四个通道,连续取几次没问题! -
延骂唯妙:[答案] pcf8591每次是先发送上次采集的数据时采集这次数据!

莲湖区17351727013: Proteus仿真(AT89C51)中用PCF8591采集光敏电阻的光照强度,电路图应该怎么画 -
延骂唯妙: 把光敏电阻一端接在任意一个A/D端口(AIN0~AIN3),另一端接在Vcc上,再在该端口接一只下接电阻到地即可.

莲湖区17351727013: pcf8591,电压如何检测 -
延骂唯妙: 低压的用万用表打到直流或者交流档位,选择合适的范围并联进行检测,不能带电换挡,直流的要注意正负极性!

莲湖区17351727013: 具体讲解"PCF8591内置跟踪保持电路",能理解为自带采样保持电路,在数据采集是不是就不需要采样保持芯片了?
延骂唯妙: 你理解是正确的.不需要外接采样保持器了.

莲湖区17351727013: 是这样的,现在做单片机的无线语音传输,要用一片单片机控制NRF24L01和PCF8591数模转换模块, -
延骂唯妙: NRF24L01是SPI接口,PCF8591是I2C接口.最好选择这两种硬件接口都有的单片机来配套,这样程序做起来会比较轻松一些.单片机同时控制两个芯片是不可能也不必要的,正常的顺序,是先通过RF24L01读取语音数据,再通过PCF8591转换成语音信号.如果不是很熟悉RF24L01的秉性的,估计要驾驭它可能还要费一番周折.

莲湖区17351727013: 单片机多路数据采集如何选通,是选择多通道的模拟开关还是多路复用器? -
延骂唯妙: 单片机多路数据采集一般选择多通道的AD转换器,比如PCF8591有4个通道,ADC0809有8个通道.

莲湖区17351727013: 单片机 PCF8591的AD/DA程序问题 -
延骂唯妙: 程序语法没有问题,如果出现逆所说的现象你可以用万用表测试下CH0,CH1是不是短路连接,那样的话调节通道1的也就是调节通道0的,单片机会优先执行通道0的.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网