lcd和服务器同时显示温度,为什么LCD1602不能同时显示温度和时间?

博主遇到一个编程挑战,目标是使用LCD1602显示DS18B20测得的温度和DS1302获取的时间。当尝试同时显示两者时,温度值显示为0,而时间正常。怀疑问题可能出在main函数编写上,硬件电路使用了51单片机STC89C52,LCD1602,DS18B20和DS1302。代码中提供了温度和时间的处理及显示函数,但存在冲突导致温度无法正确显示。
摘要由CSDN通过智能技术生成

程序目标:1602第一行显示温度,第二行显示时间。温度用DS18b20,时间用DS1302。

目前存在问题:用1602单独显示温度和时间都没得问题。合在一起显示就出现温度值为0,时间可以正常显示。

初步怀疑是我的main函数写法不对。请大家帮忙分析一下有到底有什么问题。谢谢~

硬件电路:用的51单片机STC89C52,LCD1602,DS18B20,DS1302。后门附图。

以下为程序,只有.C文件,头文件未包含,全部程序附在打包文件里面:

一、主程序  main.c

/**************************************************************************************

*                              LCD1602液晶显示实验                                                                                                  *

实现现象:下载程序后插上LCD1602液晶在开发板上,即可显示

注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。

***************************************************************************************/

#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

#include "lcd.h"

#include "temp.h"

#include

#include "DS1302.H"

typedef unsigned int u16;          //对数据类型进行声明定义

typedef unsigned char u8;

//u8 Disp[]="0Pechin Scien0e ";

//u8 Disp[8];

u8 displayData[9];

u16 DisplayDatatime[9];

bit TempDs18b20Flag;

bit Ds1302Flag;

/*******************************************************************************

* 函 数 名         : delay

* 函数功能                   : 延时函数

*******************************************************************************/

void delay1ms(void)   //误差 0us 延时1ms

{

unsigned char a,b;

for(b=199;b>0;b--)

for(a=1;a>0;a--);

}

void delayxms(u8 x)//延时X个ms

{

unsigned char a,b;

for(b=x;b>0;b--)

{

delay1ms();

}

}

/*******************************************************************************

* 函 数 名         : dataprosTime()

* 函数功能                   : 时间读取处理转换函数

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/

void dataprosTime()

{

Ds1302ReadTime();

DisplayDataTime[0] = TIME[2]/16+0x30;                                //时

DisplayDataTime[1] = TIME[2]%16+0x30;

DisplayDataTime[2] = 0x2d;//0100 0000

DisplayDataTime[3] = TIME[1]/16+0x30;                                //分

DisplayDataTime[4] = TIME[1]%16+0x30;

DisplayDataTime[5] = 0x2d;

DisplayDataTime[6] = TIME[0]/16+0x30;                                //秒

DisplayDataTime[7] = TIME[0]%16+0x30;

}

/*******************************************************************************

* 函 数 名         : datapros()

* 函数功能                   : 温度读取处理转换函数

* 输    入         : temp

* 输    出         : 无

*******************************************************************************/

void datapros(int temp)

{

//int temp;

//temp=Ds18b20ReadTemp();

float tp;

IF(temp< 0)                                //当温度值为负数

{

DisplayData[0] = 0x2d;           //   - 0010 1101

//因为读取的温度是实际温度的补码,所以减1,再取反求出原码

temp=temp-1;

temp=~temp;

tp=temp;

temp=tp*0.0625*100+0.5;

//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点

//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就

//算加上0.5,还是在小数点后面。

}

else

{

DisplayData[0] = 0x2b;//第0位数据,正温度第0位+号,00101011

tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量

//如果温度是正的那么,那么正数的原码就是补码它本身

temp=tp*0.0625*100+0.5;

//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点

//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就

//算加上0.5,还是在小数点后面。

}</

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我不能为您提供完整的代码,但我可以给您一些思路和建议。 首先,您需要连接LCD 1602和DS18B20到STC 15W系列单片机上。您可以使用STM32CubeMX进行配置和生成代码。然后,您需要使用ESP8266连接到服务器,上传数据并接收返回结果。您可以使用AT命令控制ESP8266或使用ESP8266 SDK进行编程。 以下是一些基本的代码: 1. 配置LCD 1602和DS18B20 ```c #include <reg52.h> #include "lcd1602.h" #include "ds18b20.h" sbit DQ = P1^4; // DS18B20连接到P1.4 void main() { float temp; char buf[16]; lcd_init(); // 初始化LCD 1602 ds18b20_init(DQ); // 初始化DS18B20 while(1) { temp = ds18b20_get_temp(DQ); // 获取温度 sprintf(buf, "Temp: %.1fC", temp); lcd_write_string(0, 0, buf); // 在LCD 1602上显示温度 delay_ms(1000); } } ``` 2. 连接ESP8266到服务器 ```c #include <reg52.h> #include "lcd1602.h" #include "ds18b20.h" #include "esp8266.h" sbit DQ = P1^4; // DS18B20连接到P1.4 void main() { float temp; char buf[16]; lcd_init(); // 初始化LCD 1602 ds18b20_init(DQ); // 初始化DS18B20 esp8266_init(); // 初始化ESP8266 while(1) { temp = ds18b20_get_temp(DQ); // 获取温度 sprintf(buf, "Temp: %.1fC", temp); lcd_write_string(0, 0, buf); // 在LCD 1602上显示温度 esp8266_connect("SSID", "password"); // 连接WiFi esp8266_send_data("POST /upload HTTP/1.1\r\n"); // 发送HTTP头 esp8266_send_data("Host: example.com\r\n"); esp8266_send_data("Content-Type: application/json\r\n"); sprintf(buf, "{\"temp\":%.1f}", temp); esp8266_send_data("Content-Length: %d\r\n", strlen(buf)); esp8266_send_data("\r\n"); esp8266_send_data(buf); // 发送数据 esp8266_disconnect(); // 断开WiFi delay_ms(10000); // 每10秒上传一次数据 } } ``` 请注意,这只是一个基本的框架,您需要根据您的具体需求进行修改和完善。同时,如果您不熟悉单片机编程和网络编程,建议您先学习相关知识再进行开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值