找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1936|回复: 0
收起左侧

带详细注释的单片机ds18b20温度计程序设计

[复制链接]
ID:454098 发表于 2018-12-25 09:45 | 显示全部楼层 |阅读模式
#include <reg51.h>
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
        
int num;
sbit shi = P2^0;//-----------------------------------------数码管十位数
sbit ge = P2^1;//------------------------------------------数码管个位数
sbit DS = P2^2;//-------------------------------------------单总线

uchar code table[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};//数字0~9

/*进11.95us,一次6.5us*/
void delay_us(unsigned char us)//-----------------------延时
{
        while(us --);
}

void display(unsigned int num)//-------------------------数码管显示
{
        shi = 1;//-------------------------------------------打开十位数码管
        P0 = ~table[num / 10];//----------------------------显示温度十位
        delay_us(1000);//-------------------------------------延时1ms
        shi = 0;//------------------------------------------关闭十位数码管
        ge = 1;//-------------------------------------------打开个位数码管
        P0 = ~table[num % 10];//----------------------------显示温度个位
        delay_us(1000);//-----------------------------------延时1ms
        ge = 0;//-------------------------------------------关闭个位数码管
}

bit ds_init()
{
        bit i;
        DS = 1;
        _nop_();
        DS = 0;
        delay_us(75);//499.45us
        DS = 1;
        delay_us(4);//37.95us
        i = DS;
        delay_us(20);//141.95us
        DS = 1;
        _nop_();
        return(i);
}
/*写一字节*/
void write_byte(uchar dat)//------------------------传输一个命令
{
        uchar i;
        for(i = 0; i < 8; i ++)//-------------------------for中传输 8 个信号
        {
                DS = 0;
                _nop_();//-------------------------------------产生写时序
                DS = dat & 0x01;
                delay_us(10);//76.95us
                DS = 1;
                _nop_();
                dat >>= 1;
        }
}
/*读一字节*/
uchar read_byte()//----------------------------------读一个命令        
{
        uchar i,j,dat;
        for(i = 0; i < 8; i ++)//-------------------------for中接收 8 个信号
        {
                DS = 0;
                _nop_();//-------------------------------------产生读时序
                DS = 1;
                _nop_();
                j = DS;
                delay_us(10);//76.95us
                DS = 1;
                _nop_();
                dat = (j<<=7) | (dat>>1);
        }
        return(dat);//----------------------------------将 dat 值返给主函数        
}

void main()//---------------------------------------主函数
{        
        uint i;
        uchar L,M;
        while(1)//----------------------------------死循环
        {
                ds_init();
                write_byte(0xcc);//--------------------调整ds18b20工作模式 忽略rom指令
                write_byte(0x44);//--------------------调整ds18b20工作模式 温度转换指令
                ds_init();
                write_byte(0xcc);//--------------------调整ds18b20工作模式 忽略rom指令
                write_byte(0xbe);//--------------------调整ds18b20工作模式 读暂存器指令
                L = read_byte();//----------------------将读出来的值赋给 L
                M = read_byte();//---------------------将读出来的值赋给 M
                i = M;
                i <<= 8;
                i |= L;
                i = (i * 0.0625 + 0.5);//--------------数据转换为数字
                display(i);
        }
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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