#include <reg52.h> //52系列头文件
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P3^4; //定义DS18B20的io口
sbit beep=P1^4; //定义蜂鸣器
sbit jdq=P1^2; //加热继电器
sbit jdq1=P1^3; //风扇继电器
uint high; //定义温度的上限值
uint low; //定义温度的下限值
uint temp,t,w; //定义整型的温度数据
uchar flag;
float f_temp; //定义浮点型的温度数
sbit s1=P3^5; //功能按键
sbit s2=P3^6; //增大按键
sbit s3=P3^7; //减小按键
sbit led1=P1^0; //高温报警灯
sbit led2=P1^1; //低温报警灯
uchar flag1,flag2,flag3,flag4,s1num,qian,bai,shi,ge;
uchar code table[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0xc6
}; //共阳数码管段码表
uchar code table1[]=
{0x40,0x79,0x24,0x30,0x19,
0x12,0x02,0x78,0x00,0x10};//带小数点的编码
void delay(uchar z) //延时函数
{
uchar a,b;
for(a=z;a>0;a--)
for(b=100;b>0;b--);
}
void init()
{
EA=1; //允许中断
ET1=1; //允许定时器1中断
TR1=1; //打开T1定时器
TMOD=0x10; //定义定时器1工作方式1
TH1=(65536-4000)/256; //给定时器的高8位赋初值
TL1=(65536-4000)%256; //给定时器的低8位赋初值
flag=0;
high=300; //高温初值30
low=200; //低温初值20
}
void hdidi() //高温报警
{
beep=0;
led1=0;
delay(500);
beep=1;
led1=1;
delay(500);
}
void ldidi() //低温报警
{
beep=0;
led2=0;
delay(50);
beep=1;
led2=1;
delay(50);
}
void dsreset(void) //DS18b20复位, 初始化函数
{
uint i;
ds=0;
i=103; //延时最短480us
while(i>0) i--;
ds=1; //等待16-60us,收到低电平一个约60-240us则复位成功
i=4;
while(i>0) i--;
}
bit tempreadbit(void) //读1位数据函数
{
uint i;
bit dat;
ds=0;i++;
ds=1;i++;i++; //i++起到延时作用
dat=ds;
i=8;
while(i>0)i--;
return(dat);
}
uchar tempread(void) //读1字节的数据函数
{
uint i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);
//读出的数据最低位在最前面,这样刚好一个字节在dat里
}
return(dat);
}
void tempwritebyte(uchar dat) //向DS18B20写一个字节的数据函数
{
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 //写0
{
ds=0;
i=8;
while(i>0) i--;
ds=1;
i++;i++;
}
}
}
void tempchange(void) //DS18B20开始获取温度并转换
{
dsreset();
delay(1);
tempwritebyte(0xcc); //写跳过读ROM指令
tempwritebyte(0x44); //写温度转换指令
}
uint get_temp() //读取寄存器中存储的温度数据
{
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc); //写跳过读ROM指令
tempwritebyte(0xbe); //写温度转换指令
a=tempread(); //读低8位
b=tempread(); //读高8位
temp=256*b+a;
f_temp=temp*0.0625; //温度在寄存器中为12位,分辨率为0.0625
temp=f_temp*10+0.5; //乘以10表示小数点后面只取一位
return temp; //temp是整型
}
void keyscan()
{
if(s1==0) //功能键
{P2=0xff;
delay(5);
if(s1==0)
{
while(!s1);
s1num++;
if(s1num==1)
{
flag=1;
}
if(s1num==2)
{
flag=2;
}
if(s1num==3)
{
s1num=0;
flag=0;
}
}
}
if(s1num==1)
{
flag=1;
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
low+=10; //下限温度加1
if(low==1000)
low=200;
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3); // 下限温度减1
low-=10;
if(low==0)
low=200;
}
}
}
if(s1num==2)
{
flag=2;
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
high+=10; //上限温度加1
if(high==1000)
high=300;
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
high-=10; //上限温度减1
if(high==0)
high=300;
}
}
}
}
void main() //主函数
{
init();
while(1)
{
tempchange(); //温度转换函数
if(temp>high)
{ //温度大于上限温度
jdq=0;
jdq1=1;
hdidi();
}
if((temp<=high)&&(temp>=low)) //温度大于下限温度 小于上限温度
{
jdq=0;
jdq1=0;
led1=1;
led2=1;
beep=1;
}
if(temp<low) //温度小于下限温度
{
jdq=1;
jdq1=0;
ldidi();
}
}
}
void time1() interrupt 3 //定时器中断1
{
TH1=(65536-4000)/256; //给定时器的高8位赋初值
TL1=(65536-4000)%256; //给定时器的低8位赋初值
t++;
keyscan();
if(flag==0)
{
if(t==4) t=0;
switch(t)
{
case 1:P0=table[get_temp()/100]; P2=0xfd;break; //显示温度十位
case 2:P0=table1[get_temp()%100/10];P2=0xfb;break; //显示温度个位
case 3:P0=table[get_temp()%10]; P2=0xf7;break; //显示小数点后一位
//case 3:delay(1);break;
}
}
if(flag==1)
{
if(t==4) t=0;
switch(t)
{
case 0:P0=0xc7; P2=0xfe;break; //L
case 1:P0=0xff; P2=0xfd;break;
case 2:P0=table[low/100]; P2=0xfb;break; //下限温度十位
case 3:P0=table[low%100/10]; P2=0xf7;break; //下限温度个位
}
}
if(flag==2)
{
if(t==4) t=0;
switch(t)
{ //H
case 0:P0=0x89; P2=0xfe;break;
case 1:P0=0xff; P2=0xfd;break;
case 2:P0=table[high/100]; P2=0xfb;break; //上限温度十位
case 3:P0=table[high%100/10]; P2=0xf7;break; //上限温度个位
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
101、基于51单片机DS18B20水箱水温检测控制电路图及程序元件清单
共32个文件
log:6个
bak:2个
xls:1个
2 下载量 201 浏览量
2023-07-19
10:46:17
上传
评论 2
收藏 467KB RAR 举报
温馨提示
本资源内容概要: 这是基于51单片机的DS18B20水箱水温检测控制设计,包含了电路图源文件(Altiumdesigner软件打开)、C语言程序源代码(keil软件打开)、元件清单(excel表格打开)。 本资源适合人群: 单片机爱好者、电子类专业学生、电子diy爱好者。 本资源能学到什么: 可以通过查看电路学习电路设计原理,查看代码学习代码编写原理。 本资源使用建议: 建议使用者需要具备一定电子技术基础,掌握一些常用元器件原理,例如三极管、二极管、数码管、电容、稳压器等。了解C语言基础设计原理,能看懂基础的电路图,具备一定的电路图软件使用能力。
资源推荐
资源详情
资源评论
收起资源包目录
101、基于51单片机DS18B20水箱水温检测控制电路图及程序元件清单.rar (32个子文件)
101、基于51单片机DS18B20水箱水温检测控制电路图及程序元件清单
电路图
18B20.PcbDoc.htm 5KB
18B20.pcbdoc_viewstate 3KB
__Previews
18B20.SchDocPreview 69KB
History
18B20.SCHLIB 47KB
18B20.SchDoc 197KB
18B20.PcbLib 74KB
Project Outputs for 18B20
Design Rule Check - 18B20.html 12KB
Design Rule Check - 18B20.drc 2KB
18B20.pdf 338KB
18B20.OutJob 3KB
18B20.PRJPCB 52KB
Project Logs for 18B20
18B20 PCB ECO 2011-03-18 10-15-28 PM.LOG 3KB
18B20 PCB ECO 2011-05-18 03-52-56 PM.LOG 1KB
18B20 PCB ECO 2011-05-18 03-42-22 PM.LOG 2KB
18B20 PCB ECO 2011-03-18 10-22-24 PM.LOG 249B
18B20 PCB ECO 2011-05-18 03-54-14 PM.LOG 314B
18B20 PCB ECO 2011-05-18 03-58-32 PM.LOG 359B
18B20.PcbDoc 424KB
18B20.PcbDocPreview 75KB
DS18B20两个继电器 程序
DS18B20 13KB
DS18B20.c 5KB
DS18B20.LST 13KB
DS18B20.OBJ 15KB
DS18B20.Uv2 2KB
DS18B20_Opt.Bak 976B
DS18B20.plg 256B
DS18B20.M51 20KB
DS18B20.Opt 976B
DS18B20.lnp 46B
DS18B20.hex 6KB
DS18B20_Uv2.Bak 2KB
元件清单.xls 14KB
共 32 条
- 1
资源评论
>行者<
- 粉丝: 209
- 资源: 135
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功