备战蓝桥杯day18__PCF8591基本原理与AD转化应用

一,PCF8591

PCF8591是一个拥有4路模拟输入,1路DAC输出的AD,DA转化芯片,使用I2C为通信接口

AIN0,AIN1,AIN2,AIN3:4路模拟信号输入。

A0,A1,A2:硬件地址,在蓝桥杯平台为接地,默认地址的前4为1001,最后一位为写保护位。

Vss:备用电源 。

SDA,SCL:I2C通信相关。

Vref:为参考电压,蓝桥杯平台参考电压为5V,意味着模拟信号的5V,相当于数字信号的255。

在进行I2C通信时,第一位发送的字节数据为设备地址,等待响应后,下一个字节数据是对PCF8591里面寄存器的命令,该寄存器的具体定义如下。

光敏传感器接到AIN1,通道1;控制寄存器应写入:0x01
电位器Rb2接到AIN3,通道3;控制寄存器应写入:0x03。 

二,代码部分

#include "reg52.h"
#include "iic.h"
#include "absacc.h"
#include "xmf_smg_ca.h"
void SMGWorking(unsigned char channel);
sbit S4=P3^3;
unsigned char sta=0;
unsigned char SMGnotdotduanma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char dat;
void Read_RD1()
{
	IIC_Start();
  IIC_SendByte(0x90);
  IIC_WaitAck(); 
	IIC_SendByte(0x01); 
	IIC_WaitAck(); 
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck(); 
	dat=IIC_RecByte();
	IIC_SendAck(1); 
	IIC_Stop();
}
void Read_RB2()
{
	IIC_Start();
  IIC_SendByte(0x90);
  IIC_WaitAck(); 
	IIC_SendByte(0x03); 
	IIC_WaitAck(); 
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck(); 
	dat=IIC_RecByte();
	IIC_SendAck(1); 
	IIC_Stop();
}
void Scan_key()
{
	if(S4==0)
	{
		Delay(100);
		if(S4==0)
		{
			if(sta==0)
			{
				while(S4==0)
				{
					sta=1;
				Read_RD1();
				SMGWorking(1);
				}
			}
			else if(sta==1)
			{
				while(S4==0)
				{
				sta=0;
				Read_RB2();
				SMGWorking(3);
				}
			}
		}
	}
}
void SMGWorking(unsigned char channel)
{
	Dispaly_SMG(0,~(0x40));
	Delay(100);
	Dispaly_SMG(1,SMGnotdotduanma[channel]);
	Delay(100);
	Dispaly_SMG(2,~(0x40));
	Delay(100);
	Dispaly_SMG(3,0xff);
	Delay(100);
	Dispaly_SMG(4,0xff);
	Delay(100);
	Dispaly_SMG(5,SMGnotdotduanma[dat/100]);
	Delay(100);
	Dispaly_SMG(6,SMGnotdotduanma[dat/10%10]);
	Delay(100);
	Dispaly_SMG(7,SMGnotdotduanma[dat%10]);
	Delay(100);
	Display_ALL(0xff);
}
void main()
{
	XBYTE[0XA000]=0X00;
	 
	while(1)
	{
	 Scan_key();
		if(sta==1)
		{
			Read_RD1();
			SMGWorking(1);
		}
		else if(sta==0)
		{
			Read_RB2();
			SMGWorking(3);
		}
		
	}
}


版权声明:本文为weixin_58931449原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。