单片机中使用DS18B20温度传感器C语言程序(参考8)

发布者:EtherealBeauty最新更新时间:2016-09-21 来源: eefocus关键字:单片机  DS18B20  温度传感器 手机看文章 扫描二维码
随时随地手机看文章
#include "reg51.h"

#include "INTRINS.H"
#include "LCD.h"
#define CLR_RI (RI=0)
#define CLR_TI (TI=0)
                                
unsigned char code ID[2][8]={ 0x28,0x1D,0x25,0x1D,0x00,0x00,0x00,0x80,
                              0x28,0x0e,0x9e,0x1c,0x00,0x00,0x00,0x32};
unsigned char currSensorNo=0;

sbit TMDAT   = P1^7;
sbit RUN_LED = P1^6;

/*------------------------------------------------
*
*------------------------------------------------*/
void serial_initial()
{
     TMOD=0X20;
     SCON=0X50;
     PCON=0X00;
     TL1=TH1=0XE8;
     TR1=1;
}

/*------------------------------------------------
*
*------------------------------------------------*/
void send(unsigned char count,unsigned char SEND_Buf[])

unsigned char i; 
for(i=0;i {
   SBUF=SEND_Buf[i];
   while(!TI);
   CLR_TI;
}
}

/*----------------------------------------------------
*   delay N ms
*----------------------------------------------------*/
void Delay_ms (unsigned int Nms )
{
unsigned char i;
while(Nms--)
for(i=0; i<125; i++) ;
}

/*----------------------------------------------------
*   delay N count
*----------------------------------------------------*/
void Delay_Count (unsigned char Count )
{
    while(Count>0) Count--;
}

/*----------------------------------------------------
*   start Reset Pulse
----------------------------------------------------*/
void tmreset(void)
{
    TMDAT=0;
    Delay_Count(103);

    TMDAT=1;
    Delay_Count(4);
}

/*----------------------------------------------------
*        ACK
*----------------------------------------------------*/
void tmpre(void)
{
    while(TMDAT);
    while(~TMDAT);
    Delay_Count(4);
}

/*----------------------------------------------------
*   Read a bit from 1820
*----------------------------------------------------*/
bit tmrbit(void)
{
    int i=0;
    bit dat;
    TMDAT=0;i++;
        TMDAT=1;i++;i++;
    dat = TMDAT;
        Delay_Count(8);
    return dat;
}

/*----------------------------------------------------
*   Read a byte from 1820
*----------------------------------------------------*/
unsigned char tmrbyte(void)
{
unsigned char i,j,dat=0;

    for(i=1;i<=8;i++)
    {
        j=tmrbit();
        dat=(j<<7)|(dat>>1);
    }
    return dat;
}

/*----------------------------------------------------
*   Read a byte from 1820
*----------------------------------------------------*/
void tmwbyte(unsigned char dat)
{
    signed char   i=0;
    unsigned char j;
    bit testb;

    for(j=1;j<=8;j++)
    {
        testb=dat & 0x01;
        dat = dat>>1;
        if(testb)
        {
            TMDAT=0;
            i++;i++;
            TMDAT=1;
            Delay_Count(8);
        }
        else
        {
            TMDAT=0;
            Delay_Count(8);
            TMDAT=1;
            i++;i++;
        }
    }
}

/*----------------------------------------------------
*   send convert command to 1820
*----------------------------------------------------*/
void tmstart(void)
{
unsigned char i;
tmreset();
    tmpre();
    Delay_ms(1);
/* tmwbyte(0xcc);*/
    tmwbyte(0x55);
    for(i=0;i<8;i++)
    tmwbyte(ID[currSensorNo][i]);
    tmwbyte(0x44);
}


/*----------------------------------------------------
*   Read tempreature from 1820
*----------------------------------------------------*/
unsigned int tmrtemp_all(void)
{
unsigned char a,b;
unsigned int y3;
unsigned char i;

tmreset();
    tmpre();
    Delay_ms(1);
    /*tmwbyte(0xcc);*/
    tmwbyte(0x55);
    for(i=0;i<8;i++)
    tmwbyte(ID[currSensorNo][i]);
          
    tmwbyte(0xbe);
    a = tmrbyte();
    b = tmrbyte();
    y3 = ((unsigned int)b) << 8;
  

    return ((y3+a) & 0x7ff) ;
}

/*----------------------------------------------------
*   Start Test tempreature, All
*
*----------------------------------------------------*/
void Display_AllTemp(void )
{
unsigned int last;
unsigned char i,Dot;

RUN_LED=0;
Part=0;
LED_DISPLAY();
Delay_ms(1);

tmstart();

Delay_ms(800);
last=tmrtemp_all();
RUN_LED=1;

Dot= (last & 0x0f)*6.25 ;
Digit[0]= Dot%10;
Digit[1]=Dot/10;

last=(last>>4) & 0x7f ;
if( (last == 0x7f) )   // erro
{
    for(i=0;i<5;i++) Digit[i]=16; 
}
    else
{
   for(i=2;i<5;i++)
   {
    Digit[i] = last %10;
    last = last/10;
   }
   if(Digit[4]==0)Digit[4]=17;
   Part=1; 
}
Digit[5]=currSensorNo;

         
LED_DISPLAY();

}

/*----------------------------------------------------
*
*----------------------------------------------------*/
/* void Read_Id()
{
   unsigned char i,id[8];
    tmreset();
    tmpre();
    Delay_ms(1);
    tmwbyte(0x33);

   for(i=0;i<8;i++)
    id[i]=tmrbyte();
      send(8,id);
}*/

/*----------------------------------------------------
*
*    Main
*----------------------------------------------------*/
void main(void)
{
unsigned char id[8]={1,2,3,4,5,6,7,8};

serial_initial();
send(8,id);
    for(;;)
    {
   RUN_LED=!RUN_LED;
/*    Read_Id();*/
   TX_C =!TX_C ;
   currSensorNo=(currSensorNo==1)?0:1;
   Display_AllTemp();
      /*Change();*/
   send(6,Digit);
   Delay_ms(1000);
         _nop_();
   }
}

关键字:单片机  DS18B20  温度传感器 引用地址:单片机中使用DS18B20温度传感器C语言程序(参考8)

上一篇:单片机超声波传感器测量距离
下一篇:单片机中使用DS18B20温度传感器C语言程序(参考7)

推荐阅读最新更新时间:2024-03-16 15:10

MCU 是如何从上电复位运行到 main 函数的?
前言 在笔者的上一篇文章中《中断服务子程序是如何被执行的》,详细阐述了中断响应以及执行的整个过程,其中涉及到关于中断向量表的相关知识,本篇文章再次以中断向量表为出发点阐述上电复位的整个过程。 复位的相关概念 复位就类似于我们的个人 PC 重启一样,又比 PC 的重启要简单一些。引起复位的原因也是多种多样,笔者在这里大致列出以下几种: 上电复位,也就是我们给我们的 MCU 通电后,其实也是一次复位的过程。 外部产生的手动复位信号,这个也比较常见,我们在平时学习所使用的开发板中就存在一个复位的按键,来实现手动的复位信号。 执行复位指令引发的复位 看门狗复位 。。。。。。 上述所示的复位虽然引起复位的原因各不相同,但是其复位的过
[单片机]
<font color='red'>MCU</font> 是如何从上电复位运行到 main 函数的?
单片机+DHT11+1602显示屏
单片机源程序如下: /********************************************************************************* 本实验仅限学习交流 AT89C52 12Mhz DHT11 LCD1602 接线如下 DHT11_DQ = P2^0 LCD1602_E= P2^7 LCD1602_RW=P2^5 LCD1602_RS=P2^6 D0—D7接到P0口 本实验没有用到DHT的校验位Check_Init,想使用校验位,定义一个变量t,t=HUMI_Buffer_Int+HUMI_Low_Int+TEM_Buffer_Int+TEM_
[单片机]
<font color='red'>单片机</font>+DHT11+1602显示屏
用51单片机中断控制LED灯亮灭
#include reg51.h //头文件 sbit LED=P2^0;//位定义LED灯 sbit k3=P3^2;//位定义按键 void delay()//延时函数 { unsigned char a,b; for(a=0;a 200;a++) for(b=0;b 200;b++); } void Int0()//使用中断所做的处理函数 { IT0=1;//外部中断0下降沿触发 EX0=1;//打开外部中断0 EA=1;//打开总中断 } void main()//主函数 { Int0();//调用函数 while(1); } void ledxs() interrupt
[单片机]
51单片机入门点亮LED
  一.keil新建单片机工程   1.单击”project”选项中的“new uvision project”,输入工程姓名。      2.挑选单片机类型,本系列以AT89C52单片机为政策,所以在Ateml中挑选AT89C52,右上角的方框不需求打勾,默许即可。右下角的”Description”便是对AT89C52单片机的描写,包括8位单片机,守时器和IO口数量,Flash容量等根柢信息。      点击OK往后,会出来一个对话框,意思是是不是复制主张代码到工程并增加文件,入门时期咱们的首要意图是了解单片机各个内置模块怎样运用,相应的C代码烧录后会有啥样的作用,这儿咱们选“否”就能够了。      3.建好工程往后,接
[单片机]
51<font color='red'>单片机</font>入门点亮LED
51单片机实现两片联级74HC595控制跑马灯
一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: LED-74HC595 ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200529 ---- @ModifiedTime: 20200529
[单片机]
51<font color='red'>单片机</font>实现两片联级74HC595控制跑马灯
单片机控制MGLS-12864接口研究
  随着传统的数字显示已经不能表达复杂的信息。而液晶显示器(LCD)则以其重量轻、电压低、功耗小、显示内容丰富等优点逐渐在单片机控制的智能仪器仪表、工业控制等领域得到广泛应用。   矿用隔爆馈电开关是煤矿井下配电系统的关键设备,其性能好坏直接影响煤矿井下的生产安全和生产效率。目前大部分矿井馈电开关保护器的显示通常是发光二极管或LED数字显示,并且大部分用灯来显示故障。   为了改进馈电开关的显示功能,利用单片机8031和液晶显示器设计了一种具有汉字显示功能的显示系统,该系统能够通过液晶显示器实时显示开关的工作参数(电压、电流等)、工作状态、供电线路的故障原因以及故障所发生的时间等,并且能对故障状态进行存储,大大方便了线路的维修
[单片机]
<font color='red'>单片机</font>控制MGLS-12864接口研究
单片机式语音播报伏特表
摘要: 本文将介绍一种基于单片机的语音播报伏特表,该系统可以对直流电压进行比较高精度的测量并用语音播报该值。同时,亦可以通过改变ADC中REF(—)和REF(+)的值实现对不同范围的直流电压的测量。 关键词: 单片机 语音播报 模数转换(ADC) 伏特表 引言 传统的伏特表在我们的日常生活及科学研究中起到了其独特的作用,但是在科学技术日新月异、集成芯片在日常生活中的应用越来越广泛的今天显得比较落伍:①它们的量程往往在出厂以前就限定好的,不能根据具体使用场合进行相应调整;②测量精度有限;③不能够将测量结果用语音播放出来。本文将介绍一种由单片机最小系统 、模-数转换电路 、语音电路 、LED显示电路 组成的单片机式语
[单片机]
基于51单片机的大气温度采集和记录系统
1 引 言 大气温度的测量具有重要意义, 一般是采用各种温度计进行人工测量, 并定时记录测量结果, 这种方法费时费工, 十分不便。本文提出了一种非常小巧的大气温度测量和记录装置, 能对范围为- 55 ℃ ~ + 125 ℃ 的温度进行定时自动测量, 同时记录测量结果, 精度最高可达0. 0625℃ 。 2 系统原理 系统结构如图1所示。系统主要由AT89C2051单片机和外围电路构成。其基本思想是由串行时钟芯片DS1306 提供时间基准, 由温度传感器DS18B20进行温度测量, 温度数据存储在DS2433中。AT89C2051单片机负责整个系统的协调控制。 AT89C2051是一款低电压, 高性能的CMOS 8位单片机, 片内含
[单片机]
基于51<font color='red'>单片机</font>的大气温度采集和记录系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved