DS18B20课程设计.docx
- 文档编号:11535258
- 上传时间:2023-03-19
- 格式:DOCX
- 页数:26
- 大小:520.83KB
DS18B20课程设计.docx
《DS18B20课程设计.docx》由会员分享,可在线阅读,更多相关《DS18B20课程设计.docx(26页珍藏版)》请在冰豆网上搜索。
DS18B20课程设计
基
于
DS18B20
的
温
度
测
量
及
双
限
控
制
器
单片机把我们带入了智能化的电子领域,许多繁琐的系统若由单片机进行设计,便能收到电路更简单、功能更齐全的良好效果。
若把经典的电子系统当作一个僵死的电子系统,那么智能化的现代电子系统则是一个具有“生命”的电子系统。
本人就温度自动化控制,设计了这款DS18B20温度控制器。
实现功能:
对温度进行测量,并在数码管上显示。
测量范围-55~125摄氏度。
显示精度0.1摄氏度,自定义上下限报警温度,(默认值,上限:
50摄氏度,下限20摄氏度)声音报警提示,指示灯报警提示,分别控制上限和下限继电器。
上下限温度可显示。
温度控制精度0.1摄氏度。
系统分为硬件系统和软件系统
第一部分、硬件系统
一、温度传感器
本设计中使用的温度传感器是达拉斯公司生产的DS18B20,他具有超小的体积,超低的硬件开销,抗干扰能力强,精度高,全数字输出。
主要参数:
1单总线数据通信。
2最高12位分辨率,精度可达0.5摄氏度。
3测量温度范围-55摄氏度~125摄氏度。
464位光刻ROM,内置序列号。
5有TO-92封装、SO封装、uSOP封装
6工作电压5V。
芯片引脚:
本设计采用TO-92封装,引脚关系如下
GND:
电源地
DQ:
单总线数据线
VDD:
电源正
RAM及EEPROM结构
操作过程:
1复位:
首先我们必须对DS18B20进行复位操作,就是单片机给芯片数据线至少480us的低电平,当DS18B20收到复位信号后,会给单片机15~60us的存在脉冲。
2存在脉冲:
在进行完复位操作后,应立即将电平拉高,以便接收存在脉冲,存在脉冲时间为60~200us的低电平信号。
至此建立基本通信。
3ROM操作:
本设计暂时不用,不做详细介绍。
4存储器操作指令:
在芯片匹配完成后,接下来就是存储器操作。
指令共8为6条,指令代表着芯片将进行什么样的工作,是芯片的关键。
5执行读写:
指令和温度数据都是通过对芯片的读写操作进行的,应严格按照数据手册时序图。
温度传感器硬件连接:
DS18B20为单总线连接,只需接电源和地,将数据线连接在单片机IO口即可,因为DS18B20内部开漏,所以需加10K的上拉电阻,以保证温度传感器正常工作。
也可以连接寄生电源模式,此处不用不做详细介绍。
操作时序图:
1复位及应答时序:
2写时序:
3读时序:
注:
未尽说明详见达拉斯官方英文数据手册。
一、单片机
单片机介绍:
单片机采用STC89C52,PDIP-40封装。
该单片机是STC推出的新一代高速、低功耗、超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟和6时钟可任意选择,HD版本和90C版本内部集成MAX810专用复位电路。
单片机参数:
型号:
STC89C52RCPDIP-40
工作电压:
5.5-3.3V
最高时钟频率:
0-80M
Flash:
8K
SRAM:
512
定时器:
3个
UART串口:
1个
DPTR:
2
EEPRM:
4K
看门狗:
有
中断源:
8个
中断优先级:
4级
IO:
35/39
掉电唤醒中断:
4个
内置复位:
有
封装:
40-PinPDIP44-PinLQFP/PLCC
引脚图:
电路连接图:
最小系统:
注:
更多详细资料参考STC官网数据手册
三、晶振
介绍:
此系统采用12M高精度晶振,接与单片机18、19脚,并接30pf电容对地,帮助晶振起振,使系统更稳定。
电路:
四、复位电路
系统正常工作必要条件,上电自动复位。
五、继电器控制电路
因为单片机IO端口输出电流较小,故需三极管对其驱动,为缩小体积三极管使用贴片型S8550。
当控制端输出低电平,三极管饱和导通使继电器吸合,继电器在断电时会产生感应电动势,为防止冲击损坏单片机和三极管,在继电器两端反向并联IN4148二极管以吸收感应电流。
继电器采用10A大功率继电器,可控制大功率电器,工作电压5V。
六、声光报警电路
声音报警使用采用5V有源蜂鸣器,使用S8550驱动发生,当温度达到上限和下限时均可报警,发出滴~滴~声。
光报警电路使用两只发光二极管分别显示上下限,报警时为常量,单片机IO直接驱动。
实际电路图:
蜂鸣器
二极管
七、键盘
按键使用4个5*5微动,功能分别是设置、加、减,第四个按键暂时不用,为日后系统升级预留,连接方式为独立按键。
电路图
八、电源
一个单片机系统离不开电源。
本系统有两种供电方式,一种使用5VUSB直接供电,一种使用9V叠层电池供电,经7805芯片稳压后,为系统提供5V电源,此为移动需求。
用一个双刀双掷开关切换。
九、显示部分
为实现人机交换离不开显示部分,此系统采用两个三位八段的数码管显示,显示方式为动态扫描,用两片74HC573锁存器分别驱动位和段,数码管为共阴数码管。
一十、整机电路:
第二部分、软件系统
/**********************************************************************************
程序名:
DS18B20温度计
设计者:
高鹏展
单位:
河南工业职业技术学院
编写时间:
2012年04月28日
硬件支持:
STC89C52RC
系统时钟:
12MHz
接口说明:
DS18B20总线接MCU的P2^2口
修改日志:
2012/4/2922:
00:
00实现小数-50.0~125.0测温功能下一步实现温度报警功能
2012/4/3017:
19:
00小数点BUG解决通过调整点的显示时间
2012/4/3019:
18:
00实现上下限温度设定
2012/4/3022:
00:
00上限蜂鸣报警
2012/5/0110:
05:
00取消蜂鸣器,定时器
2012/5/0221:
41:
00程序编写完毕
实现上下限温度设定,包括负温度
快速温度转换
精确小数点后一位
等
2012/5/1613:
55:
00制作实物修改接口定义
2012/5/0421:
00:
00功能完美实现
下一步计划使用EEPROM
2012/5/1714:
06:
00取消温度误差调整
BUG:
开机会显示85c2012/5/01此BUG解决开机读一次温度并延时
小数点过亮2012/4/3017:
19:
00小数点BUG解决通过调整点的显示时间
小数点过亮2012/4/3019:
10:
00小数点后加空显示问题完美解决
数码管还需要消影2012/4/3019:
00:
00解决
开定时器0会乱码不使用定时器实现蜂鸣器间隔响
备注:
版本V1.02012/5/2
默认上限26下限25
基于Keil4开发环境
**********************************************************************************/
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitled1=P1^0;//下限指示灯
sbitled2=P1^1;//上限指示灯
sbitJDQ1=P2^0;//下限继电器
sbitJDQ2=P2^1;//上限继电器
sbitFM=P2^5;//蜂鸣器
sbitSET=P3^4;//设置键
sbitjian=P3^5;//减键
sbitjia=P3^6;//加键
sbitDQ=P2^2;//定义总线接口
sbitwela=P2^7;//定义位锁存端
sbitdula=P2^6;//定义段锁存端
voidinit();//初始化总程序
voiddelay_18B20(uintt);//延时
ucharinit_DS18B20();//初始化
voidwrite_DS18B20(uchardat);//写数据
ucharread_DS18B20();//读数据
intreadtemp();//读取温度有符号型
voidtempp_18B20();//主程序温度处理
voidSET_alarm();//报警温度设置
inttempp;//定义运算变量
voidtemp_alarm();//温度报警
uintbai,shi,ge,dian;//定义温度位
ucharzf;//定义显示正负
intshangxian=500;//定义默认上限数值26C
intxiaxian=200;//定义默认下限数值25C
ucharMODE=0;//模式
uintt0;//用于蜂鸣器
voidMODE_SET();//模式设定
ucharcodeshu[]=//数码管表
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,//C
0x5e,0x79,0x71,
0x40,//显示"-"号16
0x00,//显示空,表示+17
0x76,//显示H18
0x38//显示L19
};
voiddisplay(uintaa,uintbb,uintcc,uintbai,uintshi,uintge);//数码管显示函数
voiddelay(uintz);//延时函数
voidyunsuan();//运算出温度各位的数值
voidmain()//主函数
{
init();//程序初始化
while
(1)//进入大循环
{
MODE_SET();
if(MODE==0)
{
tempp_18B20();//读回温度,判断温度正负,并进行处理
temp_alarm();//温度报警
yunsuan();//运算出要显示各位的数值
display(zf,bai,shi,ge,dian,12);//显示数值
}
else
{
SET_alarm();//报警温度设定
}
}
}
/******************主程序初始化********************/
voidinit()
{
dula=0;
wela=0;
zf=17;//默认显示正,即空
jia=1;
jian=1;
tempp_18B20();//读取一次温度跳过85C
wela=1;//初始化屏幕
P0=0xc0;
wela=0;
dula=1;
P0=0x40;
dula=0;//初始化屏幕
delay(1500);//转换温度延时大于750MS
}
/***************************************
函数:
精准延时函数
功能:
DS18B20延时函数,实现15uS倍数精准延时
参数:
z为定时时间长度
说明:
延时公式:
15(t+1)uS,晶振12MHz
需要加入头文件#include
****************************************/
voiddelay_18B20(uintt)
{
for(t;t>0;t--)
{
_nop_();_nop_();_nop_();_nop_();
}
_nop_();_nop_();
}
/***************DS18B20初始化函数******************/
ucharinit_DS18B20()
{
uchara;
DQ=1;
_nop_();//尽量短的延时
DQ=0;
delay_18B20(45);//延时700
DQ=1;
delay_18B20
(2);//延时45
a=DQ;
delay_18B20(11);//延时180
returna;//返回a的值
}
/******************写数据一个字节*****************/
voidwrite_DS18B20(uchardat)
{
ucharx;
for(x=0;x<8;x++)
{
DQ=0;
_nop_();
DQ=dat&0x01;
delay_18B20
(1);//延时30
DQ=1;
_nop_();//稍微延时
dat>>=1;
}
}
/*******************读数据一个字节*****************/
ucharread_DS18B20()
{
ucharx,dat;
DQ=1;
_nop_();
for(x=0;x<8;x++)
{
DQ=0;
delay_18B20(0);//延时151以上
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay_18B20
(2);//延时45
DQ=1;
_nop_();//高电平恢复期
}
returndat;//返回dat
}
/****************读取温度*****************/
intreadtemp()
{
intx,y,temp;
floattt=0;//定义浮点运算
init_DS18B20();//初始化
write_DS18B20(0xcc);//跳过ROM
write_DS18B20(0x44);//温度转换
init_DS18B20();//初始化
write_DS18B20(0xcc);//跳过ROM
write_DS18B20(0xbe);//读出寄存器值
x=read_DS18B20();//读出低八位
y=read_DS18B20();//读出高八位
temp=y;//高八位赋给temp
temp<<=8;//高八位左移
temp=temp|x;//高低八位组合
tt=temp*0.0625;//转换温度值
temp=tt*10;//放大10倍输出
returntemp;//返回温度
}
/***************显示函数*********************/
voiddisplay(uintaa,uintbb,uintcc,uintbai,uintshi,uintge)//先段
{
dula=1;
P0=shu[aa];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
P0=0x00;
delay(4);//第一位
dula=1;
P0=shu[bb];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
P0=0x00;
delay(4);//第二位
dula=1;
P0=shu[cc];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
P0=0x00;
delay(4);//第三位
dula=1;
P0=shu[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
P0=0x00;
delay(4);//第百位
dula=1;
P0=shu[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
P0=0x00;
delay(4);//第十位
dula=1;
P0=shu[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
P0=0x00;
delay(4);//第个位
dula=1;
P0=0x80;
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
P0=0x00;
delay
(2);//显示点
dula=1;
P0=0x00;
dula=0;
P0=0xff;
wela=1;
P0=0xff;
wela=0;
P0=0x00;
delay(4);//空显示
}
/*********************延时************************/
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=50;y>0;y--);
}
/********************温度处理*************************/
voidtempp_18B20()
{
tempp=readtemp();//将温度值赋给tempp调整误差0.3C此处不在调整误差
if(tempp<0)//判断温度值正负
{
zf=16;//显示符号负温度
tempp=0-tempp;
}
else
{
zf=17;//显示+
}
}
/***************运算出温度各位的数值**************/
voidyunsuan()
{
bai=tempp/1000;
shi=tempp%1000/100;
ge=tempp%100/10;
dian=tempp%10;
}
/****************温度报警程序*********************/
voidtemp_alarm()
{
if(tempp>=shangxian||tempp<=xiaxian)
{
t0++;
if(tempp>=shangxian)//上限
{
led2=0;
JDQ2=0;
led1=1;
JDQ1=1;
}
if(tempp<=xiaxian)//下限
{
led1=0;
JDQ1=0;
led2=1;
JDQ2=1;
}
}
else
{
led2=1;
JDQ2=1;
led1=1;
JDQ1=1;
FM=1;
}
if(t0==30)
{
t0=0;
FM=~FM;
}
}
/**********************模式设定***********************/
voidMODE_SET()
{
if(SET==0)
{
delay(40);//延时15ms
if(SET==0)
{
MODE++;
if(MODE>=3)
MODE=0;
while(SET==0);
delay(20);
while(SET==0);
}
}
}
/*********************报警温度设置*******************/
voidSET_alarm()
{
intsx,xx;
sx=shangxian;
xx=xiaxian;
if(MODE==1)
{
if(shangxian>=0)
{
display(18,shangxian/1000,shangxian%1000/100,shangxian%100/10,shangxian%10,12);//上限设置H最后显示C
}
else
{
sx=0-sx;
display(18,16,sx/100,sx%100/10,sx%10,12);//上限设置H最后显示C
}
}
if(MODE==2)
{
if(xiaxian>=0)
{
display(19,xiaxian/1000,xiaxian%1000/100,xiaxian%100/10,xiaxian%10,12);//下限设置L最后显示C
}
else
{
xx=0-xx;
display(19,16,xx/100,xx%100/10,xx%10,12);//下限设置L最后显示C
}
}
if(jia==0)//加键
{
delay(30);
if(jia==0)
{
if(MODE==1)//模式1时,上限加
{
shangxian+=10;
if(shangxian>=1250)
shangxian=1250;
while(jia==0);
delay(10);
while(jia==0);
}
if(MODE==2)
{//模式2时,上限加
xiaxian+=10;
if(xiaxian>=shangxian)
xiaxian=shangxian;
while(jia==0);
delay(10);
while(jia==0);
}
}
}
if(jian==0)//减键
{
delay(30);
if(jian==0)
{
if(MODE==1)//模式1时,上限减
{
shangxian-=10;
if(shangxian<=xiaxian)
shangxian=xiaxian;
while(jian==0);
delay(10);
while(jian==0);
}
if(MODE==2)//模式2时,上限减
{
xiaxian-=10;
if(xiaxian<=-500)
xiaxian=-500;
while(jian==0);
delay(10);
while(jian=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DS18B20 课程设计