实验平台:普中A2开发板,STC89C51RC芯片,11.0592M晶振。

文章目录

  • 前言
  • 一、模块图
  • 二、代码
    • 1.main.c
    • 2.PCF8591.c
    • 3.PCF8591.h
  • 总结
  • //******************************************************************//
  • 承接stm32单片机、STC系列单片机设计、嵌入式问题咨询
  • 联系QQ:2424644692
  • //******************************************************************//

前言


本文就介绍PCF8591模块的使用。

PCF8591使用IIC通信协议,模块上自带“可调电阻输入、光敏电阻输入、热敏电阻输入”。


一、模块图

引脚说明

  • INPUT0:与可调电阻相连
  • INPUT1:与光敏电阻相连
  • INPUT3:与热敏电阻相连
  • AIN0:芯片的模拟量输入口0,地址0x40
  • AIN1:芯片的模拟量输入口1,地址0x41
  • AIN2:芯片的模拟量输入口2,地址0x42
  • AIN3:芯片的模拟量输入口3,地址0x43

使用模块上模拟量作为输入

  • 当选择用数码管显示可调电阻的模拟电压值时,需要用跳线帽将AIN0与INPUT0短接;

使用外部模拟量作为输入

  • 若4个通道都使用外部模拟量输入,则将4个外部模拟量接在AIN0—AIN3上即可。

二、代码

1.main.c

代码如下:

/**************************************************************************************
实验平台:普中A2开发板(STC89C51RC芯片)PCF8591模块
试验现象:数码管显示采集到的模拟量(范围0-255)
***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器
#include <SelfDef.h>
#include <PCF8591.h>
#include <LedDisplay.h>/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   u8 dat=0;u8 disp[8];while(1){ //0x40、0x41、0x42、0x43,分别为四个模拟量通道地址dat=ReadPCF8591(0x43);datapros(disp,dat);DigDisplay(disp);}
}

2.PCF8591.c

代码如下:

/***************************************************************************************/
/**此部分为I2C总线的驱动程序*********************************/
/**适用平台:普中A2开发板,STC89CXX芯片,晶振11.0592M*********/
/**模块使用说明:INPUT0、INPUT1、INPUT2分别为可调电阻、光敏、热敏电阻AIN0、AIN1、AIN2、AIN3分别为地址0x40-0x43的地址输入当使用可调电阻作为模拟量输入时,需将AIN0与INPUT0用跳线帽短接即可*/#include <PCF8591.h>bit ack;             /*应答标志位*/
u8 disp[8];/*******************************************************************************
* 函数名         : Delay6us()
* 函数功能         : 软件延时
*******************************************************************************/
void Delay6us()       //@11.0592MHz
{_nop_();
}/*******************************************************************************
* 函数名         : Start_I2c()
* 函数功能         : 启动I2C总线,即发送I2C起始条件.
* 备注           : 起始之后SDA和SCL都为0
*******************************************************************************/
void Start_I2c()
{SDA=1;         /*发送起始条件的数据信号*/    Delay6us();SCL=1;Delay6us();      /*起始条件建立时间大于4.7us,延时*/SDA=0;         /*发送起始信号*/Delay6us();SCL=0;                /*钳住SCL总线,准备发送或接收数据 */Delay6us();
}/*******************************************************************************
* 函数名         : Stop_I2c()
* 函数功能         : 结束总线函数
*******************************************************************************/
void Stop_I2c()
{SDA=0;        /*发送结束条件的数据信号*/Delay6us();SCL=1;       /*结束条件建立时间>4μs*/Delay6us();SDA=1;       /*发送I2C总线结束信号*/Delay6us();  /*保持时间>4.7μs*/
}/*******************************************************************************
* 函数名         : SendByte(u8 c)
* 函数功能         : 字节数据发送函数
* 输入           : 要发送的字节chr
* 注意           :将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作(不应答或非应答都使ack=0,发送数据正常,ack=1)注意此函数对延时精度要求较高,多检查此处
*******************************************************************************/
void SendByte(u8 chr)
{u8 i;for(i=0;i<8;i++)        /*要传送的数据长度为8位*/{if((chr<<i)&0x80)SDA=1;                      /*判断发送位*/elseSDA=0;                Delay6us();SCL=1;              /*置时钟线为高,通知被控器开始接收数据位*/Delay6us();               /*保证时钟高电平周期大于4μs*/         SCL=0; }Delay6us();SDA=1;                /*8位发送完后释放数据线,准备接收应答位*/Delay6us();   SCL=1;Delay6us();if(SDA==1)ack=0;     elseack=1;                 /*判断是否接收到应答信号,1表示收到应答*/SCL=0;Delay6us();
}/*******************************************************************************
* 函数名         : RcvByte()
* 函数功能         : 字节数据接收函数
*******************************************************************************/
u8 RcvByte()
{u8 retc;u8 i;retc=0; SDA=1;                    /*置数据线为输入方式*/for(i=0;i<8;i++){          SCL=0;                  /*置时钟线为低,准备接收数据位*/Delay6us();                 /*时钟低电平周期大于4.7μs*/SCL=1;                  /*置时钟线为高使数据线上数据有效*/Delay6us();retc=retc<<1;if(SDA==1)retc=retc+1;          /*读数据位,接收的数据位放入retc中 */Delay6us();   }SCL=0;    Delay6us();  return retc;
}/********************************************************************
*函数名        : void Ack_I2c(bit a);
*函数功能      : 应答子函数,主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
********************************************************************/
void Ack_I2c(bit a)
{if(a==0)SDA=0;                       /*在此发出应答或非应答信号 */elseSDA=1;Delay6us();      SCL=1;Delay6us();                /*时钟低电平周期大于4μs*/  SCL=0;                     /*清时钟线,钳住I2C总线以便继续接收*/Delay6us();
}/*******************************************************************************
* 函数名         : ISendByte(u8 sla,u8 c)
* 函数功能         : ADC发送字节[命令]数据函数
*******************************************************************************/
bit ISendByte(u8 sla,u8 c)
{Start_I2c();              //启动总线SendByte(sla);            //发送器件地址if(ack==0)return 0;SendByte(c);              //发送数据if(ack==0)return 0;Stop_I2c();               //结束总线return 1;
}/*******************************************************************************
* 函数名         : IRcvByte(u8 sla)
* 函数功能         : ADC读字节数据函数
*******************************************************************************/
u8 IRcvByte(u8 sla)
{  u8 c;Start_I2c();          //启动总线SendByte(sla+1);      //发送器件地址if(ack==0)return 0;c=RcvByte();          //读取数据0Ack_I2c(1);           //发送非就答位Stop_I2c();           //结束总线return c;
}
/*******************************************************************************
* 函数名         : ReadPCF8591(u8 address)
* 函数功能         : 读取PCF8591数据 ,address为要读取的地址
* 注意           :0x40、0x41、0x42、0x43分别为可调电阻、光敏电阻、热敏电阻、悬空
*******************************************************************************/
u8 ReadPCF8591(u8 address)
{ISendByte(PCF8591,address);return IRcvByte(PCF8591);
}/***********************************驱动程序结束****************************************/

3.PCF8591.h

代码如下:

#ifndef __PCF8591_H_
#define __PCF8591_H_#include <reg52.h>
#include <SelfDef.h>
#include <intrins.h>#define  PCF8591 0x90    //PCF8591 地址sbit SCL=P2^0;           //I2C  时钟
sbit SDA=P2^1;           //I2C  数据 void Start_I2c();
void Stop_I2c();
void Ack_I2c(bit a);
void SendByte(u8 c);
bit ISendByte(u8 sla,u8 c);
u8 RcvByte();
u8 IRcvByte(u8 sla);
u8 ReadPCF8591(u8 address);#endif

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:

//******************************************************************//

承接stm32单片机、STC系列单片机设计、嵌入式问题咨询

联系QQ:2424644692

//******************************************************************//

【芯片使用】PCF8591相关推荐

  1. PCF8591 +MQ3 +LCD1602+89C51RC(酒精传感器)

    PCF8591 环境: 软件: uVision proteus 芯片 80c51 PCF8591.LCD1602 仿真图 相关函数编写电平时 代码 1602 头文件 #include<reg51 ...

  2. 【蓝桥杯】PCF8591 A/D D/A转换应用

    学习内容: 掌握ADC(光敏电阻.滑动变阻器). 会DAC输出电压值. PCF8591 A/D以及24C02存储芯片,底层驱动都是采取IIC协议 点击转送到小蜜蜂老师IIC基础理论讲解 IIC总线只有 ...

  3. 基于51单片机的智能大棚浇花系统设计 花盆浇水灌溉补光散热方案原理图程序

    硬件电路的设计 (附文件) 3.1系统的功能分析及体系结构设计 3.1.1系统功能分析 本设计由STC89C52单片机电路+LCD1602液晶显示电路+光照检测电路+土壤湿度传感器电路+A/D采样PC ...

  4. meiyouyingjian------cnclsnvcnsdnvk

    毕业论文诚信声明 本人郑重声明: 所呈交的毕业论文< >是本人在指导老师的指导下,独立研究.写作的成果.论文中所引用是他人的无论以何种方式发布的文字.研究成果,均在论文中以明确方式标明. ...

  5. 基于51单片机的智能煤气天然气CO检测阈值报警器排气风扇方案原理图设计

    硬件电路的设计 系统的功能分析及体系结构设计 3.1.1系统功能分析 本设计由STC89C52单片机+煤气/co传感器模块电路+3个LED指示灯电路+蜂鸣器报警电路+风扇控制电路+继电器控制电路+电源 ...

  6. 基于51单片机红外测距仪阈值报警仪表设计

    目录 简介 一.系统的功能分析及体系结构设计 二.STC89C52单片机最小系统 三.5V电源电路设计 四.LCD1602液晶显示模块电路设计 五.按键电路设计 六.PCF8591 A/D采样电路设计 ...

  7. 51单片机学习笔记-14 ADDA

    14 ADDA [toc] 注:笔记主要参考B站江科大自化协教学视频"51单片机入门教程-2020版 程序全程纯手打 从零开始入门". 注:工程及代码文件放在了本人的Github仓 ...

  8. 蓝桥杯比赛培训笔记(基于STCCT107D训练板)

    "蓝桥杯"比赛培训笔记 更新说明 第一次大更新:删除了一部分冗余的代码,将代码部分改得更为规范了些. --2020年2月23日 第二次更新:在C语言相关中增添了"数组&q ...

  9. 基于51单片机的水位液位温度监测鱼缸系统仿真原理图程序

    硬件设计 上一篇咱们讲了基于数码管显示的液位检测,本章讲一下基于LCD1602显示的液位检测,同时伴有温度测量.该系统可应用于鱼缸.水塔.水箱的检测.本系统液位检测方案是基于液位传感器,通过传感器嵌入 ...

  10. 基于51单片机的太阳能锂电池充电器系统电压电流检测方案原理图设计

    系统功能分析 本系统具体框图如下图所示 本设计由STC89C52单片机+LCD1602液晶显示电路+A/D转换芯片PCF8591电路+电压检测电路+电流检测电路ACS712-5A+继电器控制电路+电源 ...

最新文章

  1. WINDOWS故障修复台 免去重装的烦恼
  2. MIT_18.03_微分方程_Fourier_Series_傅里叶级数_Notes
  3. GridView分页后RowCommand出错:索引超出范围
  4. 收藏10个2012年最新发布的jQuery插件
  5. uni-app 七牛云上传文件
  6. 提交代码到远程GIT仓库,代码自动同步到远程服务器上。
  7. C#通过COM组件调用IDL的pro程序
  8. 畅通工程(并查集模版题)
  9. 图解WinHex使用入门
  10. 监控软件加入智能零售 试着用人脸辨识让消费力提升
  11. python3 mysql插入数据冲突
  12. 【愚公系列】华为云系列之ModelArts+AppCube带你识别101种西式美食【我的低代码AI体验】
  13. 除硬件外计算机系统不可缺少的是,银河系重约多少个太阳质量?
  14. Android 解决打包时提示65536问题
  15. 迷你linux服务器,迷你Linux发行版 4MLinux 34.0 来了,你有试过吗
  16. CentOS7.6如何配置网桥?|CentOS7.6服务器配置网桥
  17. 京东案例开发之居家优品
  18. SSD目标检测的个人总结(1)—— 锚框的生成
  19. 初识嵌入式之WeMos D1超声波感应开盖垃圾桶
  20. Spotify for Mac(流行音乐播放器) v1.1.51.380免费版

热门文章

  1. postfix 安装
  2. JAVA的Properties集合
  3. dnf服务器运行库,rpg游戏运行库运行环境软件(RPGVXACE RTP)
  4. g_mass_storage: Unknown symbol fsg_common_set_sysfs (err 0)
  5. 携程网络防火墙自动化运维
  6. 工欲善其事必先利其器 突然的感悟
  7. 鸟哥惠新宸:PHP 7.1 的新特性我并不是很喜欢
  8. 未来学院计算机,1968年的计算机化未来学校
  9. 从单目视觉信息学习深度信息(一)
  10. 蛋白二级结构预测(ANN神经网络、BP算法)