蓝桥杯13——PCF8591的应用(AD转换)
Posted 谏书稀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯13——PCF8591的应用(AD转换)相关的知识,希望对你有一定的参考价值。
功能概述
- PCF8591是具有IIC接口的8位A/D和D/A转换芯片
- 如果硬件地址引脚A0、A1、A2均接地,那么,PCF8591的设备的读操作地址为:0x91;而写操作地址则为:0x90。
- 蓝桥杯单片机设计与开发赛项使用的CT107D单片机开发平台中,PCF8591的三个硬件引脚地址均接地,两路模拟信号均为单端输入,分别是:
- 光敏传感器接到AIN1,通道1;控制寄存器应写入:0x01。
- 电位器Rb2接到AIN3,通道3;控制寄存器应写入:0x03。
A/D转换应用开发流程
-
一个A/D转换的周期的开始,总是在发送有效的读设备地址给PCF8591之后,A/D转换在应答时钟脉冲的后沿被触发。PCF8591的A/D转换程序设计流程,可以分为四个步骤:
- 发送写设备地址,选择IIC总线上的PCF8591器件。
- 发送控制字节,选择模拟量输入模式和通道。
- 发送读设备地址,选择IIC总线上的PCF8591器件。
- 读取PCF8591中目标通道的数据。
采样可变电阻电压与光敏电阻电压
- 光敏电阻Rd1接到PCF8591的AIN1引脚,可调电阻Rb2接到PCF8591的AIN3引脚。
- 独立按键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转换)的主要内容,如果未能解决你的问题,请参考以下文章
蓝桥杯15——PCF8591与24C02综合应用:智能照明自动控制器