成长的路上 发表于 2012-5-5 16:02:30

18B20最简程序

谁能给我分析一下这个程序?越详细越好!先声明一下,我也没有这个程序的电路图!谢谢各位了!!
/*********************************包含头文件********************************/


#include <reg51.h>   
#define lxx unsigned char
#define lxd unsigned int

sbit cs1=P3^0;
sbit cs2=P3^1;
sbit wr=P3^2;
sbit wmq=P2^0;


/*******************************共阳LED段码表*******************************/
lxx code dm[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,},
code wx[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0xf7,};
/*********************************端口定义**********************************/

sbit sj=P3^3;                                   //数据传输线接单片机的相应的引脚


/*********************************定义全局变量******************************/

unsigned char wdd=0;                         //临时变量低位
unsigned char wdg=0;                        //临时变量高位
float wd;                           //温度值
unsigned char i=0;

lxx haomiao;//毫秒
bit wmqs;//蜂鸣器状态控制位
lxx bjwd;//报警温度
lxx wd2;



/****************************************************************************
函数功能:延时子程序
入口参数:k
出口参数:
****************************************************************************/

void ys(unsigned int k)
{         
        while(k>0)k--;
}         

/****************************************************************************
函数功能:数码管扫描延时子程序
入口参数:
出口参数:
****************************************************************************/


void ys1(void)
{
        int k;
        for(k=0;k<200;k++);
}

/****************************************************************************
函数功能:数码管显示子程序
入口参数:k
出口参数:
****************************************************************************/


void xs(int wd)
{
        P0=dm;wr=0;cs1=0;wr=1;cs1=1;
        P0=wx;wr=0;cs2=0;wr=1;cs2=1;
        ys1();
        P0=255;wr=0;cs2=0;wr=1;cs2=1;

        P0=dm;wr=0;cs1=0;wr=1;cs1=1;
        P0=wx;wr=0;cs2=0;wr=1;cs2=1;
        ys1();
        P0=255;wr=0;cs2=0;wr=1;cs2=1;

        P0=dm;wr=0;cs1=0;wr=1;cs1=1;
        P0=wx;wr=0;cs2=0;wr=1;cs2=1;
        ys1();
        P0=255;wr=0;cs2=0;wr=1;cs2=1;

        P0=dm;wr=0;cs1=0;wr=1;cs1=1;
        P0=wx;wr=0;cs2=0;wr=1;cs2=1;
        ys1();
        P0=255;wr=0;cs2=0;wr=1;cs2=1;

}

/****************************************************************************
函数功能:DS18B20初始化子程序
入口参数:
出口参数:
****************************************************************************/



void csh(void)
{
        sj=1;
        ys(5);
        sj=0;
        ys(100);
        sj=1;
        ys(15);
}

void xie(lxx zls)
{
        for(i=0;i<8;i++)
        {
        sj=0;
        sj=zls&0x01;
        ys(10);
        sj=1;
        zls>>=1;
        ys(5);       
        }       
}

lxx du(void)
{
        lxx dus;
        for(i=0;i<8;i++)
        {
                sj=1;
                ys(15);
                sj=0;
                dus>>=1;
                sj=1;
                if(sj)dus|=0x80;
                ys(5);
        }       
        return(dus);
}

void ds18b20(void)
{
        csh();
        xie(0xcc);
        xie(0x44);
        ys(50);
        csh();
        xie(0xcc);
        xie(0xbe);

        wdd=du();
        wdg=du();
        wd=((wdg*256)+wdd)*0.0625;
}


/****************************************************************************
函数功能:主程序
入口参数:
出口参数:
****************************************************************************/   


voidmain()
{
        TMOD=0x01;
        TH0=15535/256;
        TL0=15535%256;
        TR0=1;
        IE=0X82;
        wmq=wmqs=0;
        while(1)
        {
                ds18b20();
                xs(wd);
                bjwd=20;
                wd2=wd;//wd2为温度的暂存变量 作用位减少数码管乱码的频率
        }
}

void T0_zd()interrupt 1
{
    TH0=15535/256;
        TL0=15535%256;       
        if(bjwd<=wd2){wmqs=1;}else{wmqs=0;wmq=0;}
        if(wmqs==1)
        {
                haomiao++;
          if(haomiao>19){haomiao=0;}
                if(haomiao>=10)wmq=0;else wmq=1;
        }
}

成长的路上 发表于 2012-5-6 14:38:00

呵呵,你懂的

無智 发表于 2012-5-6 13:29:14

貌似长短都是差不多这个大小嘛,
楼层倒序了{:lol:}

wkman 发表于 2012-5-6 12:35:24

怎么这个帖子的回复楼层是  “倒序”  的?和论坛多数帖子不同顺序?

成长的路上 发表于 2012-5-6 10:43:11

多谢大家的指点{:handshake:}{:hug:}

BXAK 发表于 2012-5-5 23:02:27

成长的路上 发表于 2012-5-5 22:50 static/image/common/back.gif
讲一下你的详细看法

51忌讳浮点运算,能化成整数运算最好不过

详细点击查看:

18b20得浮点运算0.0625(单位)可以用1/16实现。代码相差1600byte

一个有关0.0625℃的运算想到的问题

xiaoziwen 发表于 2012-5-5 22:54:43

楼上说的很对 18b20的确不好调 mcu不一样可能程序都不一定跑的通
建议楼主研究好时序图 再来看这段程序

成长的路上 发表于 2012-5-5 22:50:48

BXAK 发表于 2012-5-5 19:40 static/image/common/back.gif
用*0.0625不妥,费时费空间

讲一下你的详细看法{:smile:}

成长的路上 发表于 2012-5-5 22:49:04

这是我学长写的程序!

xakila1 发表于 2012-5-5 21:32:44

有没有人愿意翻译程序{:cry:}

syuan163 发表于 2012-5-5 21:11:09

好的程序都有带注释的,一般人都能看得懂。

BXAK 发表于 2012-5-5 19:40:56

用*0.0625不妥,费时费空间

raxb 发表于 2012-5-5 19:35:30

有没有人愿意翻译程序的{:lol:}{:lol:}{:lol:}

peric-ck 发表于 2012-5-5 16:21:11

同意 楼上

成长的路上 发表于 2012-5-5 16:18:33

STC8951,12M晶振

lcofjp 发表于 2012-5-5 16:15:08

妈呀,这叫最简程序……又是无证程序员的杰作。

jetli 发表于 2012-5-5 16:10:56

1wire器件对时隙要求严格,程序不能指出是那类mcu,几Mhz晶振,,光看程序去测试是很费神的
页: [1]
查看完整版本: 18B20最简程序