OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4431|回复: 2

关于用数码管显示18b20显示温度采集的问题

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2013-11-11
在线时间
0 小时
发表于 2013-11-11 20:11:32 | 显示全部楼层 |阅读模式

    #include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
 
sbit LS138A = P2^2;  //138译码器 
sbit LS138B = P2^3;    
sbit LS138C = P2^4;
sbit DQ = P2^5;//DS18B20数据口
sbit dula=P2^7;  //段选位
sbit BELL = P2^6;//设置P2.6口,为控制蜂鸣器发声的引脚
 
void init_ds18b20(void);
void delay(uint t);
void write_byte(uchar dat);

uchar read_byte(void);
uchar readtemperature(void);
void display(void);

uchar code table[ ] = { 0x3f,0x06,0x5b,0x4f,
      0x66,0x6d,0x7d,0x07,
      0x7f,0x6f,0x77,0x7c,
      0x39,0x5e,0x79,0x71
        };

void delay_50us(uint t)
{
 uchar j;
 for(;t>0;t--)
  for(j=19;j>0;j--);
}
 
void main(void)
{
while(1)
 {float temp;
 
     display();
 if(temp>=30)  //蜂鸣器发生条件
  {
    BELL=0;
    }
    else
    {
    BELL=1;
    } 
 }

}

void delay(uint t)
{
while(t--);
}
 
void init_ds18b20(void)  //初始化函数
{
uchar n;
 DQ=1;  //DQ先置高
 delay(8);//延时
 DQ=0; //发送复位脉冲
 delay(80); //延时(>480us)
 DQ=1; //拉高数据线 ,释放总线
 delay(8); 
 n=DQ;
 delay(4);

}

void write_byte(uchar dat)  //写函数
{
 uchar i;
 for(i=0;i<8;i++)
 {
  DQ=0;
  DQ=dat&0x01; //最低位开始写
  delay(4);  //延时40us
  DQ=1;
  dat>>=1;//右移一位 
 }
 delay(4);
}

uchar read_byte(void) //读函数
{
  uchar i,value;
 for(i=0;i<8;i++)
 {
  DQ=0;
  value>>=1; //右移一位,也起延时作用
  DQ=1;
  if(DQ) //判断
  value|=0x80; //读出来的数据放入高位,最后右移到低位
  delay(4);
  }
 return value;
}

 uchar readtemperature(void) //读温度函数
 {
 uchar a,b;
 float c;
init_ds18b20();
 write_byte(0xcc);// 跳过ROM
 write_byte(0x44);//启动温度测量
 delay(300);

 init_ds18b20();   //初始化
 write_byte(0xcc);// 跳过ROM
 write_byte(0xbe);//读寄存器
 a=read_byte();    //保存低位L
 b=read_byte();    //保存高位H
 //b<<=4;
 //b+=(a&0xf0)>>4;
//c=(((b*256)+a)*0.0625*10+0.5);
 //delay(200);
 c=((b<<=4)+((a&0xf0)>>4))+((a&0x0f)*0.0625);
 c=c*10+0.5;
return c;
}

void display(void)    //显示函数
{ uint temp;
 temp= readtemperature();
     dula=1;
  0 = table[temp/100];
  dula=0;
   LS138A=1; LS138B=1; LS138C=0;
  delay_50us(20);
   
    dula=1;
  0 = table[temp%100/10]|0x80;
   dula=0;
 LS138A=0; LS138B=1; LS138C=0;
  delay_50us(20);
   
  dula=1;
  0=table[temp%10];
  dula=0;
     LS138A=1; LS138B=0; LS138C=0;
  delay_50us(20);

  dula=1;
  0=table[temp/100];
  dula=0;
     LS138A=0; LS138B=0; LS138C=0;
  delay_50us(20);
}

为何温度到达25.5时会清零,请大神解决,谢谢        

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-11-11 20:17:25 | 显示全部楼层
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-11-12 12:25:27 | 显示全部楼层
回复【楼主位】盘旋的天鹰:
---------------------------------
楼主的温度计算有错误吧,小数的计算和整数计算最好还是分开好点。

我是这样做的,先查表得到小数部分的数值,然后计算整数部分,显示的时候也是,先显示整数,再显示小数,发现这样做比较接近实际,我用的是12bit数据模式
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 21:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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