一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

搜索
楼主: benli

[其他综合] 这个DS18B20程序哪里有问题

[复制链接]
 楼主| 发表于 2013-6-1 12:41 | 显示全部楼层
倪大德 发表于 2013-6-1 12:35
1。 在一幅扫描之后读取无闪烁!

                2。在读取时最好屏蔽系统中断 ...

这样处理的,在中断计数里每隔1.5S将标志位dip_flag置1
while(1)
{
EA=0;
   DS1302_GetTime(now);            //读取当前时间
        Tim[0]=now[6]/16*10+now[6]%16; Tim[1]=now[4]/16*10+now[4]%16; Tim[2]=now[3]/16*10+now[3]%16;

   EA=1;
   hour=(now[2]>>4&0x0f)*10+(now[2]&0x0f);                //亮度调整
                            if(hour<=5)       liang=1;
        else if(hour<=7)  liang=7;
        else if(hour<=19) liang=10;
        else if(hour<=21) liang=5;
        else if(hour<=24) liang=1;

    Conversion( );           //农历处理函数
        Key();                //键处理

                for(disrow=0;disrow<16;disrow++)//扫描16行       
          {       
                            loadoneline1();//装载一线时间点阵数据

                          switch(set_S)
                          {
                                  case 1:         loadoneline6();                          //调年时只显示年数据
                                                break;
                                case 3:
                                case 2:  loadoneline2();                          //调日期时只显示日期
                                                break;
                                case 7:  loadoneline4();                          //调星期时只显示星期
                                                break;
                                default:

                        if(con==0)loadoneline2();           //装载公历点阵数据v
                        if(con==1) loadoneline3();           //装载农历点阵数据v
                        if (con==2) loadoneline4();           //装载星期点阵数据v
                                                if (con==3) loadoneline5();           //装载温度点阵数据
                                                break;
                                                }
                        sendoneline2();//发送下半屏一线点阵数据
                        P1=((disrow+1)&0x0f)|0x60;// 扫描行                               
                                                //STB=0;
                        STB= 1;   // 点亮屏幕
                         OE=0;                       
                delay(liang);               
                   OE=1;                          //亮度调节
                   delay(15-liang);
           }
                if (dip_flag==1) {dip_flag=0;ReadTemp();}          //当dip_flag为1时读取18B20温度
  }

回复

使用道具 举报

发表于 2013-6-1 13:03 | 显示全部楼层
benli 发表于 2013-6-1 12:41
这样处理的,在中断计数里每隔1.5S将标志位dip_flag置1
while(1)
{



      if (dip_flag==1) {dip_flag=0;ReadTemp();}          //当dip_flag为1时读取18B20温度
};


            一。 不清楚整个程序设计。为何要设定dip_flag为1时读取。   

           二。 对DS18B20来说,不是用在单一温控系统中,实时性高。

                  在此屏中,一分钟读取也无大限,个人感觉可直接读取。


            ReadTemp();      //读取18B20温度
};
回复

使用道具 举报

 楼主| 发表于 2013-6-1 13:27 | 显示全部楼层
倪大德 发表于 2013-6-1 13:03
if (dip_flag==1) {dip_flag=0;ReadTemp();}          //当dip_flag为1时读取18B20温度
};
...

f (dip_flag==1) {dip_flag=0;ReadTemp();}          //当dip_flag为1时读取18B20温度
};就是为了间隔一定时间读取一次,这标志位没有别的作用。for循环里部分是显示一幅画面的,每次读取会造成亮度严重下降,读取18B20温度用的时间太长了,

回复

使用道具 举报

发表于 2013-6-1 13:40 | 显示全部楼层
倪大德 发表于 2013-6-1 12:16
现在已很多少用STC片了,原因是:性价比并不高。

我用的俩片子都是ATMEL的AVR。
而且基本都是以前项目剩下的片子,废物利用而已。

DIY本身就没啥性价比啊(组装套件那种不算在内,这里说的是自己设计PCB,自己写程序那种)。



回复

使用道具 举报

发表于 2013-6-1 13:43 | 显示全部楼层
benli 发表于 2013-6-1 13:27
f (dip_flag==1) {dip_flag=0;ReadTemp();}          //当dip_flag为1时读取18B20温度
};[/ ...


          以一幅显示“实用单片机”为例:


         一。 先显示“实用单片机”

        二。结束后关屏同时读取DS18B20


       三。以此循环
回复

使用道具 举报

 楼主| 发表于 2013-6-1 13:48 | 显示全部楼层
倪大德 发表于 2013-6-1 13:43
以一幅显示“实用单片机”为例:

倪工还是先估算下读取18B20温度一次需要多少时间吧
回复

使用道具 举报

发表于 2013-6-1 14:05 | 显示全部楼层
benli 发表于 2013-6-1 13:48
倪工还是先估算下读取18B20温度一次需要多少时间吧



                 

            可以查阅一下本坛我的一字屏的程序!
回复

使用道具 举报

 楼主| 发表于 2013-6-1 14:16 | 显示全部楼层
倪大德 发表于 2013-6-1 14:05
可以查阅一下本坛我的一字屏的程序!

这种方式我早试过了,亮度下降严重,用来点亮屏的时间太少了
回复

使用道具 举报

发表于 2013-6-1 14:17 | 显示全部楼层
我严格按器件手册上时许写的读取函数,单纯的读取,需要2ms。
LZ这个需要2.8ms因为前面还有发送转换指令。

就看LZ应用场合了。

我那个,VFD刷屏占了80+%多的CPU时间,5kHz的调用频率,在25Mhz的晶振下,剩余整段CPU时间不到1ms……
根本没办法有效的接收18b20的数据啊。
回复

使用道具 举报

 楼主| 发表于 2013-6-1 14:30 | 显示全部楼层
jimmy_xt 发表于 2013-6-1 14:17
我严格按器件手册上时许写的读取函数,单纯的读取,需要2ms。
LZ这个需要2.8ms因为前面还有发送转换指令。 ...

我是在3264点阵时钟上,每隔一定时间读取一次温度时会造成轻微的闪一下,不关他了,反正不会一直盯着看吧
回复

使用道具 举报

本版积分规则

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

GMT+8, 2025-8-19 03:43 , Processed in 0.034843 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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