|
=======================================================H文件===========================================================
#ifndef __8591_h
#define __8591_h
#include "delay.h"
sbit SDA=P1^2; //定义总线连接端口
sbit SCL=P1^1;
sbit WP=P1^0;
#define READ8591 0x01
#define WRITE8591 0x00
#define IIC_8591 0x90
/******* 控制字定义 *******/
/* 模拟信号输出开关 */
#define anlog_output_off 0 //禁止模拟输出
#define anlog_output_on 1 //允许模拟输出
/* 模拟输入模式设置 */
#define anlog_model_0 0x00 //四输入
#define anlog_model_1 0x01 //共差分输入
#define anlog_model_2 0x02 //双直通单差分输入
#define anlog_model_3 0x03 //双差分输入
/* 通道自动增量设置 */
#define auto_increment_off 0 //禁止通道自动增量
#define auto_increment_on 1 //禁止通道自动增量
/* 模拟转换通道设置 */
#define anlog_channel_0 0x00 //通道0
#define anlog_channel_1 0x01 //通道1
#define anlog_channel_2 0x02 //通道2
#define anlog_channel_3 0x03 //通道3
static unsigned char Control_Key;
/**函数声明**/
void start_8591(void);
void stop_8591(void);
void send_8591(unsigned char Data);
unsigned char receive_8591(void);
void write_8591(unsigned char slave_addr,unsigned char Control_Key,unsigned char Data);
unsigned char read_8591(unsigned char slave_addr,unsigned char rom_addr);
void ack_8591(void);
void no_ack_8591(void);
bit check_ack_8591(void);
void model_set(bit anlog_sw,unsigned char input_model,bit auto_increment,unsigned char AD_channel);
#endif
=======================================================C文件===========================================================
#include "8591.h"
/* -------------
功能:开始
备注:
内容:
--------------- */
void start_8591(void)
{
SDA=1;
_nop_ ();
SCL=1;
_nop_ ();
SDA=0;
_nop_ ();
SCL=0;
_nop_ ();
}
/* -------------
功能:结束
备注:结束后10ms无法写
内容:
--------------- */
void stop_8591()
{
SDA=0;
_nop_ ();
SCL=1;
_nop_ ();
SDA=1;
_nop_ ();
SCL=0;
}
/* -------------
功能:发送数据
备注:输入:Data 要发送的数据
内容:
--------------- */
void send_8591(unsigned char Data)
{
unsigned char temp;
unsigned char s;
temp=Data;
for(s=0;s<8;s++)
{
SCL=0;
_nop_ ();
if((temp&0x80)==0x80)
{
SDA=1;
}
else
{
SDA=0;
};
_nop_ ();
SCL=1;
temp<<=1;
_nop_ ();
};
SCL=0;
}
/* -------------
功能:接收数据
备注:返回值:接收到的数据
内容:
--------------- */
unsigned char receive_8591(void)
{
unsigned char Data=0;
unsigned char s=0;
SDA=1;
for(s=0;s<8;s++)
{
unsigned char d;
SCL=0;
_nop_ ();
SCL=1;
Data<<=1;
_nop_ ();
d=SDA;
Data|=d;
};
SCL=0;
return(Data);
}
/* -------------
功能:应答
备注:
内容:
--------------- */
void ack_8591(void)
{
SDA=0;
_nop_ ();
SCL=1;
_nop_ ();
SCL=0;
_nop_ ();
}
/* -------------
功能:无应答
备注:
内容:
--------------- */
void no_ack_8591(void)
{
SDA=1;
_nop_ ();
SCL=1;
_nop_ ();
SCL=0;
_nop_ ();
}
/* -------------
功能:查询应答
备注:返回值:应答信号error
内容:接收器每成功接收1bit数据都要把SDA拉低,以示接收成功
--------------- */
bit check_ack_8591(void)
{
bit error=0;
SCL=0;
SCL=1;
_nop_ ();
error=SDA;
return(error);
}
/* -------------
功能:写8591一字节数据
备注:返回值:无
输入值:slave_addr 器件地址
control 控制字
Data 要写入的数据
内容:写1byte数据到rom_addr地址
--------------- */
void write_8591(unsigned char slave_addr,unsigned char Control_Key,unsigned char DA_Data)
{
start_8591();
send_8591(IIC_8591|slave_addr|WRITE8591);
ack_8591();
send_8591(Control_Key);
ack_8591();
send_8591(DA_Data);
ack_8591();
stop_8591();
//delay_nms(10);
}
/* -------------
功能:读取8591
备注:返回值:读取的数据
输入值:slave_addr 器件地址
Control 控制字
内容:读取ADC
--------------- */
unsigned char read_8591(unsigned char slave_addr,unsigned char Control)
{
unsigned char Data=0;
start_8591();
send_8591(IIC_8591|WRITE8591|slave_addr);
ack_8591();
send_8591(Control);
ack_8591();
start_8591();
send_8591(IIC_8591|READ8591|slave_addr);
ack_8591();
Data=receive_8591();
SCL=0;
no_ack_8591();
stop_8591();
return(Data);
}
void model_set(bit anlog_sw,unsigned char input_model,bit auto_increment,unsigned char AD_channel)
{
Control_Key=0x00;
if(anlog_sw)
{
Control_Key|=0x40;
};
input_model=input_model<<4;
Control_Key|=input_model;
if(auto_increment)
{
Control_Key|=0x04;
};
Control_Key|=AD_channel;
}
=======================================================资 料===========================================================
程序ourdev_608891EOZM8B.rar(文件大小:37K) (原文件名:PCF8591.rar)
中文手册ourdev_608893O2JHTX.pdf(文件大小:283K) (原文件名:PCF8591中文数据手册.pdf)
![]()
测试。。输出显示4路AD的输入电压占Vref比例 AD位数:8位 (原文件名:4路AD 1路DA.jpg) |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|