PCF8591程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PCF8591程序
/**********************************
**头文件:PCF8591.h
**文件名: PCF8591.c
**创建人: 动车组
**日期: 2012-8-8
**功能描述:PCF8591_Write(uchar DAC_Date);DAC转换输出(8位的)
** PCF8591_Read(uchar a[4]);四个单端输入ADC数据(8位的)
**占用资源:IIC的两个IO口IIc_Scl、IIc_Sad
***********************************/
#include"PCF8591.h"
#include <intrins.h>
#define _NOP_() _nop_();_nop_();_nop_();_nop_();_nop_()/*短暂延时4.7us*/
/*停止I2C总线*/
void IIc_stop()
{
IIc_Sad = 0;
_NOP_();
IIc_Scl = 1;
_NOP_();
IIc_Sad = 1; //总线置于空闲状态
}
/*IIC初始化子程序*/
void IIc_init()
{
IIc_stop(); //结束之前IIC的操作
IIc_Scl = 1; //总线置于空闲状态
IIc_Sad = 1;
}
/* 启动I2C总线*/
void IIc_start()
{
IIc_Sad = 1;
IIc_Scl = 1;
_NOP_();
IIc_Sad = 0;
_NOP_();
IIc_Scl = 0;
}
/*IIC写一个字节返回应答信号返回1设备正常*/
bit IIc_write_byte(uchar date)
{
uchar i;
bit ack;
for(i=8;i>0;i--)
{
date <<= 1;
IIc_Scl = 0;
IIc_Sad = CY;
_NOP_();
IIc_Scl = 1;
_NOP_();
}
IIc_Scl = 0;
_NOP_();
IIc_Sad = 1;/*8位发送完后释放数据线,准备接收应答位*/
_NOP_();
IIc_Scl = 1;
if(IIc_Sad==0)//从机设备应答ack=1
ack = 1;
else
ack = 0;
IIc_Scl = 0;
_NOP_();
return(ack);
}
/*IIC读一个字节主机应答信号Master_ack为1是应答0时非应答*/ uchar IIc_read_byte(bit Master_ack)
{
uchar i,vaule;
IIc_Sad=1;
for(i = 8;i > 0;i--)
{
vaule <<= 1;
IIc_Scl = 1;
_NOP_();
if(IIc_Sad)
vaule++;
IIc_Scl = 0;
_NOP_();
}
IIc_Sad = !Master_ack;//主机应答信号
_NOP_();
IIc_Scl = 1;
_NOP_();
IIc_Scl = 0;
_NOP_();
return vaule;
}
/******************以下是PCF8591的应用函数*********************************************************/
/*PCF8591的控制字Con和DAC数据这个函数已经写好器件地址了
/*函数返回值1写入为正常*/
bit PCF8591_Write(uchar DAC_Date)
{
bit ack;
// EA=0;
IIc_init();
IIc_start();
ack=IIc_write_byte(Address_PCF8591);//写器件地址
if(ack==0) //写入失败从机设备没有相应
return(0);
ack=IIc_write_byte(Model_PCF8591);//写第二个字节控制字
if(ack==0) //写入失败从机设备没有相应
return(0);
ack=IIc_write_byte(DAC_Date);//写第三个字节DAC数据
if(ack==0) //写入失败从机设备没有相应
return(0);
IIc_stop();
/*后面是读一个字节数据用来开始ADC转换的*/
IIc_start();
ack=IIc_write_byte(Address_PCF8591+1);//写器件地址读数据
if(ack==0) //写入失败从机设备没有相应
return(0);
IIc_read_byte(0); //读一个数据开始ADC转换这个数据没用哦
IIc_stop();
return(1);
// EA=1;
}
/*从PCF8591中读出四个ADC通道的数据返回1从机设备正常*/
bit PCF8591_Read(uchar a[])
{
bit ack;
IIc_init();
IIc_start();
ack= IIc_write_byte(Address_PCF8591+1);
if(ack==0) //写入失败从机设备没有相应
return(0);
a[0] = IIc_read_byte(1);
a[1] = IIc_read_byte(1);
a[2] = IIc_read_byte(1);
a[3] = IIc_read_byte(0);
IIc_stop();
return (1);
}
/************************************/
/**********************************
**文件名: PCF8591.h
**创建人: 动车组
**日期: 2012-8-8
**功能描述:PCF8591_Write(uchar DAC_Date);DAC转换输出(8位的)
** PCF8591_Read(uchar a[4]);四个单端输入ADC数据(8位的)
**占用资源:IIC的两个IO口IIc_Scl、IIc_Sad
***********************************/
#ifndef __PCF8591_H__
#define __PCF8591_H__
#include <REG52.H>
#define uchar unsigned char
#define uint unsigned int
sbit IIc_Scl=P1^5; //IIC的时钟
sbit IIc_Sad=P3^6; //IIC的数据线
#define Address_PCF8591 0x90 //PCF8591的硬件地址
#define Model_PCF8591 0x44 //模式是四个ADC单端输入允许DAC输出允许自动增量
/*PCF8591的DAC数据;函数返回值1写入为正常*/
bit PCF8591_Write(uchar DAC_Date);
/*从PCF8591中读出四通道的数据返回1从机设备正常*/
bit PCF8591_Read(uchar a[4]);//a[]的长度必须大于等于4
#endif
/******************************/
#include <REG52.H>
#include"PCF8591.h"
#include"LCD1602.h"
void main()
{
uchar i;
uchar temp[4];
L1602_init();
PCF8591_Write(127);
PCF8591_Write(200);
while(1)
{
PCF8591_Write(i++);
if(1)
{
PCF8591_Read(temp);
L1602_Uint(1,2,temp[0]);
L1602_Uint(1,7,temp[1]);
L1602_Uint(2,1,temp[2]);
L1602_Uint(2,7,temp[3]);
}
else
L1602_Uint(2,2,1);
}
}。