程序目标: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,还是在小数点后面。
}</