为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

电子温度计

2010-06-23 9页 doc 63KB 45阅读

用户头像

is_840623

暂无简介

举报
电子温度计 电子温度闹钟 ———吴伟 a.功能简介: 该电子温度计是由51单片机控制实现温度测量的,其测温范围:-55~125 ,使用的温度传感器位DS18b20。并提供低温高温报警,报警温度可设定,其设定方法由4个按键控制,高温低温的报警设置可由自己任意设定,只要不超过其测量范围。当所测温度达到其设置的警界温度时蜂鸣器会一直响。 本温度计采用五位数码管显示其测量温度,第一位显示正负温度,如果是正温度,则显示一个“笑脸”,负温显示...
电子温度计
电子温度闹钟 ———吴伟 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=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; } }
/
本文档为【电子温度计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索