原创 电子温度计

2011-3-11 14:54 3090 9 11 分类: MCU/ 嵌入式

        这个也是大一下学期做的,也是院里的那个比赛,那时我上交了2个作品,呵呵。。。

       当时大一刚入门,程序很多是参照网上人写的,然后我根据我的硬件做了很多修改和

补充,程序注释我也写了很多,只是那时候随便写的文档,没有贴图,也没有照片。

以后得吸取教训,做了一个东西一定要认认真真写文档,对于自己有很大帮助!

 

a.功能简介:

该电子温度计是由51单片机控制实现温度测量的,其测温范围:-55~125  ,使用的温度传感器位DS18b20。并提供低温高温报警,报警温度可设定,其设定方法由4个按键控制,高温低温的报警设置可由自己任意设定,只要不超过其测量范围。当所测温度达到其设置的警界温度时蜂鸣器会一直响。

本温度计采用五位数码管显示其测量温度,第一位显示正负温度,如果是正温度,则显示一个“笑脸”,负温显示的是负号“—”,中间三位显示的是温度值,有一位小数,最后一位数码管是显示的温度负号“℃”。其有关按钮说明如下:

按钮一(与P3^4相连),按一次进入报警设定,第二次推出设定              按钮二(与P3^5相连),设定是菜单切换

按钮三(与P3^6相连),减设定

按钮四(与P3^7相连),加设定

在使用该温度计时,想要设定高温或低温,必须先启动这两个开关,当开关打开时,第二位数码管显示F,当开关关闭时显示P.当设置高温时第一位数码管显示显示H(high),设置低温时第一位数码管显示L(low).

b.硬件接法:

该作品的全部控制单元是由51单片机完成的,一共用了五位数码管,全部用来显示温度,其控制位从左到右为P0^3,P0^4,P0^5,P0^6,P0^7.另采用四个按键辅助软件进行调节,其控制位分别为P3^4,P3^5,P3^6,P3^7.(具体功能见程序清单。

c.作品有待改进之处:

可以经适当改装,将温度计单独用线引出来,便于各种需要控制温度的场合,比如空调的温度控制,锅炉的控制等.

d.程序清单:

#include "reg52.h"

#include "absacc.h"

unsigned char code tab[]={0xC0,0xF9,0xA4,0xB0,0x99,

 

                    0x92,0x82,0xf8,0x80,0x90,};/*0~9的数码管段码*/    //共阳数码管

 

sbit P0_0=P0^0;

sbit DQ=P1^0; //c51与DS18B20通信口

sbit P27=P2^7; //小数点

sbit RED=0x97;   //高温报警灯

sbit GREEN=0x96;  //低温报警灯

sbit SET=P3^4;   //以下按钮设置

sbit NEXT=P3^5;

sbit REDUCE=P3^6;

sbit ADD=P3^7;

unsigned char tempL=0; //温度低八位

unsigned char tempH=0;  //温度高八位

float temperature;  //显示温度值

float temperatureH=35,temperatureL=0;  //报警温度

int tH=1,tL=1;//报警状态,1为关闭

int m,k=1,l,keyon,keytype,out=0;//设置报警温度时使用的中间变量,其中k就为实际测得的温度

void delay(unsigned int time)

{

  unsigned int n;

  n=0;

  while(n<time) n++;

  return;

}

void display(float k)  //显示温度

{ if(k>=0)  //正温度显示

  {

   

    P0=0xf7;

    P2=0xd5;

    delay(250);

    P2=0xff;

  }

  else   //负温度显示负号

  {

    k=-k;

    P0=0xf7;

    P2=0xbf;

    delay(250);

    P2=0xff;

  }

 

  P0=0xef;    //温度十位显示

  P2=tab[(int)(k/10)];

  delay(250);

  P2=0xff;

  P0=0xdf;   //温度个位显示

  P2=tab[((int)k)%10];

  P27=0;

  delay(250);

  P2=0xff;

  P0=0xbf;     //温度一位小数显示

  P2=tab[((int)(k*10))%10];

  delay(250);

  P2=0xff;

  P0=0x7f;

  P2=0x70;

  delay(250);

  P2=0xff;

}

Init_DS18B20(void)//温度计复位

{

  unsigned char x=0;

  DQ=1;

  delay(8);

  DQ=0;

  delay(85);

  DQ=1;

  delay(14);

  x=DQ;

  delay(20);

}

ReadOneChar(void)//读一个字节

{

  unsigned char i=0;

  unsigned  char dat=0;

  for (i=8;i>0;i--)

  {

    DQ=1;

    delay(1);

    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;

  }

  delay(4);

}

ReadTemperature(void)//读取温度

{

  char ctempL,ctempH;

  Init_DS18B20();

  WriteOneChar(0xcc);

  WriteOneChar(0x44);

  delay(125);

  Init_DS18B20();

  WriteOneChar(0xcc);

  WriteOneChar(0xbe);

  tempL=ReadOneChar();     

  tempH=ReadOneChar();

  if(tempH<0xf8) //温度是否小于零

    temperature=((tempH*256)+tempL)* 0.0625;//大于零

  else  //温度小于0

    {

   ctempL=tempL;

   ctempH=tempH;  

   temperature=(((~ctempH)*256)+(~ctempL)+1)* 0.0625;

   temperature=-temperature;

}

 

}

///////////////////////////报警设置显示/////////////////////////

void Display2()

{ ///////////////////高温报警显示////////////////////

  if(m==0||m==1)

   {

     P0=0xf7;//第一位数码管亮

     P2=0x89;//显示H

     delay(70);

     P2=0xff;

     if(m==0&&k==-1) delay(70);

     else

    {

       if(tH==1)//高温报警关闭

      {

               P0=0xef;  //第二位数码管亮 

               P2=0x8c;//显示P

               delay(70);

               P2=0xff;

   }

    else //高温报警开启

      {

               P0=0xef;  //第二位数码管亮  

               P2=0x8e;//数码管显示F

               delay(70);

               P2=0xff;

      }

    }

  if(m==1&&k==-1) delay(100);

     else

    {

       if(temperatureH>=0)//假设所设置高温大于0

      {

               P0=0xdf;    //第三位数码管亮

               P2=tab[(int)(temperatureH/10)];//所设置的高温的十位数

               delay(70);

               P2=0xff;

               P0=0xbf;    //第四位数码管亮

               P2=tab[(int)(temperatureH)%10];//所设置的高温的个位数

               delay(70);

               P2=0xff;

    }

    else //假设所设置的温度小于0

      {

               P0=0xdf;  //第三位数码管亮 

               P2=0xbf;   //////显示负号

               delay(70);

               P2=0xff;

               P0=0xbf; //第四位数码管亮  

               P2=tab[(int)(-temperatureH)%10];//显示的就是你所设置的最高的负温度,但最高负温度不能小于负10度

               delay(70);

               P2=0xff;

      }

    }

    }

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

  ///////////////////低温报警显示//////////////////

  else if(m==2||m==3)

   {

     P0=0xf7;//第一位数码管亮

     P2=0xc7;//显示L

     delay(70);

     P2=0xff;

     if(m==2&&k==-1) delay(70);

     else

    {

       if(tL==1)//低温报警关闭

      {

               P0=0xef;  //第二位数码管亮 

               P2=0x8c;//显示P

               delay(70);

               P2=0xff;

   }

    else //低温报警开启

      {

               P0=0xef;//第二位数码管亮   

               P2=0x8e;//数码管显示F

               delay(70);

               P2=0xff;

      }

    }

  if(m==3&&k==-1) delay(100);

     else

    {

       if(temperatureL>=0)//假设所设置低温大于0

      {

               P0=0xdf; //第三位数码管亮   

               P2=tab[(int)(temperatureL/10)];//所设置的低温的十位数

               delay(70);

               P2=0xff;

               P0=0xbf;   

               P2=tab[(int)(temperatureL)%10];//所设置的低温的个位数

               delay(70);

               P2=0xff;

    }

    else //假设所设置最低的温度小于0

      {

               P0=0xdf;  //第三位数码管亮 

               P2=0x40;    ////显示负号

               delay(70);

               P2=0xff;

               P0=0xbf;    //第四位数码管亮

               P2=tab[(int)(-temperatureL)%10];//显示的就是你所设置的最低的负温度,但最低的负温度不能小于负10度

               delay(70);

               P2=0xff;

      }

   

    }

   }

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

  if(l==200){k=-k;l=0;}//显示一下l就加1,加到200清零,并且显示负温

  l++;

}

/////////////////////////////报警设置显示结束///////////////////////////////////

 

////////////////////////////////报警设置/////////////////////////////////////////

void seting()

{

   if(SET==1&&NEXT==1&&REDUCE==1&&ADD==1);   //无键盘按下

   else       /////有键盘按下时

    {

   keyon=1;//只要有按键按下,则keyon=1,以下是每个按键的功能

   if(SET==0)keytype=0;

   if(NEXT==0)keytype=1;

   if(REDUCE==0)keytype=2;

   if(ADD==0)keytype=3;

}

   if(keyon==1&&SET==1&&NEXT==1&&REDUCE==1&&ADD==1)   //键盘松开后判断键盘状态

    {

   if(keytype==1)////////////////菜单下翻,P3_5键的功能,有4种模式

     {

    if(m>=3)m=0;

       else m++;

   }

   if(keytype==2) ////////////////加操作,P3_6键的功能

     {

    if(m==0)tH=-tH;//高位报警开关取反

    if(m==1)

      {

     if(temperatureH>(temperatureL+1)) temperatureH--;//设置的最高温度比最低温度大,将所设置的最高温度减一

     else temperatureH=99;//否则的话,将设置的最高温度设位99

   }

    if(m==2)tL=-tL;//低位报警开关取反

    if(m==3)

      {

     if(temperatureL>-9) temperatureL--;//设置的最低温度比负9度,将所设置的最低温度减一

     else temperatureL=(temperatureH-1);//否则的话,将设置的最高温度减一赋给设置的最低温度

   }

  }

   if(keytype==3)   ////////////////减操作

     {

    if(m==0)tH=-tH;//高位报警开关取反

    if(m==1)

      {

     if(temperatureH<99) temperatureH++;//设置的最高温度比99度小,将所设置的最高温度加一

     else temperatureH=(temperatureL+1);//否则的话,将设置的最低温度加一赋给设置的最高温度

   }

    if(m==2)tL=-tL;//低位报警开关取反

    if(m==3)

      {

     if(temperatureL<(temperatureH-1)) temperatureL++;//假如设置的最低温度比设置的最高温度减一小,将设置的最低温度加一

     else temperatureL=-9;//否则的话,将设置的最低温度设为负9度

   }

  }

   if(keytype==0)     ///////////跳出温度设置,P3_4键的功能

     {

       keyon=0;

       keytype=4;

    out=1; //跳出温度设置

  }

   keyon=0;

   keytype=4;

}

}

/////////////////////////////报警设置结束/////////////////////////////////////////

void main()    

{

  P3=0XFF;

  while(1)

  {

    ReadTemperature();

   display(temperature);

if(SET==0) /////////////////////////进入报警温度设定,P3_4键按下

   {

     out=0;//进入温度设置

     delay(300);

  while(SET==0);

  m=0;

  l=0;

  keyon=0;

  keytype=4;

  while(1)

    {

      Display2();

   seting();

   if (out==1)break;

    }

  delay(200);

  while(SET==0);

   }

if(tH==-1&&temperature>=temperatureH) {P0_0=0; delay(300);} //////满足条件是开启高温报警

else P0_0=1;

if(tL==-1&&temperature<=temperatureL) {P0_0=0;delay(300);}//////满足条件时开启低温报警

else P0_0=1;

  }

}

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户815431 2014-1-22 16:27

很好,学习了。

用户362714 2011-7-27 13:16

做的挺好的
相关推荐阅读
用户253961 2012-03-03 11:54
Matlab DIP(瓦)ch3小笔记
         对应上篇文章Matlab DIP(瓦) ch3中用到的一些小知识点,自己联系时写下的小笔记。 matlab版本2009a,matlab7.8的。 f = imr...
用户253961 2012-03-03 11:51
Matlab DIP(瓦) ch3练习
      Matlab是一种图像视频处理实现的好工具,因为matlab是基于数组操作的,而一副图像就是一个数组。因此搞DIP或者CV的是一种必需掌握的工具。     为了学会使用matlab...
用户253961 2012-03-01 18:46
opencv源码解析之滤波前言
     对图像的滤波和平滑是出来数字图像处理和计算机视觉非常重要的一个步骤,那么什么是滤波呢?滤波用编程语言到底是怎么实现的呢?效果怎么样?本人打算学习opencv有关滤波的源码,进一步加强图像...
用户253961 2011-09-24 23:14
怎样在MFC中捕获摄像头并显示出来
Visual_C++编程实现摄像头视频捕捉.pdf 说实话,要用MFC显示摄像头视频,对于入门者来说真是件难事情。网上这方面的文档简直就是太少了。倒是有很多源代码,但是对于MFC不熟悉的同学有源代码...
用户253961 2011-05-31 16:53
Hdb3之FPGA实现
  (转载请写明出处,谢谢!) 一:前言     这2天在帮一同学弄用cpld实现hdb3的编码和解码,要用vhdl,可惜我只是会一点verilog,所以我开始就用verilog来写,写出来后看点v...
用户253961 2011-05-30 21:53
基于FPGA的bmp图片显示
好久没有更新博客了,最近去了趟厦门参加考研复试,在深圳实习了1个月,然后赶回来弄毕设,一时间没更新博客。下面把我毕业设计的论文放上来,毕设题目是《基于大规模fpga的bmp图库管理》,这个题目名字...
EE直播间
更多
我要评论
2
9
关闭 站长推荐上一条 /3 下一条