《单片机课程设计报告-基于单片机的数字温度计设计.doc》由会员分享,可在线阅读,更多相关《单片机课程设计报告-基于单片机的数字温度计设计.doc(23页珍藏版)》请在三一文库上搜索。
1、单片机课程设计报告 基于单片机的数字温度计设计 1 绪论2 方案设计3 系统的硬件设计3.1 主控制器3.2 显示电路3.3 温度传感器工作原理3.4 温度传感器接口电路4 系统的软件设计4.1 主程序4.2 温度测量4.2.1 初始化DS18B204.2.2 等待应答信号4.2.3 DS18B20读字节4.2.4 DS18B20写字节4.2.5 启动温度测量4.2.6 读取测量结果4.2.7各算法流程图4.3 数码管显示5 系统的测试与总结参考文献附录1 原理图附录2 源程序清单1 绪 论随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数
2、字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。 现代社会对各种信息参数的准确度和精确度的要求都有了几何级的增长,而如何准确而又迅速的获得这些参数就需要受制于现代信息基础的发展水平。在三大信息信息采集(即传感器技术)、信息传输(通信技术)和信息处理(计算机技术)中,传感器属于信息技术的前沿尖端产品,尤其是温度传感器技术,在我国各领域已经引用的非常广泛,可以说是渗透到社会的每一个领域,人民的生活与环境的温度息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量
3、,因此研究温度的测量方法和装置具有重要的意义。测量温度的关键是温度传感器,温度传感器的发展经历了三个发展阶段:传统的分立式温度传感器模拟集成温度传感器智能集成温度传感器。目前的智能温度传感器(亦称数字温度传感器)是在20世纪90年代中期问世的,它是微电子技术、计算机技术和自动测试技术(ATE)的结晶,特点是能输出温度数据及相关的温度控制量,适配各种微控制器(MCU)。社会的发展使人们对传感器的要求也越来越高,现在的温度传感器正在基于单片机的基础上从模拟式向数字式,从集成化向智能化、网络化的方向飞速发展,并朝着高精度、多功能、总线标准化、高可靠性及安全性、开发虚拟传感器和网络传感器、研制单片测温
4、系统等高科技的方向迅速发展,本文将介绍智能集成温度传感器DS18B20的结构特征及控制方法,并对以此传感器,89S51单片机为控制器构成的数字温度测量装置的工作原理及程序设计作了详细的介绍。与传统的温度计相比,其具有读数方便,测温范围广,测温准确,输出温度采用数字显示,主要用于对测温要求比较准确的场所,或科研实验室使用。该设计控制器使用ATMEL公司的AT89S52单片机,测温传感器使用DALLAS公司DS18B20,用数码管来实现温度显示。2方案设计本设计主要是介绍了单片机控制下的温度检测系统,详细介绍了其硬件和软件设计,并对其各功能模块做了详细介绍,其主要功能和指标如下:利用温度传感器(D
5、S18B20)测量某一点环境温度测量范围为-55125,精度为0.5用数码管进行实际温度值显示采用AT89S52单片机P3 .5口控制温度传感器DS18B20的温度测量,以四位数码感形式输出测量温度,原理图如下图1.1所示: 图2.1 DS18B20与单片机接口原理 图2.2总体设计方框图 3 系统的硬件设计 3.1 主控制器 AT89S52 是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash 存储器。使用Atmel 公司高密度非 易失性存储器技术制造,与工业80C51 产品指令和引脚完 全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有
6、灵巧的8 位CPU 和在系统 可编程Flash,使得AT89S52为众多嵌入式控制应用系统提 供高灵活、超有效的解决方案。AT89S52具有以下标准功能: 8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口, 片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻 辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工 作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。8
7、位微控制器 8K 字节在系统可编程 Flash AT89S52 图3.1 时钟电路与复位电路3.2显示电路 显示采用4位数码管,图3.2.1为数码管段驱动,图3.2.2为数码管位驱动,图3.2.3为温度显示电路 图3.2.1数码管段驱动 图3.2.2数码管位驱动 图3.2.3温度显示电路3.3 温度传感器工作原理DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现位的数字值读数方式。DS18B20的性能特点如下: 独特的单线接口仅需一个端口引脚进行通讯 简单的多点分布应
8、用 无需外部器件 可通过数据线供电 零待机功耗 测温范围-55+125,以0.5递增。华氏器件-67+2570F,以0.90F 递增 温度以9 位数字量读出 温度数字量转换时间200ms(典型值) 用户可定义的非易失性温度报警设置 报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列、各种封装形式如图 3.3.1所示,DQ 为数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源;GND为地信号;VDD为可选择的VDD引
9、脚。当工作于寄生电源时,此引脚必须接地。其电路图 3.3.2所示.。 图 3.3.1外部封装形式 图3.3.2传感器电路图DS18B20的测温原理如图3.3.3所示,图中低温度系数晶振的振荡频率受温度的影响很小用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量.计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55 所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在
10、-55 所对应的一个基数值。减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器 1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温图2中的斜率累加器用于补偿和修正测温过程中的非线性其输出用,于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。另外,由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时序很重要。系统
11、对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲)发ROM功能命令发存储器操作命令处理数据。图3.3.3 DS18B20测温原理图在正常测温情况下,DS1820的测温分辨力为0.5,可采用下述方法获得高分辨率的温度测量结果:首先用DS1820提供的读暂存器指令(BEH)读出以0.5为分辨率的温度测量结果,然后切去测量结果中的最低有效位(LSB),得到所测实际温度的整数部分Tz,然后再用BEH指令取计数器1的计数剩余值Cs和每度计数值CD。考虑到DS1820测量温度的整数部分以0.25、0.75为进位界限的关系,实际温度Ts可用下式计算: 3.4 温度传感器
12、接口电路 图3.4.1温度传感器接口电路4 系统的软件设计4.1 主程序/*- 主函数 -*/void main()while(1)Convert(); /调用启动温度转换函数RdTemp(); /调用读取温度值函数 4.2 温度测量4.2.1 初始化DS18B20/*- 初始化DS18B20 -*/void TxReset() uint i;DQ=0;/发送复位脉冲i=100;while(i0) i-; /拉低900us DQ=1; /释放总线i=4;while(i0) i-;4.2.2 等待应答信号/*- 等待DS18B20应答 -*/void RxWait() uint i;while(
13、DQ); /等待15-60uswhile(DQ); /DS18B20发出存在脉冲60-240usi=4;while(i0) i-;4.2.3 DS18B20读字节/*- 读取一位数据 -*/bit RdBit()uchar i;bit b;DQ = 0; /读开始1usi+;DQ = 1; /产生读时间隙15usi+;i+;b = DQ; /读位i = 8;while(i0) i-; /等待60usDQ = 1; /释放总线return b;/*- 读取字节数据 -*/uchar RdByte()uchar i,j,d;d=0;for(i=0;i8;i+) /各位由低向高读出DS18B20j=
14、RdBit();d=(j1);return d;4.2.4 DS18B20写字节/*- 写入字节数据 -*/void WrByte(uchar d)uint i;uchar j;bit btmp;for(j=0;j1;if(btmp) /写1DQ=0; /延时15usi+;i+;DQ=1; /写1时隙不低于60ui=8;while(i0) i-;else /写0DQ=0;i=8;while(i0) i-; /保持低电平60us到120usDQ=1; /释放总线i+;i+;4.2.5 启动温度测量/*- 启动温度测量-*/void Convert()uint i;Delay(125); /延时1
15、msTxReset(); /初始化DS18B20RxWait(); /等待DS18B20答应Delay(125); /延时WrByte(0xcc); /跳过ROM命令WrByte(0x44); /温度转换命令for(i=0;i250;i+) /延时1sDisplay();4.2.6 读取测量结果/*- 读取温度值 -*/void RdTemp(void)short int temp;uint x;bit flag = 1;TxReset(); /初始化DS18B20RxWait(); /等待DS18B20应答Delay(125); /延时WrByte(0xcc); /跳过ROM命令WrByte
16、(0xbe); /读暂存存储器命令templow = RdByte(); /温度值低字节,低4位为小数temphigh = RdByte(); /温度值高字节temp = (temphigh 8) | templow; /温度为16位补码if(temp 4; /温度值整数 x = temp & 0x000f; tempxiao = (x*10)/16; /温度值小数if(flag) /正温度disp0 = tempzheng/100; /百位else /负温度disp0 = 16; /负号disp1 = (tempzheng%100)/10; /十位disp2 = tempzheng%10;
17、/个位disp3 = tempxiao; /小数 4.2.7各算法流程图图 4.2.7.1DS18B20初始化流程图 图4.2.7.2主程序流程图 开始温度零下?温度值取补码置“”标志计算小数位温度BCD值 计算整数位温度BCD值 结束置“+”标志NY 发DS18B20复位命令发跳过ROM命令发温度转换开始命令 结束图4.2.7.3 温度转换流程图 图4.2.7.4计算温度流程图 开始温度零下?温度值取补码置“”标志计算小数位温度BCD值 计算整数位温度BCD值 结束置“+”标志NY图4.2.7.5显示数据刷新流程图4.3 数码管显示/*- 数码管显示 -*/void Display() uc
18、har i,j; j=0x08;for(i=0;i1; /调整位码 Delay(125);P0=0x00; 5 系统的测试与总结5.1 测试时的图片 图5.1.1温度传感器 图5.1.2测试时室内温度显示 图5.1.3测试时手握住传感器时的温度显示5.2总结 通过近两个星期的单片机课程设计,我终于完成了“基于单片机的数字温度计设计”,心中不免有些高兴,但高兴之余也有我值得深思的。 虽然以前做过类似的实验,但这次的课程设计还是让我学到了很多东西,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法。有好多的东西,只有我们去试着做了,才能真正的掌握,只学习理论有些东西是很难理解的,更谈不
19、上掌握。通过这次的单片机课程设计我认识到了,学习要理论联系实际,把学到的理论知识同实际运用相结合,才能是我们的知识融汇贯通,才能真正的学到知识,真正的做到学以致用。附录1 原理图附录2 源程序清单#include #define ulong unsigned long#define uint unsigned int#define uchar unsigned charuchar code led= 0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0, 0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x02,0x00 ; /数码管码
20、表uchar disp4=1,2,3,4; /数码管显示缓冲区/数码管位选P1低四位,段选P0sbit LOCK=P14; /74573锁存端sbit DQ=P35; /DS18B20数据端uchar templow; /温度值低字节uchar temphigh; /温度值高字节char tempzheng; /温度值整数char tempxiao; /温度值小数void Delay(uint x);void Display();void TxReset();void RxWait();bit RdBit();uchar RdByte();void WrBit(bit b);void WrBy
21、te(uchar d);void Convert();void RdTemp();sbit ACC0 = ACC0;sbit ACC7 = ACC7;/*- 主函数 -*/void main()while(1)Convert(); /调用启动温度转换函数RdTemp(); /调用读取温度值函数/*- 初始化DS18B20 -*/void TxReset() uint i;DQ=0;/发送复位脉冲i=100;while(i0) i-; /拉低900us DQ=1; /释放总线i=4;while(i0) i-;/*- 等待DS18B20应答 -*/void RxWait() uint i;whil
22、e(DQ); /等待15-60uswhile(DQ); /DS18B20发出存在脉冲60-240usi=4;while(i0) i-;/*- 读取一位数据 -*/bit RdBit()uchar i;bit b;DQ = 0; /读开始1usi+;DQ = 1; /产生读时间隙15usi+;i+;b = DQ; /读位i = 8;while(i0) i-; /等待60usDQ = 1; /释放总线return b;/*- 读取字节数据 -*/uchar RdByte()uchar i,j,d;d=0;for(i=0;i8;i+) /各位由低向高读出DS18B20j=RdBit();d=(j1)
23、;return d;/*- 写入字节数据 -*/void WrByte(uchar d)uint i;uchar j;bit btmp;for(j=0;j1;if(btmp) /写1DQ=0; /延时15usi+;i+;DQ=1; /写1时隙不低于60ui=8;while(i0) i-;else /写0DQ=0;i=8;while(i0) i-; /保持低电平60us到120usDQ=1; /释放总线i+;i+;/*- 启动温度转换 -*/void Convert()uint i;Delay(125); /延时1msTxReset(); /初始化DS18B20RxWait(); /等待DS18
24、B20应答Delay(125); /延时WrByte(0xcc); /跳过ROM命令WrByte(0x44); /温度转换命令for(i=0;i250;i+) /延时1sDisplay();/*- 读取温度值 -*/void RdTemp(void)short int temp;uint x;bit flag = 1;TxReset(); /初始化DS18B20RxWait(); /等待DS18B20应答Delay(125); /延时WrByte(0xcc); /跳过ROM命令WrByte(0xbe); /读暂存存储器命令templow = RdByte(); /温度值低字节,低4位为小数te
25、mphigh = RdByte(); /温度值高字节temp = (temphigh 8) | templow; /温度为16位补码if(temp 4; /温度值整数 x = temp & 0x000f; tempxiao = (x*10)/16; /温度值小数if(flag) /正温度disp0 = tempzheng/100; /百位else /负温度disp0 = 16; /负号disp1 = (tempzheng%100)/10; /十位disp2 = tempzheng%10; /个位disp3 = tempxiao; /小数 /*- 延时 -*/void Delay(uint x)uint i;for(i=x;i0;i-);/*- 数码管显示 -*/void Display() uchar i,j; j=0x08;for(i=0;i1; /调整位码 Delay(125);P0=0x00;