历史上的今天
返回首页

历史上的今天

今天是:2025年01月06日(星期一)

正在发生

2018年01月06日 | 数字温度计程序

2018-01-06 来源: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; 


推荐阅读

史海拾趣

Applied Engineering Products (AEP)公司的发展小趣事

在环保意识日益增强的今天,AEP公司积极响应国家号召,致力于绿色环保和可持续发展。公司投入大量资金研发环保型电子元器件,减少生产过程中的废弃物排放。同时,公司还建立了完善的废旧产品回收机制,对废旧产品进行环保处理,实现资源的循环利用。这一举措不仅提升了AEP公司的社会形象,也为公司的可持续发展注入了新的动力。

Frequency Electronics Inc公司的发展小趣事

高频电子的业务范围广泛且多元化,主要包括FEI-NY、Gillam-FEI和FEI-Zyfer三个部门。FEI-NY部门主要负责纽约总部设施和子公司FEI-Asia与FEI-Elcom的运营;Gillam-FEI部门则负责比利时与法国的业务,并专注于电缆网络同步产品的设计、研发和生产;FEI-Zyfer部门则主要经营公司加州业务,并设计生产附带GPS技术的产品。这种多元化业务布局不仅降低了公司的经营风险,还实现了各业务之间的战略协同和资源共享。

Etron公司的发展小趣事

1991年,台湾的电子行业正蓬勃发展,钰创科技(Etron)在这一时期应运而生,创始人凭借对市场敏锐的洞察力,决定专注于利基型缓冲记忆体产品与系统晶片的设计与生产。初创时期,公司面临着技术、资金和市场等多重挑战。然而,钰创科技凭借其团队的技术实力和创新精神,成功开发出了一系列具有竞争力的产品,逐渐在市场上崭露头角。

DIOO公司的发展小趣事

DIOO公司的创始人李奥(Leo)是一位热衷于电子技术的工程师。在20世纪80年代初,他看到了电子行业的巨大潜力,并决定创立DIOO公司,专注于开发和生产高端电子产品。凭借对技术的热爱和对市场的敏锐洞察,李奥带领DIOO公司推出了第一款自主研发的电子产品——高性能音频放大器,该产品凭借其卓越的性能和独特的设计在市场上引起了轰动。

3L Electronic Corporation公司的发展小趣事

3L Electronic Corporation深知人才是企业发展的根本。因此,公司注重人才培养和团队建设,为员工提供丰富的培训和发展机会。通过引进优秀人才和建立激励机制,公司形成了一支高效、专业的团队,为公司的持续创新和发展提供了有力保障。

EPT公司的发展小趣事

面对日益严峻的环境问题,EPT积极响应国家绿色发展的号召,开始探索和实践绿色生产。公司引进了一系列环保设备和工艺,实现了生产过程中的节能减排和资源循环利用。同时,EPT还加强了对废旧电池的回收和处理工作,以减少对环境的污染。这一举措不仅展现了EPT对社会责任的担当,也为其在电子行业中树立了绿色发展的典范。

以上故事均基于EPT公司在电子行业发展的背景信息虚构而成,旨在展现其发展历程中的关键节点和亮点。请注意,这些故事并非真实事件,仅供参考。

问答坊 | AI 解惑

【招聘】EDA Software Engineer / Senior EDA Software Engineer

本人就职的公司正在招聘员工,期待您的加入。 北京普拉普斯微电子技术有限公司 公司介绍:         ProPlusDesign Solutions, Inc., headquartered in San Jose, California, USA, isa leading technology and se ...…

查看全部问答>

请教联想输入法问题?

在做用于wince平台下的输入法,现在拼音输入法已实现,不过只能一个一个汉字输入,码表是16进制的形式表示,两个字节(ASCII码)表示一个汉字(或符号)现在想实现拼音联想功能,至少能实现词组输入,还没啥头绪??请教各位!分没啦,不好意思啊!…

查看全部问答>

89c51的PCON寄存器的问题

其中存在IDL位空闲位,还有PD掉电工作位,单片机的功率不高吧?在何时会用到省电模式呢?还有空闲工作方式下振荡器仍工作,所以只需要复位只需要两个机器周期。那么通常情况下复位需要几个机器周期。 SMOD波特率倍增在串行通信时经常被怎样使用?…

查看全部问答>

通信类软件包括哪些?

比如飞信是的吧? 做这行需要哪些软硬件知识呢?比如用不同语言开发要用到哪些函数、控件、API等,要知道哪些底层协议,对各类硬件接口要有哪些撑握?除PC外还有哪些外围东东要学习? 希望有经验的大侠指导下我这个门还未入的菜鸟。。。 谢谢!…

查看全部问答>

关于ce5自带的webserver的问题

我想把webserver的主目录\\www转移到NandFlash上,先是修改servers.dat,如下: ; @CESYSGEN IF SERVERS_MODULES_HTTPD root:-Directory(\"\\NandFlash\\Windows\"):-Directory(\"www\") Directory(\"\\NandFlash\\Windows\\www\"):-Directory(\ ...…

查看全部问答>

请教芯片c语言问题

最近可以说是加入了嵌入式开发的行列, 但在看一些c的程序时发现一些奇怪的语句, 比如, bit P80                                = 0xffffffbf.0; bit&nb ...…

查看全部问答>

WaitCommEvent在串口程序中的应用问题

我在应用中是只对EV_RXCHAR事件 WaitCommEvent这个函数主要是接收到数据的时候触发事件,进行下面的读取函数,如果没有数据接收,就会阻塞。 一开始用这个函数没有问题,但是调用两次后,也就是第三次调用这个函数,就算是没有数据接收到,也不会 ...…

查看全部问答>

LED恒流驱动与不同控制模式的比较

市场上可以买到的微功率电源芯片有以下几种控制模式:   PFM、PWM、chargepump、FPWM、PFM/PWM以及pulse-skipPWM、digitalPWM   其中常见的有PFM、PWM、chargepump以及PFM/PWM   1、PFM是通过调节脉冲频率(即开关管的工作频率)的方法 ...…

查看全部问答>

过程性连续赋值语句

verilog中若一个过程块里面有多个过程性连续赋值语句(如多个assign语句),请问这些语句是顺序执行的吗? 求高手指点!…

查看全部问答>

斗胆开贴,MSP430疑难杂症都跟帖吧,共同学习。

斗胆开贴,MSP430疑难杂症都跟帖吧,共同学习。…

查看全部问答>