蓝桥杯单片机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(); } }