液晶显示温度计程序

发布者:温暖微风最新更新时间:2018-01-09 来源: eefocus关键字:液晶显示  温度计 手机看文章 扫描二维码
随时随地手机看文章

#include
#include

sbit  RST   = P2^0;
sbit  CLK   = P2^1;
sbit  DQ    = P2^2;
sbit  TSOR  = P2^3;

sbit  ALERT =P2^4;
sbit  RS    = P2^7;
sbit  RW    = P2^6;
sbit  EN    = P2^5; 
/*------------------------------------------全局变量-------------------------------------------------------*/
statIC unsigned char temp1,temp2;         //温度值的整数部分、小数部分
static unsigned char pos,posset;           //数字电位器电位值、设定值
static unsigned char min,sec;              //分钟、秒
static unsigned char count;                //Timer0中断计数
static unsigned char minset;               //设定的分钟数
static unsigned char status1,status2;  //状态标志
bit   stop,timeover;     //定时停止、结束
static char line0[] ="     00:00      ";
static char line1[] ="   . C         W";


/*-------------------------------------------------------------------------------------------------------------*/
void          InitInterupt();
void          KeyboardDelay();
/*-------------------------------------------LCD驱动函数------------------------------------------------*/
void          DelayL();
void     DelayS();
void     WriteCommand(unsigned char c);
void     WritEDAta(unsigned char c);
void     ShowChar(unsigned char pos,unsigned char c);
void     ShowString(unsigned char line,char *ptr);
void     InitLcd();
/*----------------------------------------------键盘-程序--------------------------------------------------*/
unsigned char GetKey();
/*---------------------------------------------数字温度计驱动-------------------------------------------*/
void          ChangePos(bit sel,unsigned char pos1,unsigned char pos2);
/*------------------------------------------温度传感器驱动----------------------------------------------*/
void          Delay15();
void          Delay60();
void          Delay100ms();
void          Write0TS();
void          Write1TS();
bit           ReaDTS();
void          ResetTS();
void          WriteByteTS(unsigned char byte);
unsigned char  ReadByteTS();
void          InitTS();
void          GetTempTS();
/*-------------------------------------------------主程序---------------------------------------------------*/
void main (void) {
     char code str1[]  ="  Hello World!  ";
     char code str2[]  ="   2002-10-20   ";
  unsigned char i;

     SP=0x50;
  ALERT=0;                 //报警灯灭
  TSOR=1;                 //1-wire总线释放

     DelayL();
  InitLcd();               //初始化LCD
  DelayL();
     ShowString(0,str1);    //启动画面
     ShowString(1,str2);
  for(i=0;i<15;i++)
       Delay100ms();
     InitInterupt();         //初始化中断设置

     minset=10;               //缺省定时10分钟
     posset=0;                //缺省电位器值0
  min=minset;     //初始化数据
  pos=posset;
  sec=0;            
     count=0;
     P1=0xF0;
  status1=0;
  status2=0;
  stop=1;
  timeover=0;

     ChangePos(0,255-pos,255-pos);     //设置电位器

  InitTS();                //初始化温度计
  while(1)      //循环显示温度值
  {
       GetTempTS();
    line1[0]=0x20;
    i=temp1;
if(i>39)       //超过40摄氏度,告警灯亮
 ALERT=1;
    if(i>99)      //超过100摄氏度,显示温度的百位
    {
      line1[0]=0x31;    
      i-=100;
       }
       line1[1]=i/10+0x30;     //显示温度的十位
    line1[2]=i%10+0x30;    //显示个位
    line1[4]=temp2+0x30;   //显示小数位
    if(timeover)               //若定时结束,则电位器缓慢复0
    {
         for(;pos>0;pos--)
      {
         ChangePos(0,255-pos,255-pos);    
         _nop_();
   _nop_();
      }
   timeover=0;
   posset=0;
    }
       if(pos>posset)       //若按键修改电位器位置
    {
      for(;pos>posset;pos--)   //则缓变到设定值
         {
         ChangePos(0,255-pos,255-pos);    
         _nop_();
      _nop_();
      } 
      ChangePos(0,255-pos,255-pos);
    }
    else if(pos    {
      for(;pos         {
         ChangePos(0,255-pos,255-pos);    
         _nop_();
      _nop_();
      } 
      ChangePos(0,255-pos,255-pos); 
    }
       i=pos;  
    line1[9]=0x20;     //显示电位器等级值
    if(i>99)
    {
      line1[9]=i/100+0x30;
         i=i%100;
    }
       line1[10]=i/10+0x30;
       line1[11]=i%10+0x30;
    ShowString(1,line1);
    line0[5]=min/10+0x30;   //显示时间
    line0[6]=min%10+0x30;
       line0[8]=sec/10+0x30;
    line0[9]=sec%10+0x30;
    ShowString(0,line0);    
       Delay100ms();
  }
}

void InitInterupt()
{
  TMOD=0x21;               //初始化中断设置
  TL1=0xFD;
  TH1=0xFD;
  PX0=1;
  EA=1;                 
  ES=1;                 
  PCON=0;    
  TR1=1;
  SCON=0x50;


  TL0=0x00;                 //定时0.05m
  TH0=0x4C;  
  ET0=1;

  EX0=1;                
  IT0=1;
}

void KeyboardDelay()        //按键中断延时
{
 unsigned char i,j;
 i=0x40;
 j=0xFF;
 while(i--)
  while(j--);
}

/*--------------------------------------------中断处理-----------------------------------------------------*/
Int0_process() interrupt 0 using 0
{
  unsigned char key;
  unsigned char keycode[]= "TP";
  unsigned char step[3]={1,2,5};
  EA=0;
  key=GetKey();                //获得按键值
  switch(key)
  {
   case 0:
     stop=!stop;
  min=minset;
     sec=0;
     break;
   case 1:
   case 2:
   case 3:
     if(stop)
  {
   minset+=step[key-1];
  if(minset>60)
    minset=0;
  min=minset;
  }
     break;
   case 5:
   case 6:
   case 7:
     if(stop)
  {  
   minset-=step[key-5];
  if(minset>60)
    minset=0;
  min=minset;
  }
     break;
   case 9:
   case 10:
   case 11:
   posset+=step[key-9];
     break;
   case 13:
   case 14:
   case 15:
   posset-=step[key-13];
     break;
   default:
     break;
  }
  TR0=!stop;
  KeyboardDelay();
  P1=0xF0;
  EA=1;
}

Timer0_process() interrupt 1 using 0
{
  EA=0;
  TR0=0;
  TL0=0x00;
  TH0=0x4C;
  count++;
  if(count==20)      //如果到累计定时到达1s
  {
   if(sec==0)       //定时处理
   {
     if(min==0)      //总定时到,则置结束标志
    timeover=1;
     else
  {
      min--;
      sec=59;
     }  
   }
   else
     sec--;
   count=0;
  }  
  TR0=1;
  EA=1;
}
/*--------------------------------------LCD驱动子程序--------------------------------------------------*/
void DelayL()                           
{unsigned char i,j;
 i=0xF0;
 j=0xFF;
 while(i--)
  while(j--);
}

void DelayS()              
{
 unsigned char i;
 i=0x1F;
 while(i--);
}

void WriteCommand(unsigned char c)       
{
 DelayS();
 EN=0;
 RS=0;
 RW=0;
 _nop_();
 EN=1; 
 P0=c;
 EN=0;
}

void WriteData(unsigned char c)          
{
 DelayS();
 EN=0;
 RS=1;
 RW=0;
 _nop_();
 EN=1; 
 P0=c;
 EN=0;
 RS=0;
}

void ShowChar(unsigned char pos,unsigned char c) 
{
 unsigned char p;
 if(pos>=0x10)
    p=pos+0xB0;
 else
    p=pos+0x80;
 WriteCommand(p);
 WriteData(c);
}

void ShowString(unsigned char line,char *ptr)    
{
 unsigned char l,i;
 l=line<<4;
 for(i=0;i<16;i++)
   ShowChar(l++,*(ptr+i));
}    

void InitLcd()
{
 DelayL();
 WriteCommand(0x38);
 WriteCommand(0x38);
 WriteCommand(0x06);
 WriteCommand(0x0C);
 WriteCommand(0x01);
 WriteCommand(0x80);
}     
/*---------------------------------------------键盘子程序-------------------------------------------------*/
unsigned char GetKey()
{
  unsigned k,t,i,j;
  k=P1;
  k=k&0xF0;
  i=0;
  while((k&0x10)&&i<4)
  {
 i++;
 k=k>>1;
  }   
  k=0x01;
  j=0;
  while(j<4)           
  {
    P1=0xFF^k;
 _nop_();
    t=P1;
    t=t^0xFF;
    t=t&0xF0;
    if(t)
   break;
    j++;
 k=k<<1;
  }
  k=j*4+i;
  return k;
}
/*-----------------------------------------数字温度计驱动子程序--------------------------------------*/
void  ChangePos(bit sel,unsigned char pos1,unsigned char pos2)
{  unsigned char i;
     RST=0;
     DQ=0;
     CLK=0;
  RST=1;
  DQ=sel;
     _nop_();
     CLK=1;
     _nop_();
  CLK=0;
     for(i=0;i<8;i++)
  {
  if(pos1&0x80)
       DQ=1;
  else
    DQ=0;
     _nop_();
     CLK=1;
     _nop_();
  CLK=0;
  pos1=pos1<<1;
 }
 for(i=0;i<8;i++)
 {
  if(pos2&0x80)
       DQ=1;
  else
    DQ=0;
     _nop_();
     CLK=1;
     _nop_();
     CLK=0;
  pos2=pos2<<1;
 }
    RST=0;
}

/*------------------------------------------温度传感器子程序-------------------------------------------*/
void Delay100ms()              //延时100ms
{
 unsigned  char i,j,k;
 for(i=0;i<8;i++)
   for(j=0;j<25;j++)
     for(k=0;k<250;k++);
}

void Delay15()                 //延时15us
{
 unsigned  char i;
 for(i=0;i<8;i++);
}

void Delay60()                 //延时60us
{
 unsigned  char i;
 for(i=0;i<30;i++);
}

void Write0TS()                //写bit 0
{
     TSOR=1;
     TSOR=0;
  Delay15();
  Delay15();
  Delay15();
  Delay15();
     TSOR=1;
  _nop_();
  _nop_();
}

void Write1TS()                 //写bit 1
{
     TSOR=1;
     TSOR=0;
     _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
     TSOR=1;
     _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
     Delay15();
     Delay15();
     Delay15();
}

bit ReadTS()
{
 bit b;
     TSOR=1;
     TSOR=0;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
     TSOR=1;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
     b=TSOR;            
     Delay15();
     Delay15();
     Delay15();
  _nop_();
  _nop_();
  return b;
}

void ResetTS()                //复位
{unsigned char i;

   TSOR=1;
   TSOR=0;
   for(i=0;i<8;i++)
     Delay60();
   TSOR=1;              
   while(TSOR);         
   for(i=0;i<8;i++)
     Delay60();
}

void WriteByteTS(unsigned char byte)   //写一个字节(byte)
{unsigned char i;
 for(i=0;i<8;i++)
 {
   if(byte&0x01)
     Write1TS();
   else
     Write0TS();
   byte=byte>>1;
 }
}

unsigned char ReadByteTS()          //读一个字节(byte)
{
 unsigned char i,j;
 bit           b;
 j=0;
 for(i=0;i<8;i++)
 {
   b=ReadTS();
   if(b)
     j+=1;
   j=_cror_(j,1);
 }
 return j;
}
           
void InitTS()                 //初始化温度转换
{
     ResetTS();               
  WriteByteTS(0xCC);       
  WriteByteTS(0x4E);       
  WriteByteTS(0x64);       
     WriteByteTS(0x8A);      
     WriteByteTS(0x1F);      
}

void GetTempTS()                //获取温度
{
     ResetTS();               
  WriteByteTS(0xCC);       
  WriteByteTS(0x44);       
  Delay100ms();           
     ResetTS();              
  WriteByteTS(0xCC);      
   WriteByteTS(0xBE);      
     
  temp2=ReadByteTS();
  temp1=ReadByteTS();
  ReadByteTS();
  ReadByteTS();
  ReadByteTS();
  ReadByteTS();
  ReadByteTS();
  ReadByteTS();
  ReadByteTS();
  temp1=temp1<<4;
  temp1+=(temp2&0xF0)>>4;
   temp2=(temp2&0x0F)?5:0;
}
液晶显示温度计程序


关键字:液晶显示  温度计 引用地址:液晶显示温度计程序

上一篇:单片机与PC机串口通讯程序
下一篇:PCF8563时钟程序

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

TFT型液晶显示器基本介绍
   我一般来说目前在选购液晶显示器时应该明确,LCD的品质需要由液晶板的可视角度,响应时间,对比度,亮度等具体的性能指标来保证。    TFT液晶显示原理   TFT型的液晶显示器主要的构成包括了:偏光板(1)、玻璃基板(2)、薄模式晶体管(3)、配向膜(4)、液晶材料(5)、导向板(6)、色滤光板(7)、萤光管(8)等等。首先液晶显示器必须先利用背光源,也就是萤光灯管投射出光源,这些光源会先经过一个偏光板然后再经过液晶,这时液晶分子的排列方式进而改变穿透液晶的光线角度。然后这些光线接下来还必须经过前方的彩色的滤光膜与另一块偏光板。因此我们只要改变刺激液晶的电压值就可以控制最后出现的光线强度与色彩,并进而能在液晶面板上变化出
[工业控制]
用FPGA构成液晶显示控制器
    摘要: 在DSP和FPGA为核心的无线扩频通信平台上增加液晶显示和触摸屏控制,从而能实现文字和图形信息的编辑和无线传送。用FPGA构造逻辑作为液晶显示控制器,不需要额外硬件资源。该产品集成化后体积小、便于携带、用途广泛。     关键词: 液晶显示  无线通信  FPGA  DSP     由DSP(数字信号处理)芯片和FPGA(现场可编程逻辑门阵列)为核心组成的无线数字扩频通信平台是无线扩频通信的一个开放式平台,能用于无线接入、无线图象和音频传送、移动INTERNET、精确区域定位LPS、智能遥控探测等高科技领域。在此基础上增加液晶显示和触摸屏控制,从而能实现文字和图形信息的编辑和无线传送。
[应用]
LCD1602液晶显示汉字显示程序带仿真
//建立 工 字字模并在第一行第一列显示 //P155 参考程序: GONG_ZI() //单片机仿真文件下载: http://www.51hei.com/bbs/dpj-23789-1.html #include reg51.h #include intrins.h //库函数头文件,代码中引用了_nop_()函数 sbit RS=0xb0; //P3.0 sbit RW=0xb1; //P3.1 sbit E= 0xb2; //P3.2 void lcd_w_cmd(unsigned char com); void lcd_w_dat(unsigned char dat); unsigned char
[单片机]
液晶显示模块设计中应注意的几个问题
    随着信息产业的迅速发展,作为信息显示终端之一的LCD器件也得到了空前的发展。在FPD(Flat panel display)器件中,LCD以其轻、薄、小、耗电低等优点而一枝独秀。     为LCD配置了驱动电路,就形成了液晶显示模块LCM(Liquid Crystal Module)。它的基本组成部件除了LCD、驱动电路外一般还有连接件、背光源等。液晶显示模块同一个系统中的其他电路一样,有简单的接口,并提供了丰富的控制显示的指令系统。为整机的开发节约了时间。下面讨论LCM设计中的应注意的几个问题及解决方法。     对比度     对比度是描述一个显示器件在显示时前景(如显示的文字、图形等)和背景之间明暗差别大
[电源管理]
<font color='red'>液晶显示</font>模块设计中应注意的几个问题
C0851F410与12864液晶显示
#include C8051F410.h #define uchar unsigned char #define LCMdata P2 #define Busy 0x80 sbit RS = P1^3; sbit RW = P1^4; sbit E = P1^5; sbit PSB = P1^6; sbit REST= P0^7; //sfr16 TMR2RL = 0xCA; // Timer2 Reload Register //sfr16 TMR2 = 0xCC; void Display_String(uchar line,uchar *string); void Wr_Data(uchar wrdat
[单片机]
Ds3231+12864液晶显示AT89C51带温度功能的时钟程序
Ds3231+12864液晶显示AT89C51带温度功能的时钟程序。 #include #include #include #define uchar unsigned char #define uint unsigned int sbit LCD_RS=P2^6; sbit LCD_RW=P2^5; sbit LCD_EN=P2^4; sbit LCD_PSB=P2^3; sbit DQ=P3^7; //18b20 sbit SDA=P1^4; //ds32321 //模拟I2C数据传送位SDA sbit SCL=P1^3;
[单片机]
Ds3231+12864<font color='red'>液晶显示</font>AT89C51带温度功能的时钟程序
串行接口中文图形点阵液晶显示模块的应用
摘要:介绍一种具有4位/8位并行、2线/3线串行多种接口方式,内部含有国标一级、二极简体中文字库的图形点阵液晶显示模块;利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。介绍模块的性能特点、操作指令及接口方式;以AT89C2051单片机及2线串行接口方式为例,给出相应的硬件电路及显示子程序。 关键词:串/并接口 液晶模块 中文字库 引言 液晶显示器件由于具有显示信息丰富、功耗低、体积小、质量小、无辐射等优点,得到了广泛的应用;但液晶显示模块复杂的硬件接口和软件编程却令产品设计人员生畏,因而限制了该模块在某些领域的应用。本文介绍一种具有串/并多种接口方式,且内部含有GB2312一级、二级简体中文字库
[电源管理]
单片机DHT11温湿度+1602液晶显示程序
DHT11驱动程序参考 http://www.51hei.com/bbs/dpj-112282-1.html http://www.51hei.com/bbs/dpj-38067-1.html 1602驱动程序参考 http://www.51hei.com/bbs/dpj-24671-1.html /********************************************************************************************* 程序名:    DHT11-1602 编写人:    fby 编写时间:  2019年3月21日 硬件支持:  STC89C52RC D
[单片机]
单片机DHT11温湿度+1602<font color='red'>液晶显示</font>程序
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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