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

Posted 谏书稀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯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;

以上是关于蓝桥杯13——PCF8591的应用(AD转换)的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯pcf8591读和写

蓝桥杯pcf8591读和写

AD转换

蓝桥杯15——PCF8591与24C02综合应用:智能照明自动控制器

Proteus仿真PCF8591 AD电压采集8X8点阵显示

AD-DA转换(PCF8591)