蓝桥杯单片机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();
	    
	}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 手把手撸个博客网站

    手把手撸个博客网站node-webserver-blog-public源码地址博客地址CSDN运行项目前必读三个项目中各种各样的授权参数已全部修改成自己的授权参数,忘悉知!!!!忘悉知!!!!忘悉知!!!!自己创建一个数据库名称就可以了,表是运行node时候自动创建好以myblog3为数据库名称,admin登录页面有个一键生成地方生成账号:admin密码:123,只能生成一次,因…

    2022年7月14日
    9
  • Linux系统中修改文件内容「建议收藏」

    Linux系统中修改文件内容「建议收藏」1、进入文件:vim文件名vimcommon.js2、查找待修改内容位置:(1)按住shift输入“:”,使文件变成可查询状态(2)输入“/”+要修改的内容,回车(例如:要修改服务器地址和端口号)3、修改内容定位到要修改的位置后按i键变成可编辑状态,对要修改的内容进行修改4、退出按ESC键,退出修改状态5、保存(不保存)修改:保存修改:(1)按住shift输入“:”,使文件变成可查询状态(2)输入…

    2022年7月26日
    6
  • ida反编译出来代码能直接用吗_xrl指令

    ida反编译出来代码能直接用吗_xrl指令IDAPro直接修改指令—以将jnz修改为jz为例子理清程序的逻辑后,采用最简单的办法控制程序的执行路径——修改指令。首先,通过菜单栏中Options/General/Disassembly/Numberofopcodebytes设置IDA使其显示指令的机器码。一般修改为16jnz的机器码为75,只需将其改为jz的机器码74。修改方法:Edit/Patchpr…

    2025年5月30日
    1
  • W3C 标准_w3c规范

    W3C 标准_w3c规范W3C标准,即一系列标准的集合,他的本质是结构标准语言。就像平时使用的HTML、CSS等都需要遵守这些标准。万维网联盟创建于1994年,是web技术领域最具权威和影响力的国际中立性技术标准机构。它有效促进了web技术相互之间的兼容。就像网页是由三部分组成:结构、表现和行为。那么他对应的标准也分三方面:1.结构化…

    2022年9月17日
    0
  • 在线IEEE浮点二进制计算器工具「建议收藏」

    在线IEEE浮点二进制计算器工具「建议收藏」在线IEEE浮点二进制计算器工具在线IEEE浮点二进制计算器工具这是一个小计算器,旨在帮助您了解用于浮点计算的IEEE754标准。它是用JavaScript实现的,并且可以与Chrome和Firefox的最新桌面版本一起使用。我尚未在其他浏览器上进行过测试。如果您在左侧的三个框中之一中输入浮点数字,然后按Enter键,您将在右侧看到该数字的位模式。您可以输入使用通常在编程语言接受的语法,比如数字42,2.345,12E-3,等;您可以输入值NaN,Inf和-Inf直接;并且您还可以使用语法输入分

    2022年10月20日
    0
  • 常量字符串过长的解决办法_编译异常和运行异常有哪些

    常量字符串过长的解决办法_编译异常和运行异常有哪些如果使用String str = “这是一个很长很长很长 你需要的字符串。”; 出现异常不能正常编译运行时,可以使用下方:StringBuilder sb = new StringBuilder();sb.append(“这是一个很长很长”);sb.append(“很长 你需要的字符串”);字符串太长或字符串其他情况下可使用 : StringBuilder sb = new StringBuilder()…

    2022年8月19日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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