<meta name="keywords" content="必胜时时彩开户,keywords" /> PCF8591调试日志 联系我们

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这类用处极广的通讯要领,活到老学到老。