基于18B20温度传感器+1602液晶显示器的C语言程序设计开发

发布者:EternalSmile最新更新时间:2016-10-27 来源: eefocus关键字:18B20  温度传感器  液晶显示器 手机看文章 扫描二维码
随时随地手机看文章
#include < reg51.h >
#include < intrins.h >
#define uchar unsigned char
#define uint  unsigned int
sbit DQ = P3^3 ;  //定义DS18B20端口DQ  
sbit BEEP=P3^6  ; //蜂鸣器驱动线
bit presence  ;   //检测18b20是否插好
sbit LCD_RS = P2^0 ;             
sbit LCD_RW = P2^1 ;
sbit LCD_EN = P2^2 ;
uchar code  cdis1[ ] = {" 牛牛智能科技 "} ;
uchar code  cdis2[ ] = {" WENDU:    .  C "} ;
uchar code  cdis3[ ] = {" DS18B20  ERR0R "} ;
uchar code  cdis4[ ] = {"  PLEASE CHECK  "} ;

unsigned char data  temp_data[2] = {0x00,0x00} ;
unsigned char data  display[5] =   {0x00,0x00,0x00,0x00,0x00} ;
unsigned char code  ditab[16] =    {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
                                                        0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
void beep() ; 
unsigned char code  mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ;

#define delayNOP() ; {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;

/*******************************************************************/
void delay1(int ms)
{
 unsigned char y ;
  while(ms--)
 {
  for(y = 0 ; y<250 ; y++)
  {
   _nop_() ;
   _nop_() ;
   _nop_() ;
   _nop_() ;
  }
 }
}

/******************************************************************/
/*检查LCD忙状态                                                   */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。   */
/******************************************************************/ 
bit lcd_busy()
 {                          
    bit result ;
    LCD_RS = 0 ;
    LCD_RW = 1 ;
    LCD_EN = 1 ;
    delayNOP() ;
    result = (bit)(P0&0x80) ;
    LCD_EN = 0 ;
    return(result) ; 
 }

/*写指令数据到LCD                                                  */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。          */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{                          
   while(lcd_busy()) ;
    LCD_RS = 0 ;
    LCD_RW = 0 ;
    LCD_EN = 0 ;
    _nop_() ;
    _nop_() ; 
    P0 = cmd ;
    delayNOP() ;
    LCD_EN = 1 ;
    delayNOP() ;
    LCD_EN = 0 ;  
}

/*******************************************************************/
/*写显示数据到LCD                            */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。       */
/*******************************************************************/
void lcd_wdat(uchar dat)
{                          
   while(lcd_busy()) ;
    LCD_RS = 1 ;
    LCD_RW = 0 ;
    LCD_EN = 0 ;
    P0 = dat ;
    delayNOP() ;
    LCD_EN = 1 ;
    delayNOP() ;
    LCD_EN = 0 ; 
}


/*  LCD初始化设定                                                  */
/*******************************************************************/
void lcd_init()

    delay1(15) ;   
    lcd_wcmd(0x01) ;      //清除LCD的显示内容            
    lcd_wcmd(0x38) ;      //16*2显示,5*7点阵,8位数据
    delay1(5) ;
    lcd_wcmd(0x38) ;         
    delay1(5) ;
    lcd_wcmd(0x38) ;         
    delay1(5) ;

    lcd_wcmd(0x0c) ;      //显示开,关光标
    delay1(5) ;
    lcd_wcmd(0x06) ;      //移动光标
    delay1(5) ;
    lcd_wcmd(0x01) ;      //清除LCD的显示内容
    delay1(5) ;
}

/*  设定显示位置                                    */
/*******************************************************************/
void lcd_pos(uchar pos)
{                          
  lcd_wcmd(pos | 0x80) ;  //数据指针=80+地址变量
}

/*自定义字符写入CGRAM                                   */
/*******************************************************************/
void  writetab()  
{  
    unsigned char i ;
    lcd_wcmd(0x40) ;            //写CGRAM
    for (i = 0 ; i< 8 ; i++)       
    lcd_wdat(mytab[ i ]) ;        
}

/*us级延时函数                                        */
/*******************************************************************/

void Delay(unsigned int num)
{
  while( --num ) ;
}

/*初始化ds1820                                      */
/*******************************************************************/
Init_DS18B20(void)
{  
     DQ = 1 ;      //DQ复位
     Delay(8) ;    //稍做延时

     DQ = 0 ;      //单片机将DQ拉低
     Delay(90) ;   //精确延时 大于 480us

     DQ = 1 ;       //拉高总线
     Delay(8) ;

     presence = DQ ;    //如果=0则初始化成功 =1则初始化失败
     Delay(100) ;
     DQ = 1 ; 
     
     return(presence) ; //返回信号,0=presence,1= no presence
}


/* 读一个字节                     */
/*******************************************************************/
 ReadOneChar(void)
{
unsigned char i = 0 ;
unsigned char dat = 0 ;

for (i = 8 ; i > 0 ; i--)
  {
    DQ = 0 ; // 给脉冲信号
    dat >>= 1 ;
    DQ = 1 ; // 给脉冲信号

    if(DQ)
     dat |= 0x80 ;
    Delay(4) ;
  }

    return (dat) ;
}

/* 写一个字节                                         */
/*******************************************************************/
 WriteOneChar(unsigned char dat)
{
  unsigned char i = 0 ;
  for (i = 8 ; i > 0 ; i--)
  {
    DQ = 0 ;
    DQ = dat&0x01 ;
    Delay(5) ;

    DQ = 1 ;
    dat>>=1 ;
  }
}

/* 读取温度                            */
/*******************************************************************/
 Read_Temperature(void)
{
     Init_DS18B20() ;
  
     WriteOneChar(0xCC) ;  // 跳过读序号列号的操作
     WriteOneChar(0x44) ;  // 启动温度转换

     Init_DS18B20() ;
     WriteOneChar(0xCC) ;  //跳过读序号列号的操作
     WriteOneChar(0xBE) ;  //读取温度寄存器

     temp_data[0] = ReadOneChar() ;   //温度低8位
     temp_data[1] = ReadOneChar() ;   //温度高8位 
}

/* 数据转换与温度显示                                              */
/*******************************************************************/
 Disp_Temperature()
{
  display[4]=temp_data[0]&0x0f ;
  display[0]=ditab[display[4]]+0x30 ;//查表得小数位的值
  
  display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;
  display[3]=display[4]/100+0x30 ;
  display[1]=display[4]%100 ;
  display[2]=display[1]/10+0x30 ;
  display[1]=display[1]%10+0x30 ;

    if(display[3]==0x30)        //高位为0,不显示
   { 
     display[3]=0x20 ;              
     if(display[2]==0x30)      //次高位为0,不显示
     display[2]=0x20 ;
   }

     lcd_pos(0x48) ;             
     lcd_wdat(display[3]) ;        //百位数显示 
     lcd_pos(0x49) ;             
     lcd_wdat(display[2]) ;        //十位数显示 
  lcd_pos(0x4a) ;             
     lcd_wdat(display[1]) ;        //个位数显示 
  lcd_pos(0x4c) ;             
     lcd_wdat(display[0]) ;        //小数位数显示 

/*******************************************************************/
/* 蜂鸣器响一声                 */
/*******************************************************************/
void beep()
  {
    unsigned char y ;
    for (y=0 ;y<100 ;y++)
    {
      Delay(60) ;
      BEEP=!BEEP ;                //BEEP取反
    } 
    BEEP=1 ;                      //关闭蜂鸣器
 Delay(40000) ;
  }

/* DS18B20 OK 显示菜单                                             */
/*******************************************************************/
void  Ok_Menu ()

    uchar  m ;
    lcd_init() ;                //初始化LCD 
            
    lcd_pos(0) ;                //设置显示位置为第一行的第1个字符
     m = 0 ;
    while(cdis1[m] != '\0')
     {                         //显示字符
       lcd_wdat(cdis1[m]) ;
       m++ ;
     }

    lcd_pos(0x40) ;             //设置显示位置为第二行第1个字符
     m = 0 ;
    while(cdis2[m] != '\0')
     {
       lcd_wdat(cdis2[m]) ;      //显示字符
       m++ ;
     }

     writetab() ;               //自定义字符写入CGRAM
     delay1(5) ;
     lcd_pos(0x4d) ;
     lcd_wdat(0x00) ;          //显示自定义字符
}


/* DS18B20 ERROR 显示菜单                             */
/*******************************************************************/
void  Error_Menu ()
{
     uchar  m ;
     lcd_init() ;                //初始化LCD 
 
    lcd_pos(0) ;                //设置显示位置为第一行的第1个字符
     m = 0 ;
     while(cdis3[m] != '\0')
     {                         //显示字符
       lcd_wdat(cdis3[m]) ;
       m++ ;
     }

     lcd_pos(0x40) ;             //设置显示位置为第二行第1个字符
     m = 0 ;
     while(cdis4[m] != '\0')
     {
       lcd_wdat(cdis4[m]) ;      //显示字符
       m++ ;
     }
}


/* 主函数     */
/************************************/
void main()
 {
     Ok_Menu () ;

 do
  {
    Read_Temperature() ; //读取温度
   Disp_Temperature() ;  //显示温度
     }
    while(!presence)  ;

     Error_Menu () ;

 do
  {  
    Init_DS18B20() ;
    beep() ;
     }
 while(presence) ;
}

关键字:18B20  温度传感器  液晶显示器 引用地址:基于18B20温度传感器+1602液晶显示器的C语言程序设计开发

上一篇:单片机控制多个步进电机C语言程序设计
下一篇:1602液晶显示红外遥控解码C语言程序设计

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

51单片机测量PWM脉冲宽度LCD1602显示当前PWM占空比频率
此程序通过两个定时器一个外部中断,测量PWM高电平时间以及周期,计算并在1602显示出占空比 周期 高电平时间,只需让脉冲在P3^2口输入即能测得数据。。 单片机源程序如下: #include reg52.h #include LCD1602.h typedef unsigned char uint8; typedef unsigned int uint16;//数据类型重定义 uint8 count = 0; //计进入外部中断次数 bit flag = 1; //捕获结束标志位 long Pwm_All; //PWM的周期 long Pwm_High; //PWM的高电平时间 占空比=Pwm_Hi
[单片机]
STM32CubeMX系列 | 内部温度传感器
1. 内部温度传感器简介 STM32F1有一个内部的温度传感器,可以用来测量CPU及周围的温度。该温度传感器在内部和ADCx_IN16输入通道相连接,此通道把传感器输出的电压转换成数字值,温度传感器模拟输入推荐采样时间是17.1us,内部温度传感器支持的温度范围为:-40~125℃,精度为±1.5℃左右 通过读取ADC通道16的值,通过如下计算公式即可算出当前温度: T = { ( V25 - Vsense ) / Avg_Slope } + 25 上式中: V25 = Vsense 在25℃时的数值(典型值为:1.43) Avg_Slope = 温度与 Vsense 曲线的平均斜率(典型值为:4.3 mV/℃) 以上典型值请
[单片机]
stm32F407之内部温度传感器
刚才发了ADC的一般用法,得知stm32内部内置了一个温度传感器,于是趁热调试了一下内部温度传感器。没有软件滤波,正如手册里所说的,该温度传感器起到一个检测温度变化的作用,如果你想要精确的温度测量,请你外置测温元件...呵呵,测试结果如图: 代码如下: /************************************************************ Copyright (C), 2012-2022, yin. FileName: main.c Author: 小枣年糕 Date: 2012\05\01 Description: ADC1 DMA tempersen
[单片机]
stm32F407之内部<font color='red'>温度传感器</font>
MSP430单片机控制lcd1602显示C程序
//MSP430写的1602液晶显示程序2011/8/26//硬件连接 //P4 数据口 P3.7---E P3.6---RW P3.5----RS #include msp430x14x.h #define uint unsigned int #define rw(x) P3OUT=(P3OUT&(~BIT6))|(x?BIT6:0); unsigned char table0 = hankouxueyuan ; unsigned char table1 = dianzisheji ; //**************延时**************************
[单片机]
液晶显示器的汉字显示方法
  1 引 言   常用的液晶显示模块分为数显液晶模块、点阵字符液晶模块和点阵图形液晶模块。图形液晶模块在我国应用较为普及, 因为中文不能像西文字符那样用字符模块即可显示, 要想显示中文必须用图形模块。 研究了图形液晶模块的汉字显示方法, 以8051 单片机为基础, 介绍了液晶模块与单片机的典型接口电路, 描述了通过外扩的EEPROM 存储汉字字模数据, 将其作为外部数据存储器进行寻址, 通过C51 程序详细介绍了使用方法。对于程序存储器和数据存储器分开寻址的单片机, 该方式能起到节省程序存储器, 扩大程序容量的作用。   2 液晶模块显示汉字方法   使用图形液晶模块可以显示汉字和图形。以DG12864( 128×
[电源管理]
<font color='red'>液晶显示器</font>的汉字显示方法
1602字符液晶详细资料和实例 (续)
1602字符液晶详细资料和实例 (续) 1602与单片机的接口通常有两种: 下面再为大家展示几种可能出现的问题 1:通电之后,程序也烧写进去了,但是1602就是不显示,只显示一排黑块(一般都是在上排8个小黑块,记得刚开始用1602液晶的时候,被这个整怕了~~),怎么样,你郁闷了吧,其实出现这种问题的原因无非以下几种:硬件连线上的错误,这种错误一般用万用表仔细检查后很容易找出来。第二种情况就是硬件连接上是正确的,那么此时出问题最大的就是程序上了,如果你用的是忙检测,看一下忙检测函数写对了没,如果用的是延时函数,那么看看延时的时间是否够长。再就是看看时序图,这点很重要的哦。如果硬件和软件都没有错
[单片机]
<font color='red'>1602</font>字符液晶详细资料和实例  (续)
温度传感器: TDK 推出用于测量激光二极管温度、可选配金丝键合的新型NTC 热敏电阻
可选配金丝键合 电阻和B值容差均在±1%范围内,确保温度传感高度准确 用于测量光通信收发器和LiDAR中的激光二极管的温度 温度传感器: TDK 推出用于测量激光二极管温度、可选配金丝键合的新型NTC 热敏电阻 TDK株式会社推出全新的NTCWS系列NTC热敏电阻,可选配金丝键合。此产品系列将于2023年9月开始投入量产。这些可键合的NTC热敏电阻可通过金丝键合安装于封装内部,从而对光通信用激光二极管(LD)进行高度准确的温度检测。 在光通信收发器中,LD设备的使用正在不断增加,5G 以及用于测量车辆间距的LiDAR便是典型代表。由于LD的波长会随着温度变化而变,因此对LD的温度进行控制是提高其性能的关键所
[传感器]
<font color='red'>温度传感器</font>: TDK 推出用于测量激光二极管温度、可选配金丝键合的新型NTC 热敏电阻
图形点阵式液晶显示器MSP-G320240在高速处
摘要:介绍了内置SED1335控制器的图形液晶显示器MSP-G320240的工作原理及应用方法,给出了MSP-G320240液晶显示器同DSP的简单接口电路,同时给出了相应的液晶显示器的初始化和清显示区的具体程序。 关键词:液晶显示器;DSP;接口;SED1335;MSP-G320240 1 引言 各种仪器仪表无论是测量型的仪器仪表,还是信号源型的仪器仪表,或大或小都有一个显示子系统,这使得液晶显示器(LCD)的应用尤为广泛。由于液晶显示器具有体积小、外形薄、功耗低、重量轻、工作驱动电压低、无辐射,特别是视域宽、显示信息量大等优点,因此,随着现代测控技术的日益发展,液晶显示器已经成为测量显示结果和人机对话的重要工具。本文介绍
[电源管理]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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