📄 温度.c
字号:
////////温度测量报警系统,设置20~29度为安全范围
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^7;
sbit bemp=P3^7;
sbit lcden=P2^2;
sbit lcdrs=P2^0;
sbit lcdrw=P2^1;
sbit sh_zeng=P1^7;
sbit sh_jian=P1^6;
sbit xia_zeng=P1^5;
sbit xia_jian=P1^4;
uchar code table1[]="temp:";
uchar code table2[]="up:";
uchar code table3[]="down:";
uchar code table4[]="0123456789.-";
uchar bai,shi,ge,flag,num,shi_sh,shi_xia,ge_sh,ge_xia;
int temp;
int warn_sh=29; //温度上限值
int warn_xia=20;//温度下限值
void delayms(uint z)
{
uint x,y;
for(x=z;z>0;z--)
for(y=110;y>0;y--);
}
void dsreset() //DS18B20初始化
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=1;
while(i>0)i--;
}
bit tempreadbit(void) //读一位数据函数
{
uint i;
bit dat;
ds=0;i++; //延时
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return(dat);
}
uchar tempread(void)
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);//将位转换为字节
}
return(dat);
}
void tempwrite(uchar dat)//向DS18B20写一个字节数据函数
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0;
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
void tempchange() //DS18B20开始获取温度并转换
{
dsreset();
delayms(1);
tempwrite(0xcc);//写跳过读ROM指令
tempwrite(0x44);//写温度转换指令
}
void get_temp() //读取寄存器中存储的温度数据
{
uchar a,b;
dsreset();
delayms(1);
tempwrite(0xcc);
tempwrite(0xbe);
a=tempread();
b=tempread();
temp=b;
temp<<=8;
temp=temp|a;
if(!(b&0xf8))
temp=temp*0.625;//温度在寄存器中为12为,分辨率为0.0625,加0.5是为了四舍五入
else
{
temp=(~temp+1)*0.625;
flag=1;
}
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
void write_date(uchar date)
{
lcdrs=1;
P0=date;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
void init_1602()
{
}
void display(uint ch) //显示正温度数据
{
write_com(0x80);
for(num=0;num<5;num++)
{
write_date(table1[num]);
}
write_date(table4[ch]);
write_date(table4[bai]);
write_date(table4[shi]);
write_date(table4[10]);
write_date(table4[ge]);
write_com(0x80+0x40);
for(num=0;num<3;num++)
{
write_date(table2[num]);
}
write_date(table4[shi_sh]);
write_date(table4[ge_sh]);
write_com(0x80+0x40+0x07);
for(num=0;num<5;num++)
{
write_date(table3[num]);
}
write_date(table4[shi_xia]);
write_date(table4[ge_xia]);
}
void warn(uchar s,uchar led,uint ch)//温度报警
{
uchar i,j;
i=s;
j=s/2;
P1=~led;
while(i--)
{
bemp=0;
display(ch);
}
P1=0xff;
while(j--)
{
display(ch);
bemp=1;
}
}
void deal(int t)
{
if(t>warn_sh*10)
{
warn(2,0x01,12);
}
else if((t<warn_xia*10)&&(t>=0))
{
warn(2,0x02,12);
}
else if(t<0)
{
warn(2,0x02,11);
}
else
display(12);
}
void key() //按键扫描函数
{
if(sh_zeng==0)
{
delayms(5);
if(sh_zeng==0)
{
warn_sh++;
if(warn_sh==100)
warn_sh=99;
}
while(!sh_zeng);
}
if(sh_jian==0)
{
delayms(5);
if(sh_jian==0)
{
warn_sh--;
if(warn_sh==-55)
warn_sh=-54;
while(!sh_jian);
}
}
if(xia_zeng==0)
{
delayms(5);
if(xia_zeng==0)
{
warn_xia++;
if(warn_xia==100)
warn_sh=99;
}
while(!xia_zeng);
}
if(xia_jian==0)
{
delayms(5);
if(xia_jian==0)
{
warn_xia--;
if(warn_xia==-55)
warn_xia=-54;
while(!xia_jian);
}
}
}
void init()
{
lcden=0;
P2=0;
flag=0;
P0=0xff;
P1=0xff;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void main()
{
init();
while(1)
{
key();
tempchange();
get_temp();
bai=temp/100;
shi=temp%100/10;
ge=temp%10;
shi_sh=warn_sh%100/10;
ge_sh=warn_sh%10;
shi_xia=warn_xia%100/10;
ge_xia=warn_xia%10;
if(flag==0)
{
deal(temp);
display(12);
}
else
{
flag=0;
display(11);
warn(2,0x02,11);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -