PCF8591 ---AD\DA转换器的使用(IIC通信的软件模拟与应用) (by 51单片机)
依旧是借着蓝桥杯的机会,来学习一些模块,和软件模拟一些通信方式。
今天学习的模块是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单片机)相关推荐
- 高速AD/DA转换器常用资料
高速AD/DA转换器常用资料 [日期:2005-1-12] 来源:利尔达单片机技术有限公司 作者: [字体:大 中 小] 型号 位数 采样频率 通道数 接口 NMC2 电压功耗 封装 ADS1110 ...
- AD/DA转换器性能限度
AD/DA转换器性能限度 作者:夏风喃喃 参考:模拟集成电路设计 (加)David A. Johns and Ken Martin / 著 文章目录 AD/DA转换器性能限度 量化噪声 信噪比(SNR ...
- IIC驱动0.96寸OLED屏幕显示(51单片机)
这篇文章得用到IIC驱动,大家如果不会IIC通信,可以看这篇文章,也是我写的,是有关IIC通信的,有什么不理解的可以在看一下:https://blog.csdn.net/m0_58832575/art ...
- IIC协议的软件模拟实现程序
项目场景:基于STM32F407实现GPIO软件模拟IIC驱动EEPROM 背景:工作中用到了EEPROM用于存储配置信息,需要对EEPROM进行读.写功能的实现. 硬件:使用的EEPROM型号为 B ...
- 15 玩转STM32之IIC通信(芯片硬件篇)
15.1 IIC控制器说明(硬件部分) 在14 玩转STM32之IIC通信(软件模拟篇)我们讲了软件模拟的方式,本章讲解芯片自带的硬件部分(并非所有的芯片都含有IIC,像51系列的是没有的,但是绝大多 ...
- 51单片机--AD/DA
AD/DA介绍 AD和DA是模拟信号和数字信号之间的转换过程. AD,全称为模拟到数字(Analog-to-Digital),指的是将模拟信号转换为数字信号的过程.在AD转换中,模拟信号经过采样.量化 ...
- 16F877A和24C02通信汇编语言,pic单片机IIC通信读24C02程序例 16F877A 主频4M
#define _iic_h_//pic单片机IIC通信初始化函数声明 void iiccsh(void); //pic单片机IIC通信读外围设备函数声明 //功能:传送一个8位地址,返回一个8位数据 ...
- 基于STM32F103C8T6的IIC通信协议及硬件通信和软件OLED温度显示项目
#一.IIC协议简介 #二.IIC总线系统结构 #三.IIC总线物理层特点 #四.软/硬件IIC总线 #五.IIC总线协议层 #六.IIC通信结构 ##1.空闲状态 ##2.开始信号 ##3.停止信号 ...
- SPI的模拟应用——OLED以及时钟模块的应用(一)SPI协议介绍及利用协议实现两机通信(51单片机)
链接:https://pan.baidu.com/s/1g8jkENjO8v4eXq0bN0acEw?pwd=45c8 提取码:45c8 目录 一. 什么是SPI 1-1 SPI简介 1-2 SPI ...
最新文章
- 问题文件Android Studio 安装完成不能打开等问题解决记录
- P2480 [SDOI2010]古代猪文
- python装饰器类-Python 装饰器、类装饰器、属性装饰器
- pytorch笔记:实现简易LSTM
- java 关键字volatile的作用
- 线程并发库和线程池的作用_并发–顺序线程和原始线程
- java for循环遍历解释,三种for循环遍历
- Python Levenshtein(两个文本比较,两个字符串比较)
- mysql 索引的简单使用
- 频率副词always,usually,often...用法_16
- 学习笔记——SM2算法原理及实现
- Android的 EditText的inputType类型
- Ubuntu 18.04下QFIL刷机
- unity多人联机插件_Unity网络系统插件,打通游戏联网任督二脉
- C语言程序设计实验报告——实验六
- ma2灯光控制台 linux,MA2灯光控制台简易教程.pdf
- 对于System.out.println简单了解
- 2016全球排名前50的博客网站性能
- 企业如何操作网络口碑营销?
- UCenter 来自网络