单片机教程及学习之LCD1602显示DS18B20温度实验

发布者:GoldenSunrise最新更新时间:2015-09-08 来源: eefocus关键字:单片机教程  LCD1602  DS18B20 手机看文章 扫描二维码
随时随地手机看文章
#include

#include
typedef  unsigned int uint;
typedef unsigned char  uchar;

sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^2;
sbit DQ=P3^4;
uchar Temp_Value[]={0x00,0x00};
uchar Temp=0;
uchar Display_Digit[]={0,0,0,0};
bit DS18B20_IS_OK=1;
uchar code df_tab[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};//decimal fraction
uchar code Display_LINE0[]={" Current Temp:"};
uchar Display_LINE1[]={" Temp:          "};


void _delay_ms(unsigned int x)
{
 unsigned char i;
 while(x--)
 {
  for(i=0;i<125;i++);
 }
}

void _delay_us(uint x)
{
 while(--x);
}

bit LCD_Busy(void)//测忙
{
 bit LCD_Status;//返回值变量
 LCD_RS=0;//读取状态
 LCD_RW=1;
 LCD_EN=1;
 _nop_();_nop_();_nop_();_nop_();
 LCD_Status=(bit)(P0&0x80);
 LCD_EN=0;
 return LCD_Status;
}

void LCD_Write_Command(uchar cmd)//写指令
{
 while(LCD_Busy());
 LCD_RS=0;//
 LCD_RW=0;
 LCD_EN=0;
 _nop_();_nop_();
 P0=cmd;
 _nop_();_nop_();_nop_();_nop_();
 LCD_EN=1;
 _nop_();_nop_();_nop_();_nop_();
 LCD_EN=0;
 
}

void LCD_Write_Data(uchar dat)//写数据
{
 while(LCD_Busy());//每次写数据操作之前均需要检测忙信号
 LCD_RS=1;
 LCD_RW=0;
 LCD_EN=0;
 P0=dat;
 _nop_();_nop_();_nop_();_nop_();
 LCD_EN=1;
 _nop_();_nop_();_nop_();_nop_();
 LCD_EN=0;
 
}

void Init_LCD(void)//液晶初始化
{
 _delay_ms(15);//延时15MS
 LCD_Write_Command(0x38);
 _delay_ms(5); 
 LCD_Write_Command(0x38);
 _delay_ms(5); 
 LCD_Write_Command(0x38);//以后每次写指令操作之前均需要检测忙信号
 while(LCD_Busy()); 
 _delay_ms(5);
 LCD_Write_Command(0x01);//清屏
 while(LCD_Busy());
 _delay_ms(5);
 LCD_Write_Command(0x38);//设置16*2显示,5*7点阵,8位数据接口
 _delay_ms(5);
 while(LCD_Busy());
 LCD_Write_Command(0x0c);//开显示,不显示光标
 _delay_ms(5);
 while(LCD_Busy());
 LCD_Write_Command(0x06);//当读或写一个字符后地址指针加一,且光标加一
 }

void LCD_POS(uchar pos)//字符显示位置
{
 LCD_Write_Command(0x80|pos);
}

void Show_String(uchar *str)//显示字符串
{
 while(*str!='')
 LCD_Write_Data(*str++);
}
uchar DS18B20_Init(void)
{
 uchar status;
 DQ=1;
 _delay_us(10);
 DQ=0;
 _delay_us(90);
 DQ=1;
 _delay_us(8);
 status=DQ;
 _delay_us(100);
 DQ=1;
 return status;
}
uchar Read_One_Byte(void)
{
 uchar i,dat=0;
 DQ=1;
 _nop_();
 for(i=8;i>0;i--)
 {
  DQ=0;
  dat>>=1;
  DQ=1;
  _nop_();_nop_();
  if(DQ)
   dat|=0x80;
  _delay_us(30);
  DQ=1;
 }
 return dat;
}
void Write_One_Byte(uchar dat)
{
 uchar i;
 for(i=8;i>0;i--)
 {
  DQ=0;
  DQ=dat&0x01;
  _delay_us(5);
  DQ=1;
  dat>>=1;
 }
}

void Read_Temp(void)
{
 if(DS18B20_Init()==1)
  DS18B20_IS_OK=0;
 else
 {
  Write_One_Byte(0xcc);
  Write_One_Byte(0x44);
  DS18B20_Init();
  Write_One_Byte(0xcc);
  Write_One_Byte(0xbe);
  Temp_Value[0]=Read_One_Byte();
  Temp_Value[1]=Read_One_Byte();
  DS18B20_IS_OK=1;
 }
}
void Display_Temperature(void)
{
 uchar ng=0;
 if((Temp_Value[1]&0xf8)==0xf8)
 {
  Temp_Value[1]=~Temp_Value[1];
  Temp_Value[0]=~Temp_Value[0]+1;
  if(Temp_Value[0]==0x00)
  Temp_Value[1]++;
  ng=1;
 }
 Display_Digit[0]=df_tab[Temp_Value[0]&0x0f];
 Temp=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4);
 Display_Digit[3]=Temp/100;
 Display_Digit[2]=Temp0/10;
 Display_Digit[1]=Temp;
 Display_LINE1[13]=0x43;
 Display_LINE1[12]=0xdf;
 Display_LINE1[11]=Display_Digit[0]+'0';
 Display_LINE1[10]='.';
 Display_LINE1[9]=Display_Digit[1]+'0';
 Display_LINE1[8]=Display_Digit[2]+'0';
 Display_LINE1[7]=Display_Digit[3]+'0';
 if(Display_Digit[3]==0)
  Display_LINE1[7]=' ';
 if(Display_Digit[2]==0&&Display_Digit[3]==0)
  Display_LINE1[8]=' ';
 if(ng)
 {
  if(Display_LINE1[8]==' ')
   Display_LINE1[8]='-';
  else if(Display_LINE1[7]==' ')
   Display_LINE1[7]='-';
  else
   Display_LINE1[6]='-';
 }
 LCD_POS(0);
 Show_String(Display_LINE0);
 LCD_POS(0x40);
 Show_String(Display_LINE1);
}

void main(void)
{
 Init_LCD();
 Read_Temp();
 _delay_ms(1000);
 while(1)
 {
  Read_Temp();
  if(DS18B20_IS_OK)
   Display_Temperature();
  _delay_ms(200);
 }
}

关键字:单片机教程  LCD1602  DS18B20 引用地址:单片机教程及学习之LCD1602显示DS18B20温度实验

上一篇:基于89C52与DT9122D红外遥控用数码管显示
下一篇:NRF24L01接收程序(单片机是STC89C52)

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

STM8S - DS18B20
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-- /******** STM8S-Discovery DS18B20 Test ******** * 版本.........: 1.0 * 目标.........: STM8S105C6T6 * 文件名.......: main.c * 开发环境.....: IAR for STM8 V1.1 ***********************************************/ #include iostm8s105
[单片机]
基于ATmega16的无线温度监测系统设计方案
随着社会的发展和进步,越来越多的场合对温度的要求日臻严格,温度监控系统的应用日趋受到重视。在农业发展领域,农业大棚、冷库、培育温室等众多场合都需要温度测量技术。传统的测温系统都是有线系统,对于一些需要多点测温的场合,使用传统有线测温方式在布设、维护和更新方面存在着很多不便。为了解决这个问题,设计了一种基于单片机和无线收发模块的无线温度监控系统,结合温度传感器可以很方便构建一个多点分布式智能无线温度监控系统。 1 无线温度监控系统构成 系统主要由两部分组成。如图1所示,第一部分是节点温度测量系统,第二部分是温度显示管理终端。节点温度测量系统负责测量温度,并将温度值通过无线通信发送到温度显示管理终端。管理终端接收温度信息并进行显示和
[单片机]
基于ATmega16的无线温度监测系统设计方案
单片机温度采集电路的设计与虚拟仿真
   0 引言   在工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数。其中,温度控制也越来越重要。在工业生产的很多领域中,人们都需要对各类加热炉、热处理炉、反应炉和锅炉中的温度进行检测和控制。采用单片机对温度进行控制不仅具有控制方便、简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而大大提高产品的质量和数量。因此,单片机对温度的控制问题是工业生产中经常会遇到的控制问题。   目前应用的温度检测系统大多采用由模拟温度传感器、多路模拟开关、A/D转换器及单片机等组成的传输系统。这种温度采集系统需要大量的测温电缆,才能把现场传感器的信号送到采集卡上.安装和拆卸繁杂,成本也高。同时线路上传送
[单片机]
PIC单片机入门教程(四)—— 第一个工程
1、新建工程 1.1 菜单栏“文件”- “新建项目” 1.2 “Microchip嵌入式”- “独立项目”- “下一步” 1.3 在器件栏直接输入你的单片机型号,这里以PIC12F675为例。输入“PIC12F675”- “下一步” 1.4 选择调试头,如果有的话。“None”- “下一步” 1.5 选择烧录or调试工具,这里以PICkit3为例- “下一步” 1.6 PIC12F675是8位单片机,选择编译器时,选择“XC8”- “下一步” 1.7 “输入项目名称”- “选择项目存放位置”- “编码设置为GB2312,中文注释才不会乱码”- “完成” 1.8 新建的工程目录结构如下 2、编写一个空
[单片机]
PIC<font color='red'>单片机</font>入门<font color='red'>教程</font>(四)—— 第一个工程
51单片机玩转物联网基础篇06-LCD1602液晶显示器
前言 本节我们开始学习LCD1602,LCD1602是字符型液晶显示屏,在实际项目中应用非常广泛,学完本节就可以逐步开发一些好玩的应用了。 一、基础知识 1.LCD1602简介 LCD1602是字符型液晶显示模块,专门用于显示字母、数字、符号等点阵式LCD,顾名思义,LCD1602一共可以显示两行,每一行能够显示16个字符数据,采用5V供电,具有低功耗、长寿面、搞可靠性等特性,实物图如下: (1) 引脚说明 在 LCD1602 内部含有 80 个字节的 DDRAM,它是用来寄存显示字符的。其地址和屏幕的对应关系如下 从上图可知,LCD1602中80个字节并不是所有的都用来显示数据,只有第一行的00-0F,第二行的4
[单片机]
51<font color='red'>单片机</font>玩转物联网基础篇06-<font color='red'>LCD1602</font>液晶显示器
STM32单片机学习(9) LCD1602显示屏输出实验
核心代码由kingsraywii提供,本文作者对其进行整合、更详细地注释和部分代码改进, 添加了芯片ID获取、字符串输出和printf重定向输出功能 注:使用普中科技开发板测试时,需要拔掉Boot1插口 接5V电压,重启 /* * * 软件功能: LCD1602实验(软件延时方式) * */ #include stm32f10x.h #include delay.h #include stdio.h /* 定义宏变量 lcd_RS = data/command(H/L) 数据/命令操作 lcd_RW = read/write(H/L) 读写操作 lcd_Enable 使能操作 lcd_GPIO lcd1602接
[单片机]
通用型51单片机lcd1602驱动
文件:lcd_1602.h #ifndef _LCD1602_TRAVELER_H_ #define _LCD1602_TRAVELER_H_ /*************************待配置项*******************************/ #define DATA_LCD P0 //液晶与MCU 数据口 sbit RS_LCD = P2^5; // 液晶的RS、RW、E 端在 MCU端的连线 sbit RW_LCD = P2^6; sbit E_LCD = P2^7; /**************************************************
[单片机]
Proteus C51仿真学习板7——LCD1602
LCD1602作为最基础的字符型液晶显示屏,能过显示16x02=32个字符。那么时序的操作——读写是最主要的内容,今天就带大家一起读读时序。 在看时序图前,对LCD的引脚功能要了解,才能更好的读懂时序。 这里除了电源(1、2)、背光(15、16)、对比度(3)外,主要是控制信号和数据信号。 RS:数据/命令选择引脚,即=1写入数据,=0写入命令; RW:读写选择引脚,即=1读数据,=0写数据; EN:使能引脚;D0-D8:8位数据位。 所以:当RS=0,RW=0时,写入指令;当RS=1,RW=0时,写入数据;当RS=0,RW=1时,读忙信号;当RS=1,RW=1时,读数据。 这里忙信号主要是D7引脚,即D7=0
[单片机]
Proteus C51仿真学习板7——<font color='red'>LCD1602</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

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