找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1174|回复: 0
打印 上一主题 下一主题
收起左侧

DS18B20温度检测

[复制链接]
跳转到指定楼层
楼主
ID:402738 发表于 2018-9-26 16:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^4;
bit flag;
uint temp,num;
void writecod(uchar);
void writedata(uchar);
void delay();
sbit RS=P2^5;   //LCD1602数据/命令选择端
sbit RW=P2^6;   //LCD1602读/写选择端
sbit EN=P2^7;   //LCD1602使能端
uchar code table[]={'0','1','2','3','4','5','6','7','8','9'};

void delayus(uint t)//us级的延时程序
{
        while(t--);
}

void ds_reset()//DS18B20复位初始化
{
        ds=1;//初始总线
        delayus(5);//11.0592M大约66us
        ds=0;//拉低总线
        delayus(80);//大约延时700多us
        ds=1;//释放总线
        delayus(14);//11.0592M延时时间差不多在150us
        if(ds==0)
                flag=1;
        else
                flag=0;
        delayus(20);//大约200多us
}
bit ds_read_bit()//一个位的读取函数
{
        bit dat;
        ds=0;
        _nop_();//一个机器周期的延时函数大约1us;
        _nop_();
        ds=1;//释放总线
        _nop_();
        dat=ds;
        delayus(10);
        return dat;
}
//DS18b20在传输数据的时候都是低位在前
uchar ds_read_byte()//读一个字节
{
        uchar i,j,k;
        for(i=0;i<8;i++)
        {
                j=ds_read_bit();
                k=(j<<7)|(k>>1);
        }
        return k;
}

void ds_write_byte(uchar dat)//写一个字节
{
        uchar i;
        for(i=0;i<8;i++)
        {
                ds=0;
                _nop_();
                ds=dat;
                ds=dat&0x01;//只保留dat的最低位,因为DS18B20在传输数据的过程中都是低位在前
                delayus(6);
                ds=1;
                dat=dat>>1;
        }
        delayus(6);
}
uint read_temperature()//读温度
{
        uchar a,b;//DS18B20的温度分别分2个字节存放的,分别低8位LSB和高8位MSB,所以这里a用来存低8位b用来存高8位
        ds_reset();//初始化
        ds_write_byte(0xcc);//发送跳过ROM
        ds_write_byte(0xbe);//发送读取温度指令
        a=ds_read_byte();
        b=ds_read_byte();
        //接下来用一个16位的变量来存储温度值
        temp=b;
        temp=temp<<8;
        temp=temp|a;
        temp=temp*0.0625*10+0.5;//为了方便显示将数放10倍,+0.5四舍五入;
        return temp;
       
}
void writecod(uchar x)
{
         RS=0;
         RW=0;
         EN=0;
         P0=x;
         delay();
         EN=1;
         delay();
         EN=0;
}
void writedata(uchar y)
{
         RS=1;
         RW=0;
         EN=0;
         P0=y;
         delay();
         EN=1;
         delay();
         EN=0;

}
void delay()
{
        uchar a,b;
        for(a=100;a>0;a--)
                for(b=100;b>0;b--);
}
void main()
{
                writecod(0x01);
                writecod(0x38);
                writecod(0x0e);
                writecod(0x06);
                writecod(0x80);
        while(1)
        {
                ds_reset();//初始化
                ds_write_byte(0xcc);//跳过ROM
                ds_write_byte(0x44);//启动温度转换
                num=read_temperature();
                writecod(0x80);
                writedata(table[num/100]);
                writecod(0x80+1);
                writedata(table[num%100/10]);
                writecod(0x80+2);
                writedata('.');
                writedata(table[num%10]);
                writedata(0xdf);
                writedata('C');
                delay();
                delay();
                delay();
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表