#include <main.h>
void main()//主函数
{
init();//初始化函数
while(1)
{
unnormal_proccessing(get_temp(Ds18b20ReadTemp()),up_limit_temp,down_limit_temp);//恒温控制函数
temp_control();//控制按键函数
}
}
void whtlt()
{
Ds18b20Init(); //初始化
Ds18b20WriteByte(0xcc); //跳过读ROM命令
Ds18b20WriteByte(0x4e); //写入写暂存器2和3(TH和TL)命令
Ds18b20WriteByte(up_limit_temp); //暂存器TH(上限温度暂存器)写入上限温度
Ds18b20WriteByte(down_limit_temp); //暂存器TL(下限温度暂存器)写入下限温度温度
Ds18b20WriteByte(0xff); //向配置寄存器写命令,进行温度值分辨率设置
Ds18b20Init(); //DS18B20初始化
Ds18b20WriteByte(0xcc); //向DS18B20发跳过读ROM命令
Ds18b20WriteByte(0x48); //向DS18B20发将RAM中2、3字节的内容写入EEPROM
} //DS18B20上电后会自动将EEPROM中的上下限温度拷贝到TH、TL暂存器
void rhtlt()
{
Ds18b20Init(); //初始化
Ds18b20WriteByte(0xcc); //0XCC 写入跳过读ROM命令
Ds18b20WriteByte(0xbe); //0XBE 写入读内部RAM中9字节的内容命令
Ds18b20ReadByte(); //读内部RAM (LSB)
Ds18b20ReadByte(); //读内部RAM (MSB)
up_limit_temp=Ds18b20ReadByte(); //读内部RAM (TH)
down_limit_temp=Ds18b20ReadByte(); //读内部RAM (Tl)
}
void init()//初始化函数
{
uint i,j;//函数初始化
Ds18b20ChangTemp();
heatting=1;//不制热
refrigerating=1;//不制冷
f=1;
bili=100;
LcdInit();//LCD初始化函数
LcdWriteCom(0x80);//第一行显示
j=strlen(num3);
for(i=0; i<j; i++)
{
LcdWriteData(num3[i]);
delay_ms(100);
}
LcdWriteCom(0x80+0x40);//第二行显示
j=strlen(num4);
for(i=0; i<j; i++)
{
LcdWriteData(num4[i]);
delay_ms(100);
}
LcdWriteCom(0x80);//第一行显示
j=strlen(num1);
for(i=0; i<j; i++)
{
LcdWriteData(num1[i]);
// delay_ms(1);
}
LcdWriteCom(0x80+0x40);//第二行显示
j=strlen(num2);
for(i=0; i<j; i++)
{
LcdWriteData(num2[i]);
// delay_ms(1);
}
rhtlt();
LcdWriteCom(0x80+0X40+0x02);
LcdWriteData('0'+up_limit_temp/10);
LcdWriteCom(0x80+0X40+0x03);
LcdWriteData('0'+up_limit_temp%10);
LcdWriteCom(0x80+0X40+0x08);
LcdWriteData('0'+down_limit_temp/10);
LcdWriteCom(0x80+0X40+0x09);
LcdWriteData('0'+down_limit_temp%10);
LcdWriteCom(0x04); //关闭写一个指针加1
}
uint get_temp(uint temp)//计算温度函数
{
float tp;
tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
//如果温度是正的那么,那么正数的原码就是补码它本身
temp=tp*0.0625*bili+0.5;
//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
//算加上0.5,还是在小数点后面。
return temp;
}
void display_real_tenp(uint temp)//实时温度显示函数
{
uchar datas[] = {0, 0, 0, 0, 0, 0}; //定义数组
datas[0] = temp % 100000 / 10000;
datas[1] = temp % 10000 / 1000;
datas[2] = temp % 1000 / 100;
datas[3] = temp % 100 / 10;
if(f==1)
{
LcdWriteCom(0x80+0x02); //写地址 80表示初始地址
LcdWriteData('-'); //百位
}
else
{
if (datas[0]>=1)
{
LcdWriteCom(0x80+0x02); //写地址 80表示初始地址
LcdWriteData('0'+datas[0]); //百位
}
if (datas[0]<1)
{
LcdWriteCom(0x80+0x02); //写地址 80表示初始地址
LcdWriteData(' '); //百位
}
}
if (datas[0]>=1||datas[1]>=1) //逻辑运算。或(||)、非(!)
{
LcdWriteCom(0x80+0x03); //写地址 80表示初始地址
LcdWriteData('0'+datas[1]); //十位
}
if (datas[0]==0&&datas[1]==0) //逻辑运算。包括与(&&) 或(||)、非(!)
{
LcdWriteCom(0x80+0x03); //写地址 80表示初始地址
LcdWriteData(' '); //十位
}
LcdWriteCom(0x80+0x04); //写地址 80表示初始地址
LcdWriteData('0'+datas[2]); //个位
LcdWriteCom(0x80+0x06); //写地址 80表示初始地址
LcdWriteData('0'+datas[3]); //显示小数点
}
void temp_control()//控制温度上下限函数
{
if(k1==0)//选择按键
{
delay_ms(5);
if(k1==0)
{
while(!k1);
limit_choise_num++;
if(limit_choise_num>=4)
{
limit_choise_num=0;
}
}
}
if(limit_choise_num==0)//正常显示
{
LcdWriteCom(0x0c);//关闭光标
display_real_tenp(get_temp(Ds18b20ReadTemp()));//显示函数
}
if(limit_choise_num==1)//调节上限温度
{
LcdWriteCom(0x80+0X40+1);
LcdWriteCom(0x0f);//开启光标
if(k2==0)//增加温度
{
delay_ms(5);
if(k2==0)
{
while(!k2);
up_limit_temp++;
if(up_limit_temp>=100)
{
up_limit_temp=0;
}
//写入新数据
whtlt();
LcdWriteCom(0x80+0X40+0x02);
LcdWriteData('0'+up_limit_temp/10);
LcdWriteCom(0x80+0X40+0x03);
LcdWriteData('0'+up_limit_temp%10);
LcdWriteCom(0x80+0X40+1);//光标回写
}
}
if(k3==0)//减少温度
{
delay_ms(5);
if(k3==0)
{
while(!k3);
up_limit_temp--;
if(up_limit_temp<0)
{
up_limit_temp=99;
}
//写入新数据
whtlt();
LcdWriteCom(0x80+0X40+0x02);
LcdWriteData('0'+up_limit_temp/10);
LcdWriteCom(0x80+0X40+0x03);
LcdWriteData('0'+up_limit_temp%10);
LcdWriteCom(0x80+0X40+1);//光标回写
}
}
}
if(limit_choise_num==2)//调节下限温度
{
LcdWriteCom(0x80+0X40+7);
LcdWriteCom(0x0f);//开启光标
if(k2==0)//增加温度
{
delay_ms(5);
if(k2==0)
{
while(!k2);
down_limit_temp++;
if(down_limit_temp>=100)
{
down_limit_temp=0;
}
//写入新数据
whtlt();
LcdWriteCom(0x80+0X40+0x08);
LcdWriteData('0'+down_limit_temp/10);
LcdWriteCom(0x80+0X40+0x09);
LcdWriteData('0'+down_limit_temp%10);
LcdWriteCom(0x80+0X40+7);//光标回写
}
}
if(k3==0)//减少温度
{
delay_ms(5);
if(k3==0)
{
while(!k3);
down_limit_temp--;
if(down_limit_temp<0)
{
down_limit_temp=99;
}
//写入新数据
whtlt();
LcdWriteCom(0x80+0X40+0x08);
LcdWriteData('0'+down_limit_temp/10);
LcdWriteCom(0x80+0X40+0x09);
LcdWriteData('0'+down_limit_temp%10);
LcdWriteCom(0x80+0X40+7);//光标回写
}
}
}
if(limit_choise_num==3)//调节温度比例
{
LcdWriteCom(0x80+0X0f);
LcdWriteCom(0x0f);//开启光标
if(k2==0)//增加温度
{
delay_ms(5);
if(k2==0)
{
while(!k2);
bili++;
if(bili>=120)
{
bili=120;
}
//写入新数据
LcdWriteCom(0x80+0X0c);
LcdWriteData('0'+bili % 1000/100);
LcdWriteCom(0x80+0X0d);
LcdWriteData('0'+bili % 100/10);
LcdWriteCom(0x80+0X0e);
LcdWriteData('0'+bili%10);
LcdWriteCom(0x80+0X0f);//光标回写
display_real_tenp(get_temp(Ds18b20ReadTemp()));//实时显示函数
}
}
if(k3==0)//减少温度
{
delay_ms(5);
if(k3==0)
{
while(!k3);
bili--;
if(bili<80)
{
bili=80;
}
//写入新数据
LcdWriteCom(0x80+0X0c);
LcdWriteData('0'+bili % 1000/100);
LcdWriteCom(0x80+0X0d);
LcdWriteData('0'+bili % 100/10);
LcdWriteCom(0x80+0X0e);
LcdWriteData('0'+bili%10);
LcdWriteCom(0x80+0X0f);//光标回写
display_real_tenp(get_temp(Ds18b20ReadTemp()));////实时显示函数
}
}
}
}
void unnormal_proccessing(uint temp,uint up_temp,uint down_temp)//恒温控制函数
{
uchar datas[] = {0, 0, 0, 0}; //定义数组
uint temp1=0;
datas[0] = temp % 10000 / 1000;
datas[1] = temp % 1000 / 100;
datas[2] = temp % 100 / 10;
datas[3] = temp % 10;
temp1=datas[0]*1000+datas[1]*100+datas[2]*10+datas[3];//实际的温度乘以100
if(temp1 < down_temp*100)//升温函数
{
heatting=0;//制热
refrigerating=1;//不制冷
}
else if(temp1 > up_temp*100)//降温函数
{
heatting=1;//不制热
refrigerating=0;//制冷
}
else//正常
{
heatting=1;//不制热
refrigerating=1;//不制冷
}
}