车载可测温式电子万年历
cc=j;
delay1(500); if(P34==0) { while(!P34); j++; if(j==10) j=0; d=j+(10*i); } else if(P35==0) { while(!P35); if(j==0) j=10; j--; d=j+(10*i); } XBYTE[0x7e02]=d; XBYTE[0x7e04]=e; }
while(!P32) { delay1(500); while(!P32); delay1(20); }
while(P32) { dd=10;
delay1(500); dd=i;
delay1(500); if(P34==0) { while(!P34); i++; if(i==6)
-19-
车载可测温式电子万年历
i=0; d=j+(10*i); } else if(P35==0) { while(!P35); if(i==0) i=6; i--; d=j+(10*i); } XBYTE[0x7e02]=d; XBYTE[0x7e04]=e; }
while(!P32) { delay1(500); while(!P32); delay1(20); }
while(P32) { ee=10;
delay1(500); ee=m;
delay1(500); if(P34==0) { while(!P34); m++; if(m==10) m=0; e=m+(10*n); } else if(P35==0) { while(!P35); if(m==0)
-20-
车载可测温式电子万年历
m=10; m--; e=m+(10*n); } XBYTE[0x7e02]=d; XBYTE[0x7e04]=e; }
while(!P32) { delay1(500); while(!P32); delay1(20); }
while(P32) { ff=10;
delay1(500); ff=n;
delay1(500); if(P34==0) { while(!P34); n++; if(n==3) n=0; e=m+(10*n); } else if(P35==0) { while(!P35); if(n==0) n=3; n--; e=m+(10*n); } XBYTE[0x7e02]=d; XBYTE[0x7e04]=e; }
-21-
车载可测温式电子万年历
delay1(2000); }
3.5 温度采集程序设计
3.5.1 DS18B20的初始化
(1)先将数据线置高电平“1”。
(2)延时(该时间要求的不是很严格,但是尽可能的短一点)。 (3)数据线拉到低电平“0”。
(4)延时750微秒(该时间的时间范围可以从480到960微秒)。 (5)数据线拉到高电平“1”。
(6)延时等待(如果初始化成功则在15到60毫秒时间之内产生一个由DS18B20所返回的低电平“0”。据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制)。
(7)若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。
(8)将数据线再次拉高到高电平“1”后结束。
3.5.2 DS18B20的写操作
(1)数据线先置低电平“0”。
(2)延时确定的时间为15微秒。
(3)按从低位到高位的顺序发送字节(一次只发送一位)。 (4)延时时间为45微秒。 (5)将数据线拉到高电平。
(6)重复上(1)到(6)的操作直到所有的字节全部发送完为止。 (7)最后将数据线拉高。
3.5.3 DS18B20的读操作
(1)将数据线拉高“1”。 (2)延时2微秒。
(3)将数据线拉低“0”。 (4)延时15微秒。 (5)将数据线拉高“1”。 (6)延时15微秒。
(7)读数据线的状态得到1个状态位,并进行数据处理。
-22-
车载可测温式电子万年历
(8)延时30微秒。 程序如下:
sbit TMDAT=P2^7;
dmsec(unsigned int count) //1ms delay {unsigned int i; while(count--) {for(i=0;i<125;i++){} } }
void tmreset(void) //复位子程序 { unsigned int i; TMDAT=0;
i=103;while(i>0) i--; //900vs TMDAT=1;
i=4;while(i>0) i--; }
void tmpre (void) //复位结束 {unsigned int i; while(TMDAT); while(~TMDAT); i=4;while(i>0)i--; }
bit tmrbit() //读一位数据的子程序 {unsigned int i; bit dat;
TMDAT=0;i++; TMDAT=1;i++;i++; dat=TMDAT; i=8;while(i>0)i--; return(dat); }
unsigned char tmrbyte(void) //读一字节子程序 {unsigned char i,j,dat; dat=0; for(i=1;i<=8;i++) {j=tmrbit(); dat=(j<<7)|(dat>>1) ; }return(dat);
-23-