我用的AD是PCF8591、单片机用的C52,电路图、源程序全是我自己原创。。。
-----------------------------------------------------------------------------------------------

电路图:
C语言程序:
#include "reg52.h"
#include "PCF8591.h"
main()
{ char x;
x=PCF8591_AD(channel); //channel默认为通道3
//电压值为:(x/256*参考电压)
}
包含的头文件:
PCF8591.h
i2c.h
--------------------------以下为PCF8591.h内容-----------------------------------------------------------
#include "i2c.h"
#ifndef _PCF8591_
#define _PCF8591_
#define PCF8591 0x90 //PCF8591 输入地址 (输出地址=输入地址+1)
char channel=3; //默认为通道3
#endif
#ifndef _iic_
#define _iic_
sbit scl=P1^5;
sbit sda=P3^6;
#endif
void PCF8591_DA(char x)
{iic_start();
iic_sendbyte(PCF8591); for(ack=1;ack;)ack=iic_recack();
iic_sendbyte(0x40); for(ack=1;ack;)ack=iic_recack(); //允许"模拟输出"
iic_sendbyte(x); for(ack=1;ack;)ack=iic_recack();
iic_stop();
}
char PCF8591_AD(char channel)
{char x;
iic_start(); //设置模拟输入通道
iic_sendbyte(PCF8591); for(ack=1;ack;)ack=iic_recack();
iic_sendbyte(0x40+channel); for(ack=1;ack;)ack=iic_recack();
iic_stop();
iic_start();
iic_sendbyte(PCF8591+1); for(ack=1;ack;)ack=iic_recack();
x=iic_recbyte(); iic_ack(0);
iic_stop();
return x;
}
------------------------以上为PCF8591.h内容-------------------------------------------------------------
------------------------以下为i2c.h内容---------------------------------------------------------------------
#include<reg52.h>
#include"intrins.h"
#ifndef _iic_
#define _iic_
sbit scl=P1^5;
sbit sda=P3^6;
bit ack;
#endif
void delay5us(void)
{ _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void iic_start(void)

{ delay5us();
sda=1;
delay5us();
scl=1;
delay5us();
sda=0;
delay5us();
scl=0;
}
void iic_stop(void)
{ delay5us();
sda=0;
delay5us();
scl=1;
delay5us();
sda=1;
delay5us();
}
void iic_sendbyte(unsigned char x)
{char i;
for(i=0;i<8;i++)
{ delay5us();
sda=x&0x80;
delay5us();
scl=1;
delay5us();
scl=0;
x=x<<1;
}
}
unsigned char iic_recbyte(void)
{unsigned i,x;
for(i=0;i<8;i++)
{x=x<<1;
delay5us();
sda=1;
delay5us();
scl=1;
delay5us();
x=x|sda;
scl=0;
}
return x;
}
void iic_ack(bit ack)
{if(ack)
sda=1;
else sda=0; //给出"0"响应表示收到,给出"1"响应表示没收到(不响应)
delay5us();
scl=1;
delay5us();
scl=0;
}
bit iic_recack(void)
{bit ack;
sda=1;
delay5us();
scl=1;
delay5us();
ack=sda; //收到"0"响应表示发送成功,收到"1"响应表示发送失败(从机未响应)
scl=0;

return ack;
}
------------------------以上为i2c.h内容---------------------------------------------------------------------
电眼与探针的区别 就好比人的视觉概念与触觉概念差不多 电眼是在看的光或者是紫外线的情况下动作 传给程控器信号 而探针则是火焰烧到上面与形成离子流 在一般油机上面都是用电眼 气机多用探针 油气两用机型也是用电眼 安徽国赛燃烧器设备销售有限公司


