九层妖塔 起于垒土


蓝桥杯 模板Template Part9:PCF8591 ADC/DAC

  • 一、原理图
  • 二、通过IIC对PCF8591的写操作与读操作
    • 写操作
    • 读操作
  • 三、基本模板
    • 1、`头文件`
    • 2、数模转换函数`PCF8591_DAC()`
    • 3、模数转换函数`PCF8591_ADC()`
    • 4、显示信息的处理
  • 四、备用拓展模板
    • 1、多通道连续读取


改编自国信长天蓝桥杯官方蓝皮书例程,按照自己的习惯进行了补充和修改


基础知识

【蓝桥杯】—{模块}—{PCF8591_8位A/D and D/A转换器Part_1}

【蓝桥杯】—{模块}—{PCF8591_8位A/D and D/A转换器Part_2}


一、原理图

PCF8591原理图:

Notes:
 ●PCF8591有4路A/D转换 模拟输入,分别为AIN0AIN1AIN2AIN31路D/A模拟输出OUT
 ●第一路A/D转换 模拟输入AIN0通道0 外部输入


 ●第二路A/D转换 模拟输入AIN1通道1 光敏电阻 RD1

 ●第三路A/D转换 模拟输入AIN2通道2 四路运算放大器LM324的输出引脚


 ●第四路A/D转换 模拟输入AIN3通道3 电位器Rb2



二、通过IIC对PCF8591的写操作与读操作

写操作

Created with Raphaël 2.3.0总线启动发送 地址字节 (写数据)发送 控制字节发送 数据字节总线停止

Notes:
 ●PCF8591和AT24C02共用IIC总线。
 ●主机进行总线操作时,发送的第一个字节为地址字节 选择接收数据的从机,和数据传输方向(写操作时最后一位为0,写入)。主机等待从机发出应答。
 ●写操作时,主机发送的第二个字节为控制字节 ,写入从机的控制寄存器,设置从机的各种功能。主机等待从机发出应答。
 ●写操作时,主机发送的第三个字节为数据字节 ,写入从机的DAC数据寄存器,8位数据,数模转换的数字量电压。主机等待从机发出应答。
 ●地址字节和控制字节必须有,数据字节可以没有。

读操作

Created with Raphaël 2.3.0总线启动发送 地址字节 (读数据)接收 数据字节总线停止

Notes:
 ●主机进行总线操作时,发送的第一个字节为地址字节 规定接受数据的从机,和数据传输方向(读操作时最后一位为1,读取)。
 ●读操作时,主机发送完第一个字节地址字节规定了数据传输方向为读取后进入接受模式。一次只能传输一个字节,由于PCF8591只有8位数据,只需要传输一次。主机接收到一个字节后,发送非应答信号,告诉从机我不要了,别发送了



三、基本模板

1、头文件

 在原有头文件的基础上增加以下内容:

#define AIN0_extern 0X40   //通道0外部输入  模拟输出使能—四路单端输入
#define AIN1_RD1    0X41   //光敏电阻 RD1   模拟输出使能—四路单端输入
#define AIN3_Rb2    0X43   //通道3电位器Rb2 模拟输出使能—四路单端输入extern uchar uc_PCF8591_ADC_Rb2;    电位器 Rb2
extern uchar uc_PCF8591_ADC_RD1;    //光敏电阻 RD1
extern uchar uc_PCF8591_ADC_extern;//外部输入extern void PCF8591_DAC(float dat);     //DAC输出
extern uchar PCF8591_ADC(uchar Control_Byte);  //通过IIC总线读取ADC结果

2、数模转换函数PCF8591_DAC()

//------------------------------------------DAC输出---------------//
void PCF8591_DAC(float dat)
{IIC_Start();        //总线启动IIC_SendByte(0X90); //地址字节 写数据IIC_WaitAck();      //等待应答IIC_SendByte(0X43); //控制字节 模拟输出使能IIC_WaitAck();      //等待应答IIC_SendByte(dat/5.0*255);  //数据字节 数模转换的数据IIC_WaitAck();      //等待应答IIC_Stop();         //总线停止
}

Notes:
 ●数模转换进行数字量到模拟量的转换,数字量来自主机通过IIC总线写入从机,从机PCF8591进行转换后从OUT引脚输出模拟量。数据传输方向为单向,只从主机写入从机,只需要进行一个完整的写操作


3、模数转换函数PCF8591_ADC()

//------------------------------------------通过IIC总线读取ADC结果---------------//
uchar PCF8591_ADC(uchar Control_Byte)
{uchar temp;IIC_Start();        //总线启动IIC_SendByte(0X90); //地址字节 写数据IIC_WaitAck();      //等待应答IIC_SendByte(Control_Byte); //控制字节IIC_WaitAck();      //等待应答IIC_Stop();         //总线停止IIC_Start();           //总线启动IIC_SendByte(0X91);    //地址字节 读数据IIC_WaitAck();         //等待应答temp = IIC_RecByte();  //从I2C总线上接收数据IIC_SendAck(1);        //发送非应答IIC_Stop();            //总线停止return temp;
}

Notes:
 ●模数转换进行模拟量转换为数字量。模拟量来自AIN0AIN1AIN2AIN3四个引脚。从机PCF8591进行转换后,通过IIC总线传输给主机。
 ●主机需要先写入数据给从机,配置从机的寄存器,设置相关功能。此时为写操作
 ●从机PCF8591进行转换后,主机还需要从IIC总线接收转换完的数据。此时为读操作


4、显示信息的处理

//-----------------------------------------数码管处理函数---------------//
void SEG_Proc(void)     //数码管处理函数
{if(ui_SEG_flag) return;   //刷新频率ui_SEG_flag = 1;……if(uc_Key_Value == 10)  {PCF8591_DAC(2.0); uc_PCF8591_ADC_extern = PCF8591_ADC(AIN0_extern);if(uc_PCF8591_ADC_extern != 0x80)sprintf(puc_SEG_Buf,"%02u  %05.2f",(uint)uc_Key_Value,(float)uc_PCF8591_ADC_extern/256.0*5);}SEG_Tran(puc_SEG_Buf,puc_SEG_Code);   //数码管段码转换
}

四、备用拓展模板

1、多通道连续读取

 1、缓冲数组:

uchar idata puc_ADC_Buf[4] = {0,0,0,0};

 2、初始化部分

void main(void)
{ALL_Init();Timer1Init();UartInit();uc_ADC_Value_AIN0 = PCF8591_ADC(0x40); //初始值 0x80uc_ADC_Value_AIN1 = PCF8591_ADC(0x41); // 0uc_ADC_Value_AIN2 = PCF8591_ADC(0x42); // 1uc_ADC_Value_AIN3 = PCF8591_ADC(0x43); // 2//puc_ADC_Buf[0] = uc_ADC_Value_AIN0;  puc_ADC_Buf[0] = uc_ADC_Value_AIN1;puc_ADC_Buf[1] = uc_ADC_Value_AIN2;puc_ADC_Buf[2] = uc_ADC_Value_AIN3;uc_ADC_Value_AIN0 = PCF8591_ADC(0x40); //3uc_ADC_Value_AIN1 = PCF8591_ADC(0x41); //0uc_ADC_Value_AIN2 = PCF8591_ADC(0x42); //1uc_ADC_Value_AIN3 = PCF8591_ADC(0x43); //2puc_ADC_Buf[3] = uc_ADC_Value_AIN0; puc_ADC_Buf[0] = uc_ADC_Value_AIN1;puc_ADC_Buf[1] = uc_ADC_Value_AIN2;puc_ADC_Buf[2] = uc_ADC_Value_AIN3;ES = 1;ET1 = 1;EA = 1;…………while(1){………… }

 3、ADC处理函数

void ADC_Proc(void)
{if(uc_ADC_flag) return;uc_ADC_flag = 1;uc_ADC_Value_AIN0 = PCF8591_ADC(0x40); //3uc_ADC_Value_AIN1 = PCF8591_ADC(0x41); //0uc_ADC_Value_AIN2 = PCF8591_ADC(0x42); //1uc_ADC_Value_AIN3 = PCF8591_ADC(0x43); //2puc_ADC_Buf[3] = uc_ADC_Value_AIN0; puc_ADC_Buf[0] = uc_ADC_Value_AIN1;puc_ADC_Buf[1] = uc_ADC_Value_AIN2;puc_ADC_Buf[2] = uc_ADC_Value_AIN3;sprintf(puc_Uart_Send_String,"通道0AIN0:%05.2f -- ",(float)puc_ADC_Buf[0]/255.0*5.0);Uart_Send_String(puc_Uart_Send_String);sprintf(puc_Uart_Send_String,"通道1AIN1:%05.2f -- ",(float)puc_ADC_Buf[1]/255.0*5.0);Uart_Send_String(puc_Uart_Send_String);sprintf(puc_Uart_Send_String,"通道2AIN2:%05.2f -- ",(float)puc_ADC_Buf[2]/255.0*5.0);Uart_Send_String(puc_Uart_Send_String);sprintf(puc_Uart_Send_String,"通道3AIN3:%05.2f\r\n",(float)puc_ADC_Buf[3]/255.0*5.0);Uart_Send_String(puc_Uart_Send_String);}

  
  
  
  
彩 蛋

蓝桥杯 模板Template Part9:PCF8591 ADC/DAC相关推荐

  1. 蓝桥杯 模板Template Part10:AT24C02存储器

    九层妖塔 起于垒土 蓝桥杯 模板Template Part10:AT24C02存储器 一.原理图 二.AT24C02存储器内部存储结构的形象解释 1.存储结构 2.存储结构的地址编码 3.第一页的形象 ...

  2. 蓝桥杯单片机——PCF8591 ADC/DAC模块

    本篇讲的单片机是第十一届蓝桥杯单片机实训的硬件设备. 蓝桥杯单片机硬件基础 PCF8591电路图: PCF8591是具有IIC总线接口的8位A/D及D/A转换器,有4路A/D转换输入,1路D/A模拟输 ...

  3. 蓝桥杯模板TemplatePart12:NE555定时器频率测量

    九层妖塔 起于垒土 蓝桥杯模板TemplatePart12:NE555定时器&频率测量 一.555定时器 1.内部框图: 2.基础知识: 二.Template: 1.定时器0初始化为计数器 2 ...

  4. 4.8 51单片机-PCF8591(ADC/DAC)转换芯片

    4.8 PCF8591(ADC/DAC)转换芯片 4.8.1 原理图 当前实验板上没有PCF8591芯片,这里采用外接模块的形式使用. 图4-8-1 PCF8591模块实物图 图4-8-2 原理图 通 ...

  5. 第十二届_国赛蓝桥杯个人模板_基础篇

    第十二届_国赛蓝桥杯个人模板_网格图_DFS/BFS篇 第十二届_国赛蓝桥杯个人模板_全排列_DFS/BFS篇 第十二届_国赛蓝桥杯个人模板_DP篇 第十二届_国赛蓝桥杯个人模板_数论篇 第十二届_国 ...

  6. 【国信长天蓝桥杯】扩展板② ADC按键的使用

    摘要 本篇文章主要介绍了蓝桥杯嵌入式比赛扩展板上面ADC按键的工作原理与使用方法. 跳线帽与原理图 要想使用ADC按键需要将扩展板连接到主板上,如下图所示,并且还要短路扩展板上AKEY跳线帽. 连接成 ...

  7. 蓝桥杯模块学习17——AT24C02存储器(深夜学习——单片机)

    一.硬件电路: 1.引脚功能: (1)A0-A2:决定不同设备的地址码: (2)WP:写保护 二.通讯方式(IIC协议) 通讯方式与PCF8591相同,可参考以下文章: 蓝桥杯模块学习16--PCF8 ...

  8. 【STM32G431RBTx】备战蓝桥杯嵌入式→扩展模块→DHT11

    文章目录 前言 一.软件准备 二.DHT11 1.扩展板上模块的原理图以及我们需要配置的元素 2.CubeMx的配置步骤 3.代码修改以及应用 方法1.以移植F103驱动包为方法 ①.在工程中添加大赛 ...

  9. 蓝桥杯国信长天单片机--硬件环境(一)

    CT107D 单片机由以下功能模块组成 1.功能模块 (1)单片机芯片 配置IAP15F2K61S2单片机 (2)显示模块 配置8路LED输出L1-L8 配置8位8段共阳极数码管DS1-DS2 配置L ...

最新文章

  1. 探索式测试的思维模型
  2. js中关于Blob对象的介绍与使用
  3. html文件怎么导出stl文件,各种3D建模软件导出STL文件的小技巧(一)
  4. Spark报错: IOException: Bad connect ack with firstBadlink as xxx:500010
  5. 记录一次浏览器主页被劫持的经历
  6. 深度学习图片卷积输出大小计算公式
  7. 类的可访问性(C++)
  8. Python 机器学习经典实例
  9. natapp软件使用
  10. 3串口多串口双串口以及2串口UART转WiFi多跳通讯实现三
  11. 独立样本t检验及其在SPSS中的实现
  12. android工程师考司考,法考真题app哪个好用_司考刷题哪个app好用_搜法考真题app哪个比较好用...
  13. 由旋转矩阵求旋转中心
  14. Hadoop原理 之 数据完整性
  15. 告别手动输入验证码!Web自动化测试带你解锁验证码处理和Cookie机制,跨越测试瓶颈!
  16. 王者荣耀进阶教学攻速/移速/减伤机制/视野/意识
  17. classList属性配合内置方法add()、remove()、toggle(),添加或删除某个类,以此改变CSS样式
  18. clearWState(WState_Polished)编译出错
  19. 线性代数22种题型解题思路
  20. sqli-labs(全通关刷题笔记)

热门文章

  1. 网页设计html2017体会,2017网页设计实习报告
  2. python+selenium实现自动输入关键字进行搜索
  3. 找到可靠的游戏外包开发公司
  4. oppo手机android系统进程,OPPO手机应用软件怎么在后台运行?OPPO软件后台运行两种方法...
  5. 英语六级写作必备短语词汇1
  6. (原创)通过DrawingCache截取View图片
  7. 锐捷框式交换机日常维护与故障排查
  8. 【通信原理】#19 基于matlab的交织与解交织
  9. 安装Kong和Konga
  10. SPM 3D医学图像配准