1、数字温度计的设计 单片机课程设计 ———————————————————————————————— 作者: ———————————————————————————————— 日期: 2 《单片机原理及应用》课程设计任务书 二级学院:电子
2、信息与电气工程学院 专业: 班级: 学生姓名 指导老师 职 称 讲师 课题名称 数字温度计的设计 课题工作内容 1、 设计内容:硬件电路的设计、软件电路的设计 2、 总体方案的选择、讨论确定。软件流程图的设计,硬件电路各部分的设计,程序的软调试、整机的调试。 3、 撰写设计报告
3、 指标要求 1、温度值用LED显示 2、测量范围为-30℃ ~100℃ 3、温差为±0.5℃ 进程安排 第一天 下达任务、讲授、查资料
4、 第二天 方案确定 第三天、第四天 软、硬件设计 第五天~第八天 软、硬件调试
5、 第九天 撰写报告 第十天 答辩考核 主要参考文献 《单片机原理及应用技术》 范力旻 电子工业出版社 《例说8051》 谢亮、陈敌北、 张义和 人民邮电出版社
6、 《单片机C语言应用100例 》王东锋 王会良 电子工业出版社 《51系列单片机设计实例》 楼然苗 李光飞 北航出版社
7、 《单片微机测控系统设计大全》 王福瑞编著 北航出版社 地点 起止日期 2011.09.05~2011.09.16 单片机原理及应用 课程设计 题 目 数字温度计的设计 二级学院 电子信息与电气工程学院 班 级 姓 名 学 号 指导教师 设计时间 2011.09.05~2011.9.15
8、 目录 一、概述………………………………………………………………………………………1 二、系统设计……………………………………………………………………………… 1 (一)温度计设计方案论证 ……………………………………………………………… 1 (二)框图设计…………………………………………………………………………………1 (三)硬件设计……………………………………………………………………… 2 (四)软件设计…………………………………………………………………………………7 三、调试 ……………………………………………………………………………………
9、 9 四、课程设计小结……………………………………………………………………… 9 五、参考文献……………………………………………………………………………… 9 六、附件………………………………………………………………………………………10 附录1、电路原理………………………………………………………………10 附录2、实拍照片………………………………………………………………10 附录3、元件清单………………………………………………………………11 附录4、程序清单………………………………………………………………12
10、 数字温度计的设计 一、概述 生活和生产中,经常用到一些测温设备,但是传统的测温设备但是传统的测温设备具有制作成本高、硬件电路和软件设计复杂等缺点,基于AT89C52单片机的数字温度计具有制作简单,成本低,度数方便,测温范围广和测温准确等优点,应用前景广阔。 设计参数规格设计: 1、温度值用LED显示 2、测量范围为-30℃ ~100℃
11、 3、温差为±0.5℃ 二、系统设计 (一)温度计设计方案论证 方案一 由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。 方案二 进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。方法简单制作简便,故采用方案一来实现数字温度计的控制。
12、 (二)框图设计 根据设计要求分析,数字温度计由STC89C52单片机、电源、显示电路、温度传感器、复位电路和时钟电路组成、系统框图如图1所示。电源给整个电路供电。显示电路显示温度值,时钟电路为STC89C52提供时钟频率。 电源 STC89C52 单片机 复位电路 显示电路 DS18B20 时钟电路 图1 基于STC89C52单片机的数字温度计系统框图 (三)硬件设计 1、最小系统 (1)电源 本次采用的是普通USB 5V直流电源。 (2)单片机:本次设计使用单片机芯片ST
13、C89C52 STC89C52的工作特性: 主要特性: ·与MCS-51 兼容 ·8K字节可编程闪烁存储器 ·寿命:1000写/擦循环 ·数据保留时间:10年 ·全静态工作:0Hz-24Hz ·三级程序存储器锁定 ·512内部RAM ·32可编程I/O线 ·两个16位定时器/计数器 ·5个中断源 ·可编程串行通道 图2 S TC89C52引脚图 ·低功耗的闲置和掉电模式 ·片内振荡器和时钟电路 (3)时钟电路 图 3 时钟电路 本次设计采用的是12M的晶振,电路图如下图3,两只电容在20pF~100pF之间取值,其取值在6
14、0pF~70pF时振荡器频率稳定性较高,按照一般经验,外接晶体时两个电容的取值为30pF。 (4)复位电路 在时钟电路工作后,只要在单片机的RST引脚上出现24个时钟振荡脉冲(2个机器周期)以上的高电平,单片机便可实现初始化状态服务。为保证应用系统可靠的复位在设计复位电路时,通常使RST引脚保持4ms以上的高电平,只要RST保持高电平,MCS-51单片机就会循环复位;当RST从高电平变为低电平时,MCS-51单片机就从0000H地址开始执行程序,在单片机复位的有效期间,ALE、PSEN 引脚输出高电平。 本次设计采用的是手动复位,其电路图如下:
15、图4复位电路 2.接口 (1)数字温度传感器DS18B20 由DALLAS半导体公司生产的DS18B20型单线智能温度传感器,属于新一代适配微处理器的智能温度传感器,可广泛用于工业、民用、军事等领域的温度测量及控制仪器、测控系统和大型设备中。它具有体积小,接口方便,传输距离远等特点。 A. DS18B20性能特点 : ①独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。 ②测温范围为-55℃-+125℃,测量分辨率为0.0625℃。 ③DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一
16、只三极管的集成电路内。 ④适应电压范围更宽,电压范围:3.0~5.5,在寄生电源方式下可由数据线供电。 ⑤测量结果直接输出数字温度信号,以"一 线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。 ⑥负压特性:电源极性接反时,芯片不会因发热而烧毁, 但不能正常工作。 图5 . DS18B20封装图 B. DS18B20内部结构 DS18B20内部结构主要由四部分组成:64位光刻ROM,温度传感器,非挥发的温度报警触发器TH和TL,高速暂存器。64位光刻ROM是出厂前被光刻好的,它可以看作是该DS18B20的地址序列号。
17、 图6 温度传感器接线图 (2) 双向总线发送器/接收器74LS245 74LS245为三态输出的八组总线收发器引出端符号: A A总线端 B B总线端 /G 三态允许端(低电平有效) DIR 方向控制端 图7. 74LS245内部逻辑图 功能表: Direction Control DIR Enable /G Operation L L L
18、 H H X B data to A bus A data to B bus Isolation (3)74LS07 六高压输出缓冲器/驱动器 简要说明 54/7407 为集电极开路输出的六组驱动器,其主要电特性的典型值如下: tPLH tph1 PD 6ns 20ns 125m W 引出端符号 1A-6A 输入端 1Y-6Y 输
19、出端 极限值 电源电压……………………7V 输入电压……………………5V 输出截至态电压 ………30V 图8 74LS07管脚图 (4)显示电路 内部的四个数码管共用a~dp这8根数据线,为人们的使用提供了方便,因为里面有四个数码管,所以它有四个公共端,加上a~dp,共有12个引脚,下面便是一个共阳结构图。 图9码管内部逻辑图 管脚顺序:从数码管正面看,以第一脚为起点,管脚的顺序是逆时针方向排列的。12-9-8-6为公共脚,A-11,B-7,C-4,D-2,E-1,F-10,G-
20、5,DP-3。 图10显示电路 (四)软件设计 主程序的主要功能是负责温度的实时显示、读出并处理DS18B20测量的当前温度值,温度测量每1s进行一次,这样就可以在1s之内测量一次被测温度,其程序流程图如图11所示。 初始化 调用显示子程序 1s到? N 初次上电 Y Y 读出温度值,温度计算处理显示数据刷新 N 发温度转换开始命令 图1 1主程序流程图 读出温度
21、子程序的主要功能是读出RAM中的9字节,在读出时需要进行CRC校验,校验有错时不能进行温度数据的改写,其程序流程图如图8所示。 发DS18B20复位命令 发跳过ROM命令 发读取温度命令 读取操作,CRC校验 Y 9字节完成? N CRC校验正? N
22、 Y 移入温度暂存器 结束 图 8 读温度流程图 温度转换命令子程序主要是发温度转换开始命令,采用12位分辨率转换时间为750ms.程序设计中采用1s显示程序延时等待转换的完成。计算温度子程序将RAM 中读取值进行BCD码转换运算,并进行温度值正负的判定,显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。 三、调试 此设计软件部分用uvision4编写与编译源程序,并生成HEX文件,编译完成后用Proteus仿真,仿真完成后将HEX文件烧制到单片机中,然后就是对硬
23、件电路的检查,排除硬件电路故障包括设计错误和工艺连接错误,检查各芯片是否有短路或断路故障。先将单片机取下,对电路板进行通电检查,通过观察是否有异常然后用万用表测试个电源电压,若这些都没有问题,则接上仿真机进行联机调试观察各接口线路是否正常。 四、课程设计小结 近两周的单片机课程设计,终于完成了我的数字温度计毕业设计,虽然途中还遇到不少困难,但最终还是把实物做出来,从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论运用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。通过这次对数字温度计
24、的设计与制作,让我了解了设计电路的程序,也让我了解了关于数字温度计的原理与设计理念,要设计一个电路总要先用仿真成功之后才实际接线的。但是最后的成品却不一定与仿真时完全一样,因为,在实际接线中有着各种各样的条件制约着。而且,在仿真中无法成功的电路接法,在实际中因为芯片本身的特性而能够成功。所以,在设计时应考虑两者的差异,从中找出最适合的设计方法。 五、参考文献 [1].范力旻,单片机原理及应用技术,电子工业出版社,2010. [2].杨居义,单片机课程设计指导,清华大学出版社,2009. [3].沙占友,孟志永,王彦朋,单片机外围电路设计,电子工业出版社,2006. [4]百度
25、文库, [5]百度文库, [6].丁元杰,单片机微机原理及应用技[M],机械工业出版社,2001. 六.附录 1.硬件原理图 2.实拍照片 3.元件清单 元件名称 型号 数量/个 用途 单片机 STC89C52 1 控制核心 晶振 12MHz 1 晶振电路 电容 30pF 2 晶振电路 电解电容 22uF/50V 1 复位电路 电阻 1KΩ 13 复位电路,上拉电阻 集成块 74LS07 1 显示驱动 集成块 74LS245 1 显示驱动 集成块 DS18B20 1 温度传感器 电阻
26、 4K7 1 复位电路 按键 1 复位电路 电源 +5V/0.5A 1 提供+5V电源 七段四位数码管 4位 1 显示电路 电阻 4K7 1 测温电路 4.程序清单 #include"reg51.h" #include"intrins.h" #define Disdata P1 #define discan P3 #define uchar unsigned char #define uint unsigned int sbit DQ = P3^7; sbit DIN = P1^7; uint h; u
27、char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; uchar code dis_7[12] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf}; uchar code scan_con[4] = {0xfe,0xfd,0xfb,0xf7}; uchar data temp_data[2] = {0x00,0x00}; uchar data dis
28、play[5] = {0x00,0x00,0x00,0x00,0x00}; void delay(uint t) { for(;t>0;t--); } scan() { char k; for(k=0;k<4;k++) { Disdata = dis_7[display[k]]; if(k == 1) DIN = 0; discan = ~scan_con[k]; delay(90); discan = 0x00; } } ow_reset(void) { char presence = 1; while
29、presence) { while(presence) { DQ = 1;_nop_();_nop_(); DQ = 0; delay(50); DQ = 1; delay(6); presence = DQ; } delay(45); presence = ~DQ; } DQ = 1; } void write_byte(uchar val) { uchar i; for(i=8;i>0;i--) { DQ = 1;_nop_();_nop_(); DQ = 0;_
30、nop_();_nop_();_nop_();_nop_();_nop_(); DQ = val & 0x01; delay(6); val = val>>1; } DQ = 1; delay(1); } uchar read_byte(void) { uchar i; uchar value = 0; for(i=8;i>0;i--) { DQ=1;_nop_();_nop_(); value >>= 1; DQ = 0;_nop_();_nop_();_nop_();_nop_(); DQ = 1;_nop_(
31、);_nop_();_nop_();_nop_(); if(DQ) value|=0x80; delay(6); } DQ = 1; return(value); } read_temp() { ow_reset(); write_byte(0xCC); write_byte(0xBE); temp_data[0] = read_byte(); temp_data[1] = read_byte(); ow_reset(); write_byte(0xCC); write_byte(0x44); } work_temp()
32、 { uchar n = 0; if (temp_data[1]>127) { temp_data[1] = (255 - temp_data[1]); temp_data[0] = (256 - temp_data[0]); n=1; } display[4] = temp_data[0] & 0x0f; display[0] = ditab[display[4]]; display[4] = ((temp_data[0] & 0xf0)>>4) | ((temp_data[1] & 0x0f)<<4); display[3] = disp
33、lay[4]/100; display[1] = display[4]%100; display[2] = display[1]/10; display[1] = display[1]%10; if(!display[3]) { display[3] = 0x0A; if(!display[2]) display[2] = 0x0A; } if(n) display[3] = 0x0B; } main() { Disdata = 0xff; discan = 0xff; for(h=0;h<4;h++) display[h] = 8; ow_reset(); write_byte(0xCC); write_byte(0x44); for(h=0;h<250;h++) scan(); while(1) { read_temp(); work_temp(); for(h=0;h<200;h++) scan(); } } 20






