18b20中文资料_引脚图_程序
18b20的样子和三极管一模一样,但它是一个数字芯片。(所以看芯片和看人一样,不能只看外表)它长着3个脚,内部还有寄存器,它的3个脚:一地、一火、一信号。它与单片机通信,属于单总线方式。所以,只要你的单片机系统中,留一个单片机引脚,就可以把测量温度的功能加进去。
程序:
- //=============================//
- // DS18B20复位函数 //
- //=====================================//
- bit ds18b20_reset(void)
- {
- bit bitbuf;
- ds18b20=1;
- //10us
- TH0=0xff;
- TL0=0xf6;
- TF0=0;
- while(!TF0);
- ds18b20=0;
- //设置1-wire总线为低电平(占领总线)
- //延迟480us-960us,尽可能选小值(480us)
- //这里我们选490us
- TH0=0xfe;
- TL0=0x3c;
- TF0=0;
- while(!TF0);
- ds18b20=1;
- //设置1-wire总线为高电平(释放总线)
- //最佳时间: 60us+7.5us
- //这里我们选68us
- TH0=0xff;
- TL0=0xc1;
- TF0=0;
- while(!TF0);
- ds18b20=1;
- // 探测总线上是否有器件
- if(ds18b20==1) bitbuf=1; //没有器件在线
- else bitbuf=0; //有器件在线
- //保证DS18B20释放总线的时间
- //490-68=422us
- TH0=0xfe;
- TL0=0x7b;
- TF0=0;
- while(!TF0);
- return(bitbuf);
- }
- //==============================//
- // DS18B20写字节函数 //
- //===============================//
- void ds18b20_write(unsigned char val)
- {
- unsigned char i;
- for (i=0;i<8;i++) // { ds18b20=0; // 设置1-wire总线为低电平 //2us TH0=0xff; TL0=0xfe; TF0=0; while(!TF0); ds18b20=val&0x01; //最低位移出 val=val>>1; //右移一位
- //60us~120us(实际不能到120us, 因为其它语句也用时间了!)
- //这里我们选62us
- TH0=0xff;
- TL0=0xc6;
- TF0=0;
- while(!TF0);
- ds18b20=1;
- }
- }
- //========================================//
- // DS18B20读字节函数 //
- //===================================//
- unsigned char ds18b20_read(void)
- {
- unsigned char i;
- unsigned char value = 0;
- for (i=0;i<8;i++) { //从总线拉低到读总线状态,不能大于15us! ds18b20=0; //2us TH0=0xff; TL0=0xfe; TF0=0; while(!TF0); ds18b20=1; //4us TH0=0xff; TL0=0xfc; TF0=0; while(!TF0); value>>=1;
- if(ds18b20) value|=0x80;
- //62us,必须大于60us
- TH0=0xff;
- TL0=0xc6;
- TF0=0;
- while(!TF0);
- }
- ds18b20=1;
- return(value);
- }
- //====================================================//
- // 启动DS18B20温度转换函数 //
- //===============================================//
- void convert_T(void)
- {
- if(ds18b20_reset()==0) // 如果复位成功
- {
- ds18b20_write(0xcc); // 跳过多器件识别
- ds18b20_write(0x44); // 启动温度转换
- }
- }
- //================================//
- // 读DS18B20温度函数
- //=======================================//
- void read_T(void)
- {
- unsigned char Lsb,Msb;
- if(ds18b20_reset()==0) // 如果复位成功
- {
- ds18b20_write(0xcc); // 跳过多器件识别
- ds18b20_write(0xbe); // 读暂存器
- Lsb=ds18b20_read(); // 低字节
- Msb=ds18b20_read(); // 高字节
- temp2=Lsb&0x0f;
- temp1=(Lsb>>4)|(Msb<<4);
- }
- }