找回密码
 立即注册

QQ登录

只需一步,快速开始

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

ds18b20测温在OLED12864上显示 求帮助

[复制链接]
跳转到指定楼层
楼主
ID:426269 发表于 2019-12-13 13:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请大佬指教,为什么显示不出来温度啊
#include "reg52.h"
#include "codetab.h"
#include "LQ12864.h"  
#include<intrins.h>
/**********************************定义变量*********************************/
sbit DS18B20_DQ=P1^4;

unsigned int Temp_Buffer = 0;
unsigned char flag_temper = 0;
//unsigned char  dis1[10];
//****************************************************
//DS18B20延时函数
//****************************************************
void DS18B20_Delay( unsigned int n )
{
        unsigned int i;
        for(i = 0 ; i < n ; i++ );
}
//****************************************************
//DS18B20写1字节
//****************************************************
void DS18B20_Write_Byte( unsigned char dat)
{
        unsigned char i;
        for( i = 0 ; i < 8 ; i++ )
        {
                DS18B20_DQ = 0;
                _nop_();                        //延时>1us
                _nop_();
               
                DS18B20_DQ = dat&0x01;                 //先写低位
                DS18B20_Delay(6);        //延时60~120us         
         
                DS18B20_DQ = 1;                //释放总线
                dat >>= 1;
                _nop_();                        //延时>1us
                _nop_();        
        }               
}

//****************************************************
//DS18B20读1字节
//****************************************************
unsigned char DS18B20_Read_Byte( )
{
        unsigned char dat=0;
        unsigned char i=0;
        for( i = 0 ; i < 8 ; i++ )
        {
                DS18B20_DQ = 0;
                _nop_();                        //延时>1us
                _nop_();
        
                dat >>= 1;               
        
                DS18B20_DQ = 1;                //释放总线
                _nop_();                        //延时>1us
                _nop_();

        //        dat=  DS18B20_DQ;
                if( DS18B20_DQ == 1)
                {
                        dat |= 0X80;
                }
                /*else
                {
                        dat &= 0x7f;
                }                 */
                        
                DS18B20_Delay(6);        //延时60~120us                        
        }
        return (dat);               
}

//****************************************************
//DS18B20初始化
//****************************************************
void DS18B20_Init()
{
//        bit Flag_exist = 0;
        DS18B20_DQ = 1;                        //释放总线
        _nop_();                                //延时>1us
        _nop_();

        DS18B20_DQ = 0;        
        DS18B20_Delay(50);                //延时480~960us        

        DS18B20_DQ = 1;                        //释放总线
        DS18B20_Delay(4);                //延时15~60us

//        Flag_exist = DS18B20_DQ;
//        DS18B20_Delay(10);                //延时60~240us

//        DS18B20_DQ = 1;                        //释放总线
//        return Flag_exist;                        
}

//**********************************************************
//读取温度函数,返回温度的绝对值,并标注flag_temper,flag_temper=1表示负,flag_temper=0表示正
//**********************************************************
unsigned int Get_temp()         //读取温度值
{  
        float tt;
        unsigned char a,b;
        unsigned int temp;
        DS18B20_Init();
//        if( DS18B20_Init() == 0 )                //初始化
//        {

                DS18B20_Write_Byte(0xcc);          //忽略ROM指令
                DS18B20_Write_Byte(0x44);          //温度转换指令
        
//        DS18B20_Delay(750);                                //PROTEUS仿真需要加
                DS18B20_Init();
        //        if( DS18B20_Init() == 0 )                 //初始化
        //        {
                        DS18B20_Write_Byte(0xcc);          //忽略ROM指令
                        DS18B20_Write_Byte(0xbe);          //读暂存器指令
                        a = DS18B20_Read_Byte();           //读取到的第一个字节为温度LSB
                        b = DS18B20_Read_Byte();           //读取到的第一个字节为温度MSB
                        temp = b;                      //先把高八位有效数据赋于temp
                        temp <<= 8;                    //把以上8位数据从temp低八位移到高八位
                        temp = temp|a;                //两字节合成一个整型变量
                        tt = temp*0.0625;
                        temp=tt*10+0.5;
                        tt=tt+0.05;
                /*        if(temp>0xfff)
                        {
                                flag_temper=1;                                //温度为负数
                                temp=(~temp)+1;
                        }
                        else
                        {                                                                                                                                                           
                                flag_temper=0;                                //温度为正或者0
                        }
                        
                        tt = temp*0.0625;              //得到真实十进制温度值
                                                        //因为DS18B20可以精确到0.0625度
                                                        //所以读回数据的最低位代表的是0.0625度
                        temp = tt*10+0.5;               //放大十倍
                                                        //这样做的目的将小数点后第一位也转换为可显示数字
                                                          //同时进行一个四舍五入操作。
                }
//        }           */
        return temp;
}
/********************(STC12C5608AD  11MHZ z=1时精确延时1ms)*******************/
void delayms(unsigned int z)
{
unsigned int x,y;
for(x=z; x>0; x--)
for(y=1848; y>0; y--);
}

/*****************************************显示温度****************************/
void Display_Temp()
{
        Temp_Buffer = Get_temp();                                          //读取DS18B20的值
        OLED_WrCmd(0x80+0x40+10);                                
/*        if(flag_temper == 1)                                                //根据温度标志位显示温度正负
        {
                OLED_WrDat('-');        
        }                                           */
        /*if( Temp_Buffer/1000 != 0 )                                        //如果第一位为0,忽略显示
        {
                OLED_WrDat(Temp_Buffer/1000+0X30);           //显示温度百位值
        }                           */
        //OLED_WrDat(Temp_Buffer%1000/100+0X30);           //显示温度十位值
//        OLED_WrDat(Temp_Buffer%100/10+0X30);           //显示温度个位值
        OLED_WrDat('.');                                                   //显示小数点
//        OLED_WrDat(Temp_Buffer%10+0X30);                   //显示温度十分位值
        OLED_WrDat('C');                                                   //显示字符C         
               
}

/*void makerand()        
{
        unsigned int a;
        Get_temp();
        a=Get_temp();
        dis1[0]=        a%1000/100+0X30;
        dis1[1]=        a %100/10+0X30;
        dis1[2]=        a %10+0X30;

}                  */
/***********************************主函数**********************************/
void main()
{
     unsigned char i;
         OLED_Init();                                                 //OLED初始化
         OLED_P8x16Str(0,3,"Wellcome to use!");         //显示欢迎界面
         delayms(1000);                                                         //延时
         OLED_CLS();                                                                 //清屏
         
        while(1)
         {
         Temp_Buffer = Get_temp();                                          //读取DS18B20的值
         delayms(500);
                                 
         OLED_WrCmd(0x80+0x40+10);                                
         OLED_WrDat(Temp_Buffer%1000/100+0X30);           //显示温度十位值
         OLED_WrDat(Temp_Buffer%100/10+0X30);           //显示温度个位值
         OLED_WrDat('.');                                                   //显示小数点
         OLED_WrDat(Temp_Buffer%10+0X30);                   //显示温度十分位值
         OLED_WrDat('C');
         delayms(1000);
         }
        /* while(1)
        {
                for(i=0; i<8; i++)
                        {OLED_P16x16Ch(i*16,0,i);  //点阵显示
                        }                                            
                OLED_P16x16Ch(0,2,0);
                OLED_P16x16Ch(16,2,1);
                OLED_P16x16Ch(32,2,2);
                OLED_P16x16Ch(48,2,3);        
                OLED_P16x16Ch(64,2,4);               
                                                           //获取并显示温度值
        }                                              */
//        Display_Temp();        
}


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

使用道具 举报

沙发
ID:648281 发表于 2020-1-1 10:12 | 只看该作者
你好!
1、和你单片机硬件端口接线有关
2、和系统时钟有关,影响延时
3、程序本身也行就不对
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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