依旧是借着蓝桥杯的机会,来学习一些模块,和软件模拟一些通信方式。

今天学习的模块是PCF8591,一款AD\DA转换器,使用IIC通信方式。

芯片的内部框图如下所示:

各引脚作用如下表所示:

仍旧和之前DS1302的使用相似,对于这款芯片的使用,依旧是按照先寻地址,再读写相应寄存器的步骤。

PCF8591芯片所能接收的地址包含固定部分和可编程部分。可编程部分必须根据地址引脚A0,A1,和A2来设置,在IIC总线协议中地址必须是起始条件后作为第一个字节发送,地址字节的最后一位用来设置对目标地址的读或写。地址字节格式如下所示:

第一个字节是地址字节,那么第二个字节就是控制字节,控制字节发送到PCF8591的控制寄存器中,用于控制器件的功能,控制字格式如下所示:

其中BIT7和BIT3必须设置为0,BIT6是模拟输出允许位,BIT4和BIT5用于定义模拟输入的方式,有单端和差分输入两种方式。最后三位用于选择模拟输入的通道。

接着就到了第三个字节,如果是D\A转换,发送的第三个字节被存储到DAC数据寄存器,使用D\A转换器转换成相应的模拟电压。

如果是A\D转换,在一个有效模式地址传给PCF8591之后,一个A\D转换周期便开始了,所选通道的采样电压被转换成相应的8位二进制码。

前面说过,单片机与PCF8591之间采用的是IIC的通信方式,所以在这里我想写一下如何用51软件模拟IIC通信。

我这里有蓝桥杯官方给出的IIC库,所以我就配合官方代码来理解IIC通信。

/*首先是IIC的启动,启始条件:必须在所有命令之前发送,时钟线保持高电平期间,数据线电平从高到低的跳变作为IIC总线的启动信号。而下面这个函数IIC_Start()就是模拟这个过程*/

void IIC_Start(void)

{
SDA = 1;
SCL = 1;
somenop;
SDA = 0;
somenop;
SCL = 0;

}

/*类似地,停止条件:时钟线保持高电平期间,数据线电平从低到高的跳变作为IIC总线的停止信号。*/

void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
somenop;
SDA = 1;
}

IIC总线协议规定,每传送一个字节数据后,都要有一个应答信号,以确定数据传送是否被对方收到,应答信号由接收设备产生,在SCL为高电平期间,接收设备将SDA拉为低电平表示数据传输正确,即产生了应答。

但当主机为接收设备时,主机对最后一个字节不应答,以向发送设备表示数据传送结束。

void IIC_Ack(unsigned char ackbit)   //当ackbit为1时,表示单片机对从设备发送来数据的应答

{                                                     //当ackbit为0时,表示主机接收了最后一个字节,因此不再应答,结束通信
if(ackbit) 
{
SDA = 0;
}
else 
{
SDA = 1;
}
somenop;
SCL = 1;
somenop;
SCL = 0;
SDA = 1; 
somenop;

}

bit IIC_WaitAck(void)
{
SDA = 1;
somenop;
SCL = 1;
somenop;
if(SDA)     //在SCL为高电平期间,因为接收设备未将SDA拉低,所以默认未接收到应答,结束IIC通信
{   
SCL = 0;
IIC_Stop();
return 0;
}
else     //接收到应答,返回1,继续下一个数据字节的传输

SCL = 0;
return 1;
}

}

//IIC传送一个字节的函数,高位在前,应当注意的是IIC进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定

void IIC_SendByte(unsigned char byt)

{
unsigned char i;
for(i=0;i<8;i++)
{   
if(byt&0x80) 
{
SDA = 1;
}
else 
{
SDA = 0;
}
somenop;
SCL = 1;
byt <<= 1;
somenop;
SCL = 0;
}

}

//IIC接收字节函数,原理同发送

unsigned char IIC_RecByte(void)
{
unsigned char da;
unsigned char i;

for(i=0;i<8;i++)
{   
SCL = 1;
somenop;
da <<= 1;
if(SDA) 
da |= 0x01;
SCL = 0;
somenop;
}
return da;

}

以上就是蓝桥杯官方给出的全部IIC函数。

对于PCF8591的初始化与通信函数还需要我们自己编写。

初始化函数如下:

void init_pcf8591(void)
{
IIC_Start();

IIC_SendByte(0x90);    //大家可以看看IAP15F2K61S2的原理图,就知道为什么是0x90了

IIC_WaitAck();
IIC_SendByte(0x03);  //选择ADC通道3
IIC_WaitAck();
IIC_Stop();

}

//接收PCF8591转换过的采样电压值

unsigned char adc_pcf8591(void)
{
unsigned char temp;

IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
temp = IIC_RecByte();
IIC_Ack(0);
IIC_Stop();

return temp;

}

以上就是PCF8591的使用以及对IIC通信的理解,在IAP15F2K61S2上还有EEPROM---AT24C02,它用的也是IIC通信,原理相同,不再多说。

PCF8591 ---AD\DA转换器的使用(IIC通信的软件模拟与应用) (by 51单片机)相关推荐

  1. 高速AD/DA转换器常用资料

    高速AD/DA转换器常用资料 [日期:2005-1-12] 来源:利尔达单片机技术有限公司  作者: [字体:大 中 小] 型号 位数 采样频率 通道数 接口 NMC2 电压功耗 封装 ADS1110 ...

  2. AD/DA转换器性能限度

    AD/DA转换器性能限度 作者:夏风喃喃 参考:模拟集成电路设计 (加)David A. Johns and Ken Martin / 著 文章目录 AD/DA转换器性能限度 量化噪声 信噪比(SNR ...

  3. IIC驱动0.96寸OLED屏幕显示(51单片机)

    这篇文章得用到IIC驱动,大家如果不会IIC通信,可以看这篇文章,也是我写的,是有关IIC通信的,有什么不理解的可以在看一下:https://blog.csdn.net/m0_58832575/art ...

  4. IIC协议的软件模拟实现程序

    项目场景:基于STM32F407实现GPIO软件模拟IIC驱动EEPROM 背景:工作中用到了EEPROM用于存储配置信息,需要对EEPROM进行读.写功能的实现. 硬件:使用的EEPROM型号为 B ...

  5. 15 玩转STM32之IIC通信(芯片硬件篇)

    15.1 IIC控制器说明(硬件部分) 在14 玩转STM32之IIC通信(软件模拟篇)我们讲了软件模拟的方式,本章讲解芯片自带的硬件部分(并非所有的芯片都含有IIC,像51系列的是没有的,但是绝大多 ...

  6. 51单片机--AD/DA

    AD/DA介绍 AD和DA是模拟信号和数字信号之间的转换过程. AD,全称为模拟到数字(Analog-to-Digital),指的是将模拟信号转换为数字信号的过程.在AD转换中,模拟信号经过采样.量化 ...

  7. 16F877A和24C02通信汇编语言,pic单片机IIC通信读24C02程序例 16F877A 主频4M

    #define _iic_h_//pic单片机IIC通信初始化函数声明 void iiccsh(void); //pic单片机IIC通信读外围设备函数声明 //功能:传送一个8位地址,返回一个8位数据 ...

  8. 基于STM32F103C8T6的IIC通信协议及硬件通信和软件OLED温度显示项目

    #一.IIC协议简介 #二.IIC总线系统结构 #三.IIC总线物理层特点 #四.软/硬件IIC总线 #五.IIC总线协议层 #六.IIC通信结构 ##1.空闲状态 ##2.开始信号 ##3.停止信号 ...

  9. SPI的模拟应用——OLED以及时钟模块的应用(一)SPI协议介绍及利用协议实现两机通信(51单片机)

    链接:https://pan.baidu.com/s/1g8jkENjO8v4eXq0bN0acEw?pwd=45c8  提取码:45c8 目录 一. 什么是SPI 1-1 SPI简介 1-2 SPI ...

最新文章

  1. 问题文件Android Studio 安装完成不能打开等问题解决记录
  2. P2480 [SDOI2010]古代猪文
  3. python装饰器类-Python 装饰器、类装饰器、属性装饰器
  4. pytorch笔记:实现简易LSTM
  5. java 关键字volatile的作用
  6. 线程并发库和线程池的作用_并发–顺序线程和原始线程
  7. java for循环遍历解释,三种for循环遍历
  8. Python Levenshtein(两个文本比较,两个字符串比较)
  9. mysql 索引的简单使用
  10. 频率副词always,usually,often...用法_16
  11. 学习笔记——SM2算法原理及实现
  12. Android的 EditText的inputType类型
  13. Ubuntu 18.04下QFIL刷机
  14. unity多人联机插件_Unity网络系统插件,打通游戏联网任督二脉
  15. C语言程序设计实验报告——实验六
  16. ma2灯光控制台 linux,MA2灯光控制台简易教程.pdf
  17. 对于System.out.println简单了解
  18. 2016全球排名前50的博客网站性能
  19. 企业如何操作网络口碑营销?
  20. UCenter 来自网络

热门文章

  1. 数字IC设计自学到底有多难?
  2. 开始时间结束时间参数不能为空,时间间隔不能超过90天
  3. QTP11.00支持的IE版本
  4. 中介变量、调节变量与协变量
  5. 1、nacos功能简介
  6. Java根据模板生成excel文件【Java】【EasyExcel】【xls】
  7. ptv服务器系统,红狮PTV安灯管理服务器系统有效提升国内某知名车企生产效率
  8. Java集成第三方OCR识别——文档篇
  9. Android视频加密那点事儿!
  10. 怎么在电脑找到菜单android,在打开的开始菜单中找到我的电脑(计算机)