一,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版权协议,转载请附上原文出处链接和本声明。