这个也是大一下学期做的,也是院里的那个比赛,那时我上交了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;
}
}
用户815431 2014-1-22 16:27
用户362714 2011-7-27 13:16