基于DS18B20+液晶1602构成的高精度温度计
下载 基于DS18B20+液晶1602构成的高精度温度计 源程序
/**************************************************
; 伟维电子单片机工作室
; http://www.mdizi.com
; Copyright 2009 mdizi McuStudio
; All rights Reserved
;作者:周洵名 QQ:491069539 电话:13528913615
;连线图:
; DB0---DPROT.0 DB4---DPROT.4 RS-------------P1.2
; DB1---DPROT.1 DB5---DPROT.5 RW-------------P1.3
; DB2---DPROT.2 DB6---DPROT.6 E--------------P1.4
; DB3---DPROT.3 DB7---DPROT.7 VLCD接10K可调电阻到GND*
; DQ----P1.1
;AT89S52 晶振频率为11.0592MHz 指令周期:1.085069us
本程序在:
本站的单片机学习板上调试完成: 型号:TL-SST89E、TL-AT89S51、TL-SST89H、TL-SST89A、TL-STC89C、TL-Min51
;功能说明:1602液晶显示温度程序,正负温度自动转换。
温度测量范围:-55℃~125℃;
温度测量精度:0.0625℃
显示精度: 0.0625
;********************************************************************************************/
#include "reg52.h"//头文件
#include "intrins.h"
#define uchar unsigned char//宏定义
#define uint unsigned int//宏定义
sbit RS=P1^2;//定义I/O的硬件接口
sbit RW=P1^3;
sbit E=P1^4;
sbit led_7=P1^7;//;;;LED秒闪烁
sbit DQ=P1^1;////定义I/O的硬件接口--温度
uint Temperature;//温度暂存单元
uint Negative_Temperature;//负温度暂存单元
bit Negative_sign=1;//负温度标志
unsigned long TEMP;//长整形单元
#define DPDR P0//并行数据接口定义
uchar code DispTab_1[]={'0','1','2','3','4','5','6','7','8','9',' ','-'};//1602:0-9 数字
uchar DispBuf[6]; //6字节的显示缓冲区
char char_char_1[]={" www.mdizi.com "};//定义字符串
void delay(uint z)//1ms延时
{
uchar x,x1;
for(;z>0;z--)
{
for(x=0;x1;
DQ=1;
}
}
read_DB18B20()//读DB18B20
{
uint temp_1;
uchar i;
for(i=0;i>1;
DQ=1;
_nop_();
DQ=0;
_nop_();
DQ=1;
_nop_();
_nop_();
_nop_();
_nop_();
if(DQ==1)
temp_1=temp_1|0x8000;
//else
// temp_1=temp_1|0x0000;
delay1(5);//程序5次延时时间为 54.25us
}
return temp_1;//返回温度值
}
void Negative()//温度为零度以下时,将变换温度
{
Negative_Temperature=Temperature;
Negative_Temperature=Negative_Temperature&0xf800;
if(Negative_Temperature==0xf800)
{
Temperature=~Temperature;
Temperature=Temperature+1;
Negative_sign=0;
}
}
void main()
{
LCD_init();//LCD复位
while(1)
{
DB18B20_init();//DB18B20复位
write_DB18B20(0xcc);//写DB18B20;0xcc 跳过 ROM 指令
write_DB18B20(0x44);//写DB18B20;0x44 启动温度转换指令
delay(1000);//延时1秒
DB18B20_init();//DB18B20复位
write_DB18B20(0xcc);//写DB18B20;0xcc 跳过 ROM 指令
write_DB18B20(0xbe);//写DB18B20;0xbe 读温度指令
Temperature=read_DB18B20();//读 DB18B20 温度,读出的温度在 Temperature
Negative();//温度为零度以下时,将变换温度,否则不变
TEMP=Temperature*0.0625*10000;//转换成 十进制(*10000,表示,显示到小数点后4位:0.0000)
write_Data_String();//显示温度
}
}