DS18B20+LCD1602数字温度传感器

发布者:火星最新更新时间:2016-09-29 来源: eefocus关键字:DS18B20  LCD1602  数字温度传感器 手机看文章 扫描二维码
随时随地手机看文章
/*STC89C52+LCD1602+DS18B20温度显示

  显示4位小数
  仅支持正温度
  DJNZ指令为两周期指令*/
   
RS BIT P2.4
RW BIT P2.5
E BIT P2.6

DQ BIT P1.7

COM DATA 30H
DAT DATA 31H
BAI DATA 32H
SHI DATA 33H
GEX DATA 34H
TH  DATA 35H
TL  DATA 36H
XI  DATA 37H

ORG 0000H
SJMP MAIN
ORG 0030H
MAIN:MOV SP,#40H
  LCALL INIT_LCD
  N1:LCALL TEMP_18B20//测温
    LCALL LCD18B20//合并整数 ,拆分小数
  LCALL BCD//数据拆解,将16进制转为BCD码
    LCALL DISP_LCD //温度显示
  LJMP N1

TEMP_18B20:LCALL INIT_18B20
     MOV COM,#0CCH
     LCALL WRITE_18B20
     MOV COM,#44H
     LCALL WRITE_18B20
     LCALL DELAY200MS
     LCALL INIT_18B20
     MOV COM,#0CCH
     LCALL WRITE_18B20
     MOV COM,#0BEH
     LCALL WRITE_18B20
     LCALL READ_18B20
     MOV TL,DAT
     LCALL READ_18B20
     MOV TH,DAT
     RET
     
INIT_18B20:SETB DQ
     NOP
     CLR DQ
     LCALL DELAY600US//延时600US            
     SETB DQ
     MOV R0,#20
  N2:NOP
     DJNZ R0,N2 //延时60US
     JB DQ,$
     LCALL DELAY600US //等待18B20响应完毕
     SETB DQ
     RET

WRITE_18B20:MOV A,COM
   MOV R2,#8 
  WR1:SETB DQ
   NOP
      CLR DQ
   NOP
   RRC A
   MOV DQ,C
   MOV R3,#30
   DJNZ R3,$    
   DJNZ R2,WR1
   SETB DQ//写完一个数据必须将DQ拉到,因为
   RET    //若最后一位C为低电平超过600US则DS18B20被复位
      
READ_18B20:MOV R2,#8
   RE01:SETB DQ
     NOP
     CLR DQ
     NOP
     SETB DQ
     MOV R3,#5
     DJNZ R3,$
     MOV C,DQ
     MOV R3,#23
     DJNZ R3,$
        RRC A
     DJNZ R2,RE01
     MOV DAT,A
     RET

LCD18B20:MOV R0,#04
   MOV A,TH
   N8:RL A
   DJNZ R0,N8
   MOV TH,A
   MOV A,TL
   SWAP A
   ANL A,#0FH
   ORL A,TH
   MOV TH,A//整数部分
   MOV A,#0FH
   ANL A,TL
   MOV TL,A//小娄部分
   RET

BCD:     MOV A,TH
   MOV B,#100
   DIV AB
   MOV BAI,A
   MOV A,B
   MOV B,#10
   DIV AB
   MOV SHI,A
   MOV GEX,B
   MOV A,TL
   MOV R0,#4
   MOV R1,#XI //四位小数由高到低分别在XI开始的单元中存储
   M1:MOV B,#10
   MUL AB
      MOV B,#16
   DIV AB
   MOV @R1,A
   INC R1
   MOV A,B
   DJNZ R0,M1
   RET

INIT_LCD:MOV COM,#00111000B
      LCALL WRITE_COM
   MOV COM,#00001110B
   LCALL WRITE_COM
   MOV COM,#00000110B
   LCALL WRITE_COM
   MOV COM,#00000001B
   LCALL WRITE_COM
   RET

DISP_LCD:MOV COM,#80H
   LCALL WRITE_COM
   MOV DPTR,#TABLE1
   MOV R1,#16
   MOV R0,#00
   M2:MOV A,R0
     MOVC A,@A+DPTR
   MOV DAT,A
   LCALL WRITE_DAT
   INC R0
   LCALL DELAY1MS
   DJNZ R1,M2
   MOV COM,#0C0H
   LCALL WRITE_COM
   MOV DPTR,#TABLE3
   MOV R1,#05H
   MOV R0,#00H
   M3:MOV A,R0
     MOVC A,@A+DPTR
   MOV DAT,A
   LCALL WRITE_DAT
   INC R0
   LCALL DELAY1MS
   DJNZ R1,M3
   MOV DPTR,#TABLE2
   MOV A,BAI
   MOVC A,@A+DPTR
   MOV DAT,A
   LCALL WRITE_DAT
   MOV A,SHI
   MOVC A,@A+DPTR
   MOV DAT,A
   LCALL WRITE_DAT
   MOV A,GEX
   MOVC A,@A+DPTR
   MOV DAT,A
   LCALL WRITE_DAT
   MOV A,#10
   MOV DPTR,#TABLE2
   MOVC A,@A+DPTR
   MOV DAT,A
   LCALL WRITE_DAT
   MOV R1,#04
   MOV R0,#XI
   M4:MOV A,@R0
     MOVC A,@A+DPTR
   MOV DAT,A
   LCALL WRITE_DAT
   LCALL DELAY1MS
   INC R0
   DJNZ R1,M4
   MOV A,#11
   MOVC A,@A+DPTR
   MOV DAT,A
   LCALL WRITE_DAT
   LCALL DELAY1MS
   RET     

WRITE_COM:CLR RS
    CLR RW
    MOV P0,COM
    LCALL DELAY3MS
    CLR E
    SETB E
    CLR E
    RET

WRITE_DAT:SETB RS
    CLR RW
    MOV P0,DAT
    LCALL DELAY3MS
    CLR E
    SETB E
    CLR E
    RET

DELAY200MS:   ;误差 0us
    MOV R7,#04H
DL6:
    MOV R6,#74H
DL5:
    MOV R5,#0D6H
    DJNZ R5,$
    DJNZ R6,DL5
    DJNZ R7,DL6
    NOP
    RET

DELAY3MS:   ;误差 0us
    MOV R6,#6FH
DL0:
    MOV R5,#0CH
    DJNZ R5,$
    DJNZ R6,DL0
    RET

DELAY1MS:   ;误差 0us
    MOV R7,#01H
DL4:
    MOV R6,#8EH
DL3:
    MOV R5,#02H
    DJNZ R5,$
    DJNZ R6,DL3
    DJNZ R7,DL4
    RET

DELAY600US:   ;误差 0us
    MOV R6,#03H
DL2:
    MOV R5,#62H
    DJNZ R5,$
    DJNZ R6,DL2
    RET

 

TABLE1: DB "Digital thermomet"
TABLE2: DB "0123456789.C"
TABLE3: DB "temp:"

  END

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit rs=P2^4;
sbit rw=P2^5;
sbit e=P2^6;
sbit dq=P1^7;
uchar bai,shi,ge,xi1,xi2,i;
uint temp;
uchar code table1[]={"0123456789.C"};
uchar code table2[]="Digital thermomet";
uchar code table3[]="temp:";

void delay(uchar t)   //误差 0us  1mS延时
{
    unsigned char a,b;
    for(t=1;t>0;t--)
        for(b=142;b>0;b--)
            for(a=2;a>0;a--);
}

/**************DS18B20操作******************/
void init_ds18b20()
{
 dq=1;
 _nop_();
 dq=0;
 for(i=0;i<200;i++);//延时min=480uS ,max=960uS;
 dq=1;
 for(i=0;i<20;i++);//延时min=15uS,max=60uS.DS18B20等待15~60uS;
 while(dq); //dq为1表明无DS18B20
 for(i=0;i<200;i++)//延时300us使DS18B20输出应答完毕
 dq=1;
}

void WriteOneByte(uchar dat)
{
 uchar j;
 for(j=8;j>0;j--)
 {
  dq=1;
  _nop_();    //至少1mS延时
  dq=0;
  _nop_();
  dq=(bit)(dat&0x01);
  for(i=0;i<20;i++);//写周期最少为60uS,不能超过120uS
  dq=1;
  //for(i=0;i<1;i++); //可以没有
  dat>>=1;
 }
}

uchar ReadOneByte()
{
 uchar j,dat;
 for(j=0;j<8;j++)
 {
  dq=1;
  _nop_();  //至少1uS的恢复期
  dq=0;
  _nop_();
  dq=1;
  for(i=0;i<3;i++);//主机在15uS内读取DQ
  dat>>=1;
  if(dq==1)
   dat|=0x80;
  else
   dat|=0x00;
  for(i=0;i<15;i++);//一个读周期至少要60us
 } 
 return(dat);
}

void temp_ds18b20()
{
 uchar th,tl;
 uint x;
 float p;
 init_ds18b20();
 WriteOneByte(0xcc);
 WriteOneByte(0x44);
 delay(255);//等待转换最大为750ms,典型值为200mS
 init_ds18b20();
 WriteOneByte(0xcc);
 WriteOneByte(0xbe);
 tl=ReadOneByte();
 th=ReadOneByte();
 x=th;
 x<<=8;
 x|=tl;  //合并高低位
 p=x*0.0625; //实际转换温度值为p
 temp=p*100+0.5;//将小数转换为整数并保留两位小数,第三位小数四舍五入
}
/******************************************************/

/***********************数据转换***********************/
void datchx()
{
 uchar d,t;
 float g;
 g=temp/100.00;
 d=g;
 t=(g-d)*100;//整数与小数部分分离,t为小数,d为整数;
 bai=d/100;
 shi=(d%100)/10;
 ge=d%10;//整数分离
 xi1=t/10;
 xi2=t%10;
}
/****************************************************/
/******************LCD1602操作***********************/
void write_com(uchar dat)
{
 rs=0;
 rw=0;
 P0=dat;
 delay(3);
 e=0;
 e=1;
 e=0;
}

void write_dat(uchar dat)
{
 rs=1;
 rw=0;
 P0=dat;
 delay(3);
 e=0;
 e=1;
 e=0;
}

void init_lcd()
{
 write_com(0x38);
 write_com(0x0D);
 write_com(0x06);
 write_com(0x01);
}

void disp_lcd()
{
 write_com(0x80);
 for(i=0;i<16;i++)
 {
  write_dat(table2[i]);
  delay(5);
 } 
 write_com(0xc0);
 for(i=0;i<5;i++)
 {
  write_dat(table3[i]);
  delay(5);
 }
 write_dat(table1[bai]);
 write_dat(table1[shi]);
 write_dat(table1[ge]);
 write_dat(table1[10]);
 write_dat(table1[xi1]);
 write_dat(table1[xi2]);
 write_dat(table1[11]);
}
/****************************************************/
void main()
{
 SP=0x30;
 init_lcd();
 while(1)
 {
  temp_ds18b20();
  datchx();
  disp_lcd();
 }
}

关键字:DS18B20  LCD1602  数字温度传感器 引用地址:DS18B20+LCD1602数字温度传感器

上一篇:AT89C2051+LCD1602+DS1302实时时钟设计(c51)
下一篇:LCD1602+ADC0832数字电压表(asm/c51)

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

基于51单片机+DHT11温湿度模块+ESP8266模块+上传oneNET APP显示+LCD1602显示
基本介绍 最近做了一个基于51单片机(STC89C52)+DHT11温湿度模块+ESP8266模块+上传oneNET APP显示+LCD1602显示。51单片机采集DHT11模块的温度和湿度,通过ESP8266模块上传温湿度到oneNET平台,然后通过APP查看温湿度模块,同时LCD1602也同样显示温度和湿度。还可以设定按键控制但单片机外设,比如APP按键按下让单片机点亮一个灯等等。。。。。 器件 51单片机 ESP8266 我用的是 01s DHT11温湿度 usb-ttl模块 实现思路 get方式 是获取平台上面的数据,正常我们单单做温湿度显示 不需要用到,如果需要用到按键等则需要。 实现步骤 1
[单片机]
基于51单片机+DHT11温湿度模块+ESP8266模块+上传oneNET APP显示+<font color='red'>LCD1602</font>显示
基于DS18B20的智能温度测量装置
作者Email: jsmo739@yeah.net 一、前言 温度是一种最基本的环境参数,人民的生活与环境的温度息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义。测量温度的关键是温度传感器,温度传感器的发展经历了三个发展阶段:①传统的分立式温度传感器,②模拟集成温度传感器,③智能集成温度传感器。目前,国际上新型温度传感器正从模拟式向数字式,从集成化向智能化、网络化的方向飞速发展。文章将介绍智能集成温度传感器DS18B20的结构特征及控制方法,并对以此传感器,89C2051单片机为控制器构成的温度测量装置的工作原理及程序设计作了详细的介绍。该装置适用于
[单片机]
STM8 DS18B20温度传感器子程序
软件设计 /********************************************************************* 目 的: 建立DS18B20操作库 目标系统: 基于STM8单片机 应用软件: Cosmic CxSTM8 *********************************************************************/ void _delay_us(u8 us) { while(--us); } //-----复位----- void resetOnewire(void) { OUT_DQ(); CLR_DQ(); _delay_
[单片机]
数码管显示51单片机DS18B20温度测量源程序及仿真
这是一款数码管显示51单片机DS18B20温度测量源程序及仿真资料,特别适合单片机初学者学习参考,这款数码管显示51单片机DS18B20温度测量源程序使用模块化编程,方便移置,单片机使用AT89C51单片机,数码使用四位共阴数码管,这样简化了硬件电路,降低了硬件的制作难度。这款数码管显示51单片机DS18B20温度测量源程序是在Keil4环境下编译通过,并在Proteus7.8仿真软件下仿真通过。温度测量范围是:-55-125度。由于源程序直接贴出来会丢后些重要内容,所以特别将这款数码管显示51单片机DS18B20温度测量源程序及仿真资料打包后放在百度网盘上,需要的爱好者可以自己去下载。更多单片机源程序与仿真请到电子乐屋。 数
[单片机]
数码管显示51单片机<font color='red'>DS18B20</font>温度测量源程序及仿真
基于GSM的远程智能汽车温控系统
  该系统利用GSM远程通信系统控制车内空调等器械运作。用户通过短信形式达到人机互动,克服红外线、无线等远程控制距离短的问题,还可以实现实时监控汽车的状态,为车主提供便利。   1系统原理与结构   1.1系统功能介绍   本系统能以10次/s的速度自动采集现场的环境温度和光照强度、采集空调和窗帘的开闭状态,并通过LCD液晶屏实时地显示出来。温度的感应范围-55~+125℃,精度为±0.5℃。光强的强度范围分为强、较强、中、较弱、弱5档。空调和窗帘的状态为开或者关。   用户可以通过手机或者小灵通等终端与GSM模块连接的系统之间进行无线通信,通信范围为移动网络覆盖的所有范围,做到了真正的通信范围无穷大。具体的通信为:
[单片机]
基于GSM的远程智能汽车温控系统
PIC单片机LCD1602显示
P IC 单片机 LCD 1602显示本站网址和电话 ;************************************ PCL EQU 2H ;定义程序 存储器 低字节地址 STATUS EQU 3H ;定义状态寄存器地址 PORTD EQU 8H ;定义RD口数据寄存器地址 PORTC EQU 7H ;定义RC口数据寄存器地址 TRISD EQU 88H ;定义RD口方向控制寄存器地址 TRISC EQU 87H ;定义RC口方向控制寄存器地址 ADCON1 EQU 9FH ;定义ADC模块控制寄存器1的地址 ;******************** Z EQU 2 ;定义0状态位的位
[单片机]
LCD1602教程(一)
LCD1602主要技术参数: 引脚说明: 接线说明: 基本操作时序: RAM地址映射图: 指令说明: 初始化设置 显示模式设置 显示开/关及光标设置 数据控制 控制器内部设有一个数据地址指针,用户可以通过它们来访问内部的全部80字节RAM。 数据指针设置 其他设置 初始化过程(复位过程) 写指令 38H :显示模式设置 写指令 08H :显示关闭 写指令 01H :显示清屏 写指令 06H :显示光标移动位置 写指令 0CH :显示开及光标设置 参考程序: /* 接线说明: RS=P3^5;RW=P3^6;EN=P3^7; D0~D7=P2^0~P2^7;
[单片机]
<font color='red'>LCD1602</font>教程(一)
基于ARM和DS18B20数字测温系统
  热误差是数控机床的最大误差源,数控机床的温度测试为机床热误差的补偿提供依据。传统的测温方案是将模拟信号通过电缆远距离传输至数据采集卡进行A/D转换并处理,实用中必须解决长线传输和模拟量传感器布线等问题。本文介绍了一种新型的设计方案,控制器采用SAMSUNG公司的32位ARM微控制器S3C44BOX,温度传感器采用单总线数字温度传感器DS18B20。采用数字温度传感器即在测试点完成了信号的数字化,提高了传输的可靠性,同时简化了外围电路,也便于传感器在机床上的布置安装。ARM处理器控制数字温度信号的采集,并与上位PC机通讯,同时其他硬件资源提供热补偿系统其他功能。本文在介绍数字温度传感器DS18B20的基础上,给出了系统的软硬件设
[电源管理]
基于ARM和<font color='red'>DS18B20</font>的<font color='red'>数字</font>测温系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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