基于51单片机的温度数据采集程序

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

/*基于51单片机的温度数据采集程序*/ #include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar set_up; //温度设定值
uint temper;
sbit FM=P2^3; //蜂鸣器报警
sbit DQ=P2^4;
sbit dula=P2^6; //数码管段选
sbit wela=P2^7; //数码管位选
sbit key1=P3^4; //按键
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z) //延时函数1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay_reset(uint t) //延时函数11us
{
for(;t>0;t--);
}
void DS18B20_reset(void) //DS18B20初始化函数{
bit flag=1;
while (flag)
{
while (flag)
{
DQ = 1;
delay_reset(1);
DQ = 0;
delay_reset(50); // 延时550us
DQ = 1;
delay_reset(6); //延时66us
flag=DQ;
}
delay_reset(45); //延时500us
flag=~DQ;
}
DQ=1;
}
void write_byte(uchar val) //DS18B20写一个字节函数{
uchar i;
for (i=0; i<8; i++)
{
DQ = 1;
_nop_();
DQ = 0;
_nop_();
_nop_();
DQ = val & 0x01; //最低位移出
delay_reset(6);
val >>= 1; //右移一位
}
DQ = 1;
delay_reset(1);
}
uchar read_byte(void) //DS18B20读一个字节函数{
uchar i,value=0;
for (i=0; i<8; i++)
{
DQ=1;
_nop_();
value >>= 1;
DQ = 0;
_nop_();
_nop_();
DQ = 1;
_nop_();
_nop_();
if (DQ)
value|=0x80;
delay_reset(6); //延时66us }
DQ=1;
return(value);
}
void display(uchar temp) //数码管显示函数{
uchar bai,shi,ge;
bai = temp/100; //百位
shi= temp%100/10; //十位
ge= temp%10; //个位
dula=1;
P0=table[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(1);
}
uint Get_Tem() //获取温度函数
{
uchar a,b;
DS18B20_reset(); //初始化
write_byte(0xCC); //忽略ROM指令
write_byte(0x44); //温度转换指令
delay(500); // 等待温度转换完成
DS18B20_reset(); //初始化
write_byte(0xCC); //忽略ROM指令
write_byte(0xBE); //读暂存器指令
a = read_byte(); //读取到的第一个字节为温度LSB
b = read_byte(); //读取到的第一个字节为温度MSB
temper=b; //先把高八位有效数据赋于temper
temper<<= 8; //把以上8位数据从temper低八位移到高八位temper=temper|a; //两字节合成一个整型变量
temper=temper*0.0625; //得到真实十进制温度值
return temper;
}
void keyscan() //按键扫描函数
{
if(key1==0) //调节设定值键
{
delay(10); //按键去抖
if(key1==0)
display(set_up);
while(!key1); //直到按键释放,否则不退出循环
while(key4) //判断有无返回键按下
{
if(key2==0) //设定值加1键
{
delay(10);
if(key2==0)
{
if(set_up>=125)
set_up=0;
else
set_up++;
}
while(!key2);
display(set_up);
}
if(key3==0) //设定值减1键
{
delay(10);
if(key3==0)
{
if(set_up==0)
set_up=125;
else
set_up--;
}
while(!key3);
display(set_up);
}
}
if(key4==0) //返回键
{
delay(10);
if(key4==0)
display(Get_Tem());
}
while(!key4);
}
}
main()
{
while(1)
{
keyscan();
if(Get_Tem()>=set_up) //温度超过设定值报警
FM=0;
else
FM=1;
display(Get_Tem()); //显示实时温度
}
}。

相关文档
最新文档