【蓝桥杯13】——PCF8591的应用(AD转换)

功能概述
  1. PCF8591是具有IIC接口的8位A/D和D/A转换芯片
  2. 如果硬件地址引脚A0、A1、A2均接地,那么,PCF8591的设备的读操作地址为:0x91;而写操作地址则为:0x90。
  3. 蓝桥杯单片机设计与开发赛项使用的CT107D单片机开发平台中,PCF8591的三个硬件引脚地址均接地,两路模拟信号均为单端输入,分别是:
    • 光敏传感器接到AIN1,通道1;控制寄存器应写入:0x01。
    • 电位器Rb2接到AIN3,通道3;控制寄存器应写入:0x03。
      在这里插入图片描述
A/D转换应用开发流程
  1. 一个A/D转换的周期的开始,总是在发送有效的读设备地址给PCF8591之后,A/D转换在应答时钟脉冲的后沿被触发。PCF8591的A/D转换程序设计流程,可以分为四个步骤:

    • 发送写设备地址,选择IIC总线上的PCF8591器件。
    • 发送控制字节,选择模拟量输入模式和通道。
    • 发送读设备地址,选择IIC总线上的PCF8591器件。
    • 读取PCF8591中目标通道的数据。

    采样可变电阻电压与光敏电阻电压

    1. 光敏电阻Rd1接到PCF8591的AIN1引脚,可调电阻Rb2接到PCF8591的AIN3引脚。
    2. 独立按键S4为通道切换选择,系统上电的时候,采样通道1光敏电阻的数据并显示在数码管上。按下S4松开后,切换到通道3采样可调电阻的数据并显示;再次按下S4松开后,又切换会通道1采样光敏电阻数据,如此循环往复。
      数码管的显示格式,前三位显示通道号,后三位显示相应通道读取的数据。
#include <STC15F2K60S2.H>  
#include <IIC.H>
#include <SMG_SHOW.H>

void DisplaySMG_ADC(unsigned char channel, unsigned char dat);
void read_AIN1();
void read_AIN3();
void key();
void delay_ms(int n);
void selectHC(unsigned char select);
void show(unsigned char w,unsigned char n);

unsigned char table[]={
    
    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
sbit S4=P3^3;
unsigned char data1;//通道1光敏电阻电压
unsigned char data3;//通道3可调电阻电压
unsigned char flag=0; //选择对应通道标志位

void main()
{
    
    
    selectHC(5);P0=0X00;P2&=0X1F;
	while(1)
	{
    
    
		key();
		if(flag==0)
		{
    
    
			read_AIN1();
		}
		if(flag==1)
		{
    
    
			read_AIN3();
		}
	}
}

void read_AIN1()
{
    
    
    //进行写操作,选择光敏传感器AIN1,通道1
	IIC_Start();
	IIC_SendByte(0x90);	//PCF8591的写设备地址
	IIC_WaitAck();      //等待从机应答
	IIC_SendByte(0x01);	//写入PCF8591的控制字节
	IIC_WaitAck();
	IIC_Stop();
	DisplaySMG_ADC(1,data1);

	//进行读操作,通道1
	IIC_Start();
	IIC_SendByte(0x91);	 //PCF8591的读设备地址
	IIC_WaitAck();
	data1=IIC_RecByte(); //读取PCF8591通道1的数据 
	IIC_Ack(0);	         //产生非应答信号
	IIC_Stop();
	DisplaySMG_ADC(1, data1);
}

void read_AIN3()
{
    
    
    //进行写操作,选择电位器AIN3,通道3
	IIC_Start();
	IIC_SendByte(0x90);	//PCF8591的写设备地址
	IIC_WaitAck();      //等待从机应答
	IIC_SendByte(0x03);	//写入PCF8591的控制字节
	IIC_WaitAck();
	IIC_Stop();
	DisplaySMG_ADC(3,data3);

	//进行读操作,通道3
	IIC_Start();
	IIC_SendByte(0x91);	 //PCF8591的读设备地址
	IIC_WaitAck();
	data3=IIC_RecByte(); //读取PCF8591通道1的数据 
	IIC_Ack(0);	         //产生非应答信号
	IIC_Stop();
	DisplaySMG_ADC(3, data3);
}


void key()
{
    
    
	if(S4 == 0)
	{
    
    
		delay_ms(1);
		if(S4 == 0)
		{
    
    
			if(flag == 0)
			{
    
    
				flag = 1;
				while(S4 == 0)
				{
    
    
					DisplaySMG_ADC(1,data1);
				}
			}
			else if(flag == 1)
			{
    
    
				flag = 0;
				while(S4 == 0)
				{
    
    
					DisplaySMG_ADC(3,data3);
				}
			}
		}
	}
}

void DisplaySMG_ADC(unsigned char channel, unsigned char dat)
{
    
    
	show(0, table[10]);
	delay_ms(1);
	show(1, table[channel]);
	delay_ms(1);
	show(2, table[10]);
	delay_ms(1);
			
	show(3, 0xFF);
	show(4, 0xFF);
	
	show(5, table[dat / 100]);
	delay_ms(1);
	show(6, table[(dat % 100) / 10]);
    delay_ms(1);
	show(7, table[dat % 10]);
	delay_ms(1);
}

void selectHC(unsigned char select)
{
    
    
	switch(select)
	{
    
    
		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; 
  }

}
void delay_ms(int n)
{
    
    
	int i,j;
	for(i=n;i>0;i--)
		for(j=110;j>0;j--);
}
void show(unsigned char w,unsigned char n)  
{
    
    
	selectHC(6);
	P0=0X01<<w;
	selectHC(7);
	P0=n;
	delay_ms(5);
	P0=0xff;
	P2&=0x1f;
}

猜你喜欢

转载自blog.csdn.net/z3447643805/article/details/113980924