搜索
bottom↓
回复: 16

18B20最简程序

[复制链接]

出0入0汤圆

发表于 2012-5-5 16:02:30 | 显示全部楼层 |阅读模式
谁能给我分析一下这个程序?越详细越好!先声明一下,我也没有这个程序的电路图!谢谢各位了!!
/*********************************包含头文件********************************/


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

}

/****************************************************************************
函数功能: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;
}


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


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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2012-5-6 14:38:00 | 显示全部楼层
呵呵,你懂的

出0入0汤圆

发表于 2012-5-6 13:29:14 | 显示全部楼层
貌似长短都是差不多这个大小嘛,
楼层倒序了

出0入0汤圆

发表于 2012-5-6 12:35:24 | 显示全部楼层
怎么这个帖子的回复楼层是  “倒序”  的?和论坛多数帖子不同顺序?

出0入0汤圆

 楼主| 发表于 2012-5-6 10:43:11 | 显示全部楼层
多谢大家的指点

出0入0汤圆

发表于 2012-5-5 23:02:27 | 显示全部楼层
成长的路上 发表于 2012-5-5 22:50
讲一下你的详细看法

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

详细点击查看:

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

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

出0入0汤圆

发表于 2012-5-5 22:54:43 | 显示全部楼层
楼上说的很对 18b20的确不好调 mcu不一样可能程序都不一定跑的通
建议楼主研究好时序图 再来看这段程序

出0入0汤圆

 楼主| 发表于 2012-5-5 22:50:48 | 显示全部楼层
BXAK 发表于 2012-5-5 19:40
用  *0.0625  不妥,费时费空间

讲一下你的详细看法

出0入0汤圆

 楼主| 发表于 2012-5-5 22:49:04 | 显示全部楼层
这是我学长写的程序!

出0入0汤圆

发表于 2012-5-5 21:32:44 | 显示全部楼层
有没有人愿意翻译程序

出0入0汤圆

发表于 2012-5-5 21:11:09 | 显示全部楼层
好的程序都有带注释的,一般人都能看得懂。

出0入0汤圆

发表于 2012-5-5 19:40:56 | 显示全部楼层
用  *0.0625  不妥,费时费空间

出0入0汤圆

发表于 2012-5-5 19:35:30 | 显示全部楼层
有没有人愿意翻译程序的

出0入0汤圆

发表于 2012-5-5 16:21:11 | 显示全部楼层
同意 楼上

出0入0汤圆

 楼主| 发表于 2012-5-5 16:18:33 | 显示全部楼层
STC8951,12M晶振

出0入0汤圆

发表于 2012-5-5 16:15:08 | 显示全部楼层
妈呀,这叫最简程序……又是无证程序员的杰作。

出0入0汤圆

发表于 2012-5-5 16:10:56 | 显示全部楼层
1wire器件对时隙要求严格,程序不能指出是那类mcu,几Mhz晶振,,光看程序去测试是很费神的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 02:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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