基于DS18B20温度计怎么设计报警系统啊?

显示温度部分已经弄好了
2025-01-03 21:38:16
推荐回答(2个)
回答1:

DS18B20是数字式传感器。所以你要用单片机或者其他计算机来与之通信,读取传感器测量出的温度值。DS18B20与计算通信有个协议:
大概是计算机先给出信号,让传感器初始化(刷新温度值),在给出读信号。这些信号有时间限制,就是两个信号之间必须有一定延时。说明书上有。读出信号后,只要在程序中带上一个温度超限报警的逻辑语句就可以完成报警系统了。

#include //52单片机头文件,一般不要改动,里面包含特殊功能寄存器的定义
#include //C语言库函数调用
#define uchar unsigned char //将unsigned char定义为uchar,简化输写。提高编程速度
#define uint unsigned int //将unsigned char定义为uint,简化输写。提高编程速度

sbit DS=P3^3; //定义温度DS18B20接口,详情见原理图

void display(uchar num,uchar dat);
void dis_temp(uint t);

uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, //共阴的数码管段选.将值送给P2口
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x80,0x63}; //数值‘'0-F' '-' '熄灭'
uchar code wema[]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7}; //位选,0-7位数码管
int temp;

/*延时子程序10ms*/
void delay10ms()
{
uchar a,b;
for(a=10;a>0;a--)
for(b=30;b>0;b--);
}

/*延时子程序,空5个指令*/
void delay(void)
{
_nop_();_nop_();_nop_();_nop_();_nop_();
}

/*延时子程序*/
void delayb(uint count)
{
uint i;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}

/*DS18B20初始化*/
void dsreset(void)
{
uint i;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}

/*读一位数据值*/
bit tmpreadbit(void)
{
uint i;
bit dat;
DS=0;i++; //i++,小延时一下
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}

/*读一个字节数据*/
uchar tmpread(void)
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好//一个字节在DAT里
}
return(dat); //将一个字节数据返回
}

/*写一个字节到DS18B20里*/
void tmpwritebyte(uchar dat)
{
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 tmpchange(void)
{
dsreset(); //初始化DS18B20
delayb(1); //延时
tmpwritebyte(0xcc); //跳过序列号命令
tmpwritebyte(0x44); //发送温度转换命令
}

/*读取DS18B20中温度寄存器数据*/
uint get_temp()
{
float ftemp;
uchar a,b;
dsreset();
delayb(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe); //发送读取数据命令
a=tmpread(); //连续读两个字节数据,读低8位
b=tmpread(); //读高8位
temp=b;
temp<<=8; //temp高8位和低8位交换,将交换过的值重新赋给temp。不懂的看C语言基础书
temp=temp|a; //两字节合成一个字
ftemp=temp*0.0625; //得到真实十进制温度值,因为DS18B20可以精确到0.0625度
//所以读回数据的最低位代表的是0.0625度
temp=ftemp*10+0.5; //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。
return temp; //返回温度值
}

/*主函数*/
void main()
{
uchar i;
while(1)
{
tmpchange(); //温度转换

}
}

回答2:

显示温度部分做好了,说明你已经完成DS1820的读取。这时在程序中你设定一值做比较,大于或小于某个值输出。
报警系统建议你采用RS485通迅,通过串口发送数据。如果上位机用电脑,你最好自己做一个windows平台软件。如果是上位机用单片机,相对容易。只要你会串口,把数据转换一下就行。希望能对你有所帮助。