一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 924|回复: 5

哪位兄弟帮个忙ds18b20,led闪屏问题!!!(已上视频)

[复制链接]
发表于 2013-9-8 16:56 | 显示全部楼层 |阅读模式
本帖最后由 梨花剑雨 于 2013-9-8 17:42 编辑

一直用ds1b20要不用lcd,要不就用段码lcd,数码LED没用过,结果发现DS18B20时序太操蛋,要求太高了,差点不行,好在搞定了

但是现在出现问题了



#include <intrins.h>
#include <string.h>
#include <stdio.h>
#include "DS18B20.h"
sbit   led1 = P1^4;
sbit   led2 = P1^5;
sbit   led3 = P1^6;
sbit   led4 = P1^7;
unsigned char timecount1,timecount2;
unsigned char code tabselect[] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//select
unsigned char ct[8];
unsigned char ct1[8];
unsigned int temp_x;
unsigned int temp_x1;
unsigned char code numtab[16]={0x14,0xD7,0x4C,0x45,0x87,0x25,0x24,0x57,0x04,0x05,0x06,0xA4,0x3C,0xC4,0x2C,0x2E};
int x = 0;
int flag=0;
void InitTimer0(void)
{
    TMOD = 0x01;
    TH0 = 0x0FF;
    TL0 = 0x9C;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}
void Timer0Interrupt(void) interrupt 1
{
    TH0 = 0x0FF;
    TL0 = 0x9C;
timecount1++;
}
//30000 us
void delay(void)   //误差 0us
{
    unsigned char a,b;
    for(b=111;b>0;b--)
        for(a=12;a>0;a--);
}
void main()
{
int i;
led1 = 1;
led2 = 0;
led3 = 0;
led4 = 0;

memset(ct,0x00,8);
InitTimer0();
while(1)
{

  if(timecount1>250)
    {
      timecount1=0;
   x = Read_Temp();
     }
  for(i=1;i<5;i++)
  {

  if(i==1)
   {
   led1=1;led2=0;led3=0;led4=0;
   
   P2 = 0xff;
     
    delay();
    led1=0;led2=0;led3=0;led4=0;
    }
   if(i==2)
   {
   led1=0;led2=1;led3=0;led4=0;
   P2 = numtab[ct[4]];
    delay();
    led1=0;led2=0;led3=0;led4=0;
   }
   if(i==3)
   {
   led1=0;led2=0;led3=1;led4=0;
   P2 = (numtab[ct[3]]+0xfb-0xff);
    delay();
    led1=0;led2=0;led3=0;led4=0;
   }
   if(i==4)
   {
   led1=0;led2=0;led3=0;led4=1;
   P2 = numtab[ct[2]];
    delay();
    led1=0;led2=0;led3=0;led4=0;
    }   
   //全关
   P2 = 0xff;
    delay();
    led1=0;led2=0;led3=0;led4=0;   
   
  }
}
  
}

这是程序,我的led刷新3ms(3000us),一次,ds18b20读挺慢的,现在就出现了闪屏(一读ds18b20就有延时)!!

这是,12m 89c516rd+的运行环境下


发表于 2013-9-8 17:31 | 显示全部楼层
加个锁存不行么,硬件上解决
回复

使用道具 举报

发表于 2013-9-8 17:32 | 显示全部楼层
最好定时器实现18b20的时序、、、、、
回复

使用道具 举报

发表于 2013-9-8 19:08 | 显示全部楼层
先试试这样:
发送转换指令和读取分开。

不行的话,每一个字节的读取与写入分开(18b20允许这样)。

还不行的话,每一个位的读取与写入分开(18b20允许这样)。

我在一个需要刷VFD屏幕的程序里用了最后一个方法,个人感觉还是比较完美的。
(ATMEGA32@24MHz,VFD扫描调用频率4.4KHz)
回复

使用道具 举报

发表于 2013-9-8 19:23 | 显示全部楼层
本帖最后由 jimmy_xt 于 2013-9-8 19:25 编辑

解决一切的关键就在这幅图的红圈里。
Trec的最大值并没有要求。也就是说,你可以发完一位之后,等任意大于1us的时间再写下一位。
这样一来,就可以把18b20的读取与写入变成N个细小的部分,从而避免影响屏幕的刷新。

无标题.png

点评

谢谢了,有空试下,昨天还上班,没法搞这个,只有六日搞了!  发表于 2013-9-8 21:13
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-8-20 21:22 , Processed in 0.068873 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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