温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,汇文网负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
网站客服:3074922707
2023
温度传感器
DS18B20ATC89S51
单片机
LCD1602
液晶显示
测温
可调
时钟
系统
程序
完整版
基于ds18b20 STC89s51单片机测温系统LCD1602液晶
可调时钟+温度显示
〔C程序完整版〕
温度传感器的种类众多,在应用与高精度、高可靠性的场合时 DALLAS〔达拉斯〕公司生产的 DS18B20 温度传感器当仁不让。超小的体积,超低的硬件开消,抗干扰能力强,精度高,附加功能强,使得 DS18B20 更受欢送。对于我们普通的电子爱好者来说,DS18B20 的优势更是我们学习单片机技术和开发温度相关的小产品的不二选择。了解其工作原理和应用可以拓宽您对单片机开发的思路。 如果要更全的资料请搜索“完整的ds18b20中文资料.pdf “。
DS18B20 的主要特征:
„ 全数字温度转换及输出。
„ 先进的单总线数据通信。
„ 最高 12 位分辨率,精度可达土 0.5摄氏度。
„ 12 位分辨率时的最大工作周期为 750 毫秒。
„ 可选择寄生工作方式。
„ 检测温度范围为–55°C ~+125°C (–67°F ~+257°F)
„ 内置 EEPROM,限温报警功能。
„ 64 位光刻 ROM,内置产品序列号,方便多机挂接。
„ 多样封装形式,适应不同硬件系统。
DS18B20 引脚功能:
·GND 电压地 ·DQ 单数据总线 ·VDD 电源电压 ·NC 空引脚
DS18B20 工作原理及应用:
DS18B20 的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。其一个工作周期可分为两个局部,即温度检测和数据处理。在讲解其工作流程之前我们有必要了解 18B20的内部存储器资源。18B20 共有2种形态的存储器资源,它们分别是:
1> ROM 只读存储器,用于存放 DS18B20ID 编码,其前 8 位是单线系列编码〔DS18B20 的编码是19H〕 ,后面48 位是芯片唯一的序列号,最后 8位是以上 56的位的 CRC码〔冗余校验〕。数据在出产时设置不由用户更改。DS18B20 共 64 位 ROM。
2> RAM 数据暂存器,用于内部计算和数据存取,数据在掉电后丧失,DS18B20 共9 个字节 RAM,每个字节为 8 位。第1、2 个字节是温度转换后的数据值信息,第 3、4 个字节是用户 EEPROM〔常用于温度报警值储存〕的镜像。在上电复位时其值将被刷新。第 5 个字节那么是用户第 3 个 EEPROM的镜像。第 6、7、8 个字节为计数存放器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。第 9 个字节为前 8个字节的 CRC码。EEPROM 非易失性记忆体,用于存放长期需要保存的数据,上下限温度报警值和校验数据, DS18B20共3位EEPROM,并在 RAM 都存在镜像,以方便用户操作。
C程序〔独家专售〕:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define LCDIO P2
sbit DQ=P3^7;//ds18b20与单片机连接口
sbit rs=P3^0;
sbit rd=P3^1;
sbit lcden=P3^2;
sbit s1=P1^3;
sbit s2=P1^4;
sbit s3=P1^5;
uchar data disdata[5];
uint tvalue;//温度值
uchar tflag;
uchar count,s1num;
char miao,shi,fen,day=18,mon=11,week=0;
uint year=2023;
uchar code table[]=" 2010-11-18 THU";
uchar code table1[]="00:00:00 000.0 C";
uchar code table2[]= "THUFRISATSUNMONTUEWES";
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
rs=0;
rd=0;
lcden=0;
P2=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
rs=1;
rd=0;
lcden=0;
P2=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
uchar num;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<15;num++)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<16;num++)
{
write_date(table1[num]);
delay(5);
}
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void write_sfm(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void write_md(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void write_year(uchar add,uint date)
{
uchar qian,bai,shi,ge;
qian=date/1000;
bai=date%1000/100;
shi=date%1000%100/10;
ge=date%1000%100%10;
write_com(0x80+add);
write_date(0x30+qian);
write_date(0x30+bai);
write_date(0x30+shi);
write_date(0x30+ge);
}
void write_week(uchar add,uchar date)
{
uchar num;
write_com(0x80+add);
for(num=0;num<3;num++)
{
write_date(table2[date]);
date++;
delay(5);
}
}
void display()
{
mon++;
if(mon==13)
{
mon=1;
year++;
write_year(1,year);
}
write_md(6,mon);
}
void keyscan()
{
rd=0;
if(s1==0)
{
delay(5);
if(s1==0)
{
s1num++;//全局变量
while(!s1);
if(s1num==1)//调时间时//
{
TR0=0;//定时器停止//
write_com(0x80+4);
write_com(0x0f);//光标闪射//
}
if(s1num==2)//调时间时//
{
write_com(0x80+7);
}
if(s1num==3)//调时间时//
{
write_com(0x80+10);
}
if(s1num==4)//调时间时//
{
write_com(0x80+14);
}
if(s1num==5)//调时间时//
{
write_com(0x80+0x40+1);
}
if(s1num==6)//调时间分//
{
write_com(0x80+0x40+4);
}
if(s1num==7)//调时间秒
{
write_com(0x80+0x40+7);//光标位置//
}
if(s1num==8)
{
s1num=0;//s1num清零//
write_com(0x0c);//光标不闪烁//
TR0=1;//定时器又开始//
}
}
}
if(s1num!=0)
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
if(s1num==7)
{
miao++;
if(miao==60)
miao=0;
write_sfm(6,miao);
write_com(0x80+0x40+7);
}
if(s1num==6)
{
fen++;
if(fen==60)
fen=0;
write_sfm(3,fen);
write_com(0x80+0x40+4);
}
if(s1num==5)
{
shi++;
if(shi==24)
shi=0;
write_sfm(0,shi);
write_com(0x80+0x40+1);
}
if(s1num==3)
{
week=week+3;
if(week==21)
week=0;
day++;
if(((mon==1)||(mon==3)||(mon==5)||(mon==7)||(mon==8)||(mon==10)||(mon==12))&&(day==32))
{ day=1;
}
if(((mon==4)||(mon==6)||(mon==9)||(mon==11))&&(day==31))
{ day=1;