PIC16F877A DS18B20数字温度计实验

发布者:月光男孩最新更新时间:2019-01-31 来源: eefocus关键字:PIC16F877A  DS18B20  数字温度计 手机看文章 扫描二维码
随时随地手机看文章

main.c


#include

#include

#include "def.h"

#include "ds18b20.h"

 

__CONFIG(0xFF32);

 

void Delay_ms(u16 xms)

{

  int i,j;

  for(i=0;i

  { for(j=0;j<71;j++) ; }

}

 

void uart_init(void)

{

    TXSTA=0x24; //开启发射使能位、高波特率,TRMT初始值可0可1

    RCSTA=0x80;

    SPBRG=0x19; //4M晶振,波特率9600,则SPBRG初值为25

}

 

//printf函数重定向

void putch(u8 c)

{

    TXREG = c;

    while(TRMT==0);

}

 

short temperature;

 

void main()

{

uart_init();

Delay_ms(5);

printf("ds18b20 demo\n");

while(1)

{

if(Init_18B20()==0)

{

printf("init ok1!\n");

Skip();

Convert();

Delay_ms(750);

if(Init_18B20()==0)

{

printf("init ok2!\n");

Skip();

Read_SP();

RomCode[0]=Read_18B20();

RomCode[1]=Read_18B20(); 

temperature=ReadTemp(RomCode);

temperature=CalcTemp(temperature);

printf("code=%02x%02x\t->\t%d.%d℃\n",RomCode[0],RomCode[1],temperature/10,temperature%10);

}

}

Delay_ms(3000);

}

}

ds18b20.h


#include

#include "def.h"

 

#ifndef __ds1820_h

#define __ds1820_h

 

extern u8 RomCode[2];

 

#define DQ1     RC1=1

#define DQ0     RC1=0

#define DQ_in   TRISC1=1

#define DQ_out  TRISC1=0

#define DQ_val  RC1

 

#define _DINT() di()

#define _EINT() ei()

#define _NOP() asm("nop")

 

 

u8 Init_18B20(void);

short CalcTemp(short a);

void Skip(void);

void Convert(void);

void Read_SP(void);

u8 Read_18B20(void);

short ReadTemp(u8 *r);

 

#endif

ds18b20.c


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

PIC16F877A@4MHz

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

#include "ds18b20.h"

#include "def.h"

 

u8 RomCode[2];

 

#define DelayNus _delay

 

u8 Init_18B20(void)

{

  u8 Error;

  

  DQ_out;

  _DINT();

  DQ0;

  DelayNus(500); //延迟至少480us

  DQ1;

  DelayNus(55);  //释放DQ后延时120us(60~240)后再读数

  DQ_in;

  _NOP();

  if(DQ_val)      

    Error = 1;   //初始化失败

  else

    Error = 0;   //初始化成功

  DQ_out;

  DQ1;

  _EINT();

  

  DelayNus(400);

  

  return Error;

}

 

void Write_18B20(u8 wdata)

{

  u8 i;

  

  for(i = 0; i < 8;i++)

  {

    _DINT();

    DQ0;

    //DelayNus(6);     //延时2us

    _NOP();

    _NOP();

    _NOP();

    _NOP();

    _NOP();

    _NOP();

    _NOP();

    _NOP();

    if(wdata & 0X01)    

    DQ1;

    else                

    DQ0;

    wdata >>= 1;

    

    DelayNus(70);     //延时91us 

    DQ1;

    _EINT();

    _NOP();

  } 

}

 

 

u8 Read_18B20(void)

{

  u8 i;

  u8 temp = 0;   

  

  for(i = 0;i < 8;i++)

  {

    temp >>= 1;

    _DINT();   

    DQ0;

    _NOP();

    _NOP();

    _NOP();

    _NOP();

 

    DQ1;

    //DelayNus(8);            //延时9us

    DQ_in;

    //DelayNus(25);           //延时45us

    if(DQ_val)   

      temp |= 0x80;    

    DQ_out;

    DQ1;

    DelayNus(70);           //延时10us

    _EINT();

    _NOP();

  }      

  return  temp;

}

 

void Skip(void)

{

    Write_18B20(0xcc);

}

 

void Convert(void)

{

    Write_18B20(0x44);

}

 

void Read_SP(void)

{

    Write_18B20(0xbe);

}

 

short ReadTemp(u8 *r)

{

    u8 temp_low;

    short temp;

    

    temp_low = r[0];      //读低位

    temp = r[1];          //读高位

    temp = (temp<<8) | temp_low;

    return  temp;

}

 

const u8 dottab[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};

//优化读数算法

short CalcTemp(short a)

{

  u8 b;

  

  if(a<0)

  {

    a=~a;

    a++; 

    b=a;

    a>>=4;

    a*=-10;

    a-=dottab[b&0x0f];    

  }

  else

  {

    b=a;

    a>>=4;

    a*=10;

    a+=dottab[b&0x0f];       

  }

 

  return a;

}

 

 

def.h


#ifndef __DEF__H_

#define __DEF__H_

 

#define u8 unsigned char

#define u16 unsigned int

 

#endif

 

关键字:PIC16F877A  DS18B20  数字温度计 引用地址:PIC16F877A DS18B20数字温度计实验

上一篇:PIC单片机-PWM波
下一篇:PIC16F877A 内部EEPROM读写演示Demo

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

基于STC89C58数字温度计的设计与实现
引 言 随着时代的发展,数字化控制无疑是人们追求的目标之一,它给人们带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,它在信息、电子、物流等许多领域都有广泛的应用。随着人们对它的要求越来越高,为现代人工作、科研、生活提供更好、更方便的设施,就需要从单片机技术人手,朝着数字化、智能化控制方向发展。 这里介绍一种数字温度计的设计制作方案。该设计控制器使用单片机STC89C58,测温传感器使用LM94022,用FM1602C液晶显示实现温度显示,设计制作了宽量程高精度多功能数字温度计能准确达到各种要求。本文设计研制的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确的特点,其输出温度和时间采用数字显示,该
[单片机]
基于STC89C58<font color='red'>数字温度计</font>的设计与实现
pic16f877a c语言时钟程序
用c语言写的一个时闹钟程序 单片机 用16F877,主时钟用20M Hz ,用32768作定时时间。可以实现2路定闹,每一路都可分别设置和开关,采用4x4键盘,16x2的字符型 LCD 显示。连线在程序开头有说明。 程序的功能: (1)上电后LCD背光打开,并显示倒计时5秒,然后时钟开始工作。 (2)用模式键(*)切换模式,如显示时间、日期、闹钟1、闹钟2等,并且可以用上、下键控制加1、减1或是闹钟的On、Off。 (3)原程序有16个键,包括0~9数字键,可以直接输入要设置的时间值,但后来将数字键取消了,你仍然可以通过修改程序的部分注释恢复此功能。 (4)闹钟有2路,时间到后闹2分钟,可按任意键取消本次闹钟。闹钟响
[单片机]
单片机——ds18b20——代码
#include #include ../delay/delay.h #include lcd.h /*==================================================== 判断写入命令/数据函数 =====================================================*/ void lcd_write(unsigned char byte, unsigned char flag) { if(flag) { RS = 1; //选择数据寄存器
[单片机]
STM32CubeMX | 33-使用GPIO读取温度传感器数据(DS18B20
本篇详细的记录了如何使用STM32CubeMX配置 STM32103RET6 的硬件GPIO外设读取温度传感器DS18B20的数据。 1. 准备工作 硬件准备 开发板 首先需要准备一个开发板,这里我准备的是一个工业DTU,主控芯片为STM32103RBT6。 DS18B20 DTU开发板板载一颗DS18B20温度传感器。 3. 使用STM32CubeMX生成工程 选择芯片型号 打开STM32CubeMX,打开MCU选择器: 搜索并选中芯片STM32F103RET6: 配置时钟源 如果选择使用外部高速时钟(HSE),则需要在System Core中配置RCC; 如果使用默认内部时钟(HSI),
[单片机]
STM32CubeMX | 33-使用GPIO读取温度传感器数据(<font color='red'>DS18B20</font>)
基于AT89S52与PIC16F877A的在线编程控制系统的设计
l 引 言 通常进行单片机的实验或开发时,传统的并行编程方法中,编程器是必不可少的。仿真、调试完的程序需要借助编程器烧到单片机内部或外接的程序存储器中。在开发过程中,程序每改动一次就要拔下电路板上的芯片,编程后再插上。随着计算机技术的发展,许多公司推出了带有片内FLASH存储器的MCU,FLASH存储器具有电可擦除、无需后备电源保护数据、可在线编程等特点。在线编程目前有两种实现方法:在线系统编程(ISP)和在线应用编程(IAP)。ISP一般是通过单片机专用的串行编程接口对单片机内部的FLASH存储器进行编程,例如AT-MEL公司的单片机AT89S52就提供了一个SPI串行接口对内部程序存储器编程(ISP)。 在线编程(ISP)
[单片机]
PIC单片机控制DS18B20 源程序
P IC 单片机 控制DS18B20 源程序 ORG   PIC54    GOTO  MAIN    ORG   0 ;---------------------- ;---------------------------- DELAY22            MOV LW  D 200         ; DELAY 2*250=500mS      MOV WF  COUNT1 DE32   MOV LW  D 250         ; 8*250=2mS    MOV WF  COUNT2 DE42  NOP             ; 1+2+1=5uS     DECFSZ  COUNT2,1     GOTO 
[单片机]
单片机中使用DS18B20温度传感器C语言程序(参考8)
#include reg51.h #include INTRINS.H #include LCD.h #define CLR_RI (RI=0) #define CLR_TI (TI=0) unsigned char code ID ={ 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; /*-------
[单片机]
智能温度传感器DS18B20的原理与应用
DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。可以分别在93.75 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。因而使用DS18B20可使系统结构更趋简单,可靠性更高。他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。 1DS18
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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