温度程序.docx
- 文档编号:23961754
- 上传时间:2023-05-22
- 格式:DOCX
- 页数:15
- 大小:17.69KB
温度程序.docx
《温度程序.docx》由会员分享,可在线阅读,更多相关《温度程序.docx(15页珍藏版)》请在冰豆网上搜索。
温度程序
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P3^6;
sbitBEEP=P3^7;
sbithi_led=P1^6;//高温报警标志位
sbitlo_led=P1^7;//低温报警标志位
sbitkey1=P1^0;//功能键
sbitkey2=P1^1;//加
sbitkey3=P1^2;//减
sbitkey4=P1^3;//确认退出键
uintcount;//功能键计数
uchardone;//功能键标志
uchari;
charhigh=35;
charlow=10;//报警温度
uchara[3];
ucharzhengshu=0;//当前读取温度整数部分
uchartemp[]={0x00,0x00};//从18B20读取的温度值
ucharb[]={0,0,0,0};//待显示的各温度数位
bithigh_baojing=0,low_baojing=0;
bitds18b20_is_ok=1;//传感器正常标志位
uintc=0;//定时器延时累加
ucharcodeduanma[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00};//0~9及不显示的共阴极段码
ucharcodexiaoshu[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};//小数的处理
//延时子程序
voiddelay(unsignedintx)
{
while(--x);
}
//初始化18b20
ucharinit_ds18b20()
{
unsignedcharstatus;
DQ=1;
delay(8);
DQ=0;
delay(90);
DQ=1;
delay(8);
status=DQ;
delay(100);
DQ=1;
returnstatus;//初始化成功时返回0
}
//读一个字节
ucharreadonebyte()
{
unsignedchari,dat;
DQ=1;
_nop_();
for(i=0;i<8;i++)
{
DQ=0;
dat>>=1;
DQ=1;
_nop_();
_nop_();
if(DQ)
dat|=0X80;
delay(30);
DQ=1;
}
returndat;
}
//写一字节
voidwriteonebyte(unsignedchardat)
{
unsignedchari;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
}
//设置18b20报警值
voidset_alarm_temp_value()
{
init_ds18b20();
writeonebyte(0xcc);//跳过序列号
writeonebyte(0x4e);//将设定的温度报警值写入DS18B20
writeonebyte(high);//写TH
writeonebyte(low);//写TL
writeonebyte(0x7f);//12位精度
init_ds18b20();//初始化18b20
writeonebyte(0xcc);//跳过序列号
writeonebyte(0x48);//温度报警值存入DS18B20
}
//读取温度值
voidread_temperature()
{
if(init_ds18b20()==1)//DB18B20故障
ds18b20_is_ok=0;
else
{
writeonebyte(0xcc);//跳过序列号
writeonebyte(0x44);//启动温度转换
init_ds18b20();//初始化DB18B20
writeonebyte(0xcc);//跳过序列号
writeonebyte(0xbe);//读取温度寄存器
temp[0]=readonebyte();//温度低8位
temp[1]=readonebyte();//温度高8位
high=readonebyte();//报警温度TH
low=readonebyte();//报警温度TL
ds18b20_is_ok=1;
}
}
//数码管上显示温度
voiddisplay_temperature()
{
unsignedchari;
unsignedcharng=0;
unsignedcharnp=0;
charsigned_current_temp;
if((temp[1]&0xf8)==0xf8)
{
temp[1]=~temp[1];
temp[0]=~temp[0]+1;
if(temp[0]==0x00)temp[1]++;
ng=1;np=0xfd;
}
b[0]=xiaoshu[temp[0]&0x0f];
zhengshu=((temp[0]&0xf0)>>4)|((temp[1]&0x07)<<4);
signed_current_temp=ng?
-zhengshu:
zhengshu;
high_baojing=signed_current_temp>=high?
1:
0;
low_baojing=signed_current_temp<=low?
1:
0;
b[3]=zhengshu/100;
b[2]=zhengshu%100/10;
b[1]=zhengshu%10;
if(b[3]==0)
{
b[3]=10;
np=0xfe;
if(b[2]==0)
{
b[2]=10;
np=0xfd;
}
}
for(i=0;i<30;i++)
{
P0=duanma[b[0]];
P2=0xf7;delay(500);P2=0xff;//小数位
P0=(duanma[b[1]])|0x80;
P2=0xfb;delay(500);P2=0xff;//个位及小数点
P0=duanma[b[2]];
P2=0xfd;delay(500);P2=0xff;//十位
P0=duanma[b[3]];
P2=0xfe;delay(500);P2=0xff;//百位
if(ng)
{
P0=0x40;P2=np;delay(500);P2=0xff;
}
}
}
//定时器中断,报警器报声音
voidT0_INT()interrupt1
{
TH0=-1000/256;
TL0=-1000%256;
BEEP=!
BEEP;
if(++c==400)
{
c=0;
if(high_baojing)hi_led=~hi_led;elsehi_led=1;
if(low_baojing)lo_led=~lo_led;elselo_led=1;
}
}
//显示上限报警温度
voiddisplay_h()
{
unsignedcharnp,i,z;
unsignedchartt=150;
z=abs(high);
a[2]=z/100;
a[1]=z%100/10;
a[0]=z%10;
if(a[2]==0)
{
a[2]=10;
np=0xfe;
if(a[1]==0)
{
a[1]=10;
np=0xfd;
}
}
for(i=0;i<30;i++)
{
P0=duanma[a[0]];
P2=0xf7;delay(tt);P2=0xff;//个位
P0=duanma[a[1]];
P2=0xfb;delay(tt);P2=0xff;//十位
P0=duanma[a[2]];
P2=0xfd;delay(tt);P2=0xff;//负号或百位
P0=0x76;
P2=0xfe;delay(tt);P2=0xff;//符号H
}
if((high<0)&&(high>-10))
{
P0=0x40;P2=0xfb;delay(tt);P2=0xff;
}
if(high<=-10)
{
P0=0x40;P2=0xfd;delay(tt);P2=0xff;
}
}
//显示下限报警温度
voiddisplay_l()
{
unsignedcharnp,i,z;
z=abs(low);
a[2]=z/100;
a[1]=z%100/10;
a[0]=z%10;
if(a[2]==0)
{
a[2]=10;
np=0xfe;
if(a[1]==0)
{
a[1]=10;
np=0xfd;
}
}
for(i=0;i<30;i++)
{
P0=duanma[a[0]];
P2=0xf7;delay(150);P2=0xff;//个位
P0=duanma[a[1]];
P2=0xfb;delay(150);P2=0xff;//十位
P0=duanma[a[2]];
P2=0xfd;delay(150);P2=0xff;//负号或百位
P0=0x38;
P2=0xfe;delay(150);P2=0xff;//符号L
}
if((low<0)&&(low>-10))
{
P0=0x40;P2=0xfb;delay(150);P2=0xff;
}
if(low<=-10)
{
P0=0x40;P2=0xfd;delay(150);P2=0xff;
}
}
voidsetkey()//功能键
{key1=1;
if(key1==0)
{
delay(100);
while(key1==0);
count=count+1;
done=1;
}
}
voidupkey()//加一键
{
key2=1;
if(key2==0)
{
delay(100);
while(key2==0);
switch(count)
{
case1:
high++;
if(high>110)high=110;
if(high<=low)high=low+1;
break;
case2:
low++;
if(low>=high)low=high-1;
break;
default:
break;
}
}
}
voiddownkey()//减一键
{
key3=1;
if(key3==0)
{
delay(100);
while(key3==0);
switch(count)
{
case1:
high--;
if(high<=low)high=low+1;
break;
case2:
low--;
if(low>=high)low=high-1;
break;
default:
break;
}
}
}
voidoutkey()//退出键
{
key4=1;
if(key4==0)
{
delay(100);
while(key4==0);
count=0;
done=0;
}
}
voidkeydone()//按键调用
{
setkey();
if(count==3)count=1;
switch(count)
{
case1:
while(count==1)
{setkey();
upkey();
downkey();
outkey();
set_alarm_temp_value();
display_h();//
}
break;
case2:
do
{setkey();
upkey();
downkey();
outkey();
set_alarm_temp_value();
display_l();
}
while(count==2);
break;
default:
break;
}
}
voidmain()
{
IE=0X82;
TMOD=0X01;
TH0=-1000/256;
TL0=-1000%256;
TR0=0;
hi_led=1;
lo_led=1;
BEEP=0;
set_alarm_temp_value();//设置18b20报警值
read_temperature();//读取温度值
delay(5000);
delay(5000);
while
(1)
{
keydone();
done=0;
if(done==1){for(i=0;i<30;i++)keydone();}
else
{
read_temperature();
if(ds18b20_is_ok)
{
if(high_baojing==1||low_baojing==1)TR0=1;
elseTR0=0;display_temperature();
}
elseP0=P2=0;
}
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 温度 程序