历史上的今天
返回首页

历史上的今天

今天是:2025年01月09日(星期四)

正在发生

2018年01月09日 | 液晶显示温度计程序

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;
}
液晶显示温度计程序


推荐阅读

史海拾趣

Analog Modules Inc公司的发展小趣事

Analog Modules Inc. 是一家总部位于美国马萨诸塞州的公司,专注于设计和生产高性能模拟电子模块和系统,为军事、航空航天、医疗和工业等领域提供解决方案。以下是 Analog Modules Inc. 公司发展的相关故事:

  1. 创立与初期阶段:Analog Modules Inc. 成立于1970年,由一群电子工程师创办。公司最初的目标是满足军事和航天领域对高性能模拟电子模块的需求。在成立初期,公司致力于开发和生产高精度的模拟信号处理模块和系统,以满足客户对于高可靠性和高性能的要求。

  2. 技术创新与产品优化:Analog Modules Inc. 在技术方面不断进行创新,并持续优化其产品线。公司的产品涵盖了广泛的领域,包括模拟信号处理、数据采集、激光驱动、通信和雷达等。这些产品具有高精度、高可靠性和耐用性,得到了客户的广泛认可和信赖。

  3. 市场拓展与全球业务:随着业务的不断发展,Analog Modules Inc. 将市场重点逐渐扩展到了全球范围。公司与全球各地的客户建立了长期稳定的合作关系,拓展了产品的销售渠道和市场份额。同时,公司还积极参与国际展会和行业交流活动,提升了品牌知名度和影响力。

  4. 应用领域与客户合作:Analog Modules Inc. 的产品广泛应用于军事、航空航天、医疗和工业等多个领域。公司与各类客户进行紧密合作,包括政府军方、航空航天机构、医疗设备制造商和工业自动化企业等。通过与客户的合作,公司不断了解市场需求,提供定制化的解决方案,满足客户的特定需求。

  5. 持续发展与未来展望:Analog Modules Inc. 将继续致力于技术创新和产品研发,以满足不断变化的市场需求。公司将继续加强与客户和合作伙伴的合作关系,不断拓展业务领域,进一步提升产品性能和服务水平。在未来,Analog Modules Inc. 将继续保持行业领先地位,为客户提供更加优质和可靠的解决方案。

Cosel公司的发展小趣事

1967年,Cosel公司的前身——木村电气销售(个人独资)在日本正式成立,标志着Cosel公司创业之路的开始。创始人凭借对电子行业的敏锐洞察和深厚技术背景,带领公司逐步在竞争激烈的市场中站稳脚跟。随着业务的不断拓展,1969年,公司撤消了木村电气销售,并成立了ELCO株式会社,这一变革为公司后续的发展奠定了坚实基础。

艾华集团(AISHI)公司的发展小趣事

1985年,艾立华和王安安怀揣着3700元的全部家当,毅然决然地踏上了创业之路。他们租下了两间不到50平方米的废弃小平房,与几名工人一起,手工制作铝电解电容器。由于资金、技术和市场的限制,艾华集团最初只能接一些其他企业不愿意做的、用量很少但又刚需的项目。然而,即便是在这样的困境中,艾立华和王安安也始终坚持对产品品质的精益求精,他们深知,只有高品质的产品才能在市场上立足。

明微公司的发展小趣事

随着全球半导体行业向中国市场的转移,明微公司意识到拓展海外市场的重要性。为了加快海外市场拓展步伐,公司积极加强与国际知名企业的合作与交流,引进先进的技术和管理经验。同时,公司还积极参加国际展会和论坛等活动,提升品牌影响力。这些举措使明微公司在国际市场上逐渐树立起良好的口碑和形象。

Allen Avionics Inc公司的发展小趣事

随着全球半导体行业向中国市场的转移,明微公司意识到拓展海外市场的重要性。为了加快海外市场拓展步伐,公司积极加强与国际知名企业的合作与交流,引进先进的技术和管理经验。同时,公司还积极参加国际展会和论坛等活动,提升品牌影响力。这些举措使明微公司在国际市场上逐渐树立起良好的口碑和形象。

Acopian Power Supplies公司的发展小趣事

在全球芯片市场不断扩大的背景下,明微公司面临着原材料供应紧张、价格波动等挑战。为了应对这些挑战,公司积极优化供应链管理,与供应商建立长期稳定的合作关系,确保原材料的稳定供应。同时,公司还加强了对市场需求的预测和分析能力,提前布局产能和库存,有效应对市场变化。这些措施的实施使明微公司在市场竞争中更加稳健。

问答坊 | AI 解惑

哪位大虾有比较好的线路板连接器供应商推荐一下

哪位大虾有比较好的线路板连接器供应商推荐一下,兄弟要小批量采购试产 O(∩_∩)O谢谢…

查看全部问答>

基于IAR的UCOU程序解读问题?

这个是UCOS提供的基于IAR的程序代码?其中有个OS_CPU_ARM_ExceptHndlr_BreakTask 函数是做什么用的,一直没有找到谁调用他?什么时候调用他?怎么调用的?没有找到调用他的函数,麻烦各位帮忙看下。程序在http://blog.chinaunix.net/u1/45113/showa ...…

查看全部问答>

WinCE6系统suspend/resume回来之后立刻进入systemidle

用touch点击开始菜单进入suspend,然后按Power Button使系统resume回来之后,系统会先进入resume状态,紧接着进入systemidle状态,backlight和display都被关掉,需要点一下屏幕才能再进入on状态,这是怎么回事?谢谢…

查看全部问答>

CE系统下如何实现显示电池电量百分比

大家好,我想问一下CE系统下,如何显示电池电量的百分比。我硬件平台是S3C2440,我用它自身带的ADC读取电池电量在计算可以吗?再就是加载电池监测芯片。除了这些还有其它什么办法吗?请大家踊跃发言,谢谢!…

查看全部问答>

msp430单片机的串口通信问题

请问各位大侠,单片机在接收中断中是一次接收一帧长度的数据么?还是分多次接收,每次大于一个字节,抑或每次只接收一个字节?…

查看全部问答>

请教UART控制器中Modem功能的测试(急)

请教各位达人: 我想测试一下芯片中UART的Modem功能,请问应该如何测试?测试环境应该如何搭建啊?是不是需要通过串口和Modem相连?AT指令怎么测试?是通过串口发给Modem吗? 谢谢! …

查看全部问答>

求教CE5.0 MFC应用程序,HTML文件浏览,添加Microsoft web浏览器控件,程序不能运行。为什么?

使用VS2005 MFC开发MTML文件浏览器,使用Microsoft web浏览器控件,可以正常编译通过,放入WINCE5.0机器设备,不能启动。 提示错误如下: Debug assertion Failed; PROGRAM:程序路径。 F:\\SP\\vctools\\vc7libsce\\ship\\atlmft\\scr\\mfc\\oc ...…

查看全部问答>

谁能提供个轮式机器人的控制原理和相关程序

最近刚开始搞科技创新的活动,想弄个轮式搬运机器人,不知道各路大侠谁有资料分享一下,小弟不胜感激!!…

查看全部问答>

电子设计大赛题目的要求

本帖最后由 paulhyde 于 2014-9-15 03:49 编辑 设计制作一个声源模块,含信号产生电路、放大电路和微型扬声器等,每按键一次发声一次,声源信号的频率为800Hz左右,声源持续时间约为1s。要求声源模块体积不超过4cm3。 太小了,各位有什么方法达到 ...…

查看全部问答>