打印

问个18b20程序的问题,纠结很长时间了,求解救

[复制链接]
6026|43
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
东北小辉辉|  楼主 | 2012-12-9 13:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 东北小辉辉 于 2012-12-9 13:47 编辑


唉!一个小小的温度传感器搞的我头昏脑胀,程序是用51写的,我把读写函数和初始化函数贴出来,大家看一下思路是否有问题,我调了很长时间了,要不是走投无路也不会麻烦大家!
void init_18b20()
{
        dq=0;
        delay2(53);//延时493us,需要延时超过480,最大960
        dq=1;//释放总线
        delay2(5);//经测试延时61us
        while(!dq);//等待18b20输出低
        delay(46);//释放总线到开始执行其他操作需要至少480us
}
void write_18b20(uchar dat)//写时序
{
        uchar i;
        bit j;
        for(i=8;i>0;i--)
        {
                j=dat&0x01;
                dat=dat>>1;
                dq=1;//一次下降沿表示写操作开始
                dq=0;//同上
                if(j)
                {
                        dq=0;
                        dq=1;
                        delay2(5);//延时61us
                }
                else
                {
                        dq=0;
                        delay2(5);
                }
        }
}
uchar read_18b20()//读时序
{
        uchar i,dat;
        for(i=8;i>0;i--)
        {
                dq=1;
                dq=0;
                _nop_();//持续低电平1us
                dq=1;
                dat=dat>>1;
                if(dq==1)
                {
                        dat=dat|0x80;
                        delay2(5);
                }
        }
        return dat;
}

补充下,我是用proteus仿真,上电后显示66,然后显示<7,调节温度示数不变化。

相关帖子

沙发
lanseshuijing| | 2012-12-9 13:48 | 只看该作者
//#ifndef _ds18b20_h_
//#define _ds18b20_h_
#include <at89x51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
p1=0;p2=0;p3=0;
sbit DQ=P2^6;
uchar temp[8],i,a_a,temp_buff;
uchar flag=0,crc_tmp;        uint  t=0;
void delayfor(uchar i);
void delay11us(uint k);
void delay1ms(uint k);
uchar ds18b20_readchar();          //read_command
void ds18b20_writechar(uchar dat);          //write_command
readtemperature(void);       //read_temperature
void gettemperature(void);
//uchar CRC (uchar j);
void read_18b20_info();
sbit one=P1^0;
//sbit wela=P2^7;
uchar ge=0x0e;
uchar shi=0x0d;
uchar bai=0x0b;
uchar qian=0x07;
/*uchar code CrcTable [256]={
0,94,188,226,97,63,221,131,194,156,126,32,163,253,31,65,
157,195,33,127,252,162,64,30,95,1,227,189,62,96,130,220,
35,125,159,193,66,28,254,160,225,191,93,3,128,222,60,98,
190,224,2,92,223,129,99,61,124,34,192,158,29,67,161,255,
70,24,250,164,39,121,155,197,132,218,56,102,229,187,89,7,
219,133,103,57,186,228,6,88,25,71,165,251,120,38,196,154,
101,59,217,135,4,90,184,230,167,249,27,69,198,152,122,36,
248,166,68,26,153,199,37,123,58,100,134,216,91,5,231,185,
140,210,48,110,237,179,81,15,78,16,242,172,47,113,147,205,
17,79,173,243,112,46,204,146,211,141,111,49,178,236,14,80,
175,241,19,77,206,144,114,44,109,51,209,143,12,82,176,238,
50,108,142,208,83,13,239,177,240,174,76,18,145,207,45,115,
202,148,118,40,171,245,23,73,8,86,180,234,105,55,213,139,
87,9,235,181,54,104,138,212,149,203,41,119,244,170,72,22,
233,183,85,11,136,214,52,106,43,117,151,201,74,20,246,168,
116,42,200,150,21,75,169,247,182,232,10,84,215,137,107,53};*/
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0xff,0xbf};
void delay(uint z);
void main()
{  
   read_18b20_info();
    while(1)
      {
               

                readtemperature();
                gettemperature();
                    if(temp[1]==0)
                      {temp[1]=10;

                        if(temp[2]==0)
                          {temp[2]=10;
                           if(temp[3]==0)temp[3]=10;
                          }
                  }  

                  P1=ge;
                  //aa=temp[4];
              P0=table[temp[4]];
              delay(2);
              P1=shi;
                 P0=table[temp[3]]&0x7f;
              delay(2);
              P1=bai;
                  //cc=temp[2];
              P0=table[temp[2]];
              delay(2);
              P1=qian;
                  if(flag==1)temp[1]=11;
              P0=table[temp[1]];
              delay(2);       
                 
               




      }






}

//子程序--18b20--


void delayfor(uchar i)          //delay 20.54 us
{
   for(i;i>0;i--) _nop_();
}

void delay11us(uint k)   //4.32us        27.04 k=3.25
{
  while(k--);                        //delay 20.55 us
// _nop_();                        //2.17us
  //_nop_();//
  //_nop_();
  //_nop_();
  //_nop_();
  //_nop_();//while(k--);
  //_nop_();
  //_nop_();
  //_nop_();
}
void delay1ms(uint k)  //delay 1ms
{
k=k*98;
while(k--);
}
/**18b20**/
void ds18b20_init(void)
{
  DQ=1;
  delayfor(3);
  DQ=0;
  delay11us(80);//delay796;
  DQ=1;
  delayfor(30);
  DQ=1;//        25
}
//********************************************
/**ds18b20读一个字节**/
//********************************************
uchar ds18b20_readchar(void)
{
          uchar i=0;
        uchar dat = 0;
        for(i=8;i>0;i--)
         {
                  DQ = 0; // 给脉冲信号
                  dat>>=1;
                  DQ = 1; // 给脉冲信号
                  if(DQ)
                  dat|=0x80;
                  delay11us(3);           //(2)36.77us (3)46.50us (4)56.24 ()/9.7us
                 // delay11us(10);
         }
        return(dat);
}
//*****************************************************
/**ds18b20写一个字节**/
//*****************************************************
void ds18b20_writechar(uchar dat)
{
//uchar i=0;
for (i=8; i>0; i--)
  {
    DQ = 0;
    DQ = dat&0x01;
    delay11us(5);  //delay56.20us
    DQ = 1;
    dat>>=1;
  }
}
//********************************************************
/**读出温度**/
//********************************************************
readtemperature(void)
{
        uchar a=0;
        uchar b=0;
        //;uint  t=0;
        ds18b20_init();
        ds18b20_writechar(0xCC); // 跳过读序号列号的操作
        ds18b20_writechar(0x44); // 启动温度转换
        delay11us(500);
        ds18b20_init();
        ds18b20_writechar(0xCC); //跳过读序号列号的操作
        ds18b20_writechar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
        a=ds18b20_readchar();
//        ds18b20_writechar(0xBE);
        b=ds18b20_readchar();
        if((b*256+a)>2000)       
          {
                          t=~(b*256+a)+1; t=t*25/40;flag=1;//取反加1 //;
           }  
        else
          {
                         t=(b*256+a)*25/40;flag=0;
          }       
        return(t);                          
}
//********************************************************
/**温度数值处理**/         
//********************************************************
void gettemperature()
{
  

        temp[0]=flag;
        temp[1]=t/1000;
        temp[2]=(t%1000)/100;
        temp[3]=(t%100)/10;
        temp[4]=t%10;

}
//********************************************************
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
                }
/**********************************/
/*********crc*********************/
/*uchar CRC (uchar j)
{
    uchar i,crc_data=0;
        temp_buff=0;
   for(i=0;i<j;)  //查表校验
     {crc_data = CrcTable[crc_data^temp[temp_buff]];
         i++;
         temp_buff++;
         }
    return (crc_data);
}
   */



/*******************************************************/
/*read18b20 info
/*******************************************************/
void read_18b20_info(void)
{
//uchar i=0;
temp_buff=0;
ds18b20_init();
ds18b20_writechar(0x33);
for(i=0;i<8;)
{
  temp[temp_buff]=ds18b20_readchar();
  i++;
  temp_buff++;
}
//crc_tmp=CRC(7);
//if(crc_tmp==temp[7])
   // {
         

  //  }
// else
//{
//P1=shi;
        // P0=table[7];
//         delay(20);
//}


}       
这是我以前写的你参考参考

使用特权

评论回复
板凳
NE5532| | 2012-12-9 14:11 | 只看该作者
本帖最后由 NE5532 于 2012-12-9 14:13 编辑

我看了你几个帖子,问题都是一样的——不会写程序。

写了一大堆出来,然后调,不通就瓜看。程序模块在哪里?分模块调试在哪里?不解决这个问题,一辈子都不会自己走路。建议先认真学习《程序调试黑包书》!

另外一个大问题就是——仿真,赶快卸载那个Pro啥的软件,你就成功一半了。那些说仿真好,骂我批判仿真的朋友们,看看这个被你们害死的孩子~~~!!!!

使用特权

评论回复
地板
东北小辉辉|  楼主 | 2012-12-9 14:28 | 只看该作者
本帖最后由 东北小辉辉 于 2012-12-9 14:38 编辑
NE5532 发表于 2012-12-9 14:11
我看了你几个帖子,问题都是一样的——不会写程序。

写了一大堆出来,然后调,不通就瓜看。程序模块在哪里 ...


首先感谢前辈的批评,但是我有一些不同的意见,我一般都是准备仿真成功后再焊出来的,我认为如果直接焊接的话,软件和硬件都有可能存在问题,到时候分不清是硬件的问题还是软件的问题了,我是个大二的学生,并且不是电子专业的,做这些纯属兴趣,不会像前辈一样,做很大型的程序,程序调试黑宝书我看过,也明白分模块调试的重要性,而且这个程序只有初始化,读写函数,应该已经算是一个小模块了吧!显示部分和其他部分我都没有贴上来,最后,冒犯之处请多包涵!

使用特权

评论回复
5
沉默爱电子| | 2012-12-9 14:28 | 只看该作者
上硬件吧。网上18B20的程序也很多啊

使用特权

评论回复
6
NE5532| | 2012-12-9 14:40 | 只看该作者
没这个说法,18B20就1根线,这么简单地东西仿真做啥?电子专业没用,学的一大堆废物。那你先说说你怎么分的模块,怎么调试的,哪些模块通了?哪些没通?

使用特权

评论回复
7
东北小辉辉|  楼主 | 2012-12-9 14:49 | 只看该作者
NE5532 发表于 2012-12-9 14:40
没这个说法,18B20就1根线,这么简单地东西仿真做啥?电子专业没用,学的一大堆废物。那你先说说你怎么分的 ...

就是做一个钟和温度整合到一起的小东西,还有闹钟倒计时什么的小功能,我把所有程序都写到一个文件,没有分为多个文件,分模块的话就是分为时钟模块,温度计模块,显示部分,然后就分别屏蔽调试,如果一个大的模块出现问题的话就再细化,比如时钟出问题的话就分为基础计时模块,闹钟模块,倒计时,秒表等等。

使用特权

评论回复
8
东北小辉辉|  楼主 | 2012-12-9 14:50 | 只看该作者
NE5532 发表于 2012-12-9 14:40
没这个说法,18B20就1根线,这么简单地东西仿真做啥?电子专业没用,学的一大堆废物。那你先说说你怎么分的 ...

其他部分已经调试正常,只有温度这块没搞定,所以我怀疑是我的时序有问题,想让前辈们来看看!

使用特权

评论回复
9
NE5532| | 2012-12-9 14:51 | 只看该作者
那你现在准备找那个模块的问题?怎么找?

使用特权

评论回复
10
ayb_ice| | 2012-12-9 14:58 | 只看该作者
baidu一大堆,
proteus例程也有

使用特权

评论回复
11
东北小辉辉|  楼主 | 2012-12-9 15:01 | 只看该作者
NE5532 发表于 2012-12-9 14:51
那你现在准备找那个模块的问题?怎么找?

没什么好方法,唉!我从来没接触过示波器,估计可以用示波器看一下波形?

使用特权

评论回复
12
东北小辉辉|  楼主 | 2012-12-9 15:03 | 只看该作者
ayb_ice 发表于 2012-12-9 14:58
baidu一大堆,
proteus例程也有

我也找过其他例程,但是您知道,每个人写程序的习惯是不同的,我想锻炼一下自己写程序的能力,只看数据手册,并且,其他人写的程序有的我看不懂,有的我认为是错误的,所以就自己写了。

使用特权

评论回复
13
NE5532| | 2012-12-9 15:14 | 只看该作者
硬件不会用示波器,等于瞎调。另外你现在的问题根本用不着示波器,既然上电乱显,是不是应该先把显示模块拿出来看一下呢???????????

使用特权

评论回复
14
东北小辉辉|  楼主 | 2012-12-9 15:29 | 只看该作者
NE5532 发表于 2012-12-9 15:14
硬件不会用示波器,等于瞎调。另外你现在的问题根本用不着示波器,既然上电乱显,是不是应该先把显示模块拿 ...


是这样的,前辈,我认为并不是上电乱显,因为时钟,日历什么的其他模块显示完全正常,如果温度初始化与读写完全正常的话,就算是乱显,我调整温度的值,乱码应该也会发生响应的变化的,当然,不排除您说的情况。
PS:看来我应该去学一下示波器。:)

使用特权

评论回复
15
不断奔跑| | 2012-12-9 15:36 | 只看该作者

使用特权

评论回复
16
ayb_ice| | 2012-12-9 15:50 | 只看该作者
这个程序延时部分很重要(时间要准,还要合理,仔细看手册,取中间值较好),很多操作必须关中断

使用特权

评论回复
17
NE5532| | 2012-12-9 16:27 | 只看该作者
东北小辉辉 发表于 2012-12-9 15:29
是这样的,前辈,我认为并不是上电乱显,因为时钟,日历什么的其他模块显示完全正常,如果温度初始化与读 ...

那你现在应该在读18B20的函数出口处,给读到的值赋一个定值,然后看显示正常不,这样才把18B20给排除开来看啊。

使用特权

评论回复
18
望断云山| | 2012-12-9 16:41 | 只看该作者
时序错了,延时应放在
dq=0;
dq=1;
之间
另外初始化时,应根据dq的高低做相应的标志,判断是否有18b20存在或者说18b20是否正常响应了,

使用特权

评论回复
19
ayb_ice| | 2012-12-9 17:07 | 只看该作者
这个单总线可有点不简单,特别是搜索命令

使用特权

评论回复
20
胜煌电子| | 2012-12-9 17:12 | 只看该作者
本帖最后由 胜煌电子 于 2012-12-9 17:13 编辑

我那个郁闷了你们 怎么这样呢。。写C++ 这么不亦乐乎啊 。。呵呵



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

91

帖子

0

粉丝