单片机课程设计高精度数字式温度传感器

上传人:仙*** 文档编号:30466033 上传时间:2021-10-10 格式:DOC 页数:24 大小:1.12MB
返回 下载 相关 举报
单片机课程设计高精度数字式温度传感器_第1页
第1页 / 共24页
单片机课程设计高精度数字式温度传感器_第2页
第2页 / 共24页
单片机课程设计高精度数字式温度传感器_第3页
第3页 / 共24页
点击查看更多>>
资源描述
自动化与电气工程学院单片机课程设计目录1. 引言12. 设计方案及原理23. 硬件设计33.1 单片机最小系统33.2 液晶(1602)显示电路33.3 DS18B20数字温度计43.4 AT89C51单片机43.5 系统主电路图54. 软件设计64.1 主程序流程图64.2 初始化流程图64.3 显示函数85. 总结96. 参考文献11附录 A 1602内部的字符集12附录 B 源程序代码13 - 22 -自动化与电气工程学院单片机课程设计1. 引言随着“信息时代”的到来,作为获取信息的手段传感器技术得到了显著的进步,其应用领域越来越广泛,对其要求越来越高,需求越来越迫切。传感器技术已成为衡量一个国家科学技术发展水平的重要标志之一。因此,了解并掌握各类传感器的基本结构、工作原理及特性是非常重要的。由于传感器能将各种物理量、化学量和生物量等信号转变为电信号,使得人们可以利用计算机实现自动测量、信息处理和自动控制,但是它们都不同程度地存在温漂和非线性等影响因素。传感器主要用于测量和控制系统,它的性能好坏直接影响系统的性能。因此,不仅必须掌握各类传感器的结构、原理及其性能指标,还必须懂得传感器经过适当的接口电路调整才能满足信号的处理、显示和控制的要求,而且只有通过对传感器应用实例的原理和智能传感器实例的分析了解,才能将传感器和信息通信和信息处理结合起来,适应传感器的生产、研制、开发和应用。另一方面,传感器的被测信号来自于各个应用领域,每个领域都为了改革生产力、提高工效和时效,各自都在开发研制适合应用的传感器,于是种类繁多的新型传感器及传感器系统不断涌现。温度传感器是其中重要的一类传感器。其发展速度之快,以及其应用之广,并且还有很大潜力。为了提高对传感器的认识和了解,尤其是对温度传感器的深入研究以及其用法与用途,基于实用、广泛和典型的原则而设计了本系统。本文利用单片机结合传感器技术而开发设计了这一温度采集监控系统。美国DALLAS公司的DS18B20数字温度传感器是一种可组网的高精度数字式温度传感器,由于其具有单总线的独特优点,可以使用户轻松地组建起传感器网络,并可使多点温度测量电路变得简单、可靠。本文结合实际使用经验,介绍了DS18B20数字温度传感器在单片机下的硬件连接及软件编程,并给出了软件流程图。为了便于观察,即监控,读回来的温度值会在液晶屏上显示。单片机芯片使用的是ATMEL公司的AT89C51单片机。它的时钟频率可达24MHz。而本设计所使用的时钟频率为12MHz,这个频率在其它型号的单片机上也能使用,便于系统移植。2. 设计方案及原理在温度采集系统中,传统的测温方法是将模拟信号远距离采样进行A/D转换,而为了获得较高的测温精度,就必须采用措施解决由长线传输,多点测量切换及放大电路零点漂移等造成的误差补偿问题。采用数字温度芯片DS18B20测量温度,输出信号全数字化。便于单片机处理及控制,省去传统的测温方法的很多外围电路。且该芯片的物理化学性很稳定,它能用做工业测温元件,此元件线形较好。在-10+85时的测量精度为-0.5。DS18B20的最大特点之一采用了单总线的数据传输,由数字温度计DS18B20和微控制器AT89C51构成的温度测量装置,它直接输出温度的数字信号,可直接与计算机连接。这样,测温系统的结构就比较简单,体积也不大,且由于单总线上可以带多个DS18B20,因此可以非常容易实现多点测量.轻松的组建传感器网络。本文为说明DS18B20的采集过程就用一个DS18B20,做单点温度采集。采用温度芯片DS18B20测量温度,可以体现系统芯片化这个趋势。部分功能电路的集成,使总体电路更简洁,搭建电路和焊接电路时更快。而且,集成块的使用,有效地避免外界的干扰,提高测量电路的精确度。所以集成芯片的使用将成为电路发展的一种趋势。本文应用这一温度芯片,也是顺应这一趋势。下面是系统整体框图:图 2-1 系统设计原理图3. 硬件设计3.1 单片机最小系统所谓单片机最小系统是指能让单片机运行程序的最小配置,包括时钟电路和复位电路。复位是单片机应用系统中不可或缺的操作,复位是使单片机处于某种确定的初始状态。单片机的工作就是从复位开始的。下面是复位操作的一种电路图:图 3-1 复位电路微型计算机执行指令是通过按序完成各种微操作,达到实现指令功能目的的。各指令的微操作在时间上是有严格的次序,这种微操作的时间次序称为时序。单片机的正常运行需要片外的时钟信号来为内部的各种微操作提高时间基准。而外部的时钟信号是由外部的时钟电路产生的,如下图:图 3-2 时钟电路3.2 液晶(1602)显示电路液晶显示技术在我们的日常生活中应用的很多。它的显著特点是:低压微功耗、平板型结构、被动显示、显示信息量大、易于彩色化、没有电磁辐射、寿命长等等。其原理图如下:图 3-3 1602液晶屏3.3 DS18B20数字温度计美国 DALLAS公司的DS18B20数字温度传感器是世界上第一种单总线设备。DQ端接在单总线上。与传统上的模拟温度计相比它所需的硬件资源少,连线简洁,可靠性高,抗干扰能力强。DS18B20的外部电源供电方式电路图如下:图 3-4 DS18B20的外部电源供电方式电路图3.4 AT89C51单片机当我们使用P0口作为I/O口时,必须在单片机外部添加上拉电阻,如下图排阻所示。图 3-5 接在P0口的上拉电阻下面是AT89C51单片机的管脚图,及与本设计有关的单片机管脚的定义:图 3-6 AT89C51的管脚及相关引脚定义3.5 系统主电路图通过对系统各个模块的分析设计,然后用总线将各个模块与单片机连接在一起,形成系统的主电路。本文硬件设计的特点是硬件接线简单、清楚。虽然硬件的复杂度得到降低,但却是通过一系列软件模块的加强来加以弥补。图 3-7 系统主电路图4. 软件设计本设计的软件设计部分都是采用C语言开发的。相比汇编语言来说,C语言开发的软件移植性好,容易阅读,更便于缩短开发周期。软件的整体设计是自底向上进行的,即先将各个子功能开发出来,然后将这些子功能嵌在一起。并且在后期的功能扩展时也比较方便,在单片机外围添加相应的外围电路,在程序中添加相应的模块就可以实现系统的扩展。4.1 主程序流程图下图是本设计的主流程图,它的流程简洁,让读者一阅便知系统的清晰结构:图 4-1 系统主程序流程图4.2 初始化流程图系统中的初始化分为系统初始化init_system(),DS18B20芯片的初始化init_DS18B20(),以及液晶的初始化init_LCD()。下面是它们各自的流程图:图 4-2 init_system()函数的流程图在初始化DS18B20的过程中,总线控制器(单片机)会将总线电位拉低,当低电平持续时间在480us到960us之间时复位信号有效。然后DS18B20等待15us到60us后在接下来的60us到240us产生应答信号。如下图初始化时序所示。图 4-3 初始化时序图下面的流程图就是根据上面的时序图来的。图 4-4 DS18B20初始化流程图对于液晶屏来说,初始化的目的是设定它的工作方式。液晶的控制以及数据的传输都是以字节为单位进行的,它的初始化流程图如下图所示。图 4-5 LCD初始化流程图4.3 显示函数显示函数的做用是将时间、日期、温度等信息显示在液晶屏上。因此,这部分也有三个部分组成,即,时间显示、日期显示、温度显示。下面是这三个函数的流程图。显示函数的主要功能是将时间、日期、温度函数的数据信息转换成相应的字符存放在字符数组中,然后将这些数据通过一定的顺序输入到液晶内部的RAM中,这样液晶得到信息后就将相应的信息显示在屏幕上。下面是它们的流程图。图 4-6 时间显示流程图图 4-7 日期显示流程图图 4-8 温度显示流程图5. 总结通过本次温度监控系统的设计,我大有收获,在制作过程中,一定要注意的每个工作步骤的检查,确保制作成功。比如在编写程序时一个微小的错误将导致程序不能正常运行,在仿真过程中将连线搭错将在仿真过程中得不到想要的结果。当系统真正出现错误时,首先从相对简单的电路原理图检查起(在程序通过编译后)看看电路是否出现问题,当电路连接无误后就要对程序的各个模块进行检查看看是不是算法及程序书写是不是存在问题,最后看看是不是设计过程中存在原理性错误。当然在实际过程中以上罗列的错误仅仅是比较常见的,其它的错误就不在这里赘述了,遇到后根据个人经验,有针对性的进行解决。这次课程设计历时2周,从一开始的确定课题,到后来的资料查找、理论学习,再有就是近来的调试和测试过程,这一切都使我的理论知识和动手能力进一步得到提高。在这次课程设计中我学会了单片机项目的开发过程,认识和掌握了1602液晶屏的控制以及DS18B20单线总线器件的控制。软件方面更加熟悉了Keil C51软件和Protues仿真软件的使用及将这两个软件联合起来快速开发单片机应用系统,为后面的学习积累了很多宝贵的经验。从得到题目到查找资料,从对题目的研究设定到Protues仿真调试失败后再一次全部重新开始在这一个充满挑战伴随挫折,充满热情伴随打击的过程中,我感触颇深,它已不仅是一个对我单片机学习情况和我的应用动手能力的检验,而且还是对我的钻研精神,面对困难的心态,做事的毅力和耐心的考验。我在这个过程中深刻的感受到了做课程设计的意义所在。本课题的重点、难点是:(1) 初步接触数字温度传感器,要对传感器的原理、结构、应用等各方面从头开始琢磨;(2) 初次尝试应用液晶做监控显示界面;(3) 熟悉单片机C语言编程;(4) 对DS18B20来说,它的控制先对较难,应为它有严格的时序要求,如果时序不对,那么控制器就不能将温度的数字量读到芯片内,更不能对DS18B20写控制指令,而液晶的显示要了解液晶的字符表(见附录A)。通过做本课题,我了解并掌握了传感器的基本理论知识,更深入的掌握单片机的开发应用和PC编程控制。为以后从事单片机软硬件产品的设计开发、PC软件开发打下了良好的基础,树立独立从事产品研发的信心,并在这种能力上得到了比较充分的锻炼。6. 参考文献1 周兴华.手把手教你学单片机C程序设计.北京航空航天大学出版社.20072 张天凡.51单片机C语言开发详解.电子工业出版社.20083 江志红.51单片机技术与应用系统开发案例精选.清华大学出版社.20084 汤竞南、沈国琴.51单片机C语言开发与实例.人民邮电出版社.20085 李华、王思明、张金敏.单片机原理及应用.兰州大学出版社.20016 李广弟.单片机基础.北京航空航天大学出版社.19947 丁向荣、贾萍.单片机应用系统与开发技术.清华大学出版社.20098 张萌、和湘、姜斌.单片机应用系统开发综合实例.清华大学出版社.2007 附录 A 1602内部的字符集 附录 B 源程序代码/*/* 工程名称:基于DS18B20的温度采集系统 */* 作 者:李 鹏 俊 */* 开发时间:2011年7月7日 */* 工程简介:本项目是我的单片机课程设计。它是将万年*/* 历及温度检测集为一体,然后显示在液晶屏上。用来实时显*/* 现场温度,以及用作监视的液晶屏。 */*/#include#include sbit lcdrs=P20; / 寄存器选择,低电平为指令寄存器,高电平为数据存储器sbit lcdrw=P21; / 低电平为数据写sbit lcden=P22; / 使能端,高脉冲使能指令或数据写unsigned char h=0; /计数50ms个数unsigned char code table0= Time:2011/7/7;unsigned char code table1= By Li Pengjun;unsigned char time17=07/07/2011 00:00; /初始时间设置int year=2011;unsigned char mou=7;unsigned char day=7;unsigned char code Table212=31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31,30,31;bit runnian=0; /为1表示闰年,否则为平年unsigned char hour=0;unsigned char min=0;unsigned char sec=1;/DS18B20sbit DQ=P27;unsigned char temph=0;/温度转换高位unsigned char templ=0;/温度转换低位bit flag=0;/flag=0,表示温度为正,相反温度为负int temputer=0;/温度为高三位整数和低四位小数表示unsigned char wendu16=T0: 25.0000 C;/由temputer转换正负由flag决定/*延时子程序*/void delay_ms(unsigned int ms)unsigned int x,y;for(x=ms;x0;x-)for(y=105;y0;y-);/*/* 温度传感器DS18B20 */*/*产生延时时间*/void delay(unsigned int us) /控制DS18B20的延时unsigned int i,j;for(i=0;ius;i+)for(j=0;j1;j+); /*DS18B20初始化*/unsigned char init_DS18B20(void)/初始化DS18B20unsigned char present;DQ=0;delay(29); DQ=1;delay(3);present=DQ;delay(25); /延时return present;/*读一个字节*/ unsigned char read_bit()/读一位unsigned char i;DQ=0;DQ=1;for(i=0;i3;i+);return DQ;unsigned char read_DS18B20(void) /读一个字节 /读一个位的时间60ust120usunsigned char temp=0,i=0;for(i=0;i8;i+)if(read_bit()temp|=0x01i;delay(1);return temp;/*写一个字节*/void write_bit(unsigned char date)/写一位DQ=0;if(date=1)DQ=1;delay(5);DQ=1;void write_DS18B20(unsigned char date) /写一个字节 /写一个位的时间60ust120usunsigned char i,j;for(i=0;ii)&0x01;write_bit(j);delay(1);/*DS18B20 温度转换*/void read_temputer() /读取转换的温度init_DS18B20(); /复位信号write_DS18B20(0xcc); write_DS18B20(0x44); /发送转换命令delay(15000); /等待转换完成init_DS18B20(); /复位write_DS18B20(0xcc); write_DS18B20(0xbe); /发送转换命令templ=read_DS18B20(); /读低8位temph=read_DS18B20(); /读高8位temputer=templ+temph*256;/将温度值转换成字符void wendu_h2d() /将温度值转换成相应的字符float tf;int tem_d; float tem_p;read_temputer(); /读取温度值if(temputer0)flag=1;temputer=0-temputer;tf=temputer*0.0625;elseflag=0;tf=temputer*0.0625;/上面分析温度正负,以及温度大小tem_d=(int)tf; /tem_d存放温度的整数部分 tem_p=tf-tem_d;if(tem_d/100) wendu5=(tem_d/100)+48;else wendu5= ; wendu4= ; tem_d=tem_d%100;if(tem_d/10) wendu6=(tem_d/10)+48;else if(wendu5!= ) wendu6=0; else wendu6= ; tem_d=tem_d%10;wendu7=tem_d+48; tem_d=(int)(tem_p*1000);if(tem_d/100)/十分位 wendu9=(tem_d/100)+48;else wendu9=0; tem_d=tem_d%100;if(tem_d/10) wendu10=(tem_d/10)+48;else wendu10=0; tem_d=tem_d%10;wendu11=tem_d+48; if(temputer%2) wendu12=5;else wendu12=0;if(flag=1)if(wendu6= )wendu6=-;else if(wendu5= )wendu5=-;else wendu4=-;else if(wendu6= )wendu4= ;wendu5= ;else if(wendu5= )wendu4= ;else wendu4= ;/*/* 液晶显示LM016L */*/*LCD写指令*/void write_command(unsigned char command) /写指令lcdrw=0; /信号写 _nop_();lcdrs=0; / 给低电平,写指令 _nop_(); _nop_();P0=command; / 送命令 _nop_(); _nop_();lcden=1; / 产生高脉冲 delay_ms(2);lcden=0;/*LCD写数据*/void write_data(unsigned char date)/写数据lcdrw=0; /信号写 _nop_();lcdrs=1; / 给高电平,写数据 _nop_(); _nop_();P0=date; / 送数据 _nop_(); _nop_();lcden=1; / 产生高脉冲 delay_ms(2);lcden=0;/*LCD初始化*/void init_LCD() /初始化LCD lcdrw=0; /信号写lcden=0; /先将使能端拉低,以便后面产生高脉冲write_command(0x38); /设置显示格式 delay_ms(1);/光标即显示设置write_command(0x0c); /不显示光标 delay_ms(1);write_command(0x06); / delay_ms(1);write_command(0x01); /LCD清屏 delay_ms(1);write_command(0x80); /LCD数据指针初始化为00H,指向第一行/*时间显示*/void time_display(void) /显示时间 unsigned char g; if(h=1) /如果计时到达1s进行以下操作h=0;sec+; if(sec%60=0) /不能被60整除 sec=0; min+; /分钟加1if(min%10) write_command(0xc0+0x0f); write_data(+time15); else g=min/10; if(g%6) write_command(0xc0+0x0e); write_data(+time14); write_data(time15=0); else write_command(0xc0+0x0e); write_data(time14=0); write_data(time15=0); min=0; hour+; if(hour24) if(hour%10) write_command(0xc0+0x0c); write_data(+time12); else write_command(0xc0+0x0b); write_data(+time11); write_data(time12=0); else write_command(0xc0+0x0b); write_data(time11=0); write_data(time12=0); hour=0; /*日期显示*/void data_display() /日期显示int YEAR=year%100;/取年份的后两位if(hour=0)&(min=0)&(sec=0)day+;if(day=Tablerunnianmou-1) if(day%10)write_command(0xc0+0x01);write_data(+time1); elsewrite_command(0xc0);write_data(+time0);write_data(time1=0);elsewrite_command(0xc0);write_data(time0=0);write_data(time1=1);day=1;mou+;if(mou=12) if(mou%10)write_command(0xc0+0x04);write_data(+time4); elsewrite_command(0xc0+0x03);write_data(+time3);write_data(time4=0);elsewrite_command(0xc0+0x03);write_data(time3=0);write_data(time4=1);year+;YEAR+;mou=1;if(YEAR%10)write_command(0xc0+0x09);write_data(+time9);elsewrite_command(0xc0+0x08);write_data(+time8);write_data(time9=0);/判断是平年还是闰年if(!(year%4) /能被4整除if(!(year%100)/能被4整除if(!(year%400)runnian=1;elserunnian=0;else runnian=1;else runnian=0;/*温度显示*/void wendu_display() /温度显示int i; wendu_h2d();/将相应的十进制数码转换成相应的字符write_command(0x80+0x04); for(i=4;i8;i+) write_data(wendui);write_command(0x80+0x09); for(i=9;i13;i+) write_data(wendui);/*初始化系统*/void init_system(void)/初始化系统int num;wendu13=0xdf;init_LCD(); /初始化LCD for(num=0;num14;num+) write_data(table0num);delay_ms(15);write_command(0xc0); /LCD数据指针初始化为40H,指向第二行 for(num=0;num14;num+) write_data(table1num);delay_ms(15); delay_ms(1500); write_command(0x01);write_command(0x80); num=0;while(wendunum!=0) write_data(wendunum);num+;write_command(0xc0); num=0;while(timenum!=0) write_data(timenum);num+;/*主函数main*/void main(void) init_system();while(1)delay_ms(50);/设定时基h+; time_display();data_display();wendu_display();
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!