51+DS1302+DS18B20+LCD1602显示时间温度可调时文档格式.docx
- 文档编号:17042472
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:23
- 大小:58.25KB
51+DS1302+DS18B20+LCD1602显示时间温度可调时文档格式.docx
《51+DS1302+DS18B20+LCD1602显示时间温度可调时文档格式.docx》由会员分享,可在线阅读,更多相关《51+DS1302+DS18B20+LCD1602显示时间温度可调时文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
DS1302的寄存器
DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见数据手册。
此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。
时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。
DS1302与RAM相关的寄存器分为两类:
一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;
另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
温度传感器的种类众多,在应用与高精度、高可靠性的场合时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>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineLCDIOP2
sbitDQ=P1^3;
//ds18b20与单片机连接口
sbitrs=P1^0;
sbitrd=P1^1;
sbitlcden=P1^2;
sbitacc0=ACC^0;
//移位时的第0位
sbitacc7=ACC^7;
//移位时用的第7位
ucharsecond,minute,hour,day,month,year,week,count=0;
ucharReadValue,num,time;
uinttvalue;
//温度值
uchartflag;
ucharcodetable[]={"
2010-11-29MON"
};
ucharcodetable1[]={"
15:
45:
00000.0C"
ucharcodetable2[]="
THUFRISATSUNMONTUEWES"
;
uchardatadisdata[5];
sbitDATA=P0^1;
//时钟数据接口
sbitRST=P0^2;
sbitSCLK=P0^0;
sbitmenu=P3^5;
//菜单
sbitadd=P3^6;
//加一
sbitdec=P3^7;
//减一
voiddelay(uintz)
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
voiddelay1(uintz)
for(;
z>
z--);
voidwrite_com(ucharcom)
rs=0;
rd=0;
lcden=0;
P2=com;
delay(5);
lcden=1;
voidwrite_date(uchardate)
rs=1;
P2=date;
voidinit()
ucharnum;
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);
write_date(table1[num]);
}
voidWrite1302(uchardat)
uchari;
SCLK=0;
//拉低SCLK,为脉冲上升沿写入数据做好准备
delay1
(2);
//稍微等待,使硬件做好准备
for(i=0;
i<
8;
i++)//连续写8个二进制位数据
{
DATA=dat&
0x01;
//取出dat的第0位数据写入1302
delay
(2);
SCLK=1;
//上升沿写入数据
//重新拉低SCLK,形成脉冲
dat>
>
=1;
//将dat的各数据位右移1位,准备写入下一个数据位
}
voidWriteSet1302(ucharCmd,uchardat)
RST=0;
//禁止数据传递
//确保写数居前SCLK被拉低
RST=1;
//启动数据传输
Write1302(Cmd);
//写入命令字
Write1302(dat);
//写数据
//将时钟电平置于已知状态
ucharRead1302(void)
uchari,dat;
i++)//连续读8个二进制位数据
//将dat的各数据位右移1位,因为先读出的是字节的最低位
if(DATA==1)//如果读出的数据是1
dat|=0x80;
//将1取出,写在dat的最高位
//将SCLK置于高电平,为下降沿读出
//稍微等待
//拉低SCLK,形成脉冲下降沿
}
returndat;
//将读出的数据返回
ucharReadSet1302(ucharCmd)
uchardat;
//拉低RST
dat=Read1302();
//读出数据
voidInit_DS1302(void)
{
WriteSet1302(0x8E,0x00);
//根据写状态寄存器命令字,写入不保护指令
WriteSet1302(0x80,((0/10)<
<
4|(0%10)));
//根据写秒寄存器命令字,写入秒的初始值
WriteSet1302(0x82,((45/10)<
4|(45%10)));
//根据写分寄存器命令字,写入分的初始值
WriteSet1302(0x84,((15/10)<
4|(15%10)));
//根据写小时寄存器命令字,写入小时的初始值
WriteSet1302(0x86,((29/10)<
4|(29%10)));
//根据写日寄存器命令字,写入日的初始值
WriteSet1302(0x88,((11/10)<
4|(11%10)));
//根据写月寄存器命令字,写入月的初始值
WriteSet1302(0x8c,((10/10)<
4|(10%10)));
//nian
WriteSet1302(0x8a,((4/10)<
4|(4%10)));
voidDisplaySecond(ucharx)
uchari,j;
i=x/10;
j=x%10;
write_com(0xc7);
write_date(0x30+i);
write_date(0x30+j);
voidDisplayMinute(ucharx)
write_com(0xc4);
voidDisplayHour(ucharx)
write_com(0xc1);
voidDisplayDay(ucharx)
write_com(0x89);
voidDisplayMonth(ucharx)
write_com(0x86);
voidDisplayYear(ucharx)
write_com(0x83);
voidDisplayWeek(ucharx)
{uchari;
x=x*3;
write_com(0x8c);
3;
i++)
write_date(table2[x]);
x++;
voidread_date(void)
ReadValue=ReadSet1302(0x81);
second=((ReadValue&
0x70)>
4)*10+(ReadValue&
0x0F);
ReadValue=ReadSet1302(0x83);
minute=((ReadValue&
ReadValue=ReadSet1302(0x85);
hour=((ReadValue&
ReadValue=ReadSet1302(0x87);
day=((ReadValue&
ReadValue=ReadSet1302(0x89);
month=((ReadValue&
ReadValue=ReadSet1302(0x8d);
year=((ReadValue&
ReadValue=ReadSet1302(0x8b);
//读星期
week=ReadValue&
0x07;
DisplaySecond(second);
DisplayMinute(minute);
DisplayHour(hour);
DisplayDay(day);
DisplayMonth(month);
DisplayYear(year);
DisplayWeek(week);
voidturn_val(charnewval,ucharflag,ucharnewaddr,uchars1num)
newval=ReadSet1302(newaddr);
//读取当前时间
newval=((newval&
4)*10+(newval&
0x0f);
//将bcd码转换成十进制
if(flag)//判断是加一还是减一
{
newval++;
switch(s1num)
{case1:
if(newval>
99)newval=0;
DisplayYear(newval);
break;
case2:
12)newval=1;
DisplayMonth(newval);
case3:
31)newval=1;
DisplayDay(newval);
case4:
6)newval=0;
DisplayWeek(newval);
case5:
23)newval=0;
DisplayHour(newval);
case6:
59)newval=0;
DisplayMinute(newval);
case7:
DisplaySecond(newval);
default:
break;
}
else
newval--;
switch(s1num)
if(newval==0)newval=99;
if(newval==0)newval=12;
break;
if(newval==0)newval=31;
DisplayDay(newval);
if(newval<
0)newval=6;
0)newval=23;
0)newval=59;
default:
}
}
WriteSet1302((newaddr-1),((newval/10)<
4)|(newval%10));
//将新数据写入寄存器
//键盘扫描程序
//*******************************************
voidkey_scan(void)
{ucharmiao,s1num=0;
if(menu==0)
while(!
menu);
s1num++;
while
(1)
if(menu==0)
while(!
s1num++;
miao=ReadSet1302(0x81);
second=miao;
WriteSet1302(0x80,miao|0x80);
write_com(0x0f);
//光标闪射
if(s1num==1)
{year=ReadSet1302(0x8d);
write_com(0x80+4);
//年光标
if(add==0)
{
delay(3);
if(add==0)
{while(!
add);
turn_val(year,1,0x8d,1);
}
if(dec==0)
if(dec==0)
{while(!
dec);
turn_val(year,0,0x8d,1);
if(s1num==2)
month=ReadSet1302(0x89);
write_com(0x80+7);
//月光标
if(add==0)
turn_val(month,1,0x89,2);
turn_val(month,0,0x89,2);
if(s1num==3)
{day=ReadSet1302(0x87);
write_com(0x80+10);
//日光标
turn_val(day,1,0x87,3);
turn_val(day,0,0x87,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 DS1302 DS18B20 LCD1602 显示 时间 温度 可调