找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于DS18B20程序

[复制链接]
跳转到指定楼层
楼主
ID:233756 发表于 2018-6-23 15:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
直接上板子后,温度一直显示127
我只是试验下,并没有精确到小数点后面的
我用别人的程序,把接口都改成自己的,试验可以的
那么我自己写的程序哪里出错了?DS18B20都搞了5天了还没有搞懂
求大神指教

#include <reg52.h>
#include <intrins.h>
#include <string.h>


void ds18b20_init();
void ds18b20_write(char comde);
char ds18b20_read();
void ds18b20_wendu(char *wendu);
void Ds18b20_Busy_Check(void);


void lcd_1602_delay(char,char,char *);
void lcd_1602_write_comde(char comde);
void lcd_1602_write_date(char date);
void lcd_1602_busy();
void lcd_1602_init();
void Delay15ms();
void Delay5ms();
void Delay68us();
void Delay500us();

sbit RS = P2^5;
sbit RW = P2^6;
sbit E  = P2^4;
sbit DQ = P2^2;

char tmp[4]= {'0','0','0','\0'};

void main()
{
        lcd_1602_init();
        ds18b20_init();
        lcd_1602_delay(1,1,"ok!");

        while(1)
        {
                ds18b20_wendu(tmp);
                lcd_1602_delay(1,1,tmp);
        }
}

void lcd_1602_delay(char hang,char lie,char *str)
{
        char i,j,k,l;
        switch(hang)
        {
                case 1: i = 0x00; break;
                case 2: i = 0x40; break;
        }
        j = lie - 1;
        k = strlen(str);
        for(l=0;l<k;l++)
        {
                lcd_1602_write_comde(0x80+i+j+l);
                lcd_1602_write_date(str[l]);
        }       
}


void lcd_1602_init()
{
        Delay15ms();//延时15ms
        lcd_1602_write_comde(0x38);//写指令38H  不检测忙信号
        Delay5ms();//延时5ms
        lcd_1602_write_comde(0x38);//写指令38H  不检测忙信号
        Delay5ms();//延时5ms
        lcd_1602_write_comde(0x38);//写指令38H  不检测忙信号
        //以后每次写指令、读/写数据操作之前均需要检测忙信号
        lcd_1602_write_comde(0x38);//写指令38H  显示模式设置
        lcd_1602_write_comde(0x08);//写指令08H  显示关闭
        lcd_1602_write_comde(0x01);//写指令01H  显示清屏
        lcd_1602_write_comde(0x06);//写指令06H  显示光标移动设置
        lcd_1602_write_comde(0x0c);//写指令0cH  显示开及光标设置       
}



void Delay15ms()                //@11.0592MHz
{
        unsigned char i, j;

        i = 27;
        j = 226;
        do
        {
                while (--j);
        } while (--i);
}



void Delay5ms()                //@11.0592MHz
{
        unsigned char i, j;

        i = 9;
        j = 244;
        do
        {
                while (--j);
        } while (--i);
}



void lcd_1602_write_comde(char comde)
{
        lcd_1602_busy();
        RS = 0;
        RW = 0;
        E  = 0;
        _nop_();
        P0 = comde;
        _nop_();
        E  = 1;
        _nop_();
        E  = 0;
        _nop_();
}



void lcd_1602_write_date(char date)
{
        lcd_1602_busy();
        RS = 1;
        RW = 0;
        E  = 0;
        _nop_();
        P0 = date;
        _nop_();
        E  = 1;
        _nop_();
        E  = 0;
        _nop_();
}



void lcd_1602_busy()
{
        char tmp;
        P0 = 0xff;
        do{
                RS = 0;
                RW = 1;
                E  = 0;
                _nop_();
                E  = 1;
                _nop_();
                tmp = P0;
                _nop_();
                E  = 0;
                _nop_();
        }while(tmp & 0x80);       
}

void Delay68us()                //@11.0592MHz
{
        unsigned char i;

        _nop_();
        i = 28;
        while (--i);
}


void Delay500us()                //@11.0592MHz
{
        unsigned char i;

        _nop_();
        i = 227;
        while (--i);
}


void ds18b20_init()
{
        DQ = 0;
        Delay500us();
        DQ = 1;
        Delay68us();
        while(DQ);
        Delay500us();
}

void ds18b20_write(char comde)
{
        char i, flag;
        for(i=0;i<8;i++)
        {
                flag = comde & 0x01;
                comde >>= 1;
                if(flag)
                {
                        DQ = 0;
                        Delay68us();
                        DQ = 1;
                        _nop_();
                        _nop_();       
                }
                else
                {
                        DQ = 0;
                        _nop_();
                        _nop_();
                        DQ = 1;
                        Delay68us();
                }
//                comde >>= 1;   //修改
        }
}


char ds18b20_read()
{
        char i,flag;
        char date = 0x00;
        for(i=0;i<8;i++)
        {
//                date >>= 1;
                DQ = 0;
                _nop_();
                _nop_();
                DQ = 1;
                _nop_();
                _nop_();
                flag = DQ;
//                if(DQ) date|=0x80;
//                Delay68us();
                date = (flag << 7) | (date >> 1);
        }
        return date;
}


void ds18b20_wendu(char *wendu)
{
       
        char du,low,high;

        ds18b20_init();
        ds18b20_write(0xcc);
        ds18b20_write(0x44);
        Ds18b20_Busy_Check();
        ds18b20_init();
        ds18b20_write(0xcc);
        ds18b20_write(0xbe);

        low = ds18b20_read();
        high = ds18b20_read();
        low >>= 4;
        du = high * 16 + low;
       
        *(wendu+0) = du/100+0x30;
        *(wendu+1) = du%100/10+0x30;
        *(wendu+2) = du%100%10+0x30;         
}


void Ds18b20_Busy_Check(void){
        bit flag; //0-busy 1-done
        do{
                DQ = 0;
                _nop_();
                _nop_();
                DQ = 1;
                _nop_();
                _nop_();
                flag = DQ;
                Delay68us();               
        }while(!flag);
}

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

使用道具 举报

来自 6#
ID:7485 发表于 2018-6-23 21:57 | 只看该作者
你可以自己测试一下。给ds18b20加以大的温差,看看数字会否变化,如果变化,检查一下数据转换程序。否则问题就广泛了。软硬件的问题都有可能。
回复

使用道具 举报

来自 7#
ID:234075 发表于 2018-6-23 23:47 | 只看该作者
我今天也碰到这个问题,在protues仿真没问题,实际硬件不能正常读取。
你试试在char ds18b20_read()子函数中
               DQ = 0;
                _nop_();
                _nop_();
                DQ = 1;
DQ=0和DQ=1中延时加大到15us或以上

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

沙发
ID:269211 发表于 2018-6-23 16:51 来自手机 | 只看该作者
你没有做温度数据处理吧
回复

使用道具 举报

板凳
ID:313328 发表于 2018-6-23 17:25 | 只看该作者
是做温度传感器?
回复

使用道具 举报

地板
ID:111634 发表于 2018-6-23 18:34 | 只看该作者
本帖最后由 zl2168 于 2018-6-23 18:35 编辑

实例97  一线式DS18B20测温
⒈ DS18B20简介
⑴ 内部组织结构    …
⑵ 操作步骤和操作指令    …
⒉ 电路设计    …
⒊ 程序设计    …
⒋ Keil调试    …
⒌ Proteus仿真    …

Proteus仿真一下,确认有效。 实例97 DS18B20测温.rar (51.78 KB, 下载次数: 12)
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。
回复

使用道具 举报

5#
ID:357365 发表于 2018-6-23 18:43 | 只看该作者
这个DS18b20的我运行成功了,你可以参考下

DS18b20.docx

12.22 KB, 下载次数: 18

回复

使用道具 举报

8#
ID:233756 发表于 2018-6-25 09:05 | 只看该作者
感谢大家的帮忙,我最后找到问题了,是void ds18b20_write(char comde)函数里的写1和0搞错了,把写0和写1的内容互换下就好了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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