基于dsb的数字温度计Word文档格式.doc
《基于dsb的数字温度计Word文档格式.doc》由会员分享,可在线阅读,更多相关《基于dsb的数字温度计Word文档格式.doc(14页珍藏版)》请在冰点文库上搜索。
DS18B20的一线工作协议流程是:
初始化→ROM操作指令→存储器操作指令→数据传输。
其工作时序包括:
初始化时序,写时序,读时序
初始化时序
主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。
若无低电平出现一直都是高电平说明总线上无器件应答。
做为从器件的DS18B20在一上电后就一直在检测总线上是否有480-960微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备。
若没有检测到就一直在检测等待。
LCD1602:
1602LCD主要技术参数:
显示容量:
16×
2个字符
芯片工作电压:
4.5—5.5V
工作电流:
2.0mA(5.0V)
模块最佳工作电压:
5.0V
字符尺寸:
2.95×
4.35(W×
H)mm
引脚功能说明
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表10-13所示:
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3
3
VL
液晶显示偏压
11
D4
4
RS
数据/命令选择
12
D5
5
R/W
读/写选择
13
D6
6
E
使能信号
14
D7
7
D0
15
BLA
背光源正极
8
D1
16
BLK
背光源负极
第1脚:
VSS为地电源。
第2脚:
VDD接5V正电源。
第3脚:
VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15脚:
背光源正极。
第16脚:
背光源负极。
LCD1602的一般初始化(复位)过程
延时15mS
写指令38H(不检测忙信号)
延时5mS
以后每次写指令、读/写数据操作均需要检测忙信号
写指令38H:
显示模式设置
写指令08H:
显示关闭
写指令01H:
显示清屏
写指令06H:
显示光标移动设置
写指令0CH:
显示开及光标设置
#include<
reg51.h>
//包含单片机寄存器的头文件
intrins.h>
//包含_nop_()函数定义的头文件
unsignedcharcodedigit[10]={"
0123456789"
};
//定义字符数组显示数字
unsignedcharcodeStr[]={"
TestbyDS18B20"
//说明显示的是温度
unsignedcharcodeError[]={"
Error!
Check!
"
//说明没有检测到DS18B20
unsignedcharcodeTemp[]={"
Temp:
//说明显示的是温度
unsignedcharcodeCent[]={"
Cent"
//温度单位
/******************************************************************************
以下是对液晶模块的操作程序
*******************************************************************************
sbitRS=P2^0;
//寄存器选择位,将RS位定义为P2.0引脚
sbitRW=P2^1;
//读写选择位,将RW位定义为P2.1引脚
sbitE=P2^2;
//使能信号位,将E位定义为P2.2引脚
sbitBF=P0^7;
//忙碌标志位,,将BF位定义为P0.7引脚
/*****************************************************
函数功能:
延时1ms
(3j+2)*i=(3×
33+2)×
10=1010(微秒),可以认为是1毫秒
***************************************************/
voiddelay1ms()
{
unsignedchari,j;
for(i=0;
i<
10;
i++)
for(j=0;
j<
33;
j++)
;
}
延时若干毫秒
入口参数:
n
voiddelaynms(unsignedcharn)
{
unsignedchari;
for(i=0;
n;
delay1ms();
判断液晶模块的忙碌状态
返回值:
result。
result=1,忙碌;
result=0,不忙
bitBusyTest(void)
{
bitresult;
RS=0;
//根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1;
//E=1,才允许读写
_nop_();
//空操作
//空操作四个机器周期,给硬件反应时间
result=BF;
//将忙碌标志电平赋给result
E=0;
//将E恢复低电平
returnresult;
}
将模式设置指令或显示地址写入液晶模块
dictate
voidWriteInstruction(unsignedchardictate)
{
while(BusyTest()==1);
//如果忙就等待
RS=0;
//根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0;
//E置低电平(根据表8-6,写指令时,E为高脉冲,
//就是让E从0到1发生正跳变,所以应先置"
0"
_nop_();
//空操作两个机器周期,给硬件反应时间
P0=dictate;
//将数据送入P0口,即写入指令或地址
//空操作四个机器周期,给硬件反应时间
E=1;
//E置高电平
E=0;
//当E由高电平跳变成低电平时,液晶模块开始执行命令
指定字符显示的实际地址
x
voidWriteAddress(unsignedcharx)
WriteInstruction(x|0x80);
//显示位置的确定方法规定为"
80H+地址码x"
将数据(字符的标准ASCII码)写入液晶模块
y(为字符常量)
voidWriteData(unsignedchary)
RS=1;
//RS为高电平,RW为低电平时,可以写入数据
RW=0;
//E置低电平(根据表8-6,写指令时,E为高脉冲,
//就是让E从0到1发生正跳变,所以应先置"
P0=y;
//将数据送入P0口,即将数据写入液晶模块
_nop_();
_nop_();
_nop_();
//空操作四个机器周期,给硬件反应时间
E=1;
//E置高电平
//空操作四个机器周期,给硬件反应时间
//当E由高电平跳变成低电平时,液晶模块开始执行命令
对LCD的显示模式进行初始化设置
voidLcdInitiate(void)
delaynms(15);
//延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x38);
//显示模式设置:
2显示,5×
7点阵,8位数据接口
delaynms(5);
//延时5ms ,给硬件一点反应时间
//延时5ms ,给硬件一点反应时间
WriteInstruction(0x38);
//连续三次,确保初始化成功
WriteInstruction(0x0c);
显示开,无光标,光标不闪烁
WriteInstruction(0x06);
光标右移,字符不移
WriteInstruction(0x01);
//清屏幕指令,将以前的显示内容清除
//延时5ms ,给硬件一点反应时间
}
/************************************************************************
以下是DS18B20的操作程序
************************************************************************/
sbitDQ=P3^3;
unsignedchartime;
//设置全局变量,专门用于严格延时
将DS18B20传感器初始化,读取应答信号
出口参数:
flag
bitInit_DS18B20(void)
bitflag;
//储存DS18B20是否存在的标志,flag=0,表示存在;
flag=1,表示不存在
DQ=1;
//先将数据线拉高
for(time=0;
time<
2;
time++)//略微延时约6微秒
;
DQ=0;
//再将数据线从高拉低,要求保持480~960us
200;
time++)//略微延时约600微秒
//以向DS18B20发出一持续480~960us的低电平复位脉冲
//释放数据线(将数据线拉高)
for(time=0;
time++)
//延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)
flag=DQ;
//让单片机检测是否输出了存在脉冲(DQ=0表示存在)
time++)//延时足够长时间,等待存在脉冲输出完毕
;
return(flag);
//返回检测成功标志
}
从DS18B20读取一个字节数据
dat
***************************************************/
unsignedcharReadOneChar(void)
unsignedchari=0;
unsignedchardat;
//储存读出的一个字节数据
for(i=0;
8;
{
DQ=1;
//先将数据线拉高
_nop_();
//等待一个机器周期
DQ=0;
//单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
dat>
>
=1;
//等待一个机器周期
DQ=1;
//将数据线"
人为"
拉高,为单片机检测DS18B20的输出电平作准备
for(time=0;
;
//延时约6us,使主机在15us内采样
if(DQ==1)
dat|=0x80;
//如果读到的数据是1,则将1存入dat
else
dat|=0x00;
//如果读到的数据是0,则将0存入dat
//将单片机检测到的电平信号DQ存入r[i]
;
//延时3us,两个读时序之间必须有大于1us的恢复期
}
return(dat);
//返回读出的十进制数据
向DS18B20写入一个字节数据
***************************************************/
WriteOneChar(unsignedchardat)
unsignedchari=0;
for(i=0;
i<
i++)
DQ=1;
//先将数据线拉高
_nop_();
//等待一个机器周期
DQ=0;
//将数据线从高拉低时即启动写时序
DQ=dat&
0x01;
//利用与运算取出要写的某位二进制数据,
//并将其送到数据线上等待DS18B20采样
for(time=0;
time++)
;
//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
DQ=1;
//释放数据线
for(time=0;
1;
;
//延时3us,两个写时序间至少需要1us的恢复期
dat>
//将dat中的各二进制位数据右移1位
}
for(time=0;
4;
;
//稍作延时,给硬件一点反应时间
以下是与温度有关的显示设置
******************************************************************************/
/*****************************************************
显示没有检测到DS18B20
***************************************************/
voiddisplay_error(void)
unsignedchari;
WriteAddress(0x00);
//写显示地址,将在第1行第1列开始显示
i=0;
//从第一个字符开始显示
while(Error[i]!
='
\0'
)//只要没有写到结束标志,就继续写