⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcf8591.c

📁 51实例大全
💻 C
字号:
/*-----------------------------------------------
  名称:IIC协议 PCF8591 AD/DA转换
  论坛:www.doflye.net
  编写:shifang
  修改:无
  内容:使用4路AD中的4路检测外部模拟量输入
------------------------------------------------*/  
#include <reg52.h>                
#include "i2c.h"
#include "delay.h"
#include "pcf8591.h"

#define AddWr 0x90   //写数据地址 
#define AddRd 0x91   //读数据地址

extern bit ack;


/*------------------------------------------------
                   AD处理函数
------------------------------------------------*/
unsigned char  ADCheck(void)
{
 unsigned char num=0,i;
 unsigned char Val=0;
 for(i=0;i<5;i++)
     WriteDAC(0);//写入固定值到DA输出,用于检测
 for(i=0;i<5;i++)//连续读5次,输入通道后多读几次,去最后一次值,以便读出稳定值
     num=ReadADC(0);
 if((num>100)&&(num<150)) // 2.5V
    Val++;

 for(i=0;i<5;i++)
   num=ReadADC(1);
if((num>100)&&(num<150)) // 2.5V
    Val++;  

 for(i=0;i<5;i++)
    num=ReadADC(2);
if((num>100)&&(num<150)) // 2.5V
    Val++;

 for(i=0;i<5;i++)
     num=ReadADC(3);
if((num>100)&&(num<150)) // 2.5V
    Val++;
return Val;
}
/*------------------------------------------------
             读AD转值程序
输入参数 Chl 表示需要转换的通道,范围从0-3
返回值范围0-255
------------------------------------------------*/
unsigned char ReadADC(unsigned char Chl)
 {
  unsigned char Val;
   Start_I2c();               //启动总线
   SendByte(AddWr);             //发送器件地址
     if(ack==0)return(0);
   SendByte(0x40|Chl);            //发送器件子地址
     if(ack==0)return(0);
   Start_I2c();
   SendByte(AddRd);
      if(ack==0)return(0);
   Val=RcvByte();
   NoAck_I2c();                 //发送非应位
   Stop_I2c();                  //结束总线
  return(Val);
 }
/*------------------------------------------------
               写入DA转换数值
输入参数:dat 表示需要转换的DA数值,范围是0-255
------------------------------------------------*/
bit WriteDAC(unsigned char dat)
{
   Start_I2c();               //启动总线
   SendByte(AddWr);             //发送器件地址
     if(ack==0)return(0);
   SendByte(0x40);            //发送器件子地址
     if(ack==0)return(0);
   SendByte(dat);             //发送数据
     if(ack==0)return(0);
   Stop_I2c();  
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -