查看: 3079|回复: 1
打印 上一主题 下一主题

18B20最简程序

[复制链接]
跳转到指定楼层
沙发
发表于 2016-6-23 20:35:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*********************************包含头文件********************************/


#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[wd%10];wr=0;cs1=0;wr=1;cs1=1;
        P0=wx[0];wr=0;cs2=0;wr=1;cs2=1;
        ys1();
        P0=255;wr=0;cs2=0;wr=1;cs2=1;

        P0=dm[wd%100/10];wr=0;cs1=0;wr=1;cs1=1;
        P0=wx[1];wr=0;cs2=0;wr=1;cs2=1;
        ys1();
        P0=255;wr=0;cs2=0;wr=1;cs2=1;

        P0=dm[wd%1000/100];wr=0;cs1=0;wr=1;cs1=1;
        P0=wx[2];wr=0;cs2=0;wr=1;cs2=1;
        ys1();
        P0=255;wr=0;cs2=0;wr=1;cs2=1;

        P0=dm[wd%10000/1000];wr=0;cs1=0;wr=1;cs1=1;
        P0=wx[3];wr=0;cs2=0;wr=1;cs2=1;
        ys1();
        P0=255;wr=0;cs2=0;wr=1;cs2=1;

}

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



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;
}


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


void  main()
{
        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;
        }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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