3345|2

89

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

DS18B20数字式温度计的设计 [复制链接]

我要用DS18B20设计一个数字式温度计,要求是用protues仿真,并且要求可以切换测华氏度和摄氏度。知道的兄弟,赐教一下。我是单片机初学者,汇编语言掌握不错,希望大家一起探讨下,学习学习~~~知道的,邮箱我:wmywolf@qq.com

最新回复

#include /*********************************************************************** * 共阳极七段数码管显示对应段查询表(数字0-9分别对应code_table[0]-[9]) * 分别对应 a b c d e f g dp * p00 p01 p02 p03 p04 p05 p06 p07 ***********************************************************************/ unsigned char code code_table[]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; #define WEISHU 3                                //修改该处可以做到不同位数的动态显示,本程序可以做到最多8个 sbit         WEI_LE=P1^1;                                 //定义位控制线 sbit         DUAN_LE=P1^0;                                //定义段控制线 sbit         DQ = P3 ^ 6;                                //ds18B20 unsigned char DISP[8];                                //定义显示缓存器 unsigned char Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7; /******************************************************************************/ void Delay_1(int num)                                //延时函数 {         while(num--) ; }        /******************************************************************************/ void Init_DS18B20(void)                                //初始化ds1820 {         unsigned char x=0;         DQ = 1;                                    //DQ复位         Delay_1(8);                                  //稍做延时         DQ = 0;                                    //单片机将DQ拉低         Delay_1(80);                                 //精确延时 大于 480us         DQ = 1;                                    //拉高总线         Delay_1(14);         x=DQ;                                      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败         Delay_1(20); } /******************************************************************************/ unsigned char ReadOneChar(void)                        //读一个字节 {         unsigned char i=0;         unsigned char dat = 0;         for (i=8;i>0;i--)         {                 DQ = 0;                         // 给脉冲信号                 dat>>=1;                 DQ = 1;                         // 给脉冲信号                 if(DQ)                 dat|=0x80;                 Delay_1(4);         }         return(dat); } /******************************************************************************/ void WriteOneChar(unsigned char dat)                //写一个字节 {         unsigned char i=0;         for (i=8; i>0; i--)         {                 DQ = 0;                 DQ = dat&0x01;                 Delay_1(5);                 DQ = 1;                 dat>>=1;         } } /******************************************************************************/ unsigned int ReadTemperature(void)                //读取温度 {         unsigned char a=0;         unsigned char b=0;         unsigned int t=0;         float tt=0;         Init_DS18B20();         WriteOneChar(0xCC);                         //跳过读序号列号的操作         WriteOneChar(0x44);                         // 启动温度转换         Init_DS18B20();         WriteOneChar(0xCC);                         //跳过读序号列号的操作         WriteOneChar(0xBE);                         //读取温度寄存器         a=ReadOneChar();                          //读低8位         b=ReadOneChar();                         //读高8位         t=b;         t  详情 回复 发表于 2010-6-19 21:59
点赞 关注

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我这有一个,但是是C语言写的,看看对你有没有点启示
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
#include
/***********************************************************************
* 共阳极七段数码管显示对应段查询表(数字0-9分别对应code_table[0]-[9])
* 分别对应 a b c d e f g dp
* p00 p01 p02 p03 p04 p05 p06 p07
***********************************************************************/
unsigned char code code_table[]=
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
#define WEISHU 3                                //修改该处可以做到不同位数的动态显示,本程序可以做到最多8个

sbit         WEI_LE=P1^1;                                 //定义位控制线
sbit         DUAN_LE=P1^0;                                //定义段控制线
sbit         DQ = P3 ^ 6;                                //ds18B20
unsigned char DISP[8];                                //定义显示缓存器
unsigned char Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7;

/******************************************************************************/
void Delay_1(int num)                                //延时函数
{
        while(num--) ;
}       
/******************************************************************************/
void Init_DS18B20(void)                                //初始化ds1820
{
        unsigned char x=0;
        DQ = 1;                                    //DQ复位
        Delay_1(8);                                  //稍做延时
        DQ = 0;                                    //单片机将DQ拉低
        Delay_1(80);                                 //精确延时 大于 480us
        DQ = 1;                                    //拉高总线
        Delay_1(14);
        x=DQ;                                      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
        Delay_1(20);
}
/******************************************************************************/
unsigned char ReadOneChar(void)                        //读一个字节
{
        unsigned char i=0;
        unsigned char dat = 0;
        for (i=8;i>0;i--)
        {
                DQ = 0;                         // 给脉冲信号
                dat>>=1;
                DQ = 1;                         // 给脉冲信号
                if(DQ)
                dat|=0x80;
                Delay_1(4);
        }
        return(dat);
}

/******************************************************************************/
void WriteOneChar(unsigned char dat)                //写一个字节
{
        unsigned char i=0;
        for (i=8; i>0; i--)
        {
                DQ = 0;
                DQ = dat&0x01;
                Delay_1(5);
                DQ = 1;
                dat>>=1;
        }
}
/******************************************************************************/
unsigned int ReadTemperature(void)                //读取温度
{
        unsigned char a=0;
        unsigned char b=0;
        unsigned int t=0;
        float tt=0;
        Init_DS18B20();
        WriteOneChar(0xCC);                         //跳过读序号列号的操作
        WriteOneChar(0x44);                         // 启动温度转换
        Init_DS18B20();
        WriteOneChar(0xCC);                         //跳过读序号列号的操作
        WriteOneChar(0xBE);                         //读取温度寄存器
        a=ReadOneChar();                          //读低8位
        b=ReadOneChar();                         //读高8位
        t=b;
        t<<=8;
        t=t|a;
        tt=t*0.0625;
        t= tt*10+0.5;                                 //放大10倍输出并四舍五入
        return(t);
}

/****************************************************************
* 将int型转换为4位BCD码
****************************************************************/
void BCD()
{
        DISP[0]=code_table[Bit0];
        DISP[1]=code_table[Bit1];
        DISP[2]=code_table[Bit2];
        DISP[3]=code_table[Bit3];
        DISP[4]=code_table[Bit4];
        DISP[5]=code_table[Bit5];
        DISP[6]=code_table[Bit6];
        DISP[7]=code_table[Bit7];
        DISP[1]=DISP[1]&0x7F;                        //显示小数点
}

/*************************
Timer 0 定时中断处理
**************************/
void timer0(void) interrupt 1
{
        static unsigned char wei=0;
        unsigned char weixuan=0x01;
        TH0=0xf4;
        TL0=0x48;                                //重新给定时器赋值
        BCD();
        P0=DISP[wei];                                //送显示数据
        DUAN_LE=1;                                //开段控制线
        DUAN_LE=0;
        P0=weixuan<         WEI_LE=1;                                //开位控制线
        WEI_LE=0;
        wei++;                                        //扫描下一位
        if(wei>=WEISHU)wei=0;
}


/****************************************************************************
名称: Delay
说明: 程序延时
参数: 无
返回: 无
*****************************************************************************/
void Delay()
{
        unsigned char a,b;

        for(a=0;a<255;a++)
                for(b=0;b<255;b++);
}
/***************************************************************************/
void main(void)
{
        unsigned int i;
        unsigned char a,b,c;
        WEI_LE=0;
        DUAN_LE=0;                                //锁存复位
        TMOD=0x01;                                //定时器0工作于方式1
        TH0=0xf4;
        TL0=0x48;                                //定时3MS;定义数码管显示扫描时间
        TR0=1;                                        //允许定时器工作
        ET0=1;                                        //允许定时器中断
        ;EX0=1;                                        //中断允许
        ;EX1=1;
        EA=1;                                        //开中断
        while(1)
        {
                i=ReadTemperature();                //读温度并送显
                a=i/100;                        //显示温度十位
                Bit2=a;
                b=i/10-a*10;                        //个位
                Bit1=b;
                c=i-a*100-b*10;
                Bit0=c;                                //小位1位       
                Delay();
                Delay();
               
        }
}
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表