功能:用单片机实现电子温度计,测温范围:-55~125 并提供低温高温报警,报警温度可设定
元器件:89s52单片机,DS18B20,12M晶振,10us电容,四联共阴数码管各一个.9015三极管两个,红绿发光二极管各一个,30p电容两个,
按钮四个.电阻若干(见原理图)
供电:5V.(可采用7805实现更高电压供电)
按钮说明:按钮一(与p1.0相连),按一次进入报警设定,第二次推出设定
按钮二(与p1.1相连),设定是菜单切换
按钮三(与p1.2相连),减设定
按钮四(与p1.3相连),加设定
功用:经适当改装,可用于各种需要控制温度的场合,比如空调的温度控制,锅炉的控制等...
---------------------
单片机源程序如下:
- #include "reg52.h"
- #include "absacc.h"
- unsigned char code tab[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X40}; //共阴 (cc)
- sbit DQ=0xb7; //c51与DS18B20通信口
- sbit P07=0x87; //小数点
- sbit RED=0x97; //高温报警灯
- sbit GREEN=0x96; //低温报警灯
- sbit SET=0x90; //以下按钮设置
- sbit NEXT=0x91;
- sbit REDUCE=0x92;
- sbit ADD=0x93;
- 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;//设置报警温度时使用的中间变量
- void delay(unsigned int time)
- {
- unsigned int n;
- n=0;
- while(n<time) n++;
- return;
- }
- void display(float k) //显示温度
- {
- if(k>=0) //正温度显示
- {
- P2=0xf7;
- P0=tab[(int)(k/100)];
- delay(260);
- P0=0x00;
- }
- else //负温度显示负号
- {
- k=-k;
- P2=0xf7;
- P0=0x40;
- delay(260);
- P0=0x00;
- }
- P2=0xfb; //温度十位显示 有错误 少了个%100
- P0=tab[(((int)k)%100)/10];
- delay(260);
- P0=0x00;
- P2=0xfd; //温度个位显示
- P0=tab[((int)k)%10];
- P07=1;
- delay(260);
- P0=0x00;
- P2=0xfe; //温度一位小数显示
- P0=tab[((int)(k*10))%10];
- delay(260);
- P0=0x00;
- }
- 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);
- }
- ConversionTemperature()
- {
- Init_DS18B20();
- WriteOneChar(0xcc);
- WriteOneChar(0x44);
- delay(20);
- }
- ReadTemperature(void)
- {
- char ctempL,ctempH;
- Init_DS18B20();
- WriteOneChar(0xcc);
- WriteOneChar(0xbe);
- tempL=ReadOneChar();
- tempH=ReadOneChar();
- if(tempH<0xf8) //温度是否小于零
- temperature=((tempH*256)+tempL)* 0.0625;//大于零
- else
- {
- ctempL=tempL;
- ctempH=tempH;
- temperature=(((~ctempH)*256)+(~ctempL)+1)* 0.0625;
- temperature=-temperature;
- }
- //delay(200);
- //return(temperature);
- }
- ///////////////////////////报警设置显示/////////////////////////
- void Display2()
- { ///////////////////高温报警显示////////////////////
- if(m==0||m==1)
- {
- P2=0xf7;
- P0=0x76;
- delay(70);
- P0=0x00;
- if(m==0&&k==-1) delay(70);
- else
- {
- if(tH==1)
- {
- P2=0xfb;
- P0=0x71;
- delay(70);
- P0=0x00;
- }
- else
- {
- P2=0xfb;
- P0=0x3f;
- delay(70);
- P0=0x00;
- }
- }
- if(m==1&&k==-1) delay(100);
- else
- {
- if(temperatureH>=0)
- {
- P2=0xfd;
- P0=tab[(int)(temperatureH/10)];
- delay(70);
- P0=0x00;
- P2=0xfe;
- P0=tab[(int)(temperatureH)%10];
- delay(70);
- P0=0x00;
- }
- else
- {
- P2=0xfd;
- P0=0x40; //////显示负号
- delay(70);
- P0=0x00;
- P2=0xfe;
- P0=tab[(int)(-temperatureH)%10];
- delay(70);
- P0=0x00;
- }
- }
- }
- //////////////////////////////////////////////////
- ///////////////////低温报警显示//////////////////
- else if(m==2||m==3)
- {
- P2=0xf7;
- P0=0x38;
- delay(70);
- P0=0x00;
- if(m==2&&k==-1) delay(70);
- else
- {
- if(tL==1)
- {
- P2=0xfb;
- P0=0x71;
- delay(70);
- P0=0x00;
- }
- else
- {
- P2=0xfb;
- P0=0x3f;
- delay(70);
- P0=0x00;
- }
- }
- if(m==3&&k==-1) delay(100);
- else
- {
- if(temperatureL>=0)
- {
- P2=0xfd;
- P0=tab[(int)(temperatureL/10)];
- delay(70);
- P0=0x00;
- P2=0xfe;
- P0=tab[(int)(temperatureL)%10];
- delay(70);
- P0=0x00;
- }
- else
- {
- P2=0xfd;
- P0=0x40; ////显示负号
- delay(70);
- P0=0x00;
- P2=0xfe;
- P0=tab[(int)(-temperatureL)%10];
- delay(70);
- P0=0x00;
- }
-
- }
- }
- ///////////////////////////////////////////////////////
- if(l==200){k=-k;l=0;}
- l++;
- }
- /////////////////////////////报警设置显示结束///////////////////////////////////
- ////////////////////////////////报警设置/////////////////////////////////////////
- void seting()
- {
- if(SET==1&&NEXT==1&&REDUCE==1&&ADD==1); //无键盘按下
- else /////有键盘按下时
- {
- 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)////////////////菜单下翻
- {
- if(m>=3)m=0;
- else m++;
- }
- if(keytype==2) ////////////////加操作
- {
- if(m==0)tH=-tH;
- if(m==1)
- {
- if(temperatureH>(temperatureL+1)) temperatureH--;
- else temperatureH=99;
- }
- if(m==2)tL=-tL;
- if(m==3)
- {
- if(temperatureL>-9) temperatureL--;
- else temperatureL=(temperatureH-1);
- }
- }
- if(keytype==3) ////////////////减操作
- {
- if(m==0)tH=-tH;
- if(m==1)
- {
- if(temperatureH<99) temperatureH++;
- else temperatureH=(temperatureL+1);
- }
- if(m==2)tL=-tL;
- if(m==3)
- {
- if(temperatureL<(temperatureH-1)) temperatureL++;
- else temperatureL=-9;
- }
- }
- if(keytype==0) ///////////跳出温度设置
- {
- keyon=0;
- keytype=4;
- out=1;
- }
- keyon=0;
- keytype=4;
- }
- }
- /////////////////////////////报警设置结束/////////////////////////////////////////
- void main()
- {
- P1=0XFF;
- while(1)
- {
- ConversionTemperature();//温度转换
- display(temperature);//显示温度
- if(SET==0) /////////////////////////进入报警温度设定
- {
- 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)RED=1;
- else if(tH==-1&&temperature>=temperatureH) RED=0; //////满足条件是开启高温报警
- else if(temperature<(temperatureH-0.2))RED=1;
- if(tL==1)GREEN=1;
- if(tL==-1&&temperature<=temperatureL) GREEN=0;//////满足条件时开启低温报警
- else if(temperature>(temperatureL+0.2)) GREEN=1;
- ReadTemperature();//读取温度
- display(temperature);//显示温度
- }
- }
复制代码
所有资料51hei提供下载:
ab2989ca9f6b9ceb6de043c63cd7cc5320100307060217.rar
(2.05 KB, 下载次数: 39)
5a6b387e6eb881d2978f9b1febb2d45020100307060022.rar
(54.36 KB, 下载次数: 34)
作者:weixin_34194087
来源:CSDN
原文:https://blog.csdn.net/weixin_34194087/article/details/87296694
版权声明:本文为博主原创文章,转载请附上博文链接!
|