找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机测量温度DS18B20 LCD1602显示

[复制链接]
跳转到指定楼层
楼主
最常用的温度传感器 上至128° 下至-55°


//数字式温度计
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED = P3^0;   //灭掉一颗LED

int temp;
int wendu;
uchar data disdata[5];

//定义开关入口
sbit DQ = P1^7;//DS18B20的接入口
sbit lcden=P2^1;
sbit lcdrs=P2^0;
sbit LED1=P3^0;
sbit LED2=P3^7;

//声明区
void write_com(uchar com);

void delay(uint);

//定义区
void delay(uint i)
{
    while(i--);
}
void delay_1(int z)   
{
   int x,y;
   for(x=0;x<z;x++)   
       for(y=0;y<122;y++);
}

//液晶函数
void init()
{
    lcden=0;
    write_com(0x38);//设置显示模式为5*7八位数据接口
    write_com(0x0c); //开显示,显示光标光标不闪烁
    write_com(0x06); //光标指针自动加1
    write_com(0x01);//清屏
    write_com(0x80+2);//显示数据的地址
}

void write_com(uchar com)
{
    lcdrs=0;
    P0=com;
    delay_1(10);
    lcden=1;
    delay_1(10);
    lcden=0;
}

void write_data(uchar date)
{
    lcdrs=1;
    P0=date;
    delay_1(10);
    lcden=1;
    delay_1(10);
    lcden=0;
}

//以上为液晶要用到的函数

//ds18b20温度传感器所需函数,分为初始化 读字节 写字节 读取温度4个函数
void Init_DS18B20() //初始化
{
    uchar x=0;
    DQ=1;
    _nop_();
    _nop_();
    DQ=0;
    delay(70);
    DQ=1;
    delay(15);
    x=DQ;
    delay(35);
}

uchar Read_OneChar()    //读一个字节
{
    uchar i;
    uchar temp=0;
    for(i=0;i<8;i++)
    {
        DQ=1;
        _nop_();
        DQ=0;
        _nop_();
        _nop_();
        DQ=1;
        _nop_();
        temp>>=1;
        if(DQ)
            temp|=0x80;
        delay(60);
    }
    return(temp);
}

void Write_OneChar(uchar dat)       //写一个字节
{
    uchar i;
    for(i=0;i<8;i++)
    {
        DQ=0;
        _nop_();
        DQ=dat&0x01;
        delay(10);
        DQ=1;
        dat>>=1;
    }
}

int ReadTemp1() //读取温度
{
    uchar Temp1L=0;
    uchar Temp1H=0;
    int t;
    Init_DS18B20();
    Write_OneChar(0xCC);
    Write_OneChar(0x44);
    delay(250);
    LED = 0;
    Init_DS18B20();
    Write_OneChar(0xCC);
    Write_OneChar(0xBE);
    Temp1L=Read_OneChar();
    Temp1H=Read_OneChar();
    if(Temp1H&0xF0)     //显示负数
    {
        Temp1L=~Temp1L;
        Temp1H=~Temp1H;
        t=(Temp1H*256+Temp1L)/16*(-1)-1;
    }
    else
        t=(Temp1H*256+Temp1L)*0.0625;
    return(t);
}

void display()
{
     wendu=ReadTemp1();
     delay(100);
     if(wendu<0)
     {
        wendu=-wendu;
        disdata[0]='-';
     }
     else
        disdata[0]=wendu/1000+0x30;//百位数

     disdata[1]=wendu%1000/100+0x30;//十位数
     disdata[2]=wendu%100/10+0x30;//个位数
     disdata[3]=wendu%10+0x30;//小数位
     write_com(0xc2);
     write_data(disdata[0]);
     write_com(0xc3);
     write_data(disdata[1]);
     write_com(0xc4);
     write_data(disdata[2]);
     write_com(0xc5);
     write_data(disdata[3]);
}

void main()
{  
    init();
    while(1)
    {
     ReadTemp1();
     display();
     delay(800);
    }
}




DS18B20仿真.png (194.19 KB, 下载次数: 45)

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

使用道具 举报

沙发
ID:758576 发表于 2020-5-25 06:35 | 只看该作者
特别感谢作者
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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