《单片机课程设计报告数字温度计设计.doc》由会员分享,可在线阅读,更多相关《单片机课程设计报告数字温度计设计.doc(29页珍藏版)》请在三一办公上搜索。
1、河南理工大学单片机课程设计报告 数字温度计 姓 名: 惠水丰 陈鹤澎 学 号: 310608040309 310608040307 专业班级: 电科 063班 指导老师: 杨俊起 胡治国 所在学院:电气工程与自动化学院 2009年 9月 15日摘要本设计是一款简单实用的小型数字温度计,所采用的主要元件有传感器18B20,单片机AT89S52,四位共阴极数码管一个,电容电阻若干。18B20支持“一线总线”接口,测量温度范围-55C+125C。在-10+85C范围内,精度为0.5C。18B20的精度较差为 2C 。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的
2、现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。本次数字温度计的设计共分为五部分,主控制器,LED显示部分,传感器部分,复位部分,时钟电路。主控制器即单片机部分,用于存储程序和控制电路;LED显示部分是指四位共阴极数码管,用来显示温度;传感器部分,即温度传感器,用来采集温度,进行温度转换;复位部分,即复位电路。测量的总过程是,传感器采集到外部环境的温度,并进行转换后传到单片机,经过单片机处理判断后将温度传递到数码管显示。本设计能完成的温度测量范围是-55C+128C,由于能力有限,不能实现报警功能。 随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已
3、经成为一种比较成熟的技术,本文将介绍一种基于单片机控制的数字温度计,本温度计属于多功能温度计,可以设置上下报警温度,当温度不在设置范围内时,可以报警。 关键词:单片机,数字控制,温度计, DS18B20,AT89S52目录1概述. 1.1 课程设计的目的和意义. 1.2 任务及要求2 系统总体方案及硬件设计2.1系统总体方案设计2.2系统硬件电路设计53 软件设计123.1系统总体方案设计123.2程序设计124实验仿真155课程设计体会16参考文献17附1: 源程序代码附2 :系统原理图 1 概述1.1 课程设计的目的和意义 通过课程设计使我进一步熟悉了单片机的内部结构和工作原理,掌握了单片
4、机应用系统设计的基本方法和步骤;通过利用MCS-51单片机,理解单片机在自动化装置中的作用以及掌握单片机的编程调试方法;通过设计一个简单的实际应用输入控制及显示系统,掌握protues和keil以及各种仿真软件的使用。目前温度计的发展很快,从原始的玻璃管温度计发展到了现在的热电阻温度计、热电偶温度计、数字温度计、电子温度计等等,温度计中传感器是它的重要组成部分,它的精度、灵敏度基本决定了温度计的精度、测量范围、控制范围和用途等。传感器应用极其广泛,目前已经研制出多种新型传感器。但是,作为应用系统设计人员需要根据系统要求选用适宜的传感器,并与自己设计的系统连接起来,从而构成性能优良的监控系统。1
5、.2 任务及要求设计一个简单数字温度计,能够测量通常环境下的温度,能够实现零下温度的测量,能够测量小数。 2 系统总体方案及硬件设计2.1系统总体方案设计2.1.1 方案论证方案一: 由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。方案二:考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,
6、进行转换,就可以满足设计要求。从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二。2.1.2原理框图温度计电路设计总体设计框图如图2-1所示,控制器采用单片机AT89S52,温度传感器采用DS18B20,用四位LED数码管以并口传送数据实现温度显示。 单 片 机 复位电路数码管显示 温度传感器时钟电路 图2-1 2.1.3功能模块连接简介 温度传感器的接口2连接单片机P3.4,用于传送数据,接口3连接电源,接口1接地;数码管的段码输入端连接单片机的P0端口,公共端接P2.4-P2.7,单片机的P2.0-P2.3接控制键盘,时钟电路连接XTAL,复位电路连接
7、RST。2.2系统硬件电路设计2.2.1单片机的选择单片机AT89S52具有低电压供电和体积小等特点,四个端口只需要三个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电,此处我们采用USB接口供电,省去了大量空间,更适合于便携式产品的应用。AT89S52主要特性: 与MCS-51单片机产品兼容 4K字节在系统可编程Flash存储器 1000次擦写周期 全静态工作:0Hz33MHz 32个可编程I/O口线 2个16位定时器/计数器 6个中断源 全双工UART串行通道 低功耗空闲和掉电模式 掉电后中断可唤醒 看门狗定时器 双数据指针 灵活的ISP编程 4.0-5.5
8、V电压工作范围单片机AT89S52的内部结构总框图。它可以划分为CPU、存储器、并行口、串行口、定时/计数器和中断逻辑几个部分。 AT89S52外部引脚功能如图2-2所示。 图2-2 本次设计需要注意的几个端口:P0口(3932):是一组8位漏极开路行双向I/O口,也既地址/数据总线复用口。可作为输出口使用时,每位可吸收电流的方式驱动8个TTL逻辑电路,对端口写“1”可作为高阻抗输入输入端用。在访问外部数据存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。在Flash编程时,PO口接收指令字节,而在程序校验时,输出指令字节,校验时,要求接上拉电阻。P3口(10
9、17):是一组带有内部上拉电阻的8位双向I/O口,P1的输入缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输出端口。作输出端口时,被外部拉低的P3口将用上拉电阻输出电流。P3口除可作为一般的I/O口线外,更重要的用途是它的第二功能,如图2-3所示: 图2-3部分控制总线的功能:/Vpp(31):内部和外部程序存储器选择线。=0时访问外部ROM 0000HFFFFH;=1时,地址0000H0FFFH空间访问内部ROM,地址1000HFFFFH空间访问外部ROM。本次设计接高电平。XTAL1(19)和XTAL2(18):使用内部振荡电路时,
10、用来接石英晶体和电容;使用外部时钟时,用来输入时钟脉冲。RST/VPD(9):复位信号输入端。AT89S52接能电源后,在时钟电路作用下,该脚上出现两个机器周期以上的高电平,使内部复位。第二功能是VPD,即备用电源输入端。当主电源Vcc发生故障,降低到低电平规定值时,VPD将为RAM提供备用电源,发保证存储在RAM中的信号不丢失。2.2.2时钟电路设计AT89S52时钟有两种方式产生,即内部方式和外部方式。(如图2-4所示)AT89C51中有一个构成内部震荡器的高增益反向放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。这个放大器与作为反馈元件的片外石英或陶瓷震荡器一起构成自激
11、震荡器震荡电路如图。外接石英晶体(或陶瓷部时钟,采用外部时钟如图所示。在这种情况下,外部时钟脉冲接到XTAL1端,既内部时钟发生器的输入端,XTAL2悬空。由于外部时钟信号是通过一个2分频的触发器后作为内部时钟信号的所以外部时钟的占空比没有特殊要求,但最小高电平持续的时间和最大低电平持续的时间应符合产品技术条件的要求。本次设计采用内部震荡电路,瓷片电容采用30P,晶振采用12MHZ 内部震荡电路 外部震荡电路 图2-42.2.3复位电路设计单片机系统的复位电路在这里采用的是上电+按钮复位电路形式,其中电阻R采用10K的阻值,电容采用电容值为10的电解电容。具体连接电路如图3-5所示: 图2-5
12、2.2.4 温度显示电路四位共阴极数码管,能够显示小数和负温度。零下时,1和2分别显示负号。当温度超过99.9时,四个数码管全部亮。2.2.5温度传感器DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现912位的数字值读数方式。DS18B20的性能特点如下: 独特的单线接口仅需要一个端口引脚进行通信; 多个DS18B20可以并联在惟一的三线上,实现多点组网功能; 可通过数据线供电,电压范围为3.05.5V; 温度以9或12位数字; 用户可定义报警设置; 报警搜索命令识
13、别并标志超过程序限定温度(温度报警条件)的器件; 负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作; DS18B20采用3脚PR35封装或8脚SOIC封装,其内部结构框图如图2-6所示。I/OC64位ROM和单线接口高速缓存存储器与控制逻辑温度传感器高温触发器TH低温触发器TL配置寄存器8位CRC发生器Vdd 图2-664位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。温度报警触发器TH和TL,可通过软件写入户报警上下限。DS18B20温度传感器的内部存储器
14、还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。高速暂存RAM的结构为8字节的存储器,结构如图2.3所示。头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义如图2-7所示。低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。温度 LSB温度 MSBTH用户字节1TL用户
15、字节2配置寄存器保留保留保留CRCTMR1R011111 图2-7DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。因此,在实际应用中要将分辨率和转换时间权衡考虑。温度传感器18B20汇编程序,采用器件默认的12位转化,最大转化时间750微秒 ,可以将检测到的温度直接显示到AT89C52的两个数码管上。 表1 DS18B20温度转换时间表R1R0分辨率/位温度最大转换时间/MS00993.750110187.510113751112750高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数
16、据的正确性。当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625LSB式表示。当符号位S0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。DS18B20完成温度转换后,就把测得的温度值与RAM中的TH、TL字节内容作比较。若TTH或TTL,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令做出响应。因此,可用多只DS18B20同
17、时测量温度并进行报警搜索。在64位ROM的最高有效字节中存储有循环冗余检验码(CRC)。主机ROM的前56位来计算CRC值,并和存入DS18B20的CRC值作比较,以判断主机收到的ROM数据是否正确。另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作按协议进行。操作协议为:初使化DS18B20(发复位脉冲)发ROM功能命令发存储器操作命令处理数据。分别说明如下:1、初始化 单总线的所有处理均从初始化开始。初始化过程是主机通过向作为从机的DS18B20芯片发一个有时间宽度要求的初始化脉冲实现的。初始化后,才可进行读写操作。2
18、、ROM操作命令 总线主机检测到DS18B20的存在 便可以发出ROM操作命令之一 这些命令表.2:表2 ROM操作命令指 令代 码Read ROM(读ROM)33HMatch ROM(匹配ROM)55HSkip ROM(跳过ROMCCHSearch ROM(搜索ROM)F0HAlarm search(告警搜索)ECH3、存储器操作 命令如表.3: 表.3 存储器操作命令指令代码Write Scratchpad(写暂存存储器)4EHRead Scratchpad(读暂存存储器)BEHCopy Scratchpad(复制暂存存储器)48HConvert Temperature(温度变换)44HR
19、ecall EPROM(重新调出)B8HRead Power supply(读电源)B4H 3 软件设计3.1系统总体方案设计 本次课程设计采用的是protues软件仿真,用Keil软件进行编译。Protues软件是英国Labcenter electronics公司出版的EDA工具软件。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。 开 始 软件部分由主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序,判断程序,按键检测等。 初 始 化 调显示子程序 得出温度总子程序 判断数据是否在控制范围内 是否报警
20、返回 图3-1 主程序流程3.2程序设计3.2.1 主程序主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。这样可以在一秒之内测量一次被测温度,其程序流程见图3-1所示。3.2.2 读出温度子程序读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。其程序流程图如图3-2所示发DS18B20复位命令发跳过ROM命令发读取温度命令读取操作,CRC校验9字节完?CRC校验正?确?移入温度暂存器结束NNYY 图3-2 读出温度子程序流程3.2.3二进制转换BCD码命令子程序 二进制转换BCD码
21、命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。二进制转换BCD码命令子程序流程图,如图3-3发DS18B20复位命令发跳过ROM命令发温度转换开始命令结束 图3-3二进制转换BCD码流程图3.2.4 计算温度子程序将RAM中读取进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图4-4所示。开始温度零下?NY温度值取补码置“-”标志置“+”标志计算小数位温度BCD值 计算整数位温度BCD值 结束图3-4 测量温度流程图 3.2.5温度数据显示子程序 显示数据子程序主要是对显示缓冲器中的显示数据进行
22、刷新操作,查表送段码至LED,开位码显示,采用动态扫描方式4 实验仿真 图4-1系统仿真图如图4-1所示,加上复位电路和时钟电路,在protues构成了完整的仿真图,输入程序后就能够进行仿真。调试结果分析: 本次数字温度计能够比较精确的测量一般温度,测量范围是-55128,并且能够测出小数。 5 课程设计体会 本次的课程设计使我们进一步巩固了书本上的知识,做到了学以致用。这是我们第二次自己动手设计的电路,通过系统仿真软件protues和编译软件keil,使我们进一步了解了单片机的设计制作过程,其中最为困难的是软件部分,即编程部分,我们上网找了好多资料,虽然经过自己的修改,但还是有很多功能不能实
23、现,如报警和温度上下限设置。由于protues并不是很熟练,在使用的过程中有很多原件的名称不知道,从而花费了大量的时间在网上查找,今后应该在这方面多多努力。最后一步的焊接硬件也遇到了不少麻烦,数码管引线太多容易弄混,三级管放大电路中,三极管容易接反。总结经验的时候我们得出这样的结论,学习应该学以致用,有目的的去学习,如果学了不用等于没学。其次,要学以致用,就要理论联系实际,这样才会取得事半功倍的效果。参考文献1 康华光,陈大钦,张林.电子技术基础 模拟部分(第五版).高等教育出版社.2006.103-1082余发山.单片机原理及应用技术.中国矿业大学出版社,2003.31-323 51单片机学
24、习网 附1 源程序代码#include#include#define H 125 #define L -55unsigned int zhengshu=0;/温度值 int dingyih=H,dingyil=L,n;/温度上下限uint m=0,i;/按键标志位uchar temp;bit biaozhi_1=0,biaozhi_2=0,biaozhi_3=0;sbit gw=P24;sbit sw=P25;sbit bw=P26;sbit qw=P27;sbit k1=P20;sbit k2=P21;sbit k3=P23;sbit k4=P22;sbit bj=P32;sbit led=
25、P31;uchar ge,shi,bai,qian;/显示位定义uchar table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x76,0x38,0x00;/0/1/2/3/4/5/6/7/8/9/ - / H / lvoid delay(z) uint i,j;for(i=0;i0;j-);void xianshi1(uchar ge, shi, bai, qian) gw=0;sw=1;bw=1;qw=1; P0=tablege;delay(1); gw=1;sw=0;bw=1;qw=1; P0=tableshi;de
26、lay(1);gw=1;sw=0;bw=1;qw=1; P0=0x80;delay(1); gw=1;sw=1;bw=0;qw=1; P0=tablebai;delay(1); gw=1;sw=1;bw=1;qw=0; P0=tableqian;delay(1);void xianshi2(uchar ge, shi, bai, qian) if(bai=0) bai=13; if(shi=0) shi=13; gw=0;sw=1;bw=1;qw=1; P0=tablege;delay(1); gw=1;sw=0;bw=1;qw=1; P0=tableshi;delay(1); gw=1;sw
27、=1;bw=0;qw=1; P0=tablebai;delay(1); gw=1;sw=1;bw=1;qw=0; P0=tableqian;delay(1);void init() /初始化函数 TMOD=0x01; TH0=(65536-20000)/256; TL0=(65536-20000)%256; EA=1; ET0=1; TR0=1;void main() gw=0; sw=0; bw=0; qw=0; bj=0; led=1; P0=0xff; delay(2000); P0=0x00; P2=0Xff; ge=shi=bai=qian=10; init(); while(1)
28、/正负显示 if(m=0) zhengshu=gettemp(); n=zhengshu; if(neg_flag=0) qian=zhengshu/1000; bai=zhengshu%1000/100; shi=zhengshu%100/10; ge=zhengshu%10; if(qian=0) qian=13; if(bai=0) bai=13; if(neg_flag=1) qian=10; bai=zhengshu%1000/100; shi=zhengshu%100/10; ge=zhengshu%10; if(bai=0) qian=13; bai=10; /上下限比较 if(
29、n=dingyih*10)|(n=dingyil*10) bj=1; led=0; delay(25); bj=bj; led=led;else bj=0; led=1; /按键 if(m=1) /功能键按下 biaozhi_1=1; while(biaozhi_1) /启动上限设置 qian=11; if(dingyih=10)bai=10; shi=(-dingyih)%100/10; elsebai=13;shi=10; else bai=dingyih%1000/100; shi=dingyih%100/10; ge=dingyih%10; if(k2=0) /加 delay(20);
30、 if(k2=0) dingyih+; if(dingyih=H) dingyih=H; if(k4=0) /减 delay(20); if(k4=0) dingyih-; if(dingyihL) dingyih=L; if(k3=0) /取消检测及运行 delay(20); if(k3=0) biaozhi_1=0; biaozhi_2=0;m=0; dingyih=H; dingyil=L;EA=0;ge=10;shi=10;bai=10;qian=10; gw=0; sw=0; bw=0; qw=0; P0=0x40; delay(50);EA=1; if(m=2) /再次按下了功能键,切换到下限设置 biaozhi_1=0; biaozhi_2=1; while(biaozhi_2) /启动下限设置 qian=12; if(dingyil=10)bai=10; shi=(-dingyil)%100/10; elsebai=13;shi=10; else /max than zero bai=dingyil%1000/100; shi=dingyil%100/10; ge=dingyil%10; if(k2=0) /加 delay(20