第十五届蓝桥杯单片机组——PCF8591

文章目录

  • 一、PCF8591介绍
  • 二、根据手册写代码
    • 2.1 IIC设备地址
    • 2.2 实现DA功能
    • 2.3 实现AD功能
  • 三、示例代码

一、PCF8591介绍

  1. 模拟-数字转换器(ADC):PCF8591包括一个4通道、8位分辨率的模拟-数字转换器。这意味着它可以将4个独立的模拟输入信号转换为8位的数字输出信号。
  2. 数字-模拟转换器(DAC):PCF8591还包含一个8位的数字-模拟转换器。这意味着它可以将一个8位的数字输入信号转换为一个模拟输出信号。
  3. I2C接口:PCF8591通过使用I2C接口(Inter-Integrated Circuit interface),一种字节级的双向串行协议,可以连续不断的与微控制器进行交流,无需任何中间数据传输设备。

二、根据手册写代码

2.1 IIC设备地址

第十五届蓝桥杯单片机组——PCF8591_第1张图片
第十五届蓝桥杯单片机组——PCF8591_第2张图片
可以发现开发板上A2、A1、A0都接地了,也就是设备地址为 1001000R/W

2.2 实现DA功能

第十五届蓝桥杯单片机组——PCF8591_第3张图片

void PCF8591_DA(u8 output){
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x40);		// 发送让PCF8591实现DA功能指令
	IIC_WaitAck();
	IIC_SendByte(output);	// 发送要产生多大的电压0~0V,255~5V
	IIC_WaitAck();
	IIC_Stop();
}

2.3 实现AD功能

u8 PCF8591_AD(){
	u8 AD;
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	
	IIC_SendByte(0x03);
	IIC_WaitAck();
	
	IIC_Start(); 
	IIC_SendByte(0x91);  //器件地址
	IIC_WaitAck();  
	
	AD=IIC_RecByte(); 
	IIC_SendAck(1); 
	
	IIC_Stop();
	AD=Median_Avereage(AD);
	return AD;
}

三、示例代码

#include 
#include 

unsigned char code dat[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99,
					      0x92, 0x82, 0xf8, 0x80, 0x90,
						  0x88,0x80,0xc6,0xc0,0x86,0x8e,
						  0xbf,0x7f};

void Delay(unsigned int t)
{
	while(t--);
}

void selectHC573(unsigned char num)  
{
	switch(num)
	{
		case 4:
			P2=(P2 & 0x1f) | 0x80;
			break;
		case 5:
			P2=(P2 & 0x1f) | 0xa0;
			break;
		case 6:
			P2=(P2 & 0x1f) | 0xc0;
			break;
		case 7:
			P2=(P2 & 0x1f) | 0xe0;
			break;
		case 0:
			P2=(P2 & 0x1f) | 0x00;
			break;
	}
}

void system_Init()
{
	selectHC573(5);
	P0=0x00;
	selectHC573(0);
}

void display_SMG_Bit(unsigned char dat, unsigned pos)
{
	/*消影法2*/
	P0=0xff;
	selectHC573(7);
	selectHC573(0);
	
	P0=0x01<<(pos-1);
	selectHC573(6);
	selectHC573(0);


	P0=dat;
	selectHC573(7);
	selectHC573(0);
	
}

void display_D_SMG(int dat1)
{	
	display_SMG_Bit(dat[2],1);
	Delay(300);
	
	display_SMG_Bit(dat[0],2);
	Delay(300);
	
	display_SMG_Bit(dat[2],3);
	Delay(300);

	display_SMG_Bit(dat[3],4);
	Delay(300);
	
	display_SMG_Bit(dat[16],5);
	Delay(300);
	
	display_SMG_Bit(dat[dat1 / 100],6);
	Delay(300);
	
	display_SMG_Bit(dat[((dat1 / 10) % 10)],7);
	Delay(300);

	display_SMG_Bit(dat[dat1 % 10],8);
	Delay(300);
}

void PCF8591_WRITE(unsigned char date)
{
	IIC_Start(); 
	IIC_SendByte(0x90);  //器件地址
	IIC_WaitAck();
	
	IIC_SendByte(0x40);  //控制字节
	IIC_WaitAck();
	
	IIC_SendByte(date);   //D\A的D
	IIC_WaitAck();       
	
	IIC_Stop();
}



unsigned char PCF8591_READ(unsigned char read_addr)
{
	unsigned char dat; 
	IIC_Start(); 
	IIC_SendByte(0x90);  //器件地址
	IIC_WaitAck();
	
	IIC_SendByte(read_addr);  //控制字节
	IIC_WaitAck();
	
	IIC_Start(); 
	IIC_SendByte(0x91);  //器件地址
	IIC_WaitAck();  
	
	dat=IIC_RecByte(); 
	IIC_SendAck(1); 
	
	IIC_Stop();
	return dat;
}


void main()
{
	unsigned char dat,i;
	system_Init();
	PCF8591_WRITE(0xf0);
	dat=PCF8591_READ(0x00);
	while(1)
	{
		i++;
		PCF8591_WRITE(0x00);
		if(i==200){
			dat=PCF8591_READ(0x01);
			// 0x01是光敏电阻,0X03是电位器
			i=0;
		}
		display_D_SMG(dat);
	}
}

你可能感兴趣的:(蓝桥杯单片机组,蓝桥杯,单片机)