PCF8591调试日志

了解一款芯片应该从它的datasheet开始,因为网上的中文资料也比较多,所以也就没有看原版的英文资料,虽然知道这不是个好习惯,但确实能省些时间(好吧,其实我真的只是懒而已)。

 
PCF8591是具有I2C总线借口的8位AD/DA转换芯片,内部为单一电源供电(25~6V),典型值为5V,CMOS工艺。PCF8591有4路AD输入,属逐次比较型,内含采样保持电路;1路8位DA输出,内含DAC数据寄存器。AD/DA转换的最大速率约为11KHz。
 
PCF8591内部可编程控制字有两个,一个是地址选择字,另一个为转换控制字。Philips规定AD器件高四位地址为1001,低三位地址为引脚地址A0,A1,A2,由硬件电路决定。因此,I2C系统中最多可以挂载8个有总线接口的AD器件。地址的最后一位为方向位R/W,MCU向AD器件进行读操作时为1,进行写操作时为0。总线操作时,由器件地址、引脚地址和方向位组成的从地址为主控制器发送的第一字节。
 
 
PCF8591的转换控制字存放在控制寄存器中,用于实现期间的各种功能。总线操作时为主控制器发送的第二字节。

以下为具体代码及注释:

#include
 
#define uchar unsigned char
#define uint unsigned int
#define PCF8591 0x90
 
sbit SCL=P2^0;
sbit SDA=P2^1;
sbit dula=P3^6;
 
uchar code table1[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar code table2[10]={0xc0,0xcf,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
 
void delay();
void delay_ms(uchar x);
void init_i2c();
void start_i2c();
void stop_i2c();
void response_i2c();
void write_byte(uchar dat);
void write_add(uchar address,uchar dat);
uchar read_byte();
uchar read_add(uchar control);
void display(uchar n);
 
void main()
{
uchar num;
init_i2c();
while(1)
{
num=read_add(0x41);
display(num);
}
}
 
void delay()
{;;}
 
void delay_ms(uchar x)
{
uchar i,j;
for(i=x;i>0;i--)
for(j=125;j>0;j--);
}
 
void init_i2c()
{
SCL=1;
delay();
SDA=1;
delay();
}
 
void start_i2c()
{
SDA=1;
delay();
SCL=1;
delay();
SDA=0;
delay();
}
 
void stop_i2c()
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
}
 
void response_i2c()
{
uchar i;
SCL=1;
delay();
while((SDA==1)&&(i<255))
i++;
SCL=0;
delay();
}
 
void write_byte(uchar dat)
{
uchar temp,i;
temp=dat;
for(i=0;i<8;i++)
{
temp<<=1;
SCL=0;
delay();
SDA=CY;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1;
delay();
}
 
void write_add(uchar address,uchar dat)
{
start_i2c();
write_byte(PCF8591);
response_i2c();
write_byte(address);
response_i2c();
write_byte(dat);
response_i2c();
stop_i2c();
}
 
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;
}
 
uchar read_add(uchar control)
{
uchar dat;
start_i2c();
write_byte(PCF8591);
response_i2c();
write_byte(control);
response_i2c();
start_i2c();
write_byte(PCF8591+1);
response_i2c();
dat=read_byte();
stop_i2c();
return dat;
}
 
 
void display(uchar n)
{
uchar bai,shi,ge;
bai=n/100;
shi=(n/10);
ge=n;
dula=0;
P2=table1[7];
dula=1;
dula=0;
P0=table2[bai];
dula=1;
dula=0;
delay_ms(5);
 
dula=0;
P2=table1[6];
dula=1;
dula=0;
P0=table2[shi];
dula=1;
dula=0;
delay_ms(5);
 
dula=0;
P2=table1[5];
dula=1;
dula=0;
P0=table2[ge];
dula=1;
dula=0;
delay_ms(5);
}
 
通过PCF8591的调试,不光掌握了一种AD/DA芯片,更是学习了I2C这种用途极广的通讯方式,活到老学到老。
永不止步步 发表于11-26 09:43 浏览65247次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:305067个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号