锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

基于IIC总线的AD转换模块PCF8591

时间:2024-05-02 09:07:09


/*本程序使用普中调试*/

#include
#include
#define uint unsigned int
#define uchar unsigned char

#define addw 0x90
#define addr 0x91

sbit scl=P2^0;
sbit sda=P2^1;

sbit rs=P2^6;
sbit rw=P2^5;
sbit en=P2^7;

uchar Ch0value,Ch1value;

void delayms(int i)
{int x,y;
for (x=i;x>0;x--)
for(y=110;y>0;y--);
}

void usdelay()
{
_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();
}


void start()//开始信号
{//时钟线在高电平时,数据线由高变低即为开始信号由高变低即为开始信号
sda=1;
usdelay();
scl=1;
usdelay();
sda=0;//数据线由高变低即为开始信号
usdelay();
scl=0;
}

void stop()//结束信号
{//时钟线在高电平时,数据线由低变高即为结束信号
sda=0;
usdelay();
scl=1;
usdelay();
sda=1;
usdelay();
sda=0;//这句可有可无
scl=0;//这句可有可无
}

void ack()//应答信号
{uchar i;
scl=1;
usdelay();
while((sda==1)&&(i<200))i++;
scl=0;
usdelay();
}

void Noack() //不应答
{
sda=1;//时钟线高电平时,数据线高,即为不应答
usdelay();
scl=1;
usdelay();
scl=0;
usdelay();
}


void send_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
scl=0;
usdelay();
sda=(bit)(dat&0x80); //数据传送是由高到低
//(bit)为强制转换命令,把数据变为非0即1的一位数据库
usdelay();
scl=1;
usdelay();
dat<<=1;
}
scl=0;
usdelay();
sda=1;//释放总线
usdelay();
}

uchar read_byte()
{

uchar i,k;
scl=0;
usdelay();
sda=1; //释放总线
usdelay();
for(i=0;i<8;i++)
{
scl=1;
usdelay();
k=(k<<1)|sda;//判断8次,移位7次
scl=0;
usdelay();
}
return k;
}

uchar read_adc(uchar channel)
{
uchar temp;
start();
send_byte(addw);
ack();
send_byte(0x40|channel);
ack();
start();
send_byte(addr);
ack();
temp=read_byte();
Noack();
stop();
return temp;

}

void init()
{
scl=1;
sda=1;
}

/*********1602程序********************/

void write_com(uchar com)
{
rs=0;
rw=0;
en=0;
P0=com;
delayms(2);
en=1;
delayms(2);
en=0;
}


void write_dat(uchar dat)
{
rs=1;
rw=0;
en=0;
P0=dat;
delayms(2);
en=1;
delayms(2);
en=0;
}

void zfc(uchar *p)
{
while(*p!=0)
write_dat(*p++);
}

void init_1602()
{
write_com(0x38);
delayms(2);
write_com(0x0c);
delayms(2);
write_com(0x06);
delayms(2);
write_com(0x01);
write_com(0x80);
zfc("Channel 0 :");
write_com(0x80+0x40);
zfc("Channel 1 :");
}

void display()
{
uchar a0,a1,a2,b0,b1,b2;
a0=Ch0value*196/10000;
a1=Ch0value*196%10000/1000;
a2=Ch0value*196%1000/100;

b0=Ch1value*196/10000;
b1=Ch1value*196%10000/1000;
b2=Ch1value*196%1000/100;
write_com(0x80+11);
write_dat(0x30+a0);
write_dat('.');
write_dat(0x30+a1);
write_dat(0x30+a2);
write_dat('V');

write_com(0x80+0x40+11);
write_dat(0x30+b0);
write_dat('.');
write_dat(0x30+b1);
write_dat(0x30+b2);
write_dat('V');

}
void main()
{
init_1602();
init();
while(1)
{
Ch0value=read_adc(0);
delayms(50);
Ch1value=read_adc(1);
delayms(50);
display();
}
}


-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章