问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

数码管 ds18b20温度显示

发布网友 发布时间:2022-05-13 14:50

我来回答

3个回答

热心网友 时间:2023-10-13 02:49

楼主你在时序上有些错误

1。在转换时没有留够足够的转换时间。根据DS18B20芯片手册,9位精度转换时间为93.75ms。12位精度转换时间为750ms。而DS18B20默认为12位精度。所以我加了750ms延时

2。在写函数的时候

void ds18b20_write_byte(uchar date) //写一个字节

{

  uchar i;

    for(i=0;i<8;i++)    //一个字节八位

      {

        if((date&&0x01)==1) //写入1

        {

         ds18b20=0;

          delay_15us();

         ds18b20=1;

        }

        else           //写入0

        {

        ds18b20=0;  

       delay_60us();

       ds18b20=1;

      }

   date>>=1;  //右移一位

  }

}

应该是if((dat&0x01)==0x01)这里多了一个&号,导致结果错误。

3。我增加了用1602显示的模块,删除了用液晶显示的模块。

/**********************************

以下是程序,并附上仿真图一张

**********************************/

#include <reg52.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

uchar temp,tmph,tmpl;

sbit ds18b20=P2^3;

sbit rw=P2^6;

sbit lcde=P2^7;

sbit rs=P2^5;

              //下面是1602的驱动程序

void delay(uint z)

{

  uint x,y;

  for(x=z;x>0;x--)

   for(y=110;y>0;y--);

}

void write_com(uchar com,bit i) //是命令写0 数据写1

{

  rs=i;

  P0=com;

  delay(5);

  lcde=1;

  delay(5);

  lcde=0;

}

void lcd1602init(void)

{

  rw=0;

  write_com(0x01,0);

  write_com(0x02,0);

  write_com(0x06,0);

  write_com(0x0c,0);

  write_com(0x38,0);

 

}

void display(uchar x,uchar y,uchar date)

{

 x&=0x01;

 y&=0x0f;

 if(x)

  {

   y+=0x40;

  }

  y+=0x80;

  write_com(y,0);

  write_com(date,1);

}

     

void delayms(uint xms)

{

 uint i,j;

   for(i=xms;i>0;i--)

     for(j=110;j>0;j--);

}

 /////////////////////////////////////////////////////////

 /////DS18B20部分//////////// 

///////////////////////////

  //延时部分

void delay_600us(void)

 {

  uchar i;

  for(i=0;i<180;i++);

 }//延时600us

void delay_400us(void)

{

 uchar i;

  for(i=0;i<120;i++);

}

void delay_60us(void)

 {

  uchar i;

  for(i=0;i<18;i++);

 }//延时60us

void delay_15us(void)

 {

  uchar i;

   for(i=0;i<3;i++);

 }//延时15us

//复位脉冲

bit resetpulse(void)

{

  ds18b20=0;

    delay_600us();

  ds18b20=1;

    delay_60us();

    return ds18b20;

}

//ds18b20初始化

void ds18b20_init(void)

 {

   while(1)

   {

    if(!resetpulse()) //收到ds18b20的低电平信号

     {

       ds18b20=1;

        delay_400us();

        break;

     }

     else

      resetpulse();  //继续发送复位信号

   }

}

void ds18b20_write_byte(uchar date) //写一个字节

{

  uchar i;

    for(i=0;i<8;i++)    //一个字节八位

      {

       // if((date&&0x01)==1) //写入1

  

     //这里错了

         if((date&0x01)==0x01)

        {

         ds18b20=0;

         _nop_();

         ds18b20=1;

   delay_60us();

        }  //end if

        else           //写入0

        {

        ds18b20=0;  

       delay_60us();

       ds18b20=1;

        } //end else

   delay_15us();

       date>>=1;  //右移一位

     }

}

uchar ds18b20_read_byte(void)  //读一个字节

 {

   uchar i,u;

     for(i=0;i<8;i++)  

     {

       u>>=1;

      ds18b20=0;

      _nop_();

              //释放总线

      ds18b20=1;

   _nop_();

   _nop_();

       if(ds18b20==1)     //读1

        {

  u|=0x80;

           

        }

       else

        { u=u&0x7f;       //读0

        

        }

       delay_60us();

     

     }

  return u;

  }

  

uchar read_temperaturn()

 {

   ds18b20_init();            //初始化;

   ds18b20_write_byte(0xcc); //跳过ram;

   ds18b20_write_byte(0x44); //启动温度测量  当为高电平时转换完成

   delayms(750);             //转换时间要求

   

   ds18b20_init();            //初始化;

   ds18b20_write_byte(0xcc); //跳过ram;

   ds18b20_write_byte(0xbe); //采集温度

  delayms(750);

   tmpl=ds18b20_read_byte();    //低位温度数据

   tmph=ds18b20_read_byte();    //高位温度数据

  tmph<<=4;           //左移4位

  tmph+=(tmpl&0xf0)>>4;

  return(tmph);

  }

 

 void main()

 { 

   uchar temph=0;

   uchar templ=0;

   lcd1602init();

   while(1)

    { temp=read_temperaturn();

      

   temph=temp/10+'0';

   templ=temp%10+'0';

      delayms(20);

   display(0,0,temph);

   display(0,1,templ);

  

    }

 }

热心网友 时间:2023-10-13 02:50

(1) void display()函数中的显示顺序有问题,应该先显示最右边的位(即最低位,针对你这个程序是个位),必须先显示最右边的位,依次往左边的位显示,否则先试试有问题的。
(2)仔细检查时序和处理的部分,如果显示255,最有可能就是时序不对,测出来的数值错误。
(3)有数据你参照1602的函数就可以显示 的,先要看一看手册,网上1602的源程序很多,下载一个,看懂说明就可以调用了,当然如果你想练练本领,可以根据手册自己编写,如果你的基础不错的话,也不是难事,看懂时序即可编程。
祝你好运!

热心网友 时间:2023-10-13 02:50

先看硬件电路有没有问题,确认没问题再下步。首先你行调试你的显示程序,给个数值能否正常显示;仔细检查与18B20通讯的时序(那些延时程序必须计算的很准确)。
我看延时程序是用C写的,延时长度不知道你是怎么计算来的,准确吗?
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
人类如何才能悬浮在空中? - 知乎 人体悬浮术是真的存在吗 人体怎样才能真正的在空中悬浮 小孩c蛋白反应高是什么原因 (2014?南海区二模)如图所示,物重G为2000N,小红用800N的拉力花2s的时间... 苹果13系列升级iOS15.5好吗? 出生2o12年11月20日2点姓石光字辈取名 求龙凤胎名字:2012年6月21日(农历5月初3)凌晨0点40分出生,大的为龙,小... by和take有什么区别 takeby后面跟交通工具的区别 数码管显示DS18B20温度 请问一个温度电阻的温度值怎么用数码管直接显示? 在加热设备上的温度通过数字显示,是什么原理?温度传感器与显示屏是怎样实现的? 全桃花芯的拿火吉他,外观很漂亮,有高手试过音色吗? 求助各位大侠帮我编写用数码管和DS18B20设计温度显示器的C语言程序,不要报警器和蜂鸣器的 拿火,芬达,马丁吉他哪个好 打算入手拿火吉他,请问一下哪款比较适合初学者? 热风枪没有数码管显示温度怎么调档位 拿火电箱木吉他怎么样,有没有人用过? 拿火和Awood吉他哪个好? 拿火吉他音质,口述如何? vivo手机微信主页怎么让别人看到我的手机号 拿火吉他的新型材料和木吉他哪个好? EXCEL表里面设了序号太多了,我想删除中间任何一个,我想下面跟着自动排序怎么设呀? Excel删除列自动更新序号方法,日常办公常用技巧,学会不吃亏! 增值税普通发票是什么样的呀? 我喝水都喝的撑着了,还是渴怎么办 上海移动普通套餐可以享受5G吗 以下哪项不是5G超高清优势? 总是喝水还是感觉口渴怎么办? 这个51单片机数码管显示温度程序 数码管无法显示温度数字 如何使pt100的温度在数码管显示 单片机 通过DS18B20测试当前环境温度, 并通过数码管显示当前温度值 求好心人解答,为啥数码管不能正常显示温度(51单片机控制DS18B20) DS18b20数码管显示温度问题?(显示不了,请帮帮忙!) 数码管的工作环境温度? 吃人猴生活在哪里? 如果不熬夜痘痘自然会消吗? 毛衣啥子毛最好? 不熬夜是不是就不会长痘痘了? 熬夜引起的痘痘,不熬夜就会好吗?还是同时要怎样? 辣椒塞肉糊的做法 坚持不熬夜痘痘会消吗? OPPO手机中的来电铃声的从文件中选择怎么删除里面的东东 早睡早起可以让痘痘减少吗? 为什么不熬夜也会长痘痘? 早睡早起脸上的痘会好吗? oppoa5手机从文件中选择里的通话记录怎么删掉 哪件衣服毛质更好?感觉?