温度控制C程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include
#define uchar unsigned char
#define uint unsigned int
sbit red=P1^0; //报警指示灯控制
sbit green=P1^1; //正常范围温度指示控制
sbit ds=P3^7; //DS18B20控制口
sbit fm=P3^6; // 蜂鸣器信号线
sbit key1=P3^0; //按键1控制
sbit key2=P3^1; //按键2控制
sbit key3=P3^2; //按键3控制
sbit key4=P3^3; //按键4控制
uchar biaozhi;
uchar num,num1,num2,num3;
uint temp,shangxian,xiaxian,aa,bb,ee; //定义温度上下限值
uint flag1,b1,t,t1,f,f1,b2,n;
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
//不带小数点0~9编码和负号
unsigned char code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
//带小数点0~9编码
/******延时函数******/
void delay(uchar z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void dsreset(void) //DS18B20复位,初始化函数
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}

bit tempreadbit(void) //读1位数据函数
{
uint i;
bit dat;
ds=0;i++; //i++ 起延时作用
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return (dat);
}

uchar tempread(void) //都1个字节数据函数
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在dat里
}
return(dat);
}

void tempwritebyte(uchar dat) //向DS18B20写一个字节数据函数
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //写1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0; //写0
i=8;while(i>0)i--;
ds=1;
i++;i++;
}

}
}

void tempchange(void) //DS18B20开始获取温度并转换
{
dsreset();
delay(1);
tempwritebyte(0xcc); // 写跳过读ROM指令
tempwritebyte(0x44); //写温度转换指令
}


uint get_temp() //读取寄存器中存储的温度数据
{
uchar a,b;
dsreset();
delay(1);

tmpwritebyte(0xcc);//写跳过读ROM指令
tmpwritebyte(0xbe);//写温度转换指令

a=tempread(); //读低8位
b=tempread(); //读高8位
temp=b;
temp<<=8;
temp=templa;
f_temp=temp*0.0625;
temp=f_temp*10+0.5;
f_temp=f_temp+0.5;
return temp;
}
void disply(uchar num,uchar dat)
{
uchar i;
dula=0;
P0=table[dat];
dula=1;
dula=0;
wela=0;
i=i&(~((0X01)<<(num)));
P0=i;
wela=1;
wela=0;
delay(1);
}

void dis_temp(uint t)
{
uchar i;
i=t/100;
display(0,i);
i=t%100/10;
display(1,i+10);
i=t%100%10;
display(2,i);
}






void tht1()
{
dsreset();
delay(1);
tmpwritebyte(0xcc); // 地址总线上的所有驱动程序
tmpwritebyte(0x4e); // 启动一个单一

的温度转换
tmpwritebyte(aa);
tmpwritebyte(bb);
tmpwritebyte(ee);

}
void key()
{
if(key1==0)
{
delay(10);
if(key1==0)
{
n=1;
num++;
if(num==1)
{
num1=0;
num2=0;
t=num2;
}
if(num==2)
{
num1=0;
num2=0;
f=num2;
}
if(num==3)
{
num=0;
n=1;
}

while(!key1);
}
}
if(key2==0)
{
delay(10);
if(key2==0&&num==2)
{
num1++;
if(num1==2)
num1=0;
while(!key2);
}
}
if(key3==0)
{
delay(10);
if(key3==0)
{

num2++;
if(num2==100&&num1==0)
{
num2=0;
t=num2;
}
if(num2==55&&num1==1)
{
num2=0;
f=num2;
}
if(num==1)
t=num2;
if(num==2)
f=num2;
while(!key3);
}
}
if(key4==0)
{
delay(10);
if(key4==0)
{
num2--;
if(num2==0)
num2=99;
if(num==1)
t=num2;
if(num==2)
f=num2;
while(!key4);
}
}

}

void zhi()
{
uchar shi,shi1,ge,ge1;
if(n==1)
{
shi=t/10;
ge=t%10;
shi1=f/10;
ge1=f%10;
aa=shi*10+ge*1;
bb=shi1*10+ge1*1;
n=0;
tht1();
}

}

void init()
{
num=0;
num1=0;
num2=0;
aa=90;
bb=50;
ee=0x7f;
b2=0xbf;
}
void display(uint temp)
{
uchar A1,A2,A2t,A3,b1;
if(flag1!=0xff)
{
b1=0xff;
if(b2!=0xbf)
{

if(temp>=shangxian)
temp=shangxian;
if(temp<=xiaxian)
temp=xiaxian;
}
if(b2==0xbf)
{
if(temp>=shangxian)
temp=shangxian;

}
if((temp==xiaxian)&&b2==0xff||(temp==shangxian))
{
fm=1;
red=1;
green=0;

}
else
{
fm=0;
red=0;
green=1;
}


}
if(flag1==0xff)
{
b1=0xbf;
if(b2!=0xbf)
{ b1=0xff;
temp=xiaxian;
fm=1;
red=1;
green=0;

}
if(b2==0xbf)
{
if(temp>=xiaxian)
temp=xiaxian;

if((temp==xiaxian)&&b2==0xbf)
{
fm=1;red=1;
green=0;

}
else
{
fm=0;
red=0;
green=1;
}
}
}



A1=temp/100;
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;




P2=0x01; //显示负号
P0=b1;
delay(2);

//显示百位
P2=0x02;
P0=table[A1];
delay(2);

//显示十位
P2=0x04;
P0=table1[A2];
delay(2);

//显示个位
P2=0x08;
P0=table[A3];
delay(2);
}
void display1()
{

uchar A1,A2;
if(num1==1)
b2=0xbf;
else
b2=0xff;
A1=num2/10;
A2=num2%10;

//显示负号
P2=0x01;
P0=b2;
delay(2);

//显示百位
P2=0x02;
P0=table[A1];
delay(2);

//显示十位
P2=0x04;
P0=table1[A2];
delay(2);

//显示个位
P2=0x08;
P0=0xc0;
delay(2);
}
void main()
{

init();
tht1();
while(1)
{
tmpchange();
key();
zhi();
if(num==0)
{
display(tmp());
//n=0;
}
else
{
display1();

}

}
}

相关文档
最新文档