找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于stc12c5a32s2单片的18b20温度显示固定数值不变,以下是程序,哪位大神能否指导...

[复制链接]
跳转到指定楼层
楼主
ID:389725 发表于 2018-8-24 17:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "ds18b20.h"


void delay(uint z)
{
   uint x,y;
   for(x=z;x>0;x--)
      for(y=110;y>0;y--);
}
void dsreset(void)  //复位,初始化
{
   uint i;
   ds=0;
   i=103;
   while(i>0) i--;
   ds=1;
   i=4;
   while(i>0) i--;
}
bit tempreadbit(void)
{
   uint i;
   bit dat;
   ds=0;
   i++;
   ds=1;
   i++;
   i++;
   dat=ds;
   i=8;
   while(i>0)i--;
   return dat;
}
uchar tempread(void)   //读一个字节函数
{
   uchar i,j,dat;
   dat=0;
   for(i=1;i<=8;i++)
   {
      j=tempreadbit();
   dat=(j<<7)|(dat>>1);  //读出的数据最低位在最前面,这样刚好一个字节在dat里
   }
   return dat;
}
void tempwritebyte(uchar dat)   //写一个字节函数
{
   uint i;
   uchar j;
   bit testb;
   for(j=1;j<=8;j++)
   {
       testb=dat&0x01;
    dat=dat>>1;
    if(testb)
    {
       ds=0;
    i++;
    i++;
    ds=1;
    i=8;
    while(i>0)i--;
  }
     else
  {
    ds=0;
    i=8;
    while(i>0)i--;
    ds=1;
    i++;
    i++;
  }
}
}
void tempchange(void)  //开始获取温度并转换
{
    dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0x44);
}
uint get_temp(void)
{
   uchar a,b;
   uint temp;
   dsreset();
   delay(1);
   tempwritebyte(0xcc);
   tempwritebyte(0xbe);
   a =tempread();                           //存放温度值的低字节
   b =tempread();
   temp=b;
   temp<<=8;
   temp=temp|a;
   temp=temp*0.0625*10+0.5;
   return temp;
}
显示程序在主函数
tempchange();//调用温度转换函数
LcdDisplay(get_temp());   //读取温度并显示
void LcdDisplay(int temp)   //lcd显示
{   
   unsigned char datas[] = {0, 0, 0, 0, 0}; //定义数组
float tp;  
if(temp< 0)    //当温度值为负数
   {
  temp=temp-1;
  temp=~temp;
  tp=temp;
  temp=tp*0.0625*100+0.5;
   }
  else
   {   
   
  tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
  temp=tp*0.0625*100+0.5;
}
datas[0] = temp / 10000;
datas[1] = temp % 10000 / 1000;
datas[2] = temp % 1000 / 100;
datas[3] = temp % 100 / 10;
datas[4] = temp % 10;
write_str("温度:");
write_data('0'+datas[1]|0x30);
write_data('0'+datas[2]|0x30);
write_data('.');
write_data('0'+datas[3]|0x30);
write_data('0'+datas[4]|0x30);
location(4,6);
write_data(0xA1);
write_data(0xE6);
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:388013 发表于 2018-8-24 17:43 | 只看该作者
读取后好像没有返回

评分

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

查看全部评分

回复

使用道具 举报

板凳
ID:137075 发表于 2018-8-24 18:12 | 只看该作者
我也没看到返回
回复

使用道具 举报

地板
ID:80221 发表于 2018-8-25 17:11 | 只看该作者
没刷新显示
回复

使用道具 举报

5#
ID:389725 发表于 2018-8-27 08:11 | 只看该作者

怎么样修改才有返回呢
回复

使用道具 举报

6#
ID:308437 发表于 2018-8-27 10:06 | 只看该作者
1984528951 发表于 2018-8-24 17:43
读取后好像没有返回

显示程序在主函数
tempchange();//调用温度转换函数
LcdDisplay(get_temp());   //读取温度并显示
void LcdDisplay(int temp)   //lcd显示
{   
   unsigned char datas[] = {0, 0, 0, 0, 0}; //定义数组
float tp;  
if(temp< 0)    //当温度值为负数
   {
  temp=temp-1;
  temp=~temp;
  tp=temp;
  temp=tp*0.0625*100+0.5;
   }
  else
   {   
   
  tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
  temp=tp*0.0625*100+0.5;
}
datas[0] = temp / 10000;
datas[1] = temp % 10000 / 1000;
datas[2] = temp % 1000 / 100;
datas[3] = temp % 100 / 10;
datas[4] = temp % 10;
write_str("温度:");
write_data('0'+datas[1]|0x30);
write_data('0'+datas[2]|0x30);
write_data('.');
write_data('0'+datas[3]|0x30);
write_data('0'+datas[4]|0x30);
location(4,6);
write_data(0xA1);
write_data(0xE6);
}
他书主函数调用了

评分

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

查看全部评分

回复

使用道具 举报

7#
ID:307368 发表于 2018-8-27 11:29 | 只看该作者
uint get_temp(void)
{
   uchar a,b;
   uint temp;
   dsreset();
   delay(1);
   tempwritebyte(0xcc);
   tempwritebyte(0xbe);
   a =tempread();                           //存放温度值的低字节
   b =tempread();
   temp=b;
   temp<<=8;
   temp=temp|a;
   temp=temp*0.0625*10+0.5;
   return temp;
}
这个函数已经是温度了,楼上那一段又算了一遍,但也没有看到哪里调用了这段函数。复杂。
启动温度采集,等待足够时间(看配置,有的配置好像需要900ms左右,其他忘了),读取数据,一般就可以了。就算手不去摸他。基本都会跳。

评分

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

查看全部评分

回复

使用道具 举报

8#
ID:389725 发表于 2018-8-27 14:13 | 只看该作者
熊熊生风 发表于 2018-8-27 11:29
uint get_temp(void)
{
   uchar a,b;

LcdDisplay(get_temp());   在主函数的显示函数调用了
回复

使用道具 举报

9#
ID:317472 发表于 2018-8-28 01:40 来自手机 | 只看该作者
LcdDisplay(get_temp());   //读取温度并显示 需要加一个中间变量,分开写
回复

使用道具 举报

10#
ID:384109 发表于 2018-8-28 10:27 | 只看该作者
temp=b;
   temp<<=8;
   temp=temp|a;
   temp=temp*0.0625*10+0.5;
   return temp;
这里的temp*0.0625*10+0.5;去除

temp=tp*0.0625*100+0.5;
   }
  else
   {   
   
  tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
  temp=tp*0.0625*100+0.5;
}
这里改成 temp=(tp*0.0625*100+0.5)*100;
   }
  else
   {   
   
  tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
  temp=(tp*0.0625*100+0.5)*100;
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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