⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 温度传感器程序.txt

📁 温度传感器程序,普通51单片机与DS18B20的传感器通信程序
💻 TXT
字号:


#include <stdio.h>
#include<absacc.h>
#include<intrins.h>

#define uchar unsigned char
#define tempint DBYTE[0X30]
#define tempdf DBYTE[0X31]

uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};

sbit dat=P0^7;

void set_ds18b20();               //初始化DS18B20子程序
void get_temperature();           //获得温度子程序
void read_ds18b20();              //读DS18B20子程序
void write_ds18b20(uchar command);//向DS18B20写1字节子程序,即写寄存器

void main()
{
     EA=0;                        //禁止中断
     SP=0x60;                     //设置堆栈指针
     while(1)
     {
         get_temperature();       //获得温度,程序到此结束。温度数据的整数部分以十六进制形式保存在一个字节的tempint中,即tempint=0x19表示获得的温度为25°C
     }
}

void set_ds18b20()                  //初始化DS18B20子程序
{
    while(1)
    {
        uchar delay,flag;
        flag=0;
        dat=0;                    //数据线置低电平
        delay=250;
        while(--delay);           //低电平保持500us
        dat=1;                    //数据线置高电平
        delay=30;
        while(--delay);           //高电平保持60us
        while(dat==0)             //判断DS18B20是否发出低电平信号
        {
            delay=120;            //DS18B20响应,延时240us
            while(--delay);
            if(dat)               //DS18B20发出高电平初始化成功,返回
            {
                flag=1;           //DS18B20初始化成功标志
                break;
            }
        }
        if(flag)                  //初始化成功,再延时480us
        {
            delay=240;
            while(--delay);
            break;
        }
    }
}

void get_temperature()            //温度转换、获得温度子程序
{
    set_ds18b20();                //初始化DS18B20
    write_ds18b20(0xcc);          //发跳过ROM匹配命令
    write_ds18b20(0x44);          //发启动转换命令
    set_ds18b20();
    write_ds18b20(0xcc);          //发跳过ROM匹配命令
    write_ds18b20(0xbe);          //发出读温度命令
    read_ds18b20();               //将读出的温度数据的整数部分保存在tempint中
}

void read_ds18b20()                  //读DS18B20子程序,将读出的温度数据保存到tempint和tempdf处
{
    uchar delay,i,j,temp,temph,templ;
    j=2;                          //读2位字节数据
    do
    {
    for(i=8;i>0;i--)              //一个字节分8位读取
    {
        temp>>=1;                 //读取1位右移1位,最左边一位置0,待会用来存数据口dat中的温度数据
        dat=0;                    //数据线置低电平
        _nop_();
        _nop_();                  //低电平持续2us
        dat=1;                    //数据线置高电平
        delay=4;
        while(--delay);           //延时8us
        if(dat)                   //读取1位数据,此时温度数据存在dat中
            temp|=0x80;           //temp=temp|0x80,把temp最左边一位置1,即置入温度数据
        delay=10;                 //读取一位数据后延时20us
        while(--delay);
    }
    if(j==2)                      //读取的第一字节(低8位)存templ
        templ=temp;
    else
        temph=temp;               //读取的第二字节(高8位)存temph
    }while(--j);
    tempdf=templ&0x0f;            
    templ>>=4;
    temph<<=4;
    tempint=temph|templ;         //将读取的数据转换成温度值,整数部分存入tempint,小数部分存入tempdf
}

void write_ds18b20(uchar command)
{
    uchar delay,i;
    for(i=8;i>0;i--)              //将一字节数据一位一位写入
    {
        dat=0;                    //数据线置低电平
        delay=8;                  //延时16us
        while(--delay);
        dat=command&0x01;         //将数据放置在数据线上
        delay=20;                 //延时40us
        while(--delay);
        command=command>>1;       //准备发送下一位数据
        dat=1;                    //发送完一位数据,数据线置高电平
        _nop_();                  //延时1us
    }
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -