for(j=0;j<10;j++)
;
}
voidkey_num(void)
{
P1=0xfe;//扫描第一行
switch(P1)
{
case0xee:
key=1;break;
case0xde:
key=2;break;
case0xbe:
key=3;break;
}
P1=0xfd;//扫描第二行
switch(P1)
{
case0xed:
key=4;break;
case0xdd:
key=5;break;
case0xbd:
key=6;break;
}
P1=0xfb;//扫描第三行
switch(P1)
{
case0xeb:
key=7;break;
case0xdb:
key=8;break;
case0xbb:
key=9;break;
}
P1=0xf7;//扫描第四行
switch(P1)
{
case0xe7:
key=10;break;
case0xd7:
key=0;break;
case0xb7:
key=11;break;
}
}
voidkey_work(void)
{
switch(key)
{
case10:
a++;
if(a==3)
a=1;
break;
case11:
a=0;
break;
default:
switch(a)
{
case1:
set_max=set_max%10*10;
set_max=set_max+key;
break;
case2:
set_min=set_min%10*10;
set_min=set_min+key;
break;
}
break;
}
}
voidkey_scan(void)
{
P1=0xf0;
if(P1!
=0xf0)
{
key_delay(300);
if(P1!
=0xf0)
{
key_num();
key_work();
}
}
P1=0xf0;
while(P1!
=0xf0);
}
/************************延时函数************************/
voiddelay_10us(uintz)
{
for(;z>0;z--);
}
voiddelay_600ms()
{
uinta,b;
for(a=300;a>0;a--)
for(b=250;b>0;b--);
}
/************************18B20复位************************/
voidds18b20_init(void)
{
charX=1;
while(X)
{
while(X)
{
wd=1;
delay_10us
(1);
wd=0;
delay_10us(50);
wd=1;
delay_10us(9);
X=wd;
}
delay_10us(20);
X=~wd;
}
wd=1;
}
/************************18B20写一个字节************************/
voidds18b20_write_byte(ucharval)
{
uchari,X;
for(i=8;i>0;i--)
{
X=val&0x01;
wd=1;delay_10us
(1);
wd=0;delay_10us
(1);
wd=X;//最低位移出,并写入总线
delay_10us(8);
val=val/2;//右移一位,倒数第二位变为最低位
}
wd=1;
delay_10us
(1);//高电平维持11us,写结束
}
/**********************18B20读1个字节********************/
uchards18b20_read_byte(void)
{
uchari;
ucharvalue=0;
for(i=8;i>0;i--)
{
value>>=1;
wd=1;delay_10us
(1);
wd=0;delay_10us
(1);
wd=1;delay_10us
(2);
if(wd)
value|=0x80;
delay_10us(8);
}
wd=1;//总线恢复高电平,DQ=1
return(value);
}
/**********************18B20读温度************************/
voidDS18B20_Read()
{
ds18b20_init();//总线复位
ds18b20_write_byte(0xCC);//发SkipROM命令
ds18b20_write_byte(0x44);//((0xBE)发读命令)送入温度转换命令
wd=1;
delay_600ms();
ds18b20_init();
ds18b20_write_byte(0xCC);//SkipROM
ds18b20_write_byte(0xBE);//((44)发转换命令)送入发读命令
temp[0]=ds18b20_read_byte();//18B20存储器的第一个字节为温度低8位
temp[1]=ds18b20_read_byte();//18B20存储器的第二个字节为温度高8位
}
/************************18B20温度数据处理************************/
voidDS18B20_Work()
{
inttemp1=0;
ucharn=0;//存储符号
if(temp[1]&0x08)//如果实际温度为负值,负温度补码求原码
{
temp1=temp[1];
temp1=temp1<<8;
temp1=temp1|temp[0];
temp1=0xffff-temp1+1;
temp[0]=temp1&0x00ff;
temp1=temp1&0xff00;
temp1=temp1>>8;
temp[1]=temp1;
n=1;
}
table[0]=((temp[0]&0x0f)*0.0625+0.05)*10;
table[3]=((temp[0]&0xf0)>>4)|((temp[1]&0x0f)<<4);
//低八位屏蔽小数位后右移四位与高八位屏蔽高四位后左移四位合并形成温度的整数值
t=table[3]+table[0]/10.0;
table[0]=table[0]+'0';
table[1]=table[3]%10+'0';
table[2]=table[3]/10%10+'0';
table[3]=table[3]/100+'0';
if(table[3]=='0')
{
table[3]=0xfe;
if(table[2]=='0')
{
table[2]=0xfe;
}
}
//温度的百位及十位为0时都不显示,LCD1602的“不显示"代码为0x20
if(n)
table[3]=0x2D;//负温度(最低-55c)时最高位显示"-"
}
/*****************用于18B20变化温度对显示数组的修改*******************/
voidDS18B20_Change()
{
tab2[10]=table[2];
tab2[11]=table[1];
tab2[13]=table[0];
}
/****************************主函数***********************/
main()
{
uchari;
lcd_init();
while
(1)
{
switch(a)
{
case1:
for(i=0;i<16;i++)
{
tab1[i]=table5[i];
tab2[i]=table3[i];
}
tab2[11]=0xdf;
tab2[9]=set_max/10+'0';
tab2[10]=set_max%10+'0';
break;
case2:
for(i=0;i<16;i++)
{
tab1[i]=table5[i];
tab2[i]=table4[i];
}
tab2[11]=0xdf;
tab2[9]=set_min/10+'0';
tab2[10]=set_min%10+'0';
break;
case0:
for(i=0;i<16;i++)
{
tab1[i]=table1[i];
tab2[i]=table2[i];
}
tab1[8]=0xdf;
tab1[14]=0xdf;
tab2[14]=0xdf;
tab1[6]=set_max/10+'0';
tab1[7]=set_max%10+'0';
tab1[12]=set_min/10+'0';
tab1[13]=set_min%10+'0';
DS18B20_Read();//读出18B20温度数据
DS18B20_Work();//处理温度数据
DS18B20_Change();
break;
}
lcd_scan();//显示温度值
key_scan();
if(t>set_max)
{
hot=1;
cold=0;
}
elseif(t{
cold=1;
hot=0;
}
else
{
cold=1;
hot=1;
}
}
}
底图总号
拟制
审核
日期
签字
标准化
第15页
共16页
更改标记
数量
更改单号
签名
日期
批准
描图:
描校:
系统仿真
效果图
产品名称
单总线温控可调监测系统
工序名称
产品图号
工序号
旧底图总号
底图总号
拟制
审核
日期
签字
标准化
第16页
共16页
更改标记
数量
更改单号
签名
日期
批准
描图:
描校: