1602液晶显示DS18B20温度

发布者:机械梦想家最新更新时间:2016-11-18 来源: eefocus关键字:液晶显示  DS18B20 手机看文章 扫描二维码
随时随地手机看文章

//LCD1602驱动程序
#include 
#include 
#define uchar unsigned char
#define uint unsigned int 
#define LCD1602_RS  P2_5 //定义引脚
#define LCD1602_RW  P2_6
#define LCD1602_E   P2_7
#define LCD1602_IO  P0
#define Busy    0x80 //用于检测LCD1602状态字中的Busy标识
const uchar num[]="0123456789.-+";
void WriteData(uchar DAT);
void WriteCommand(uchar command,BuysC);
uchar ReadData(void);
void Readbusy(void);
void LCD1602_Init(void);
void DisplayOneChar(uchar X, uchar Y, uchar DData);
void Displaystring(uchar X, uchar Y, uchar code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
void delayms(uchar);
uchar code a[] = {"WENDUCONGZHI"};
uchar code b[]={"LMT:2"};
uchar code c[]={"MAX:9"};
uchar a0,a1,a2,a3;
uint aa;
float wendu;//得到的十进制温度值       
uchar temp[2]={0,0};  //存放DS18B20的温度寄存器值
uint value = 0;   //读字节变量
sbit FM=P2^2;     //超温 控制 引脚   
sbit DQ=P2^0;       //数据线  
void ReadSerialNumber(void);
void ow_reset(void);
void tmstart (void);
void ReadSerialNumber(void);
void Read_Temperature(void);
void write_byte(char);
uint read_byte(void);
void delay_18B20(uint);
void baojing();
void zhuanhuan();
void delay_led(uint z);

/******转换************/
void zhuanhuan()
{
   aa=wendu;
   
   a1=aa/100; //百位
   a2=aa%100/10; //十位
   a3=aa%10;    //个位 
}

//========18b20延时程序=================*/
void delay_18B20(uint seconds)   //12us延时  
{
     for(;seconds>0;seconds--);
}
/******************************************
          18b20程序
******************************************/
//===============复位 ===========
 void ow_reset(void)
{
    uchar x;
    DQ = 0;          //pull DQ line low
    delay_18B20(88);       //至少480微秒, 
    DQ = 1;         
    delay_18B20(12);     // wait for presence18b20 36us
    x = DQ;   //   X=0,则 初始化成功 ,X=1,则 失败  。       
                     
    delay_18B20(22);   
}
//=========从总线上读取一个字节========
uint read_byte(void)
{
    uchar i;
    for (i=8;i>0;i--)
    {
        value>>=1;   
        DQ = 0;           
        _nop_();_nop_();_nop_();_nop_();
        DQ = 1;               
        if(DQ)
        {
            value|=0x80;   //取出高位数据    
        }
        delay_18B20(8);      
     }
     return(value);  //返回 value值 
}
//===========向18B20写一个字节=================
void write_byte(char val)
{
    uchar i,j;
    for (i=8; i>0; i--)  // writes byte, one bit at a time
    {
        DQ = 0;         // pull DQ low to start timeslot
        j++;            /*延时4us*/
        DQ = val&0x01;   //从低位开始写  
        delay_18B20(12);   
        DQ = 1;
        j++;
        val>>=1;   //写完一位 ,移除它 
     }
}
//============读取温度============
void Read_Temperature(void)
{
   uint k,i,t;
  float  temple;            /*存放读取的温度值 将其除以16即为得到的值*/
    ow_reset();     //复位 
    k++;              //延时4us
 k++;
 k++;
 k++;
    write_byte(0xCC); //直访ROM
    k++;              //延时4us
    write_byte(0xBE); // 写入读命令 
    k++;k++;          //延时8us
    temp[0]=read_byte();     //读取低字节
    temp[1]=read_byte();    //读取高字节
    i=temp[1];
 t=temp[0];
 i=i<<8;
 i=i|t;    
    if((temp[1]&0x80))     //符号位判断
    {
        temple=(~i+1);   //如果为负温则去除其补码 ,先将 补码转换成 原码  
         a0=num[11]; /*表示温度为负数   */    
    }          
    else
    {
        temple=i;
     a0=num[12]; //*表示温度为正数  
    }  
  k=0;
    wendu=temple*0.0625;
 wendu=wendu*10+0.5; 
}
//=======初始化============
void tmstart (void)
{
    ow_reset();    //复位
    delay_18B20(3);      //延时  
    write_byte(0xCC);    //跳过序列号命令,对所有器件有效     
    write_byte(0x44);    //发转换命令 44H,    
}
//========报警===========//
void baojing()
{
 if(aa>=34)
  FM=0;
  else if( aa<=31)
  FM=1;
}

//
void delayms(uchar i)  

    uchar j;
    for(;i>0;i--)
 for(j=0;j<125;j++)
 {;}
}
 void delays(uint m)
{
uint i,j;
for(i=0;i  {
    for(j=0;j<1000;j++)
     {;}
   }
}
//
void main(void)
{
 uchar shuju;
 delayms(2);
 Delay400Ms(); //启动等待,等LCM讲入工作状态
 delays(1);
 LCD1602_Init(); //LCM初始化    
 Delay5Ms(); //延时片刻(可不要)   
 shuju=ReadData();
 Displaystring(2, 0, a);
 tmstart (); //18B20初始化    
    delay_18B20(58);   

  while(1)
  {
    
     Read_Temperature();  //读温度   
        delay_18B20(59);
        tmstart(); //初始化   
        delay_18B20(59);    //*等待转换结束 
  zhuanhuan();   // 显示数值转换  
  DisplayOneChar(0,1,a0);
  DisplayOneChar(1,1,num[a1]);
  DisplayOneChar(2,1,num[a2]);
  DisplayOneChar(3,1,num[10]);
  DisplayOneChar(4,1,num[a3]);
  Displaystring(6,1,b);
  Displaystring(11,1,c);
 
  baojing();  //报警扫描     
 //shuju=ReadData();//测试用句无意义 
  }
}
//写数据   
void WriteData(uchar DAT)
{
 Readbusy();
 LCD1602_RS = 1;
 LCD1602_RW = 0;
 LCD1602_IO = DAT;
 LCD1602_E = 0; //若晶振速度太高可以在这后加小的延时
 LCD1602_E = 0; //延时 
 LCD1602_E = 1;
 LCD1602_E=1;
 LCD1602_E=0;
}
//写指令    
void WriteCommand(uchar command,BuysC) //BuysC为0时忽略忙检测
{
 LCD1602_IO=0x00;
 if (BuysC) 
 Readbusy(); //根据需要检测忙
 LCD1602_RS = 0;
 LCD1602_RW = 0;
 LCD1602_IO = command;
 LCD1602_E = 0;
 LCD1602_E = 0;
 LCD1602_E = 1; 
 LCD1602_E = 1;
 LCD1602_E=0;
}
//读数据   
uchar ReadData(void)
{
Readbusy();
 LCD1602_RS = 1; 
 LCD1602_RW = 1;
 LCD1602_E = 0;
 LCD1602_E = 0;
 LCD1602_E = 1;
 delayms(1);
 LCD1602_E = 0;
 return(LCD1602_IO);
}
//读忙 
void Readbusy(void)
{
 LCD1602_IO = 0xff; 
 LCD1602_RS = 0;
 LCD1602_RW = 1;
 LCD1602_E = 0;
 LCD1602_E = 0;
 LCD1602_E = 1;
 delayms(2);
 while (LCD1602_IO&0x80); //检测忙信号   
  LCD1602_E = 0;
}
 //初始化 
void LCD1602_Init(void) //LCM初始化
{
 Delay400Ms();
 LCD1602_E = 0;
 LCD1602_IO=0x00;
 WriteCommand(0x38,0); //三次显示模式设置,不检测忙信号
 Delay5Ms();
 WriteCommand(0x38,0);
 Delay5Ms(); 
 WriteCommand(0x38,0);
 Delay5Ms();
 WriteCommand(0x38,1); //显示模式设置,开始要求每次检测忙信号
 Delay5Ms();
 WriteCommand(0x08,1); //关闭显示   ]  
 Delay5Ms();
 WriteCommand(0x01,1); //显示清屏    
 Delay5Ms();
 WriteCommand(0x06,1); // 显示光标移动设置     
 Delay5Ms();
 WriteCommand(0x0f,1); // 显示开及光标设置     
 Delay5Ms();
}
//按指定位置显示一个字符  
void DisplayOneChar(uchar X, uchar Y, uchar DData)
{
 Y &= 0x01;
 X &= 0x0f; //限制X不能大于15,Y不能大于1   
 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
 X |= 0x80; // 算出指令码
 WriteCommand(X, 0); //这里不检测忙信号,发送地址码   
 WriteData(DData);
}
//按指定位置显示一串字符  
void Displaystring(uchar X, uchar Y, uchar code *DData)
{
 uchar ListLength;
  ListLength = 0;
 Y &= 0x01;
 X &= 0x0f; //限制X不能大于15,Y不能大于1
 while (DData[ListLength]>0x20) //若到达字串尾则退出  
  {
   if (X <= 0x0f) //X坐标应小于0x0f   
    {
     DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
     ListLength++;
     X++;
    }
  }
}
//5ms延时
void Delay5Ms(void)
{
 unsigned int t = 5552;
 while(t--);
}
//400ms延时
void Delay400Ms(void)
{
  uchar i = 5;
  uint j;
  while(i--)
   {
  j=7269;
  while(j--);
   }
 }

关键字:液晶显示  DS18B20 引用地址:1602液晶显示DS18B20温度

上一篇:单片机做的简单逆变器(DC12-AC220)
下一篇:关于单片机I/0口置低的引脚不能拉高的问题

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

EIZO推出高亮度医疗成像用彩色液晶显示
      近日, Eizo Nanao Corporation("EIZO")推出全新的2 兆像素(1200 x 1600 自然分辨率)彩色液晶显示器:RadiForce RX220。       RadiForce RX220 继承了RadiForce RX211的特点,采用了IPS(横向电场效应显示技术)面板,侧面观看时几乎没有任何偏色现像,并把旧型号的最高亮度从750 cd/m2提高至900 cd/m2,推荐校准亮度从300 cd/m2提高至400 cd/m2。这些属性让RX220可与单色显示器相媲美,故适合作 3D 渲染或图像融合的显示用途,而且符合DICOM(医学数字成像和通信)Part 14 标准,在CT(计
[医疗电子]
液晶显示模拟KS0713及其应用
摘要:液晶显示模块KS0713是SAMSUNG ELECTRONICS生产的小型液晶显示模块。它具体积小、价格低、使用方便等优点。在一些小型的自动控制、监控、测量仪器中,常常用于显示提示菜单、波形或各类参数的变化,实现实时的监控和测量。 关键词:液晶模块 单片机 波形 汉字 概述 KS0713是一种小型的大规模集成并带有驱动器和控制器的点阵型液晶模块。它的外观尺寸为42mm%26;#215;39mm,有29个外部引脚。它直接受单片机控制,接收8位串行或并行数据, 同时可将数据显示,并将数据存储在模块同的数据存储器中(DDRAM)。由于DDRAM中的数据显示单元与液晶屏的点阵单元存在一一对应关系,并且KS0713液晶模块数据的
[应用]
单片机实时时钟电路(LCD1602、DS1302)
一、简介 此电路主要有51单片机、LCD1602模块、DS1302芯片组成,通过LCD1062显示当前时间。 二、运行效果 三、源文件 main.c /*想要更多项目私wo!!!*/ #include reg52.h #include intrins.h #include string.h #define uint unsigned int #define uchar unsigned char sbit IO = P1^0; sbit SCLK = P1^1; sbit RST = P1^2; sbit RS = P2^0; sbit RW = P2^1; sbit EN = P2^2; uchar *
[单片机]
单片机实时时钟电路(LCD<font color='red'>1602</font>、DS1302)
【自学51单片机】12 --- 1602液晶初步认识
1、1602液晶硬件接口介绍 1602液晶技术参数 说明:(1) 工作电流:在5v工作电压下液晶的工作电流为2mA,仅仅指液晶,不包括背光。 1602液晶接口原理图及引脚功能 说明:(1) 引脚3:液晶显示偏压信号。用来调整显示黑点与不显示黑点的对比度。(2) 4引脚:数据命令选择引脚。置高电平1,为读写数据,置低电平0,为读写命令。(3) 5引脚:读写选择引脚。置高电平1,为读数据或命令,置低电平0,为写数据或命令。(4) 6引脚:使能信号引脚。高电平有效,低电平无效。(5) 7~14引脚:8个数据引脚。因为总电流不大,直接接到PO口上,不用通过74HC245。 2、1602的读写时序介绍 液晶内部自带80
[单片机]
【自学51单片机】12 --- <font color='red'>1602</font>液晶初步认识
单片机+LCD1602显示℃ 这种自定义符号
#include all.h u8 xdata LCD1602_Write_Buffer1 ; u8 xdata LCD1602_Write_Buffer2 ; u8 code LCD1602_5x8 ={0x08,0x00,0x07,0x08,0x08,0x08,0x08,0x07}; u8 xdata LCD1602_Write_Cursor_Add; void LCD1602_Delay(u8 len) { u8 idata i; while(len--) { i=15; while(i--); } } void LCD1602_Write_Add(u8 Ad
[单片机]
使用MSP430G2 LaunchPad开发板连接LCD液晶显示屏的方法
本篇文章是我们学习使用Energia IDE开发环境编程MSP430G2 LaunchPad的教程系列中的第三篇教程。在上一篇教程中,我们学习了如何控制MSP430G2 LaunchPad开发板上的数字输入和输出引脚。在本教程中,我们将学习如何将LCD与开发板连接,以便我们可以显示一些有用的信息。 我们在这个项目中使用的LCD是最常用的16×2点阵式液晶显示器,也就是所谓的字符显示器。我们大多数人都会通过公共PCO或其他电子项目来接触到这一点。像这样的显示对于我们将来的教程中显示数据和其他调试信息将非常方便。由于提供了库,将该LCD与MSP430连接起来非常简单。所以让我们开始学习吧! 所需材料 ● 德州仪器的MS
[单片机]
使用MSP430G2 LaunchPad开发板连接LCD<font color='red'>液晶显示</font>屏的方法
使用AVR来驱动MAXIN的DS18B20
我最近正在研究使用AVR来驱动MAXIN的DS18B20,琢磨了几天,终于把它的驱动程序写好了. 使用IAR C++编译器 #ifndef DS18B20_H #define DS18B20_H /****************************************只需在源程序里定义以下宏 #define seDDS() (seDB0()) #define clDDS() (clDB0()) #define seDS() (sePB0()) #define clDS() (clPB0()) #define GetDS() (GetPB0()) **********************************
[单片机]
MIM单元结构及通信机理
MIM是由金属、绝缘体、金属三层薄膜组成的夹心结构。用于液晶显示的MIM结构如图1所示,主要有两种: (1)图1(a)是比较常见的“T”形结构。这种结构的工艺过 程比较简单,早期研制的MIM基本是这种形式。但这种结构的MIM面积比较大,具有较大的寄生电容,对提高对比度、改善其显示质量等不利。如果要减小其面积,就要求有大面积、高分辩率的光刻设备。不仅增加了制作工艺的难度,成品率下降,还提高了成本,更不适合实现大型显示。(2)图1(b)示出研制的侧向MIM结构,这种结构是在扫描线侧向形成 MIM递断作用 M IM元件的特点是其伏安特性的非线性变化。液晶显示正是利用了MIM的这个特点。当外加偏压达到某一定值V (闭值电压)时,
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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