找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2780|回复: 4
收起左侧

单片机高效率代码读取18B20 显示在LCD1602上

[复制链接]
ID:529657 发表于 2020-8-5 21:02 | 显示全部楼层 |阅读模式
#include <STC89C5xRC.H>
#include <intrins.h>

sbit DATA_IO = P3^2;


/* 软件延时函数,延时时间(t*10)us */
void DelayX10us(unsigned char t)
{
    do {
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
    } while (--t);
}

bit GetACK()
{
        bit ack;
        EA = 0;
        DATA_IO = 0;
        DelayX10us(60);
        DATA_IO = 1;
        DelayX10us(6);
        ack = DATA_IO;
        while(!DATA_IO);
        EA = 1;
        return ack;
}

void DS18B20_Write(unsigned char dat)
{
        unsigned char mask;
        EA = 0;
        for(mask=0x01;mask!=0;mask<<=1)
        {
                DATA_IO = 0;
                _nop_();
                _nop_();
                if((dat&mask)!= 0)
                        DATA_IO = 1;
                else
                        DATA_IO = 0;
                DelayX10us(6);
                DATA_IO = 1;
        }
        EA = 1;
}
unsigned char DS18B20_Read()
{
        unsigned char dat;
        unsigned char mask;
        EA = 0;
        for(mask=0x01;mask!=0;mask<<=1)
        {
                DATA_IO = 0;
                _nop_();
                _nop_();
                DATA_IO = 1;
                _nop_();
                _nop_();
                if(!DATA_IO)
                        dat &= ~(mask);
                else
                        dat |= mask;
                DelayX10us(6);
        }
        EA = 1;
        return dat;
}

bit DS18B20_Start()
{
        bit ack;
        ack = GetACK();
        if(ack == 0)
        {
                DS18B20_Write(0xCC);
                DS18B20_Write(0x44);
        }
        return ~ack;
}

bit GetTemp(int *temp)
{
        bit ack;
        unsigned char LSB,MSB;
        ack = GetACK();
        if(ack==0)
        {
                DS18B20_Write(0xCC);
                DS18B20_Write(0xBE);
                LSB = DS18B20_Read();
                MSB = DS18B20_Read();
        }
        *temp = ((int)MSB<<8) + LSB;
        return ~ack;
}

IMG_3558.JPG

18B20.zip

60.46 KB, 下载次数: 21, 下载积分: 黑币 -5

回复

使用道具 举报

ID:810174 发表于 2020-8-11 23:02 来自触屏版 | 显示全部楼层
没有注释的程序,无论程序写得怎么样,都不能称为合格的程序
回复

使用道具 举报

ID:468878 发表于 2020-8-13 14:53 | 显示全部楼层
19011250 发表于 2020-8-11 23:02
没有注释的程序,无论程序写得怎么样,都不能称为合格的程序

哈哈,我刚还看了好一会,你这么一说,我才发现这个问题。算了,不看了。
回复

使用道具 举报

ID:981034 发表于 2021-11-17 15:21 | 显示全部楼层
是,有些不明白
回复

使用道具 举报

ID:906597 发表于 2021-11-19 15:19 | 显示全部楼层
19011250 发表于 2020-8-11 23:02
没有注释的程序,无论程序写得怎么样,都不能称为合格的程序

哈哈有道理
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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