基于AT89C51单片机的测温系统 联系客服

发布时间 : 星期日 文章基于AT89C51单片机的测温系统更新完毕开始阅读

.

接下来就是主机发出各种操作命令,但各种操作命令都是向DS18B20写0

和写1组成的命令字节,接收数据时也是从DS18B20读取0或1的过程。因此首先要搞清主机是如何进行写0、写1、读0和读1的。

写周期最少为60微秒,最长不超过120微秒。写周期一开始做为主机先把总线拉低1微秒表示写周期开始。随后若主机想写0,则继续拉低电平最少60微秒直至写周期结束,然后释放总线为高电平。若主机想写1,在一开始拉低总线电平1微秒后就释放总线为高电平,一直到写周期结束。而做为从机的DS18B20则在检测到总线被拉底后等待15微秒然后从15us到45us开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。

对于读数据操作时序也分为读0时序和读1时序两个过程。读时隙是从主

机把单总线拉低之后,在1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0。采样期内总线为高电平则确认为1。完成一个读时序过程,至少需要60us才能完成

让DS18B20进行一次温度的转换,那具体的操作就是:

..

.

(1).主机先作个复位操作,

(2).主机再写跳过ROM的操作(CCH)命令,

(3).然后主机接着写个转换温度的操作命令,后面释放总线至少一秒,让DS18B20完成转换的操作。在这里要注意的是每个命令字节在写的时候都是低字节先写,例如CCH的二进制为11001100,在写到总线上时要从低位开始写,写的顺序是“零、零、壹、壹、零、零、壹、壹”。整个操作的总线状态如下图。

(3)初始化时序程序

bit Init_DS18B20(void) {

bit flag; //储存DS18B20是否存在的标志,flag=0,存在;flag=1,不存在 DQ = 1; //先将数据线拉高

for(time=0;time<2;time++) ; //略微延时约6微秒//再将数据线从高拉低,要求保持480~960us

DQ = 0;

for(time=0;time<200;time++) ; //略微延时约600微秒//以向DS18B20发出一持续480~960us的低电平复位脉冲

DQ = 1; //释放数据线(将数据线拉高)

for(time=0;time<10;time++) ; //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)

flag=DQ; //让单片机检测是否输出了存在脉冲(DQ=0表示存在) for(time=0;time<200;time++) ; //延时足够长时间,等待存在脉冲输出完毕

..

.

return (flag); //返回检测成功标志

unsigned char ReadOneChar(void) {

unsigned char i=0;

unsigned char dat; //储存读出的一个字节数据 for (i=0;i<8;i++) {

DQ =1; // 先将数据线拉高

_nop_(); //等待一个机器周期

DQ = 0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序 _nop_(); //等待一个机器周期

DQ = 1; //将数据线\人为\拉高,为单片机检测DS18B20的输出电平作准备 for(time=0;time<2;time++) ; //延时约6us,使主机在15us内采样 dat>>=1; if(DQ==1)

dat|=0x80; //如果读到的数据是1,则将1存入dat else

dat|=0x00; //如果读到的数据是0,则将0存入dat

for(time=0;time<8;time++); //延时3us,两个读时序之间必须有大于1us的恢复期 } return(dat); //返回读出的十六进制数据

WriteOneChar(unsigned char dat)

..

.

{

unsigned char i=0; for (i=0; i<8; i++) {

DQ =1; // 先将数据线拉高

_nop_(); //等待一个机器周期

DQ=0; //将数据线从高拉低时即启动写时序 DQ=dat&0x01; //利用与运算取出要写的某位二进制数据, for(time=0;time<10;time++) ; //延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样

DQ=1; //释放数据线

for(time=0;time<1;time++) ; //延时3us,两个写时序间至少需要1us的恢复期 dat>>=1; //将dat中的各二进制位数据右移1位 }

for(time=0;time<4;time++) ; //稍作延时,给硬件一点反应时间

五、程序流程图(主程序,各子程序)

1.主程序

实时温度显示子程序:驱动数码管把实时温度值送出在LED数码管显示 主程序流程图:

开始

定时器初始化、启动 显示实时温度

温度设定

超过温度报警

图5.1主程序流程图

2.读温度值模块

读温度值模块需要调用4个子程序,分别为:

1.DS18B20初始化子程序:让单片机知道DS18B20在总线上且已准备好操作

..