求助高手帮忙修改一下,单片机温度上下线为25度和30度
时间:10-02
整理:3721RD
点击:
//部分代码修改自网络 18B20数码管显示温度
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS1=P3^4;
sbit DS2=P3^5;
sbit DS3=P3^6;
sbit ledlk=P1^0;
sbit smglk=P1^1;
sbit smgbitlk=P1^2;
//****************************动态扫描多个管脚数据***************************************
#define DatCount 3 //管脚个数
uint TMDAT[DatCount] = {1,2,3}; //各个管脚的标志数据
uint TMP[DatCount]; //读取的所有测试点的温度
uchar SIGN[DatCount]; //结果是否为负温,“+”为正温,“-”负温。
uint set1820_ss=3;
uint set1820_sg=0;
uint set1820_xs=2;
uint temp;
uchar a,flag;
void delay(uint ms)
{
uint i,j;
for (j=0;j<ms;j++)
for (i=0;i<120;i++);
}
void delayus(uint us)
{
uint i,j;
for (j=0;j<us;j++)
for (i=0;i<12;i++);
}
void showsmg(uchar smg,uchar value)
{
uchar code tablesmg[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar code table[]={ 0x3f , 0x06 ,0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71 , 0x00,0x80};
smglk=1;
P2=tablesmg[smg];
smglk=0;
smgbitlk=1;
P2=table[value];
smgbitlk=0;
delay(3);
}
void dsreset1(uint flag)
{
switch (flag) {
case 1:
{
DS1=0;
delayus(10);
DS1=1;
delayus(10);
};
case 2:
{
DS2=0;
delayus(10);
DS2=1;
delayus(10);
};
case 3:
{
DS3=0;
delayus(10);
DS3=1;
delayus(10);
};
//default:
}
}
bit tmpreadbit1(uint flag)
{
// uint i;
bit dat;
switch (flag) {
case 1:
{
DS1=0;
DS1=1;
dat=DS1;
delayus(1);
return (dat);
};
case 2:
{
DS2=0;
DS2=1;
dat=DS2;
delayus(1);
return (dat);
};
case 3:
{
DS3=0;
DS3=1;
dat=DS3;
delayus(1);
return (dat);
};
//default:
}
}
uchar tmpread1(uint flag)
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit1(flag);
dat=(j<<7)|(dat>>1);
}
return(dat);
}
void tmpwritebyte1(uchar dat,uint flag)
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
switch (flag) {
case 1:
{
if(testb)
{
DS1=0;
i++;i++;
DS1=1;
i=8;while(i>0)i--;
}
else
{
DS1=0;
i=8;while(i>0)i--;
DS1=1;
i++;
//i++;
}
};
case 2:
{
if(testb)
{
DS2=0;
i++;i++;
DS2=1;
i=8;while(i>0)i--;
}
else
{
DS2=0;
i=8;while(i>0)i--;
DS2=1;
i++;
//i++;
}
};
case 3:
{
if(testb)
{
DS3=0;
i++;i++;
DS3=1;
i=8;while(i>0)i--;
}
else
{
DS3=0;
i=8;while(i>0)i--;
DS3=1;
i++;
//i++;
}
};
//default:
}
}
}
void tmpchange1(void)
{
uchar i;
for(i=0;i<DatCount;i++)
{
dsreset1(TMDAT);
delay(1);
tmpwritebyte1(0xcc,TMDAT);
tmpwritebyte1(0x44,TMDAT);
}
}
void tmp1()
{
float tt;
uchar a,b;
uchar i;
for(i=0;i<DatCount;i++)
{
dsreset1(TMDAT);
delay(1);
tmpwritebyte1(0xcc,TMDAT);
tmpwritebyte1(0xbe,TMDAT);
a=tmpread1(TMDAT);
b=tmpread1(TMDAT);
if((b & 0xF8) == 0xF8)
{
SIGN=0x2D;
TMP=b;
TMP<<=8;
TMP=TMP|a;
TMP=~TMP+1;
tt=TMP*0.0625;
TMP=tt*10+0.5;
}
else if((b | 0x07) == 0x07)
{
SIGN=0x2B;
TMP=b;
TMP<<=8;
TMP=TMP|a;
tt=TMP*0.0625;
TMP=tt*10+0.5;
}
}
}
/********
void readrom1()
{
uchar sn1,sn2;
dsreset1();
delay(1);
tmpwritebyte1(0x33);
sn1=tmpread1();
sn2=tmpread1();
}
void sx()
{
if(temp/100>set1820_ss)
{
ledlk=1;
P2=0xf0;
//smglk=1;
// P2=0xff;
//ledlk=0;
}
else if ((temp/100==set1820_ss)&&(temp%100/10>set1820_sg))
{
ledlk=1;
P2=0xf0;
//smglk=1;
}
else if ((temp/100==set1820_ss)&&(temp%100/10==set1820_sg)&&(temp%100%10>=set1820_xs))
{
ledlk=1;
P2=0xf0;
//smglk=1;
}
else
{
P2=0xff;
//beep=1;
ledlk=0;
//smglk=0;
}
}
*************************/
void main()
{
uint p;
uchar j;
// uchar str[18] ;
ledlk=0;
TMOD=0x20;//设定定时器为方式2 可自动再装入的8位定时器
TH1=0xfd;//装入初值
TL1=0xfd;//装入初值
TR1=1;//设定定时器开始工作
SM0=0;//设定串口工作方式1 10位异步收发器 8位数据
SM1=1;//设定串口工作方式1 10位异步收发器 8位数据
REN=1;//允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。
EA=1;//开始总中断
ES=1;//串行口中断允许位;(开启)
PCON=0x80;//设定串行口波特率
// ledlk=1;
smgbitlk=0;
smglk=0;
while(1)
{
for (j=0;j<DatCount;j++)
{
tmpchange1();
tmp1();
for(p=0;p<100;p++)
{
showsmg(0,TMP[j]/100);
showsmg(1,TMP[j]%100/10);
showsmg(1,17);//显示小数点
showsmg(2,TMP[j]%100%10);
showsmg(5,j+1);
//sx();
}
}
}
}
void serial() interrupt 4
{
uchar RMgs,j,k,str[6*DatCount];
RMgs = SBUF;
if (RMgs == 0x31)
{
for(k=0;k<DatCount;k++)
{
str[k*6+0]=k+1;
str[k*6+1]=SIGN[k];
str[k*6+2]=TMP[k]/1000;
str[k*6+3]=TMP[k]%1000/100;
str[k*6+4]=TMP[k]%1000%100/10;
str[k*6+5]=TMP[k]%1000%100%10;
}
ES=0;
for (j=0;j<6*DatCount;j++)
{
SBUF=str[j];
while(!TI);
TI=0;
}
ES=1;
}
RI=0;
}
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS1=P3^4;
sbit DS2=P3^5;
sbit DS3=P3^6;
sbit ledlk=P1^0;
sbit smglk=P1^1;
sbit smgbitlk=P1^2;
//****************************动态扫描多个管脚数据***************************************
#define DatCount 3 //管脚个数
uint TMDAT[DatCount] = {1,2,3}; //各个管脚的标志数据
uint TMP[DatCount]; //读取的所有测试点的温度
uchar SIGN[DatCount]; //结果是否为负温,“+”为正温,“-”负温。
uint set1820_ss=3;
uint set1820_sg=0;
uint set1820_xs=2;
uint temp;
uchar a,flag;
void delay(uint ms)
{
uint i,j;
for (j=0;j<ms;j++)
for (i=0;i<120;i++);
}
void delayus(uint us)
{
uint i,j;
for (j=0;j<us;j++)
for (i=0;i<12;i++);
}
void showsmg(uchar smg,uchar value)
{
uchar code tablesmg[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar code table[]={ 0x3f , 0x06 ,0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71 , 0x00,0x80};
smglk=1;
P2=tablesmg[smg];
smglk=0;
smgbitlk=1;
P2=table[value];
smgbitlk=0;
delay(3);
}
void dsreset1(uint flag)
{
switch (flag) {
case 1:
{
DS1=0;
delayus(10);
DS1=1;
delayus(10);
};
case 2:
{
DS2=0;
delayus(10);
DS2=1;
delayus(10);
};
case 3:
{
DS3=0;
delayus(10);
DS3=1;
delayus(10);
};
//default:
}
}
bit tmpreadbit1(uint flag)
{
// uint i;
bit dat;
switch (flag) {
case 1:
{
DS1=0;
DS1=1;
dat=DS1;
delayus(1);
return (dat);
};
case 2:
{
DS2=0;
DS2=1;
dat=DS2;
delayus(1);
return (dat);
};
case 3:
{
DS3=0;
DS3=1;
dat=DS3;
delayus(1);
return (dat);
};
//default:
}
}
uchar tmpread1(uint flag)
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit1(flag);
dat=(j<<7)|(dat>>1);
}
return(dat);
}
void tmpwritebyte1(uchar dat,uint flag)
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
switch (flag) {
case 1:
{
if(testb)
{
DS1=0;
i++;i++;
DS1=1;
i=8;while(i>0)i--;
}
else
{
DS1=0;
i=8;while(i>0)i--;
DS1=1;
i++;
//i++;
}
};
case 2:
{
if(testb)
{
DS2=0;
i++;i++;
DS2=1;
i=8;while(i>0)i--;
}
else
{
DS2=0;
i=8;while(i>0)i--;
DS2=1;
i++;
//i++;
}
};
case 3:
{
if(testb)
{
DS3=0;
i++;i++;
DS3=1;
i=8;while(i>0)i--;
}
else
{
DS3=0;
i=8;while(i>0)i--;
DS3=1;
i++;
//i++;
}
};
//default:
}
}
}
void tmpchange1(void)
{
uchar i;
for(i=0;i<DatCount;i++)
{
dsreset1(TMDAT);
delay(1);
tmpwritebyte1(0xcc,TMDAT);
tmpwritebyte1(0x44,TMDAT);
}
}
void tmp1()
{
float tt;
uchar a,b;
uchar i;
for(i=0;i<DatCount;i++)
{
dsreset1(TMDAT);
delay(1);
tmpwritebyte1(0xcc,TMDAT);
tmpwritebyte1(0xbe,TMDAT);
a=tmpread1(TMDAT);
b=tmpread1(TMDAT);
if((b & 0xF8) == 0xF8)
{
SIGN=0x2D;
TMP=b;
TMP<<=8;
TMP=TMP|a;
TMP=~TMP+1;
tt=TMP*0.0625;
TMP=tt*10+0.5;
}
else if((b | 0x07) == 0x07)
{
SIGN=0x2B;
TMP=b;
TMP<<=8;
TMP=TMP|a;
tt=TMP*0.0625;
TMP=tt*10+0.5;
}
}
}
/********
void readrom1()
{
uchar sn1,sn2;
dsreset1();
delay(1);
tmpwritebyte1(0x33);
sn1=tmpread1();
sn2=tmpread1();
}
void sx()
{
if(temp/100>set1820_ss)
{
ledlk=1;
P2=0xf0;
//smglk=1;
// P2=0xff;
//ledlk=0;
}
else if ((temp/100==set1820_ss)&&(temp%100/10>set1820_sg))
{
ledlk=1;
P2=0xf0;
//smglk=1;
}
else if ((temp/100==set1820_ss)&&(temp%100/10==set1820_sg)&&(temp%100%10>=set1820_xs))
{
ledlk=1;
P2=0xf0;
//smglk=1;
}
else
{
P2=0xff;
//beep=1;
ledlk=0;
//smglk=0;
}
}
*************************/
void main()
{
uint p;
uchar j;
// uchar str[18] ;
ledlk=0;
TMOD=0x20;//设定定时器为方式2 可自动再装入的8位定时器
TH1=0xfd;//装入初值
TL1=0xfd;//装入初值
TR1=1;//设定定时器开始工作
SM0=0;//设定串口工作方式1 10位异步收发器 8位数据
SM1=1;//设定串口工作方式1 10位异步收发器 8位数据
REN=1;//允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。
EA=1;//开始总中断
ES=1;//串行口中断允许位;(开启)
PCON=0x80;//设定串行口波特率
// ledlk=1;
smgbitlk=0;
smglk=0;
while(1)
{
for (j=0;j<DatCount;j++)
{
tmpchange1();
tmp1();
for(p=0;p<100;p++)
{
showsmg(0,TMP[j]/100);
showsmg(1,TMP[j]%100/10);
showsmg(1,17);//显示小数点
showsmg(2,TMP[j]%100%10);
showsmg(5,j+1);
//sx();
}
}
}
}
void serial() interrupt 4
{
uchar RMgs,j,k,str[6*DatCount];
RMgs = SBUF;
if (RMgs == 0x31)
{
for(k=0;k<DatCount;k++)
{
str[k*6+0]=k+1;
str[k*6+1]=SIGN[k];
str[k*6+2]=TMP[k]/1000;
str[k*6+3]=TMP[k]%1000/100;
str[k*6+4]=TMP[k]%1000%100/10;
str[k*6+5]=TMP[k]%1000%100%10;
}
ES=0;
for (j=0;j<6*DatCount;j++)
{
SBUF=str[j];
while(!TI);
TI=0;
}
ES=1;
}
RI=0;
}
已退回3积分