蓝桥杯单片机PCF8591数据读取——湿度检测

蓝桥杯单片机PCF8591数据读取——湿度检测

蓝桥杯单片机PCF8591数据读取进行转换为湿度检测,因为在蓝桥杯提供的单片机上面并没有湿度检测的芯片,所以考察的时候使用的就是PCF8591芯片读取到的数据进行替换,具体的数据格式一般的考察形式有两种,一种是0-255整数形式;另外一种就是0-5浮点型形式的数据。但是其实也就是一个数据的转换而已。

无论怎么考察都是(0-255) 与(0-5)的对应转换。因为使用PCF8591读取出来的数据是整数形式的0-255,所以需要显示0-5的浮点数形式数据时候,需要进行必要的转换。

还有一个就是PCF8591芯片读取的地址位置不同,对应读取的外设有一点区别。读取地址0x01的时候读取的时候滑动变阻器的阻值,读取地址0x03的时候读取的是光敏电阻的阻值,但是两者也有一个共同之处就是,两者的阻值范围都是0-255,需要进行转换的时候都是一样的转换公式。

# include "reg52.h"
# include "intrins.h"
# include "iic.h"
typedef unsigned char u8;
typedef unsigned int u16;
u8 shuma[12] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xbf};
u8 adc_value;
u8 adc_table[3];
u8 value_table[3];
// 初始化外设函数
void init_system()
{

P2 = (P2 & 0x1f) | 0x80;
P0 = 0xff;
P2 = (P2 & 0x1f);
P2 = (P2 & 0x1f) | 0xa0;
P0 = 0x00;
P2 = (P2 & 0x1f);
P2 = (P2 & 0x1f) | 0xc0;
P0 = 0x00;
P2 = (P2 & 0x1f);
}
// 选通函数
void select(u8 local)
{

switch(local)
{

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()
{

u8 t = 200;
while(t--);
}
void display(u8 local, u8 num)
{

select(6);
P0 = 0x80 >> (local - 1);
P2 = P2 & 0x1f;
select(7);
P0 = num;
P2 = P2 & 0x1f;
// 简单延时
delay();
}
void close_display()
{

// 消隐
select(6);
P0 = 0x00;
P2 = P2 & 0x1f;
}
// 写内容到地址add里面
void adc_write(u8 add)
{

IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Stop();
}
// 读取地址add里面的内容
u8 adc_read(u8 add)
{

u8 temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
temp = IIC_RecByte();
IIC_WaitAck();
IIC_Stop();
return temp;
}
// 延时两毫秒 (软件延时)
void Delay2ms()		//@11.0592MHz
{

u8 i, j;
_nop_();
_nop_();
i = 22;
j = 128;
do
{

while (--j);
} while (--i);
}
void main()
{

float volt;
init_system();
adc_write(0x01);	  // 滑动变阻器的阻值(0x03光敏变阻器)
while(1)
{

adc_value = adc_read(0x01);				// 读取滑动变阻器的阻值(可以通过滑动RB3进行查看变化)
// 读取的地址为0x03的时候,读取的是光敏变阻器的阻值(可以通过调节亮度来进行观察变化)
adc_table[0] = adc_value % 10;
adc_table[1] = adc_value / 10 % 10;
adc_table[2] = adc_value / 100;
// display(1,shuma[adc_table[0]]); // 整数0-255的显示形式
// display(2,shuma[adc_table[1]]);
// display(3,shuma[adc_table[2]]);
// close_display();
volt = (adc_value / 255.0) * 5.0;
value_table[2] = (u8)(volt);			   // 直接取出个位数数值
value_table[1] = (u8)(volt*10) % 10;       // 放大十倍,计算十分位的数值
value_table[0] = (u8)(volt*100) % 10;	  // 放大一百倍,计算百分位的数值
// 浮点数0-5的显示形式
display(3,shuma[value_table[2]] & 0x7f);	// 各位数数值处理小数点操作 
display(2,shuma[value_table[1]]);
display(1,shuma[value_table[0]]);
close_display();
Delay2ms();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115104.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号