可调上下限温度报警器

发布者:eta17最新更新时间:2012-10-20 来源: 21IC 关键字:温度报警器  AT89S52  按键发声 手机看文章 扫描二维码
随时随地手机看文章

     此程序是在上一个程序进行修改而来,把年月日删除,替换为可调温度上下限。

     带有可调时间星期功能,按键发声功能,手动设定温度上下限功能,温度报警功能,适用于AT89S52芯片。芯片内存剩余3.8K。 

    可扩展功能:闹钟。
点击浏览下一页

 

                                程序
#include"reg51.h"
#define uchar unsigned char 
#define uint unsigned int 


   sbit BEEP=P3^7;    //// 定义蜂鸣器口

   unsigned char L,H;     //// 定义高低温度变量


/////////////////////////////////////////////////////////////////////////////////////////////////

 /**********报警声音**************/

 void bi(uint t)
   {
    int c,n;
    for(c=0;c0;i--)
     {
       DQ = 0;    //高电平拉成低电平时读周期开始
       dat>>=1;
       DQ = 1;    //给脉冲信号
       if(DQ)
       dat|=0x80;  
       delay_18B20(4);
     }
     return(dat);
   }

//////////////////////////////////////////////////////////////////////

/*************ds18b20写一个字节****************/

void WriteOneChar(unsigned char dat)
 {
   unsigned char i=0;
   for (i=8; i>0; i--)
   {
     DQ = 0;         //从高电平拉至低电平时,写周期的开始
     DQ = dat&0x01;  //数据的最低位先写入
     delay_18B20(5); //60us到120us延时
     DQ = 1;        
     dat>>=1;        //从最低位到最高位传入
   }
 }


//////////////////////////////////////////////////////////////////////

/**************读取ds18b20当前温度************/

void ReadTemperature(void)
 {
    unsigned char a=0,b=0,t=0;

    Init_DS18B20 ( );
    WriteOneChar ( 0xCC );       // 跳过读序号列号的操作
    WriteOneChar ( 0x44 );       // 启动温度转换
    delay_18B20  ( 100  );       // this message is wery important
    Init_DS18B20 ( );
    WriteOneChar ( 0xCC );       //跳过读序号列号的操作
    WriteOneChar ( 0xBE );       //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
    delay_18B20  ( 100  );
    a=ReadOneChar( );            //读取温度值低位
    b=ReadOneChar( );            //读取温度值高位

    temp1 = b<<4;                //高8位中后三位数的值
    temp1+= ( a&0xf0 )>>4;       //低8位中的高4位值加上高8位中后三位数的值   temp1室温整数值
    temp2 = a&0x0f;              //小数的值
    temp  = ( ( b*256+a ) >>4 ); //当前采集温度值除16得 实际温度值    zhenshu    
    xs=temp2*0.0625*10;          //小数位,若为0.5则算为5来显示   xs小数    xiaoshu      
 }


//////////////////////////


 


/*********************1602液晶程序********************/
 

/******定义液晶控制口*******/ 
 
    sbit lcdrs=P2^5;   //定义液晶三个控制口
    sbit lcdrw=P2^6;
    sbit lcden=P2^7;

    sbit K1=P3^0;     //定义三个开关
 sbit K2=P3^1;
 sbit K3=P3^2;
 //////////////////////////////////////////////////////////////////

/******定义变量*******/
  
uchar count,shi,fen,miao,xq,K1num;   //定义时间程序里所需要的变量


/////////////////////////////////////////////////////////////////

/******定义数组*******/

  uchar code table [ ]= "TH:38 TL:25 XQ:7";    //液晶界面显示的内容
  uchar code table1[ ]= "23:59:55    .  C";

//////////////////////////////////////////////////

/******延时程序*******/ 
 
  void delay(uint m)    //液晶延时程序
     {
        uint i,j;
      for(i=m;i>0;i--)
     for(j=110;j>0;j--);
     }
//////////////////////////////////////////////////////////
/////////////////////////////////////////////////// 

/**********写指令*************/ 
  void write_com(uchar com)
      {
         lcdrs=0;
         lcdrw=0;
         lcden=0;
         P0=com;
         delay(5);
         lcden=1;
         delay(5);
         lcden=0;
      }

 ////////////////////////////////////////

/************写数据*************/ 

  void write_data(uchar date)
      {
         lcdrs=1;
         lcdrw=0;
         lcden=0;
         P0=date;
         delay(5);
         lcden=1;
         delay(5);
         lcden=0;
      }


/////////////////////////////////////////
/////////////////////////////////////////////////

 /***************液晶显示程序***************/  
  
   /*********时分秒数的分离**********/ 
    
  void write_sfm(uchar add,uchar date)
      { 
        uchar shi,ge;     //分离数字,如35,分成3和5  
     shi=date/10;     
      ge=date%10;     
        write_com  ( 0x80+0x40+add );    
        write_data ( 0x30+shi      );       
     write_data ( 0x30+ge       );       
      }

 //////////////////////////////////////////////////////////////////

/**********星期***********/ 

   void write_xq(uchar add1,uchar date1)
       {
          uchar ge;      //星期只需要一个数字显示   
       ge=date1%10;    
          write_com  ( 0x80+add1 );    
        write_data ( 0x30+ge   );      
       }
  

  ////////////////////////////////////////////////////////////////
 
 /************高温低温数的分离************/

  void write_HL(uchar add2,uchar date2)
     {
         uchar shi,ge;   
      shi=date2/10;     
       ge=date2%10;      
         write_com(0x80+add2);     
      write_data(0x30+shi);  
      write_data(0x30+ge);   
     }
 
  ////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////
 
 /***************按键调时程序***************/ 
   
   void keycan()
    {
         /**********功能选择**********/ 
      if( K1==0    ) { K1num++; delay(2); if( K1==0 ) {  while(!K1);bi(300);

     if( K1num==1 ) { TR0=0; write_com ( 0x80+0x40+7 ); write_com(0x0f); }
   if( K1num==2 ) { write_com ( 0x80+0x40+4 ); }
   if( K1num==3 ) { write_com ( 0x80+0x40+1 ); }
   if( K1num==4 ) { write_com ( 0x80+15 );  }
   if( K1num==5 ) { write_com ( 0x80+10 );  }
   if( K1num==6 ) { write_com ( 0x80+4 );  }
   if( K1num==7 ) { K1num=0; write_com(0x0c); TR0=1; } 
       } 
      }

///////////////////////////////////////////////////

         /*********功能加*********/ 
     
       if( K1num!=0 ) {
         if( K2==0    ) { delay(2);
         if( K2==0    ) { while(!K2);bi(300);

      if( K1num==1 ) { miao++;   if( miao==60 )  miao=0;  write_sfm ( 6,miao);  write_com ( 0x80+0x40+7 ); }
         if( K1num==2 ) { fen++;    if(  fen==60 )   fen=0;  write_sfm ( 3,fen );  write_com ( 0x80+0x40+4 ); }
      if( K1num==3 ) { shi++;    if(  shi==24 )   shi=0;  write_sfm ( 0,shi );  write_com ( 0x80+0x40+1 ); }
      if( K1num==4 ) { xq++;     if(   xq==8  )    xq=1;  write_xq  (15,xq  );  write_com ( 0x80+15 ); }
   if( K1num==5 ) {  L++;     if(    L==100)     L=0;  write_HL( 9,L   );  write_com ( 0x80+10 ); }
   if( K1num==6 ) {  H++;     if(    H==100)     H=0;  write_HL( 3,H   );  write_com ( 0x80+4  ); }
    }
      }
     } 
  /////////////////////////////////////////////////////////////////////////////////
         /**********功能减************/ 
      if(K1num!=0)  {
      if(K3==0   )  { delay(2);
      if(K3==0   )  { while(!K3); bi(300);

      if( K1num==1 ) { miao--;   if( miao==-1 )  miao=59;  write_sfm ( 6, miao);  write_com ( 0x80+0x40+7 ); }
         if( K1num==2 ) {  fen--;   if(  fen==-1 )  fen =59;  write_sfm ( 3, fen );  write_com ( 0x80+0x40+4 ); }
      if( K1num==3 ) {  shi--;   if(  shi==-1 )  shi =23;  write_sfm ( 0, shi );  write_com ( 0x80+0x40+1 ); }
         if( K1num==4 ) {   xq--;   if(   xq==0  )  xq  = 7;  write_xq  (15, xq  );  write_com ( 0x80+15 ); }
   if( K1num==5 ) {    L--;   if(    L==-1  )    L=99;  write_HL  ( 9,L    );  write_com ( 0x80+10 ); }
   if( K1num==6 ) {    H--;   if(    H==-1  )    H=99;  write_HL  ( 3,H    );  write_com ( 0x80+4  ); }
    }
      }
     }
    }

//////////////////////////////////////////////////////////////////

/*************初始化**************/
 
  void init()
      {
        uchar num;  //定义一个变量num,用于下面数组的初始化//  
        lcden=0;
        write_com ( 0x38 );
        write_com ( 0x0c );   //不显示光标  
        write_com ( 0x06 );   //光标向右边自动移位  
        write_com ( 0x01 );   //清屏  

        shi=23; fen=59; miao=55; 
         xq=7; H=38;L=25;

        write_com ( 0x80 );     
               for( num=0; num<16; num++ )
                  { write_data( table[num]  );  delay(10); }

        write_com ( 0x80+0x40 );       
               for( num=0; num<16; num++ )
                  { write_data( table1[num] );  delay(10); }


 /////////////////////////////////////////////////////
/********定时器初始化*************/ 

          TMOD=0x01; //定义定时器0,工作方式1  
          TH0=(65536-50000)/256;   //高8位  
          TL0=(65536-50000)%256;   //低8位  
          EA=1;     //开全局中断  
          ET0=1;    
          TR0=1;    //打开定时器  
        }

 

/////////////////////////////////////////////////////////////////////

/***********定时器中断函数************/
 
  void timer0() interrupt 1
   {
     TH0=(65536-50000)/256;
     TL0=(65536-50000)%256;
     count++;
   if( count==20 ) { count=0;    miao++;
   if(  miao==60 ) {  miao=0;     fen++; }  
   if(   fen==60 ) {   fen=0;     shi++; }  
   if(   shi==24 ) {   shi=0; xq++;
   if(    xq==8  ) {    xq=1;    }       }      
  }
   }

 


///////////////////////////////////////
////////////////////////////////////////////////
///////////////////////////////////////////////////////

/*****************************************/


uchar code mytab[8]={0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00};
/*  设定显示位置           
/**************************************/
void lcd_pos(uchar pos)
{                          
  write_com(pos | 0x80) ;  //数据指针=80+地址变量
}

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

 

/////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////

void wendu()  /////温度显示程序/////   
 {
     
        writetab(   ) ;          //自定义字符写入CGRAM
        delay   ( 5 ) ;
        lcd_pos   ( 0x4e ) ;      //显示圈圈
        write_data( 0x00 ) ;    //显示自定义字符 
        write_com ( 0x0c );
        ReadTemperature();    
         
        write_com  ( 0x80+0x40+10 ); 
        write_data ( 0x30+temp/10 );

        write_com  ( 0x80+0x40+11 );
        write_data ( 0x30+temp%10 );
  
        write_com  ( 0x80+0x40+13 );
        write_data ( 0x30+xs%10   );


         /////时间显示地址/////  
        write_sfm( 6,miao );
        write_sfm( 3,fen  );
     write_xq (15,xq   ); 
        write_sfm( 0,shi  );
  } 


//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////

   //////温度报警程序//////
  void baojing()
   {
  
     if(H==temp)
    {
      bi(500);
       }
      if(L==temp)
    {
      bi(500);
       }
   }


 //////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
 /***************主函数***************/ 
   void main()
     {
        init();
        while(1)  
        {
  keycan();
        wendu(); 
  baojing();
     }
    }
关键字:温度报警器  AT89S52  按键发声 引用地址:可调上下限温度报警器

上一篇:逻辑及布尔指令和控制转移类指令练习
下一篇:跑马灯及音乐盒的汇编程序

推荐阅读最新更新时间:2024-03-16 13:10

AT89S52单片机为控制器的多功能数控电流源系统设计
在现代科学研究和工业生产中,精度高、稳定性好的数控直流电流源得到了十分广泛的应用。以往所采用的电流源多数是利用电位器进行调节,输出电流值无法实现精准步进。有些电流源虽能够实现数控但是往往输出的电流值过小,且所设定的输出电流值是否准确不经测试无法确定,不够直观。为此,结合单片机技术及V/I变换电路,利用闭环反馈调整控制原理设计制作了一种新型的基于单片机控制的高精度数控直流电流源。 本系统以AT89S52单片机为控制器,通过人机接口(按键和LCD显示屏)来设置输出电流,设置步进等级1 mA,并可同时显示预设电流值和实际输出电流值。本系统由按键设置输出电流值,经单片机计算后通过D/A转换器(TLV5618)输出模拟信号,再经过V/I
[单片机]
以<font color='red'>AT89S52</font>单片机为控制器的多功能数控电流源系统设计
一种AT89S52的USB下载线设计
1引言 随着单片机技术的不断发展和更新,支持ISP或IAP的单片机芯片日益增加,这类单片机芯片的程序下载采用了下载线的方式。这种串行程序下载方式所用的电平为TTL电平,对单片机接口来说非常安全。单片机生产厂商推荐使用ISP程序下载方式,如AT89S5X芯片支持ISP功能,并用AT89S5X芯片取代了AT89C5X芯片。 另一方面,单片机的程序的写入也从使用烧写器写入演化为使用下载线从计算机中将程序直接写入。下载线就是将计算机中的单片机程序写入单片机芯片的连接线。下载线与计算机的连接接口可分为串口下载线、并口下载线和USB接口的下载线。这种串行程序下载方式所用的电平为TTL电平,对单片机接口和单片机芯片来说更加安全。同时,采用下载
[单片机]
一种<font color='red'>AT89S52</font>的USB下载线设计
基于AT89S52单片机的双轴光伏寻日系统设计
双轴光伏寻日系统可以跟踪太阳的运动,使光伏组件始终正对着太阳接受到更多的太阳辐射,从而提高光伏板的输出功率。该装置以AT89S52 单片机 为核心处理芯片,采用时控与光控相结合的方式,控制直流电机实现寻日跟踪。通过实际安装测试,先伏发电系统的发电量得到显着提高,达到预期目标。 能源是促进经济发展和社会进步的原动力,从工业革命以来,人类所使用的主要能源为石化能源,然而其蕴藏量有限,大量的使用会造成全球环境生态和气候产生很大的变化,而太阳能是一种取之不尽、用之不竭并且无污染的清洁能源,随着人类对能源的使用从常规能源向可再生能源转移,太阳能则成为人类理想的替代能源。而目前的太阳能发电效率普遍都不高,所以如何增加太阳能发电系统的发
[单片机]
基于<font color='red'>AT89S52</font>单片机的双轴光伏寻日系统设计
AT89S52单片机+LCD12864贪吃蛇小游戏(独立按键
单片机源程序如下: //12864并行接口参考程序,控制器st7920 #include reg52.h #include Lcd12864.h #include Key.h #define uchar unsigned char #define uint unsigned int static unsigned long Seed = 1; #define A 48271L #define M 2147483647L #define Q (M / A) #define R (M % A) /************************************ 伪随机数发生器 *******************
[单片机]
基于AT89S52的智能快速充电器控制系统的设计
1.引言 本控制系统是为120w智能快速稳压电源设计的。 该快速充电器是为部队在野战条件下工作而研制的,因此要求其具有体积小、重量轻、智能化程度高、操作简便等优点,同时对电源的可靠性和抗干扰性提出了很高的要求。有稳压供电和充电两种工作方式。稳压供电时输出恒定的24V;处于充电状态时有四种充电方式:常规充电、快速充电、电池浮冲、电池训练,可以为镉镍、氢镍蓄电池充电。 2. 控制系统总体设计要求 根据实际情况,本控制系统要完成以下功能: (1) 能自动识别电池的类型(镍镉电池、镍氢电池、锂电池)。 (2) 有稳压供电和充电两种工作模式。 (3) 采用最高电压Vmax、最高温度Tmax、最长充电时间tmax、电压负增长
[应用]
adc0832与at89s52接口电路及真空度数据采集
真空系统在电力、石油化工、医疗制药、塑料、环保、医疗器械等行业都得到了广泛地应用,随着真空应用领域的不断扩展和深入,对真空技术指标要求亦越来越高,例如,在金刚石镀膜装置中,由于沉积金刚石膜的时间长达几十个小时,真空室真空度的稳定性对成膜质量的好坏有很大的影响,所以保持真空度的稳定将成为一个关键性的技术问题;离心式水泵在抽真空引水过程及水泵抽水过程中,离心式水泵入口的真空度已成为离心式水泵起/停、故障诊断的重要依据。只有将压力传感器获取的模拟信号进行有效的A/D转换成数字量后,才能输入单片机中进行处理,以及与PC通信及后续的波形显示和分析。笔者提出了ADC0832与压力传感器(PTB710)相结合,并利用单片机AT89S52的程序控
[单片机]
adc0832与<font color='red'>at89s52</font>接口电路及真空度数据采集
基于AT89S52嵌入式系统智能机器人设计方案
1 引言 在信息技术的飞速发展,计算机,通讯、消费电子三种技术合一的后PC的时代,虽然计算机和网络已经全面渗透到日常生活的每一个角落,但各种各样的新型嵌入式接入设备已经成为当前的主流产品。任何一个普通人都可能拥有几十种嵌入式技术的电子产品,小到手表、手机、mp3播放器、PDA等微型数字化产品,大到智能家电、网络家电、车载电子设备等都离不开嵌入式技术。作为嵌入式技术的一个重要的研究分支——机器人技术,目前在国内外研究的如火如荼,各种各样的工业机器人和服务机器人已经开始应用到人们的生产和生活当中,使用机器人的优势已经被人们广泛认可,并正在成为我们日常工作和生活的一部分。本文利用AT89S52设计了一种嵌入式智能寻迹机器人,在传感器、
[单片机]
基于<font color='red'>AT89S52</font>嵌入式系统智能机器人设计方案
基于AT89S52单片机直流电机PWM控制系统
1 绪论 1.1直流电机的发展 直流电动机在冶金、矿山、化工、交通、机械、纺织、航空等领域中已经得到广泛的应用。而以往直流电动机的控制只是简单的控制,很难进行调速,不能实现智能化。如今,直流电动机的调速控制已经离不开单片机的支持,单片机应用技术的飞速发展促进了自动控制技术的发展,使人类社会步入了自动化时代,单片机应用技术与其他学科领域交叉融合,促进了学科发展和专业更新,引发了新兴交叉学科与技术的不断涌现。现代科学技术的飞速发展,改变了世界,也改变了人类的生活。由于单片机的体积小、重量轻、功能强、抗干扰能力强、控制灵活、应用方便、价格低廉等特点,计算机性能的不断提高,单片机的应用也更加广泛特别是在各种领域的控制、自动化等方面。
[单片机]
基于<font color='red'>AT89S52</font>单片机直流电机PWM控制系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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