51单片机实现DS18B20采集温度,并且用1602显示出来
这里仅提供主函数部分,如果需要源代码和仿真图,请联系作者qq256379446
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include "temp.h"
#include "lcd.h"
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
u8 DisplayData[8];
u8 code ASCII[13] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
u8 xh[]="Settemp";
u8 tem=40;
u8 tmp=10;
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 数 名 : keypros
* 函数功能 : 按键函数
*******************************************************************************/
void keypros()
{
if(k1==0)
{
delay(1000);
if(k1==0)
tem++;
while(!k1);
}
if(k2==0)
{
delay(1000);
if(k2==0)
tem--;
while(!k2);
}
if(k3==0)
{
delay(1000);
if(k3==0)
tmp++;
while(!k3);
}
if(k4==0)
{
delay(1000);
if(k4==0)
tmp--;
while(!k4);
}
}
/*******************************************************************************
* 函 数 名 : datapros()
* 函数功能 : 温度读取处理转换函数
* 输 入 : temp
* 输 出 : 无
*******************************************************************************/
void datapros(int temp)
{
float tp;
if(temp< 0) //当温度值为负数
{
DisplayData[0] = 0x40; // -
//因为读取的温度是实际温度的补码,所以减1,再取反求出原码
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100;
}
else
{
DisplayData[0] = 0x00;
tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
//如果温度是正的那么,那么正数的原码就是补码它本身
temp=tp*0.0625*100;
}
DisplayData[1] = (temp % 10000 / 1000);
DisplayData[2] = (temp % 1000 / 100);
DisplayData[3] = 10;
DisplayData[4] = (temp / 10 % 10);
DisplayData[5] = (temp % 10);
}
/*******************************************************************************
* 函数名 :DigDisplay()
* 函数功能 :数码管显示函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void DigDisplay()
{ DisplayOneChar(10,0,ASCII[tem/10]);
DisplayOneChar(11,0,ASCII[tem%10]);
DisplayOneChar(13,0,ASCII[tmp/10]);
DisplayOneChar(14,0,ASCII[tmp%10]);
DisplayOneChar(4,1,ASCII[DisplayData[1]]);
DisplayOneChar(5,1,ASCII[DisplayData[2]]);
DisplayOneChar(6,1,ASCII[DisplayData[3]]);
DisplayOneChar(7,1,ASCII[DisplayData[4]]);
DisplayOneChar(8,1,ASCII[DisplayData[5]]);
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
LcdInit(); //lcd初始化函数
LcdShowStr(2,0,xh);
while(1)
{ keypros();
datapros(Ds18b20ReadTemp()); //数据处理函数
DigDisplay();//数码管显示函数
}
}