历史上的今天
返回首页

历史上的今天

今天是:2025年06月20日(星期五)

正在发生

2018年06月20日 | 基于stc15芯片的温度传感器DS18B20的使用

2018-06-20 来源:eefocus

/*************************************************** 

    File name:                      温度传感器DS18B20的使用 

    Main Function:              通过温度传感器DS18B20检测温度, 

                                                转换后上传至串口助手 

    Last modified Date:     2017-10-28 

    Created by:             Zhang Zhihao 

****************************************************/  

  

#ifndef _DS18B20_H  

#define _DS18B20_H  

  

#include  

  

#define uchar unsigned char  

#define uint  unsigned int  

  

sbit DQ = P3^7;         //DS1820数据线IO口  

bit nflag;                //温度正负标志  

sbit test = P5^5;  

  

/***************************************************** 

    延时函数:延时1us 

******************************************************/  

void delayus(uint i)  

{  

    while(i--);  

}  

  

/***************************************************** 

    功能:         延时,最小单位为ms(晶振为11.0592 

    计算方法:一个for循环 = 8个指令周期 = 8*12个机器周期 

                        = 8*12*1/11.0592 = 0.0086ms 

                        xms = 0.0086 * 110 = 0.946 ms 

******************************************************/  

void delayms(uint xms)  

{  

    uint i,j;  

    for(i=xms;i>0;i--)             

        for(j=110;j>0;j--);  

}  

  

/***************************************************** 

    DS18B20复位函数: 

    1 数据线拉低,延时480us 

    2 数据线拉高,延时480us 

******************************************************/  

void ds1820rst()          

{  

  

    DQ = 1;             //初始状态  

    delayus(4);       

    DQ = 0;             //拉低  

    delayus(480);   //延时480us  

    DQ = 1;             //拉高  

    delayus(480);    

}  

  

  

/**************************************************** 

    18b20读数据:由低位到高位,重复八次,读一个字节 

    1 数据线拉低,延时4us 

    2 数据线拉高,延时10us 

    3 读数据线状态一位,处理数据,延时45us 

    4 重复步骤1-3 

*****************************************************/  

uchar ds1820rd()  

{  

    uchar i = 0;  

    uchar dat = 0;  

    for(i=8;i>0;i--)  

    {  

        DQ = 0;         //拉低数据线  

        delayus(4);  

        dat>>=1;      //空出第一位  

        DQ = 1;         //拉高数据线  

        delayus(10);  

        if(DQ)          //若为高电平,则最高位置一  

            dat|=0x80;  

        delayus(45);//延时45us  

    }  

    return(dat);  

}  

  

  

/************************************************** 

    18b20写数据:由低位到高位,重复八次,写一个字节 

    1 数据线拉低,延时15us 

    2 送一位数据到数据线,延时60us 

    3 数据线拉高 

    4 重复步骤1-3 

**************************************************/  

void ds1820wr(uchar wdata)  

{  

    uchar i = 0;  

    for (i=8; i>0; i--)  

    {  

        DQ = 0;                  //数据线拉低  

        delayus(15);  

        DQ = wdata&0x01; //将数据最低位送入数据线  

        delayus(60);         //延时10us  

        DQ = 1;                  //数据线拉高  

        wdata>>=1;             //字节右移一位  

    }  

}  

  

  

/***************************************************** 

    读温度并转换,根据RAM命令表写命令 

        0xcc:               不读取序列地址 

        0x44:               启动温度转换 

        0xbe:               读取温度 

******************************************************/  

uint read_temp()     

{  

    uchar TL,TH;                                        //TL:低八位 TH:高八位  

    uchar wd;                                               //最终温度的绝对值  

      

    ds1820rst();                                    //先复位  

    ds1820wr(0xcc);                             //不读取64位地址,因为总线上只有一个DB1820,单片工作  

    ds1820wr(0x44);                               //启动温度转换  

      

    delayus(125);  

      

    ds1820rst();  

    ds1820wr(0xcc);                             //跳过读序列号  

    ds1820wr(0xbe);                             //读取温度  

      

    TL = ds1820rd();                                //读低八位  

    TH = ds1820rd();                                //读高八位  

      

    wd = TL/16+TH*16;  

//  tvalue = TH;                                //tvalue为16位  

//  tvalue = (tvalue<<8)+TL;  

//  if((tvalue&0xf800) == 0xf800)       //判断负温度  

//  {  

//      tvalue=~tvalue+1;                           //补码=反码+1  

//      nflag = 0;                                      //置标志位为0  

//  }  

//  else  

//      nflag = 1;  

//    

//  wd = tvalue*0.625;                          //计算温度值  

    return(wd);                                         //返回温度值  

}  

  

  

/***************************************************** 

    串口初始化函数: 

******************************************************/  

void init()  

{                 

    P1M0 = 0;P1M1 = 0;  

    SCON = 0x40;  

    T2L  = 0xe0;  

    T2H  = 0xfe;  

    AUXR = 0x14;  

    AUXR |= 0x01;  

    TI = 1;  

}  

  

  

/***************************************************** 

    串口通讯函数:发送两个字节,首字节为正负标志位, 

                                第二个字节为温度值 

******************************************************/  

void comm(uchar temper)  

{  

  

//  while(!TI == 1);  

//  {  

//      TI = 0;  

//      SBUF = nflag;  

//  }  

    while(!TI == 1);  

    {  

        TI = 0;  

        SBUF = temper;  

    }  

}  

  

  

#endif  



#include "function.h"  

  

void main()  

{  

    uchar temp;                     //临时变量存储温度  

    init();                             //串口的初始化  

    test = 0;                           //蓝色的led,测试使用  

    while(1)  

    {  

        temp=read_temp();       //读取温度  

        delayms(500);               //延时0.5s  

        comm(temp);                 //发送至上位机  

    }  

}   


推荐阅读

史海拾趣

City_Technology公司的发展小趣事

1977年,伦敦大学内,四个富有远见的科学家怀揣着梦想,创立了City Technology公司。他们利用Wolfson研究所开发的电化学技术,着手研发新型氧气感应技术。这一创新技术的诞生,标志着City Technology在气体传感领域的初步尝试,并为其日后的腾飞奠定了坚实的基础。在接下来的几年里,公司不断突破技术瓶颈,其铁罐氧气传感器技术于1982年获得了英国皇后奖技术成就奖,这一荣誉不仅肯定了公司的技术实力,也为其在市场上赢得了良好的声誉。

ABOV(现代单片机)公司的发展小趣事

随着业务的不断扩展,City Technology于1990年在英国南海岸的普茨茅斯建立了生产基地,并将办公楼从伦敦中心区迁至该地。这一举措不仅提高了公司的生产效率,也为其进一步拓展国际市场提供了有力支持。此后,公司开始在全球范围内设立销售中心,包括波恩(德国)、苏黎世(瑞士)、上海及芝加哥等地,逐步实现了业务的国际化。

Eureka Microelectronics Inc公司的发展小趣事

随着Eureka产品线的不断拓展,公司开始积极拓展海外市场。通过与国际知名电子制造商的合作,Eureka的产品逐渐打入国际市场。同时,公司也积极参与国际展会和技术交流活动,提升了品牌知名度和影响力。这些努力不仅帮助Eureka扩大了市场份额,也促进了公司与国际同行的交流与合作。

Condor公司的发展小趣事

Eureka公司自1995年成立以来,一直致力于电子技术的研发和创新。在早期阶段,公司凭借一款具有创新性的液晶显示驱动IC产品,成功打入市场。随着技术的不断进步,Eureka逐步拓展了产品线,推出了包括类比-数位混合信号处理器、系统应用完整方案等一系列产品。这些产品的推出,不仅丰富了Eureka的产品线,也提升了公司在行业内的竞争力。

Broadcom(博通)公司的发展小趣事

博通在有线和无线通信半导体领域一直保持着技术创新的领先地位。公司不断投入研发,推出了一系列具有竞争力的产品,包括宽带通信芯片、无线局域网芯片组等。这些产品的成功应用,不仅提升了博通的市场地位,也为整个电子行业的发展做出了重要贡献。

ALTERA(阿尔特拉)公司的发展小趣事

进入21世纪,随着网络泡沫的破灭,博通陷入了严重的财务困境。亏损累计高达65亿美元,股价大幅下跌,公司甚至不得不裁员以维持运营。然而,正是在这样的困境中,博通展现出了坚韧不拔的精神。通过优化产品结构、调整市场策略,博通逐渐走出了低谷,并在2003年推出了全球第一个802.11b单片机,重新赢得了市场的关注。

问答坊 | AI 解惑

步进电机资料

#include #define uchar unsigned char #define uint unsigned int uint time void timer1(void) interrupt 1 using 1{ //定时器0中断,定时1ms// TH0=(65536-1000)/256; TL0=(65536-1000)%256; time++; } void delay(uint n){ &n ...…

查看全部问答>

Tieto招聘:Senior PCB designer

叠拓(原迪易通)信息技术有限公司 (Tieto),成立于1968年,是一家北欧的从事软件解决方案的全外资集团公司,分别在赫尔辛基和斯德哥尔摩证券交易所挂牌。是综合实力北欧地区第一,欧洲前三的IT业务供应商。 请将简历发送到 xiaoli.yang@tieto.co ...…

查看全部问答>

S3C2440A嵌入式手持终端电源管理系统设计

replyreload += \',\' + 374598;这是一个关于电源管理设计的文章,附上一段节选供参考。回帖是美德    电源管理软件设计可分为:操作系统层和应用层。     (1)操作系统层     电源管理的功能执行层,它 ...…

查看全部问答>

WINCE6.0触屏驱动怎么没有鼠标光标以及不能产生右键

各位高手,我使用MS的分层驱动模型写个一个触屏驱动,目前驱动可以进行校准,能够拖动、单击、双击,就是不能产生右键,而且桌面上没有鼠标光标。还望各位高手指点迷津。在下不胜感激。…

查看全部问答>

DirectDraw问题

1>.\\YX_GPS\\port\\c\\yu_port_gui.c(79) : error C2039: \'Release\' : is not a member of \'IDirectDrawSurface\' 1>        D:\\Program Files\\Windows CE Tools\\wce500\\STANDARDSDK_500\\include\\ARMV4I\ ...…

查看全部问答>

STM32F103C6T61K订单

    ST推出STM32后,STM32的第一个1K订单已经完成。   6.11号ST推出STM32,上海XX自动化公司在前3周内完成了PCB设计和软件代码的移植,第四周内做了10套测试样片,现场连续测试2个月,EMC,工业测试全部测 ...…

查看全部问答>

我这样设置gpio对吗??

我怀疑我的设置顺序,如下:  //初始化GPIO接口  /* Enable GPIOC clock */  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  RCC_APB2PeriphClockCmd(RCC_APB2Peri ...…

查看全部问答>

香主问您一个问题!

                                 我现在用ZET6的FSMC控制TFT了,系统上还有SRAM,NOR等,现在PE5口已经是FSMC的地址线A20了,但是我的存储器地址线 ...…

查看全部问答>

不仅仅要为STM8买单?!!

用?还是不用STM8? 真的很难定夺! 用你,还得买一套编译器, 前一个应用,公司刚买一套KEIL C,也算用得差不多明白了。 你出一个STM8,我们就要为你的商业同盟出资? 试问,把应用者挡在这个门槛之外,使得STM8得不到推广,用不上量, ...…

查看全部问答>