数码之家

 找回密码
 立即注册
搜索
查看: 1806|回复: 14

[C51] 请教高手帮忙看看这是咋回事呀?诚请点拨【已解决】

[复制链接]
发表于 2019-4-20 11:15:09 | 显示全部楼层 |阅读模式
本帖最后由 慕名而来 于 2019-4-21 11:33 编辑

问题如下:
起因:STC12LE单片机I/O口模拟IIC总线同时挂载了DS3231时基芯片和HTU21D温湿度传感器两个器件,两个器件单独通讯代码都没问题,他们公用IIC基础函数及各自的功能实现函数。
问题:两个器件同时使用时,时间数据采集与显示正常可用,但温度、湿度数据失准,表现为温度偏高湿度偏低。
个人瞎想:这个是否是两个同总线的器件之间发生某些关联了,但又搞不清是怎样的原因,是否需要分时轮询采集数据,而怎样实现分时采集我没谱还希望坛友指点一下具体方法!
补充:如果单纯的采集温湿度数据并通过串口在电脑的上显示的数据是正确的。
希望各位帮忙分析一下情况,也希望指点一下分时采集数据的方法及实现方式,先谢了!
因为没有添加按键、调时函数,显示的时间、日期只是随机的可以无视



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
发表于 2019-4-20 11:20:05 | 显示全部楼层
到电脑上正常?是同时采集吗?最好把代码贴上来
回复 支持 反对

使用道具 举报

发表于 2019-4-20 11:22:54 | 显示全部楼层
是不是读取数据时有中断之类发生了?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-20 11:23:34 | 显示全部楼层
ww5223017240 发表于 2019-4-20 11:20
到电脑上正常?是同时采集吗?最好把代码贴上来

对呀就是同时的,我不知道分时咋弄;下面是每隔3分钟更新一次数据并显示数据的代码:
/********温度输出函数****************/
void temperature_out(void)
{
uchar t_t,r_h;
uchar T_high,T_low,RH_high,RH_low;//温湿度操作用变量
uint TEMP,HUMI;
uchar min;
min=BCD_HEX(M_inute);//提取实时时间
if(min%3==0)        //逢3-6-9**相隔3分钟更新数据(1分钟内可多次更新数据)
{
//温度数据更新
TEMP=HTU21D_Work(0xf3);//触发开启温度检测
T_high=TEMP/100;
t_t=TEMP%100;
if((t_t%10)<5)       
T_low=t_t/10;
else        T_low=(t_t/10)+1;
PutGB_16_16(11,1,(T_high/10),Yellow,Black);//整数10位
PutGB_16_16(12,1,(T_high%10),Yellow,Black);//整数各位
PutGB_16_16(13,1,10,Yellow,Black);//点
PutGB_16_16(14,1,T_low,Yellow,Black);//小数10位
PutGB_16_16(15,1,11,Yellow,Black);//℃

//dat_out(T_high);
//湿度数据更新
HUMI=HTU21D_Work(0xf5);//触发开启湿度检测
RH_high=HUMI/100;
r_h=HUMI%100;
if((r_h%10)<5)
RH_low=r_h%10;
else RH_low=(r_h%10)+1;
PutGB_16_16(21,1,(RH_high/10),Yellow,Black);
PutGB_16_16(22,1,(RH_high%10),Yellow,Black);
PutGB_16_16(23,1,10,Yellow,Black);
PutGB_16_16(24,1,RH_low,Yellow,Black);
PutGB_16_16(25,1,12,Yellow,Black);
}
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-20 11:53:30 | 显示全部楼层
温力口 发表于 2019-4-20 11:22
是不是读取数据时有中断之类发生了?

已经关闭了所有与中断相关的部分,温度仍然高约2.5度。
这是主函数:
void main(void)
{
LCD_Init();                //TFT-LCD初始化
HTU21D_init();//传感器初始化
ClearScreen(Black);        //全屏涂黑
P4SW=0xff;//设置P4口做I/O口使用
DS3231_init();//时间初始化
ED=0;//开启背光
while(1)
{
time_out();//显示时间
temperature_out();//显示温湿度
}
}
回复 支持 反对

使用道具 举报

发表于 2019-4-20 12:01:42 | 显示全部楼层
你电脑串口显示数据的时候小屏幕上同时显示数据的吗?两个不一样?
回复 支持 反对

使用道具 举报

发表于 2019-4-20 12:08:05 | 显示全部楼层
i2c器件不是有地址的吗,不同地址的器件不会同时回应主机,数据不会出错啊,
回复 支持 反对

使用道具 举报

发表于 2019-4-20 14:47:53 | 显示全部楼层
while(1)
{
time_out();//显示时间
temperature_out();//显示温湿度
}
两函数之间加一延时看看?或者把两函数前后对调看看?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-20 20:57:42 | 显示全部楼层
ww5223017240 发表于 2019-4-20 12:01
你电脑串口显示数据的时候小屏幕上同时显示数据的吗?两个不一样?

不是同时的,因为这个问题我专门建立了一个测试用的工程,专门用于采集数据并且发送电脑串口(我用的是电脑原生COM1口经232的通信线路),经过串口助手显示16进制数据。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-20 21:00:33 | 显示全部楼层
zhkrid 发表于 2019-4-20 12:08
i2c器件不是有地址的吗,不同地址的器件不会同时回应主机,数据不会出错啊, ...

是的,DS3231的读写地址为0xd0,0xd1;HTU21D的读写地址为0x80,0x81,如果没有这两个地址的操作也无法完成总线读写的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-20 21:06:48 | 显示全部楼层
钟义亭 发表于 2019-4-20 15:33
每个接到I2C总线上的器件 都有唯一的地址。
主机与其它器件间的数据传送 可以是由主机发送数据 到其它器件 ...

多谢你的资料与详细解释,其实我也是认为总线会自己根据相关器件地址自行分配数据的,但出现了问题就难免考虑的复杂了,或许这个问题并非人工干预分时的问题,还在迷糊中。
回复 支持 反对

使用道具 举报

发表于 2019-4-20 21:45:20 | 显示全部楼层
慕名而来 发表于 2019-4-20 20:57
不是同时的,因为这个问题我专门建立了一个测试用的工程,专门用于采集数据并且发送电脑串口(我用的是电 ...

你要在同一个工程里测试才能知道是不是真的不准吧,肯定不是I2C的问题,是你其他的问题,要么是延迟,要么是显示,现在原来的工程里加个串口输出试试看吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-20 22:10:28 | 显示全部楼层
ww5223017240 发表于 2019-4-20 21:45
你要在同一个工程里测试才能知道是不是真的不准吧,肯定不是I2C的问题,是你其他的问题,要么是延迟,要 ...

另外建立的工程也只是将温湿度相关代码移植过去加上串口通信代码测试的,在原有工程里已经试过LCD与串口助手同时显示数据但是不成功,试验LCD不显示时间只显示温湿度时数据有所好转但仍然偏高,看来应该是有其他问题,再继续调试吧,多谢指点。
回复 支持 反对

使用道具 举报

发表于 2019-4-21 00:44:29 | 显示全部楼层
慕名而来 发表于 2019-4-20 22:10
另外建立的工程也只是将温湿度相关代码移植过去加上串口通信代码测试的,在原有工程里已经试过LCD与串口 ...

怎么会不能同时显示呢?屏接线占用串口了?我感觉是不是你屏接线的问题?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-21 11:49:23 | 显示全部楼层
本帖最后由 慕名而来 于 2019-4-21 12:05 编辑

问题终于解决了,可笑的是原因竟然是因为模块的连线的问题,我是用了一段USB线连接的,这段线的质量也是没的说,外皮紧实内裹锡箔纸,锡箔纸外部还有挺密实的屏蔽网,这个线的选用是考虑到信号传输的可靠性,万没想到的是由于线缆结构的原因,不但导电优良而且热量传导也很棒,当这段线被夹在屏底板与电路板之间时,屏背光的热量加上电路板上3.3V稳压块的热量经过线皮的导入了传感器,于是就那样了。
拔掉外皮露出线丝就云开雾散一切静好了。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-11 22:55 , Processed in 0.390001 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表