单号单片机课程设计报告.docx
- 文档编号:27578171
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:23
- 大小:332.38KB
单号单片机课程设计报告.docx
《单号单片机课程设计报告.docx》由会员分享,可在线阅读,更多相关《单号单片机课程设计报告.docx(23页珍藏版)》请在冰豆网上搜索。
单号单片机课程设计报告
单片机课程设计
课题名称:
基于DS18B20的温度测量
学生姓名:
吴彬
学生学号:
100012227
专业班级:
信科81002班
指导老师:
陈卫峰
设计时间:
2014年1月13日
摘要
目前,单片机已经在测控领域中获得了广泛的应用,它除了可以测量电信号以外,还可以用于温度、湿度等非电信号的测量,能独立工作的单片机温度检测、温度控制系统已经广泛应用很多领域。
单片机是一种特殊的计算机,它是在一块半导体的芯片上集成了CPU、存储器、RAM、ROM、及输入与输出接口电路。
由于单片机的集成度高,功能强,通用性好,特别是它具有体积小,重量轻,能耗低,价格便宜,可靠性高,抗干扰能力强和使用方便的优点,使它迅速的得到了推广应用,目前已成为测量控制系统中的优选机种和新电子产品中的关键部件。
单片机已不仅仅局限于小系统的概念,现已广泛应用于家用电器,机电产品,办公自动化用品,机器人,儿童玩具,航天器等领域。
本次课程设计,就是用单片机实现温度控制,传统的温度检测大多以热敏电阻为温度传感器,但热敏电阻的可靠性差,测量温度准确率低,而且必须经过专门的接口电路转换成数字信号才能由单片机进行处理。
下面利用数字温度传感器DS18B20设计并制作了一款基于STC89C52的3位数码管显示的数字温度计,其电路简单,软硬件结构模块化,易于实现。
现代社会生活中,多功能的数字温度计可以给我们的生活带来很大的方便。
支持“单总线”接口的温度传感器简化了数字温度计的设计,降低了成本,以美国MAXIM/DALLAS半导体公司的单总线温度传感器DS18B20为核心,以STC89C52为控制器设计的DS18B20温度控制器结构简单、测温准确、具有一定控制功能的智能温度控制器。
该数字温度计利用DS18B20数字温度传感器获得的温度直接送入单片机,然后单片机STC89C52对其进行温度处理变换,最后将温度值显示在D1、D2、D3共3位七段码LED数码管上。
关键词:
STC89C52单片机,DS18B20数字温度传感器
一、设计原理
在单片机技术的基础上根据数字温度传感器DS18B20的结构特点、工作原理和通信协议设计数字温度计,同时结合软件编程实现温度采集并显示的功能。
该系统由三个模块组成:
主控制器、测温电路及显示电路。
其系统结构如图所示:
STC89C52
主
控
制
器
显示电路
晶振电路
LED和按键电路
复位电路
扫描驱动
DS18B20
设计的数字温度计控制器采用单片机STC89C52,温度传感器为DS18B20,三位共阳极LED数码管以动态扫描法实现温度显示,STC89C52的P2口接8个470欧姆的电阻作为三位数码管的段选,P3.4-P3.6接三极管驱动数码管工作,P0.0接温度传感器的DQ端实现通信。
二、硬件设计
2.1、元器件介绍
1.DS18B20温度传感器
DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。
与传统的热敏电阻相比,它能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
可以分别在93.75ms和750ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。
因而使用DS18B20可使系统结构更趋简单,可靠性更高。
他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。
DS18B20
DS18B20详细引脚功能描述
序号
名称
引脚功能描述
1
GND
地信号
2
DQ
数据输入/输出引脚。
开漏单总线接口引脚。
当被用着在寄生电源下,也可以向器件提供电源。
3
VDD
可选择的VDD引脚。
当工作于寄生电源时,此引脚必须接地。
DS18B20的内部结构如下图:
图DS18B20内部结构
64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。
温度报警触发器TH和TL,可通过软件写入户报警上下限。
DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。
如下图,头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。
第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。
DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。
低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。
高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。
第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。
温度LSB
温度MSB
TH用户字节1
TL用户字节2
配置寄存器
保留
保留
保留
CRC
图 DS18B20字节定义
当DS18B20接收到温度转换命令后,开始启动转换。
转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。
单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。
当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。
表1列出了数据输出与温度的对应关系
表1 数据输出与温度对应值表
温度/℃
二进制表示
十六进制表示
+125
0000011111010000
07D0H
+85
0000010101010000
0550H
+25.0625
0000000110010000
0191H
+10.125
0000000010100001
00A2H
+0.5
0000000000000010
0008H
0
0000000000001000
0000H
-0.5
1111111111110000
FFF8H
-10.125
1111111101011110
FF5EH
-25.0625
1111111001101111
FE6FH
-55
1111110010010000
FC90H
由表2可见,DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数
据转换时间越长。
因此,在实际应用中要将分辨率和转换时间权衡考虑。
表2DS18B20温度转换时间表
DS18B20完成温度转换后,就把测得的温度值与RAM中的TH、TL字节内容作比较。
若T>TH或T<TL,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令作出响应。
因此,可用多只DS18B20同时测量温度并进行报警搜索。
另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。
系统对DS18B20的各种操作按协议进行。
操作协议为:
初使化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。
DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。
另一种是寄生电源供电方式,单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。
当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us。
采用寄生电源供电方式时VDD端接地。
由于单线制只有一根线,因此发送接口必须是三态的。
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。
DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。
该协议定义了几种信号的时序:
初始化时序、读时序、写时序。
所有时序都是将主机作为主设备,单总线器件作为从设备。
而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。
数据和命令的传输都是低位在先。
DS18B20的复位时序
DS18B20的读时序:
对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。
DS18B20在完成一个读时序过程,至少需要60us才能完成。
DS18B20的写时序:
对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。
2.STC89C52控制芯片
STC89C52是一种带8K字节闪烁可编程可檫除只读存储器(FPEROM-FlashProgramableandErasableReadOnlyMemory)的低电压,高性能COMOS8的微处理器,俗称单片机。
该器件采用ATMEL搞密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
STC89C52具体介绍如下:
①主电源引脚(2根)
VCC(Pin40):
电源输入,接+5V电源
GND(Pin20):
接地线
②外接晶振引脚(2根)
XTAL1(Pin19):
片内振荡电路的输入端
XTAL2(Pin20):
片内振荡电路的输出端
③控制引脚(4根)
RST/VPP(Pin9):
复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。
ALE/PROG(Pin30):
地址锁存允许信号
PSEN(Pin29):
外部存储器读选通信号
EA/VPP(Pin31):
程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。
④可编程输入/输出引脚(32根)
STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。
PO口(Pin39~Pin32):
8位双向I/O口线,名称为P0.0~P0.7
P1口(Pin1~Pin8):
8位准双向I/O口线,名称为P1.0~P1.7
P2口(Pin21~Pin28):
8位准双向I/O口线,名称为P2.0~P2.7
P3口(Pin10~Pin17):
8位准双向I/O口线,名称为P3.0~P3.7
2.2电路原理图
a.电源电路
利用7805三端稳压IC来组成稳压电源所需的外围器件极少,电路内部还有过流、过热及调整管的保护,使用起来可靠方便,而且价格便宜。
7805稳定输出+5V电压,最大输出电流1.5A,提供电源电路。
b.时钟电路
STC89C52内部有一个用于构成振荡器的高增益反相放大器,时钟电路如图4—2(a)所示。
定时元件通常采用石英晶体和电容组成的并联谐振回路。
晶体振荡频率可以在1.2~12MHz之间选择,电容值在5~30pF之间选择,电容值的大小可对频率起微调的作用。
电路如下图:
c.复位电路
(1)复位操作
复位是单片机的初始化操作。
其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序。
除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位键重新启动。
(2)复位信号及其产生
RST引脚是复位信号的输入端。
复位信号是高电平有效,其有效时间应持续24个振荡周期(即二个机器周期)以上。
若使用频率为12MHz的晶振,则复位信号持续时间应超过2us
才能成复位操作。
采用按键手动电平复位,它是通过使复位端经电阻与Vcc电源接通而实现的,其电路如图所示:
d.LED和按键电路
P1.0和P1.2口分别作为LED和按键的接口,LED的阳极接5V,按键另一端接地,用于测试P1口的通信是否正常,当按键按下去时,LED灯被点亮,说明P1口通信正常。
电路如图4:
e.排阻电路引脚图和串口下载电路
f.数码管电路
P3.4-P3.6分别接三极管S8550的基极b用于片选,P2口分别接数码管对应引脚用于段选显示相应的数字,当基极输入低电平时,表示该数码管被选通。
射极作为公共端统一接高电平。
三、软件设计
3.1、主程序流程图:
主要功能是负责温度的实时显示,读出并处理DS18B20测量的当前值。
3.2主要功能模块介绍
1.读温度流程图:
主要功能是读出RAM中的9字节中存放温度数据的0和1字节。
2.温度转换流程
主要功能:
发温度转换命令,当采用12位分辨率是转换转换时间约为750ms。
3.计算温度流程
主要功能:
将RAM中的数据进行BCD码的转换,并对温度的正负进行处理。
四、综合调试
通电测试,调试程序。
将程序通过串口下载到单片机中进行调试和修改,改变传感器周围环境的温度,观察数码管示数是否变化。
注意:
请勿全部焊接完成之后再去调试。
最好焊接一部分,调试成功后再去焊接接下一部分。
比如:
先焊接电源部分,焊完之后去测量有没有+5V输出。
然后再去焊接单片机最小系统,测试最小系统能够下载程序并能够运行之后,再去焊接剩余。
五、总结
经过几天的努力,终于完成了数字温度计的设计,虽然没有完全达到设计要求,但从心底里说,还是比较高兴的。
从这次的课程设计中,我了解了如何去实现一个小的系统,从底层的硬件设计到高层的应用来实现所需要的功能。
硬件设计关键是器件的布局一定要合理,这样既方便走线也方便检查错误,软件的编程如何去实现局部电路的测试。
在读懂原理图的基础上进行电路的连接,这样更有利于去布局。
通过本次试验,我真真正正的意识到,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,C51程序设计是关键,良好的编程习惯有利于程序的修改,只有在不断的思考和编写的过程中才能提高,这就是我在这次课程设计中的最大收获,为以后的学习奠定了基础,增添了信心。
6、附录
一、按键和LED测试程序:
#include
sbitS1=P1^2;//将S1位定义为P1.2引脚
sbitLED0=P1^0;//将LED0位定义为P1.0引脚
voidmain(void)//主函数
{
LED0=0;//P1.0引脚输出低电平
while
(1)
{
if(S1==0)//P1.2引脚输出低电平,按键S1被按下
LED0=~LED0;//P1.0引脚取反
}
}
二、实时温度显示主程序:
#include"reg52.h"
#include"intrins.h"//_nop_();延时函数用
#defineDisdataP2//段码输出口
#definediscanP3//扫描口
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P0^0;//温度输入口
sbitDIN=P2^0;//LED小数点控制
uinth;
//**************温度小数部分用查表法***********//
ucharcodeditab[16]=
{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
ucharcodedis_7[12]=
{0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff,0xfd}
//共阳LED段码表"0""1""2""3""4""5""6""7""8""9""不亮""-"
ucharcodescan_con[3]={0xbf,0xdf,0xef};
uchardatatemp_data[2]={0x00,0x00};
uchardatadisplay[4]={0x00,0x00,0x00,0x00};
/***********11微秒延时函数**********/
voiddelay(uintt)
{for(;t>0;t--);}
/***********显示扫描函数**********/
scan()
{
chark;
for(k=0;k<3;k++)//三位LED扫描控制
{
Disdata=0xff;//段码口不输出
Disdata=dis_7[display[k]];
if(k==1){DIN=0;}
discan=scan_con[k];delay(90);
discan=0xff;
}
}
/***********18B20复位函数**********/
ow_reset(void)
{
charpresence=1;
while(presence)
{
DQ=1;_nop_();_nop_();
DQ=0;
delay(50);//550us
DQ=1;
delay(6);//66us
presence=DQ;//presence=0继续下一步
}
delay(45);//延时500us
presence=~DQ;
DQ=1;
}
/**********18B20写命令函数*********/
voidwrite_byte(ucharval)
{
uchari;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
DQ=val&0x01;//最低位移出
delay(6);//66us
val=val/2;//右移一位
}
DQ=1;
delay
(1);
}
/*********18B20读1个字节函数********/
ucharread_byte(void)
{
uchari;
ucharvalue=0;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
value>>=1;//右移一位赋给value
DQ=0;
_nop_();_nop_();_nop_();_nop_();//4us
DQ=1;_nop_();_nop_();_nop_();_nop_();//4us
if(DQ)value|=0x80;
delay(6);//66us
}
DQ=1;
return(value);
}
/***********读出温度函数**********/
read_temp()
{ow_reset();//总线复位
write_byte(0xCC);//发SkipROM命令
write_byte(0xBE);//发读命令
temp_data[0]=read_byte();//温度低8位
temp_data[1]=read_byte();//温度高8位
ow_reset();
write_byte(0xCC);//SkipROM
write_byte(0x44);//发转换命令
}
/***********温度数据处理函数**********/
voidwork_temp()
{
ucharn=0;
display[3]=(temp_data[0]&0xf0)>>4;
Temp_data[2]=display[3];
if(!
display[2])
{
display[2]=0x0a;
flag3=0;
if(!
display[1])
{
display[1]=0x0a;
flag2=0;
}
}//最高位为0时都不显示
if(n)
{display[2]=0x0b;//负温度时最高位显示"-"
flag3=0;}
}
/**************主函数****************/
main()
{
Disdata=0xff;//初始化端口
discan=0xff;
for(h=0;h<3;h++){display[h]=8;}//开机显示888
ow_reset();//开机先转换一次
write_byte(0xCC);//SkipROM
write_byte(0x44);//发转换命令
for(h=0;h<500;h++)
{scan();}//开机显示"888"2秒
while
(1)
{
read_temp();//读出18B20温度数据
work_temp();//处理温度数据
scan();//显示温度值2秒
}
}
七、参考文献
《基于单片机的嵌入式系统工程设计》窦振中编著中国电力出版社
《单片机的C语言应用程序设计》马忠梅等编著北京航空航天大学出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单号 单片机 课程设计 报告