当前位置:首页 > 基于51单片机及DS18B20温度传感器的数字温度计设计
/**************************定时器1初始化函数***************************/ void timer1_init(bit t) {
TMOD=0x10; TH0=0x3c; TL0=0xb0; EA=1;
ET1=1; TR1=t; }
/**************************定时器1中断函数*****************************/ void timer1() interrupt 3 {
TH0=0x3c; TL0=0xb0; }
/*********************调整报警上下限显示选择函数**********************/ void selsct_1(uchar f,uchar k) {
if(f==0) }
void selsct_2(bit f,uchar k)
//消除十位的0显示,及正负温度的显示选择
{ } if(f==1) {
if(k0/10==0) P0=temperature3[0]; else P0=temperature3[2]; }
//若为负温度,若十位为0,百位不显示,否则百位显示‘-’
if(k/100==0) P0=temperature3[0]; else P0=temperature1[k/100];
//若为正温度,百位为0则不显示百位,不为0则显示 //消除百位的0显示,及正负温度的显示选择
num++;
//每进入一次定时器中断num加1(每50ms加1一次)
if(num<5)
{s=1;if(w==1){beer=1;led=1;}else{beer=1;led=1;}}
Else //进入4次中断,定时200ms时若报警标志位w为‘1’则启动报警,不为‘1’不启动
//实现间歇性报警功能 //进入20次中断,定时1s //num归0,重新定开始定时1s
{s=0;if(w==1){beer=0;led=0;}else{beer=1;led=1;}} if(num>20) num=0; s1=0; v1=1;
//重新赋初值,定时50ms
//设定定时器1工作在方式1,最大定时65.53ms //定时器赋初值,定时50ms
//开总中断 //开定时器1中断
// 局部变量t为1启动定时器1,为0关闭定时器1
{
//定时1s时间到时自动关闭报警上下限显示功能 //定时1s时间到时自动关闭报警上下限查看功能
}
{
if(f==0) }
/****************************主显示函数********************************/ void display(uchar t,uchar t_d) {
uchar i; for(i=0;i<4;i++) {
switch(i)
{ case 0:
if(a==1) { } if(a==2) { }
//关第二个数码管 //关第三个数码管 //关第四个数码管 //开第一个数码管
P0=temperature3[4]; //若a=2则在第一个数码管上显示‘L’ wei2=0; wei3=0; wei4=0; break;
//选通第二个数码管
if(a==0){selsct_2(f,t);} //若a=0则在第二个数码管上显示测量温度的十位或‘-’ if(a==1) {
if(s==0) selsct_1(f_max,max);//若s=0则显示第二个数码管,否则不显示 else P0=temperature3[0];
//通过s标志位的变化实现调节上下限报警温度时数码管的
//若a=1则在第二个数码管上显示上限报警温度的百位或‘-’
P0=temperature3[3]; //若a=1则在第一个数码管上显示‘H’
//选通第一个数码管
if(a==0){selsct_1(f,t);} //若a=0则在第一个数码管上显示测量温度的百位或‘-’
//依次从左至右选通数码管显示,实现动态显示 //用于实测温度、上限温度的显示
//若为正温度,百位十位均为0则不显示十位,否则显示十位
{ if((k/100==0)&&(k0/10==0)) P0=temperature3[0];
else P0=temperature1[k0/10]; } if(f==1)
//若为负温度,若十位为0,十位不显示,否则十位显示‘-’
{ if(k0/10==0) P0=temperature3[2];
else P0=temperature1[k0/10];
}
wei1=1; case 1:
闪烁
if(s1==1) selsct_1(f_max,max);//若s1=1则显示第二个数码管(s1标志位用于上下限查看时的 } if(a==2) {
if(s==0) selsct_1(f_min,min); else P0=temperature3[0]; if(s1==1) selsct_1(f_min,min); }
//选通第三个数码管
wei1=0; wei3=0; wei4=0; wei2=1; break;
if(a==0){P0=temperature2[t];}//若a=0则在第三个数码管上显示测量温度的个位 if(a==1) {
if(s==0) selsct_2(f_max,max);//若s=0则显示第三个数码管,否则不显示 } if(a==2) {
if(s==0) selsct_2(f_min,min);
else P0=temperature3[0]; if(s1==1) selsct_2(f_min,min);
//若a=2则在第三个数码管上显示下限报警温度的十位或‘-’
else P0=temperature3[0];
if(s1==1) selsct_2(f_max,max);//若s1=1则显示第三个数码管
//若a=1则在第三个数码管上显示上限报警温度的十位或‘-’
//若a=2则在第二个数码管上显示下限报警温度的百位或‘-’
显示)
case 2:
}
wei1=0; wei2=0; wei4=0; wei3=1; break;
//选通第四个数码管
//若a=1则在第四个数码管上显示上限报警温度的个位
if(a==0){P0=temperature1[t_d];}//若a=0则在第四个数码管上显示测量温度的小数位 if(a==1) {
if(s==0) P0=temperature1[max];//若s=0则显示第四个数码管,否则不显示 } if(a==2) {
if(s==0) P0=temperature1[min];
else P0=temperature3[0];
if(s1==1) P0=temperature1[min];
wei3=0; wei4=1; break;
//若a=2则在第四个数码管上显示下限报警温度的个位
else P0=temperature3[0];
if(s1==1) P0=temperature1[max];//若s1=1则显示第四个数码管
case 3:
}
wei1=0; wei2=0;
}
}
display_delay(3); //每个数码管显示3ms左右 }
/****************************开机显示函数******************************/ void display1(uint z) {
uchar i,j; bit f=0; for(i=0;i for(j=0;j<4;j++) { switch(j) } { case 0:P0=temperature3[2];//第一个数码管显示 wei2=0; wei3=0; wei4=0; wei1=1; break; case 1:P0=temperature3[2];//第二个数码管显示 wei1=0; wei3=0; wei4=0; wei2=1; break; case 2:P0=temperature3[2];//第三个数码管显示 wei1=0; wei2=0; wei4=0; wei3=1; break; case 3:P0=temperature3[2];//第四个数码管显示 wei1=0; wei2=0; wei3=0; wei4=1; break; //依次从左至右显示‘-’ //‘z’是显示遍数的设定 //用于开机动画的显示 } display_delay(200); //每个数码管显示200ms左右 }
共分享92篇相关文档