IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 蓝桥杯单片机之PCF8591模块的使用 -> 正文阅读

[嵌入式]蓝桥杯单片机之PCF8591模块的使用

简述

PCF8591是一款单芯片、单电源、低功耗、8位CMOS数
据采集器件,具有四路模拟输入、一路模拟输出和一个
串行I2C总线接口。
通过I2C总线的串行输入/输出

原理图:

在这里插入图片描述

引脚定义:

SYMBOL PIN DESCRIPTION译文
AIN01analog inputs (A/D converter)模拟输入
AIN1 2
AIN2 3
AIN3 4
A0 5hardware address硬件地址
A1 6
A2 7
VSS 8negative supply voltage负电压
SDA 9 I2C-bus data input/outputIIC数据线
SCL 10 I2C-bus clock inputIIC时间线
OSC 11 oscillator input/output振荡器输入输出
EXT 12 external/internal switch for oscillator input振荡器输入的外部/内部开关
AGND 13analog ground模拟接地
VREF14voltage reference input基准电压(已经接了VCC)
AOUT 15analog output (D/A converter)模拟输出
VDD 16positive supply voltage正电压

相关地址

IIC寻址设备地址

在这里插入图片描述
前四位固定为1001,根据原理图可以知道A2、A1、A0都是接地低电平0;所以PCF8591的写地址为 0X90,读地址为 0X91 ;

控制地址

在这里插入图片描述

bit0-bit1:通道选择,00为AIN0通道,01为AIN1通道,10为AIN2通道,11为AIN3通道。根据蓝桥杯单片机开发板,其中AIN0接在J3排针的外部A/D输入通道,AIN1接在光敏电阻,AIN3接在RB2电位器(可调电阻)。
bit3:自动增量使能位(1有效): 如果自动增量(auto-increment)标志置1,每次A/D 转换后通道号将自动增加。
bit5-bit6:输入模式选择位:00为单端输入,01为三个差分输入,10为单端和差分混合输入,11为两个差分输入;一般设置为为单端输入00
bit7:运行模拟电压输入位,进行转换是需要置1;

IIC时序分析

写操作:
在这里插入图片描述

起始(START)——>设备地址(Device Address)<写操作的地址>——>PCF8591的应答信号(ACK)——>写入控制字(Control Byte)——>PCF8591的应答信号(ACK)——>写入数据字(DATA)——>PCF8591应答信号(ACK)

读操作:
在这里插入图片描述
单字节读取 :起始(START)——>设备地址(Device Address)<读操作的地址>——>PCF8591的应答信号(ACK)——>读取数据(Data Byte)——>主机的的应答信号(ACK)——>停止

数模转换D/A

将总线上接收到的数字量转换成模拟量在AOUT输出,主要利用IIC的写操作来实现数据写入,进而输出对应的模拟电压。
计算公式:
V O U T = 255 × D A T A V R E F {V}_{OUT}=255\times \frac {DATA} {{V}_{REF}} VOUT?=255×VREF?DATA?
在这里插入图片描述
在这里插入图片描述

模数转换公式

将AINx端口输入的模拟电压转换成数字量并发送到总线,主要利用IIC的读操作来实现数据读取,进而显示对应的模拟电压。
数模转换公式:
在这里插入图片描述

代码:

一:光敏电阻和可变电阻的AD转换,S4控制模式的切换

#include "reg52.h"
#include "iic.h"

sbit S4 = P3^3;
unsigned char Rd1 = 0; //光敏电阻AIN1
unsigned char Rd2 = 0;	//可调电阻AIN3
unsigned char status = 0; //按键状态记录

unsigned char SMG_NoDot[19] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f,0xff}; //0-9、A-F、'-'、'.'														   0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xbf};


//---------------------------------简单延时函数-------------------------
void Delay(unsigned int t)
{
 	while(t--);
}

void Delay500us()		//@12.000MHz
{
	unsigned char i, j;

	i = 6;
	j = 211;
	do
	{
		while (--j);
	} while (--i);
}
void Digital_Tube(unsigned char Position,unsigned char Typeface)    //Position是数码管第几位(从左到右,0开始),Typeface是显示的字样
{   
  unsigned char Bit[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};       
	P2 = P2 & 0x1f | 0xc0;
	P0=Bit[Position];
	P2 = P2 & 0x1f | 0xe0;
	P0=Typeface;
	Delay500us();
	P0=0XFF;
	P2 = P2 & 0x1f ;	//数码管消影
}
//---------------------------------数码管AD显示----------------------
void Display_PCF8591(unsigned char channel,unsigned char dat)
{
	Digital_Tube(0,SMG_NoDot[16]);
	Digital_Tube(1,SMG_NoDot[channel]);
	Digital_Tube(2,SMG_NoDot[16]);
	Digital_Tube(3,0xff);
	Digital_Tube(4,0xff);
	Digital_Tube(5,SMG_NoDot[dat/100]);
	Digital_Tube(6,SMG_NoDot[dat/10%10]);
	Digital_Tube(7,SMG_NoDot[dat%10]);
}

//----------------------------读取光敏AD-----------------------------------

//PCF8591的设备的读操作地址为:0x91;而写操作地址则为:0x90
//光敏传感器接到AIN1,通道1;控制寄存器应写入:0x01。
//电位器Rb2接到AIN3,通道3;控制寄存器应写入:0x03。
void Read_Rd1_Data(void)
{
		 IIC_Start();					//IIC总线起始信号
		 IIC_SendByte(0x90);	//发送PCF8591设备地址 写操作
		 IIC_WaitAck();			  //等待回应
		 IIC_SendByte(0x01);  //发送AIN模拟通道号	 AIN3
		 IIC_WaitAck();				//等待回应
		 IIC_Stop();					//IIC总线停止信号

		 Display_PCF8591(1,Rd1);

		 IIC_Start();						//起始信号
		 IIC_SendByte(0x91);	  //发送PCF8591设备地址 读操作
		 IIC_WaitAck();					//等待回应
		 Rd1 = IIC_RecByte();		//读取数据
		IIC_SendAck(1);				//发送非应答信号
		 IIC_Stop();						//IIC总线停信号

		 Display_PCF8591(1,Rd1);
}

//-----------------------------读取滑动电阻AD-----------------------------
void Read_Rd2_Data(void)
{
		IIC_Start();	        //IIC总线起始信号
		IIC_SendByte(0x90);	  //发送PCF8591设备地址 写操作
		IIC_WaitAck();			  //等待回应
		IIC_SendByte(0x03);	  //发送AIN模拟通道号	 AIN3
		IIC_WaitAck();				 //等待回应
		IIC_Stop();						 //IIC总线停止信号

		Display_PCF8591(3,Rd2);

	  IIC_Start();//起始信号
		IIC_SendByte(0x91);	  //发送PCF8591设备地址 读操作
		IIC_WaitAck();			  //等待回应
		Rd2 = IIC_RecByte();  //读取数据
		IIC_SendAck(1);				//发送非应答信号
		IIC_Stop();	  				//IIC总线停信号

		Display_PCF8591(3,Rd2);
}

//----------------------------------按键切换控制----------------------------
void Key_Tackle(void)
{
	 if(S4 == 0)
	 {
			Delay(20);
			if(S4 == 0)
			{
			 	if(status == 0)
				{
				 	status = 1;
					while(S4 == 0)
					{
						 Display_PCF8591(1,Rd1);
					}	
				}

				else if(status == 1)
				{
				 	status = 0;
					while(S4 == 0)
					{
						 Display_PCF8591(3,Rd2);
					}
				 	
				}
			}	
	 }
}

void main(void)
{
	Read_Rd1_Data(); //上电默认进行光敏数据采集
	while(1)
	{
		Key_Tackle();
		if(status == 0)
		{
		 	 Read_Rd1_Data();
		}
		else
		{
		 	 Read_Rd2_Data();
		}
	}
}

二:输出定量的模拟电压

在开发板右侧排针D/A引脚输出模拟电压,输出的电压跟芯片的基准电压相关,可能会比实际小一点,需要自己微调。

#include "reg52.h"
#include "iic.h"

void Analog_Out(unsigned char DATA)
{
	 IIC_Start();					//IIC总线起始信号
	 IIC_SendByte(0x90);	//发送PCF8591设备地址 写操作
	 IIC_WaitAck();			  //等待回应
	 IIC_SendByte(0X40);  //发送AIN模拟通道号	 AIN0输出模式
	 IIC_WaitAck();				//等待回应
		IIC_SendByte(DATA);  //发送模拟电压对应的数据
		IIC_WaitAck();				//等待回应
	 IIC_Stop();					//IIC总线停止信号
}


void main(void)
{

	while(1)
	{
		 	 Analog_Out(255*3/5);
	}
}

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:42:39  更:2022-03-08 22:43:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:30:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码