- 第二篇http://read.pudn.com/downloads126/sourcecode/embed/536317/DS18B20%E7%9A%84C51%E7%A8%8B%E5%BA%8F.C__.htm
- *DQ为数据口,接于P3.4
- /*18b20采用三线接法,上拉5.1k电阻*/
- /*晶体:11.0592M*/
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar table[10]={0xfd,0x05,0x3e,0x7a,0x63,0x5b,0x5f,0x70,0x7f,0x7b};//一位数码管
- sbit dq= P3^4;
- bit flag;
- uint temp;
- void init_18b20 (void);
- uint read_word (void);
- void write (uchar wr);
- void get_temp (void);
- void delay (uint us);
- display_temp(uint temp1);
- void delay1(uint t);
- main ()
- { /*P1=0x63;
- while(1); */
- TMOD=0x20;
- PCON=0x00;
- TH1=0xfd;TL1=0xfd;
- TR1=1;
- SCON=0x50;
- EA=1;
- dq=0;
- _nop_();
- dq=1;
- init_18b20();
- get_temp();
- temp=temp;
- while(1){get_temp();display_temp(temp);
- SBUF=temp;
- while(TI==0);TI=0;}
- }
- void init_18b20 (void)
- { dq=1;
- _nop_();
- dq=0;
- delay(90); //delay 530 uS
- dq=1;
- delay(6); //delay 100 uS
- if(dq==0)
- flag=1; //detect 1820 success!
- else
- flag=0; //detect 1820 fail!
- delay(20);
- dq=1;
- }
- //
- void write (uchar wr)
- {
- uchar i;
- for (i=0;i<8;i++)
- {
- dq=0;
- _nop_();
- dq=wr&0x01;
- delay(5); //delay 45 uS
- dq=1;
- wr>>=1;
- }
- }
- //
- uint read_word (void)
- {
- uchar i;
- uint u=0;
- for(i=0;i<16;i++)
- {
- dq=0;
- u>>=1;
- dq=1;
- if(dq==1)
- u|=0x8000;
- delay (4);
- }
- return(u);
- }
- void get_temp (void)
- {
- uint bdata tem;
- init_18b20();
- if (flag)
- { write (0xcc); //skip rom
- write (0x44); //temp convert
- init_18b20 ();
- write (0xcc); //skip rom
- write (0xbe); //read temp
- tem=read_word(); //read
- if(tem<0x8000)
- temp=tem*0.0625; //temperature>=0
- else
- temp=tem*(-0.0625); //temperature< 0
- }
- }
- void delay (uint us)
- {
- while (us--);
- }
- void delay1(uint t) /*****************************************延时函数*************************************/
- { uint i,j;
- for(i=0;i<=t;i++) {
- for(j=0;j<=200;j++);}
- }
- display_temp(uchar temp1) //显示温度
- {uchar t1,t2;
- t1=temp1/10;
- t2=temp1%10;
- P1=table[t1];
- delay1(500);
- P1=table[t2];
- delay1(500);
- }