标题:
51单片机实现电子温度计
[打印本页]
作者:
topzho
时间:
2019-6-30 12:08
标题:
51单片机实现电子温度计
功能:用单片机实现电子温度计,测温范围:-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)
2019-6-30 12:07 上传
点击文件名下载附件
下载积分: 黑币 -5
5a6b387e6eb881d2978f9b1febb2d45020100307060022.rar
(54.36 KB, 下载次数: 34)
2019-6-30 12:07 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:weixin_34194087
来源:CSDN
原文:
https://blog.csdn.net/weixin_34194087/article/details/87296694
版权声明:本文为博主原创文章,转载请附上博文链接!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1