找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于多个ds18b20测温数码管显示的问题

  [复制链接]
回帖奖励 100 黑币 回复本帖可获得 20 黑币奖励! 每人限 1 次(中奖概率 50%)
跳转到指定楼层
楼主
ID:86791 发表于 2015-12-12 10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为什么使用单个ds18b20测温用数码管显示很正常。
当多个ds18b20测温时,数码管显示其中一个ds18b20的温度时数码管一个很亮,其他数码管很暗还会一直闪??

源码:
#include"delay.h"
void delay(uint z)      //毫秒级延时函数
{
     uint x,y;
  for(x=z;x>0;x--)
   for(y=240;y>0;y--);
}
void delay_18B20(uint t)  //ds18b20延时函数
{
     while(t--);
}

数码管程序:
#include<stc12c5a60s2.h>
#include"smg.h"
#include"delay.h"
#define DataPort P1     //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH2=P2^3;    //位选
sbit LATCH1=P2^2;    //段选
uchar code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code smg_we[]={0xbf,0x7f};
void display(uchar i,uchar dat)
{
       DataPort=0;   //清空数据,防止有交替重影
       LATCH1=1;     //段锁存
       LATCH1=0;   
    DataPort=smg_we[i]; //取位码
       LATCH2=1;     //位锁存
       LATCH2=0;
    DataPort=smg_du[dat]; //取显示数据,段码
       LATCH1=1;     //段锁存
       LATCH1=0;
         
//    delay_18B20(200); // 扫描间隙延时,时间太长会闪烁,太短会造成重影
//    DataPort=0;   //清空数据,防止有交替重影                  
}

ds18b20程序:
#include<stc12c5a60s2.h>
#include"ds18b20.h"
#include"smg.h"
#include"delay.h"      //注:stc12c5a60s2单片机执行一条语句的时间是普通51单片机的1/12,在写时序时一定要注意到
sbit DQ=P2^0;
uchar code str1[]={0x28,0xC2,0x99,0x41,0x07,0x00,0x00,0xBE}; //ROM 1
uchar code str2[]={0x28,0xAE,0x79,0xFA,0x05,0x00,0x00,0x90}; //ROM 2
uchar data disdata[2];
uint tvalue;         //温度值

void init_ds18b20()//ds1820复位   
{
DQ=1;          //DQ复位
delay_18B20(40); //延时
DQ=0;          //DQ拉低
delay_18B20(1000); //精确延时大于480us
DQ=1;          //拉高
delay_18B20(400);
}
void write_byte(uchar dat)      //写一个字节
{
    uchar i=0;
    for(i=8;i>0;i--)
    {
   DQ=0;
      DQ=dat&0x01;
      delay_18B20(100);
      DQ=1;
      dat>>=1;
    }
}
uchar read_byte()       //读一个字节
{
    uchar i=0;
uchar dat=0;
for(i=8;i>0;i--)
{  
     DQ=0; //给脉冲信号
     dat>>=1;
     DQ=1; //给脉冲信号
     if(DQ)
     dat|=0x80;
     delay_18B20(100);
}
   return(dat);
}
void ds18b20_Matchrom(uchar a)  //匹配ROM
{
char j;
write_byte(0x55);    //发送匹配ROM命令
if(a==1)
{
for(j=0;j<8;j++)
  write_byte(str1[j]);  //发送18B20的序列号,先发送低字节
}
if(a==2)
{
for(j=0;j<8;j++)
  write_byte(str2[j]);  //发送18B20的序列号,先发送低字节
}
}
uchar read_temp(uchar z)   //读取温度值并转换
{
    uchar a,b;
init_ds18b20();   
write_byte(0xcc);   //跳过读序列号
init_ds18b20();
if(z==1)
{
  ds18b20_Matchrom(1);   //匹配ROM 1
}
if(z==2)
{
  ds18b20_Matchrom(2);   //匹配ROM  2
}
write_byte(0x44);//*启动温度转换*/
delay(5);
init_ds18b20();   
write_byte(0xcc);    //跳过读序列号
init_ds18b20();
if(z==1)
{
  ds18b20_Matchrom(1);       //匹配ROM 1
}
if(z==2)
{
  ds18b20_Matchrom(2);    //匹配ROM  2
}
write_byte(0xbe);//*读取温度*/
a=read_byte();
b=read_byte();
tvalue=b<<4;
tvalue|=(a&0xf0)>>4;
return(tvalue);
}

void ds1820display()//温度值显示
{   
   
   if(z==1)
  {
      read_temp();
      disdata[0]=tvalue%100/10;//十位数
      display(0,disdata[0]);
   delay_18B20(2000);
   disdata[1]=tvalue%10;//个位数
   display(1,disdata[1]);
//   delay(5);
   
      
  }
  
}

主程序;
#include"ds18b20.h"

void main()
{
    init_ds18b20();
    while(1)
{
    ds1820display();    //温度值显示
}
}

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

使用道具 举报

沙发
ID:76227 发表于 2015-12-12 11:34 | 只看该作者
多个DS18B20的时候电流较比单个DS18B20需求的电流大,对于这种情况建议   你的数码管单独使用供电电源   不要直接用单片机上的电源供电
回复

使用道具 举报

板凳
ID:99411 发表于 2015-12-12 12:37 | 只看该作者

回帖奖励 +20 黑币

我也不懂,只是想回答拿个积分下载
回复

使用道具 举报

地板
ID:67175 发表于 2015-12-20 07:43 | 只看该作者
使用多个传感器要用到单总线,你可以看看。
回复

使用道具 举报

5#
ID:94642 发表于 2016-1-20 15:05 | 只看该作者

回帖奖励 +20 黑币

这个应该和硬件有关,和软件没关系
回复

使用道具 举报

6#
ID:103977 发表于 2016-1-21 10:20 | 只看该作者
多个DS18B20的时候电流较比单个DS18B20需求的电流大
回复

使用道具 举报

7#
ID:103999 发表于 2016-1-21 13:24 | 只看该作者
看不到C只会用汇编
回复

使用道具 举报

8#
ID:115486 发表于 2016-4-20 19:25 | 只看该作者

回帖奖励 +20 黑币

写的很好
回复

使用道具 举报

9#
ID:115545 发表于 2016-4-20 20:36 | 只看该作者
这是基于无线的吗?
回复

使用道具 举报

10#
ID:75321 发表于 2016-4-26 16:26 | 只看该作者

回帖奖励 +20 黑币

检查一下你的硬件电路,看电压是否有跳动
回复

使用道具 举报

11#
ID:75321 发表于 2016-4-26 16:28 | 只看该作者
如果电压很稳定,则可以看看是否存在虚焊的地方;数码管与单片机之间可以去掉限流电阻

评分

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

查看全部评分

回复

使用道具 举报

12#
ID:99938 发表于 2016-4-26 22:56 | 只看该作者
首先你需要看看电压是否稳定,数码管不亮可能是焊接的问题,或驱动的地方的焊接。既然一个能很亮,很可能在焊接的地方。

评分

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

查看全部评分

回复

使用道具 举报

13#
ID:97438 发表于 2016-4-27 09:41 | 只看该作者
和软件也是有关系的。。。你的延时太久了,导致数码管刷新很慢,所以会出现这个问题

评分

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

查看全部评分

回复

使用道具 举报

14#
ID:104472 发表于 2016-4-27 09:57 | 只看该作者
18b20直接读出的数据在数码管上来不断刷,造成数码管无法显示。

评分

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

查看全部评分

回复

使用道具 举报

15#
ID:115486 发表于 2016-5-19 20:39 | 只看该作者
有什么问题吗?
回复

使用道具 举报

16#
ID:115486 发表于 2016-5-19 20:39 | 只看该作者
怎么只有8币
回复

使用道具 举报

17#
ID:122080 发表于 2016-5-19 23:03 | 只看该作者

回帖奖励 +20 黑币

如果写ROM的时候选择了跳过序列码模式,可能导致只有一个温度传感器响应
回复

使用道具 举报

18#
ID:197037 发表于 2017-5-5 19:36 | 只看该作者
和软件也是有关系的吧。延时太久会导致数码管刷新很慢的
回复

使用道具 举报

19#
ID:170270 发表于 2017-5-6 13:26 | 只看该作者
程序的问题 数码管刷新在2MS左右正常  把显示程序放在2MS的定时中断里面就OK了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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