标题:
单片机DS18B20温度超出阈值报警,调上下限程序
[打印本页]
作者:
gy51xx
时间:
2017-8-23 15:50
标题:
单片机DS18B20温度超出阈值报警,调上下限程序
DS18B20温度,调上下限,数码管显示,超出阈值报警
单片机源程序如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
bit flag;
sbit ds=P2^2;
sbit beep=P1^0;
uint temp;
sbit led3=P1^2;
sbit dula=P2^6;
sbit wela=P2^7;
sbit key1=P3^4;
sbit key2=P3^6;
sbit key3=P3^7;
uchar num,num_shang=0,num_xia=0,numled,flag_qiehuan;
uchar code table_du[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(xms) //延时函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=100;j>0;j--);
}
void delayus(uint t)
{
while(t--);
}
void init() //初始化函数
{
TMOD=0x01; //设置定时器0位工作方式(00000001)
TH0=(65536-22500)/256; //装初值
TL0=(65536-22500)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1;
}
void display_shumaguan() //显示子函数,中间两位数码管
{
uchar qian,bai,shi,ge;;
qian=num_shang/10; //分离要显示的函数
bai=num_shang%10;
dula=1;
P0=table_du[qian]; //送千位段选
dula=0;
P0=0xff; //送位选数据前关闭所有显示
wela=1;
P0=0xfb; //送位选数据
wela=0;
delay(4);
dula=1; //送各位段选函数
P0=table_du[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay(4);
shi=num_xia/10;
ge=num_xia%10;
dula=1;
P0=table_du[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delay(4);
dula=1;
P0=table_du[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
// delay(1);
}
void ds_reset() //复位函数
{
ds=1;
delayus(5); // 延时
ds=0;
delayus(80);
ds=1;
delayus(14);
if(ds==0)
flag=1;
else
flag=0; //flag作为标志位,等1表示18b20存在
delayus(20);
}
bit ds_read_bit(void) //读一位数据函数
{
bit dat;
ds=0;
_nop_(); //延时机器周期
_nop_();
ds=1; //释放总线
_nop_();
dat=ds;
delayus(10); //延时100us
return dat;
}
uchar ds_read_byte() //读一个字节函数
{
uchar i,j,k;
for(i=0;i<8;i++) //一个字节8位组成,循环八次
{
j=ds_read_bit();
k=(j<<7)|(k>>1); //读出的数据最低位在最前面
}
return k;
}
void ds_write_byte(uchar dat) //写一个字节的函数
{
uchar i;
for(i=0;i<8;i++) //循环八位将一个字节由低到高写入
{
ds=0;
_nop_();
ds=dat&0x01; //保留dat的最低位
delayus(6);
ds=1; //释放总线
dat=dat>>1;
}
delayus(6);
}
uint read_temp() //读取温度函数
{
uchar a,b;
ds_reset();
ds_write_byte(0xcc);
ds_write_byte(0xbe);
a=ds_read_byte(); //读低八位
b=ds_read_byte(); //读高八位
temp=b;
temp=temp<<8;
temp=temp|a;
temp=temp*0.0625; //得到实际温度值
return temp;
}
void display(uint temp)
{
P0=table_du[temp/10];
dula=1;
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(4);
P0=table_du[temp%10];
dula=1;
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
// delay(1);
}
void keyscan()
{
if(key1==0)//按键1处理
{
if(flag_qiehuan==0)
{
flag_qiehuan=1; //切换设置上限
}
else if(flag_qiehuan==1)
{
flag_qiehuan=0; //切换设置下限
}
}
if((key2==0)&&(flag_qiehuan==0)) //k2长按
{
delay(30);
if((key2==0)&&(flag_qiehuan==0))
{
num_xia++;
}
}
else if((key2==0)&&(flag_qiehuan==0)) //K2短按
{
delay(3);
if((key2==0)&&(flag_qiehuan==0))
{
num_xia++;
while(!key2);
}
}
if((key3==0)&&(flag_qiehuan==0))
{
delay(30);
if((key3==0)&&(flag_qiehuan==0))
{
num_xia--;
}
}
else if((key3==0)&&(flag_qiehuan==0)) //K3短按
{
delay(3);
if((key3==0)&&(flag_qiehuan==0))
{
num_xia--;
while(!key3);
}
}
if((key2==0)&&(flag_qiehuan==1))
{
delay(30);
if((key2==0)&&(flag_qiehuan==1))
{
num_shang++;
}
}
else if((key2==0)&&(flag_qiehuan==1))
{
delay(3);
if((key2==0)&&(flag_qiehuan==1))
{
num_shang++;
while(!key2);
}
}
if((key3==0)&&(flag_qiehuan==1))
{
delay(30);
if((key3==0)&&(flag_qiehuan==1))
{
num_shang--;
}
}
else if((key3==0)&&(flag_qiehuan==1))
{
delay(3);
if((key3==0)&&(flag_qiehuan==1))
{
num_shang--;
while(!key3);
}
}
}
void deal()
{
if((temp>=num_xia)||(temp<=num_shang))
{
beep=0;
}
if((temp<num_xia)&&(temp>num_shang))
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
完全品.zip
(39.28 KB, 下载次数: 108)
2017-8-23 15:49 上传
点击文件名下载附件
DS18B20温度,调阈值报警
下载积分: 黑币 -5
作者:
大宝的小S
时间:
2017-8-26 10:27
不错不错。
作者:
大宝的小S
时间:
2017-8-26 10:28
很详细,正好有需要。
作者:
你大爷的大爷
时间:
2018-5-5 16:01
很详细
作者:
songjj6
时间:
2018-5-10 11:43
感谢分享,借鉴学习
作者:
ddx-oipser
时间:
2018-7-18 16:14
学到了
作者:
铭乐
时间:
2018-10-13 11:17
很好、不错
作者:
microhl
时间:
2021-7-13 09:47
做了个小温度计,放在窗外,夜深了的时候,当室外温度低于25度的时候,关闭空调,很不错的
作者:
microhl
时间:
2021-7-13 09:54
正在扩展程序,精确到小数后一位,看能否成功
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1