《单片微机原理及应用》课程设计任务书
一、设计题目、内容及要求 设计题目:简易数字温度计 设计内容: (1)可以测量-50到100摄氏度内的温度 (2)用液晶显示温度,精确到小数点后两位; (2)测量误差在0.5摄氏度以内。 设计要求: (1)根据任务要求设计硬件电路; (2)设计电路原理图、仿真结果电路图; (3)画出程序流程图,编写程序; (4)书写设计说明书。 二、设计原始资料 [1]李群芳,肖看.《单片机原理、接口及应用》.清华大学出版社,2005.3 [2]Proteus软件,Wave/Keil软件 三、要求的设计成果(课程设计说明书、设计实物、图纸等) 设计结果能正确仿真演示; 课程设计说明书一份(包括总体设计、方案论证、硬件电路、系统程序流程图、程序清单) 四、进程安排 周一 查阅资料,设计电路原理图、编写程序 周二 利用proteus完成硬件电路绘制 周三 程序调试 周四 书写课程设计说明书 周五 课程设计答辩 五、主要参考资料 [1]何利民.《单片机中级教程》.机械工业出版社,2002.4 [2]丁元杰.《单片微机原理及应用》(第二版).机械工业出版社,2005.2 [3]张有德,赵志英.《单片微型机原理、应用于实验》.复旦大学出版社,2000.4 指导教师(签名): 教研室主任(签名):
目 录
1 引言 ........................................................................................................................................ 1 2 开发和仿真软件简介 ............................................................................................................ 2
2.1 开发软件Keil C51 uVision2 ....................................................................................... 2 2.2 仿真软件Proteus ISIS ................................................................................................. 3 3 总体设计方案论证 ................................................................................................................ 5
3.1 开发方案举例 .............................................................................................................. 5
3.1.1 热敏电阻 ............................................................................................................ 5 3.1.2 数字温度芯片DS1621 ...................................................................................... 5 3.2 数据通信技术 .............................................................................................................. 6 4 系统各部分电路的选择和设计 ............................................................................................ 7
4.1 系统的工作原理 .......................................................................................................... 7 4.2 AT89C51简介 ............................................................................................................... 7
4.2.1 概述 .................................................................................................................... 7 4.2.2 AT89C51引脚功能 ............................................................................................. 8 4.2.3 复位电路的设计 ................................................................................................ 9 4.3数字温度传感器 ......................................................................................................... 10
4.3.1 DS1621的技术指标 ......................................................................................... 10 4.3.2 DS1621的工作原理 ......................................................................................... 11 4.4 单片机和DS1621接口电路 .................................................................................. 11 4.5 七段LED数码显示电路 .......................................................................................... 12 5 系统软件设计 ...................................................................................................................... 14
5.1 编程语言选择 ............................................................................................................ 14 5.2 主程序的设计 ............................................................................................................ 14 5.3 温度采集模块设计 .................................................................................................... 15 5.4 温度计算模块设计 .................................................................................................... 15 5.5 串行总线编程 ............................................................................................................ 16 6 软硬件调试结果分析 .......................................................................................................... 17 7 总结 ...................................................................................................................................... 18 参考文献 .................................................................................................................................. 19 附录A 多点温度采集系统电路原理图 ................................................................................ 20 附录B C语言源代码 .............................................................................................................. 21
1 引言
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。在信息采集(传感器技术)、信息传输(通信技术)和信息处理(计算机技术)三大信息技术中,传感器属于信息技术的前沿尖端产品,尤其是温度传感器技术,在我国各领域已经引用的非常广泛,可以说是渗透到社会的每一个领域,人民的生活与环境的温度息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义。
测量温度的关键是温度传感器,温度传感器的发展经历了三个发展阶段:①传统的分立式温度传感器,②模拟集成温度传感器,③智能集成温度传感器。目前的智能温度传感器(亦称数字温度传感器)是在20世纪90年代中期问世的,它是微电子技术、计算机技术和自动测试技术(ATE)的结晶,特点是能输出温度数据及相关的温度控制量,适配各种微控制器(MCU)。社会的发展使人们对传感器的要求也越来越高,现在的温度传感器正在基于单片机的基础上从模拟式向数字式,从集成化向智能化、网络化的方向飞速发展,并朝着高精度、多功能、总线标准化、高可靠性及安全性、开发虚拟传感器和网络传感器、研制单片测温系统等高科技的方向迅速发展。
本次课程设计的内容是开发一个基于AT89C51单片机的测温系统,并采用了数字
2温度传感器DS1621和IC串行总线通信系统,重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详细研究,对各部分的电路也一一进行了设计,该系统可以方便的实现对三路温度的采集、传输、处理和显示,并可设定上下限报警温度。它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当作温度处理模块嵌入其它系统中,作为其他主系统的辅助扩展。
本次课程设计,利用Keil和Proteus软件设计和仿真该智能数字多点测温系统。过程中所用到的主要电路由我们自主设计制作,通过查阅资料和借助指导老师最终设计出结构合理、美观,主要电气指标良好,性能稳定可靠的电路。以培养我们严谨的科学态度,正确的设计思想,科学的设计方法和良好的工作作风,掌握一定的专业技能及综合运用基础理论、基本知识的能力。
1
2 开发和仿真软件简介
2.1 开发软件Keil C51 uVision2
Keil uVISION2 是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的MCS-51 架构的芯片,它集编辑,编译,仿真等于一体,同时还支持、PLM、汇编和C语言的程序设计,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。Keil C51集成开发环境主要由菜单栏、工具栏、源文件编辑窗口、工程窗口和输出窗口五部分组成。工具栏为一组快捷工具图标,主要包括基本文件工具栏、建造工具栏和调试工具栏,基本文件工具栏包括新建、打开、拷贝、粘贴等基本操作。建造工具栏主要包括文件编译、目标文件编译连接、所有目标文件编译连接、目标选项和一个目标选择窗口。调试工具栏位于最后,主要包括一些仿真调试源程序的基本操作,如单步、复位、全速运行等。在工具栏下面,默认有三个窗口。左边的工程窗口包含一个工程的目标(target)、组(group)和项目文件。右边为源文件编辑窗口,编辑窗口实质上就是一个文件编辑器,我们可以在这里对源文件进行编辑、修改、粘贴等。下边的为输出窗口,源文件编译之后的结果显示在输出窗口中,会出现通过或错误(包括错误类型及行号)的提示。如果通过则会生成“HEX”格式的目标文件,用于仿真或烧录芯片。基本环境如图2-1所示:
图2-1 Keil C51软件的运行界面
2
MCS-51单片机软件Keil C51开发过程为: ①建立一个工程项目,选择芯片,确定选项。 ②建立汇编源文件或C源文件。 ③用项目管理器生成各种应用文件。 ④检查并修改源文件中的错误。
⑤编译连接通过后进行软件模拟仿真或硬件在线仿真。
2.2 仿真软件Proteus ISIS
Proteus软件是来自英国Labcenter electronics公司的EDA工具软件。该软件有十几年的历史,在全球广泛使用,除了其具有和其它EDA工具一样的原理布图、PCB自动或人工布线及电路仿真的功能外,其革命性的功能是,他的电路仿真是互动的,针对微处理器的应用,还可以直接在基于原理图的虚拟原型上编程,并实现软件源码级的实时调试,如有显示及输出,还能看到运行后输入输出的效果,配合系统配置的虚拟仪器如示波器、逻辑分析仪等,为用户建立了完备的电子设计开发环境。
Proteus ISIS的工作界面是一种标准的Windows界面。主要包括:标题栏、主菜单、标准工具栏、绘图工具栏、状态栏、对象选择按钮、预览对象方位控制按钮、仿真进程控制按钮、预览窗口、对象选择器窗口、图形编辑窗口。
主要功能是在图形编辑窗口做出所需的电路图。软件的应用设计界面如图2-2所示:
图2-2 Proteus软件的运行界面
3
Proteus还提供了诸多资源,如下所述:
①Proteus可提供的仿真元器件资源:仿真数字和模拟、交流和直流等数千种元器件,有30多个元件库。
②Proteus可提供的仿真仪表资源 :示波器、逻辑分析仪、虚拟终端、SPI调试器、 信号发生器、模式发生器、交直流电压表、交直流电流表。理论上同一种仪器可以在一个电路中随意的调用。
③除了现实存在的仪器外,Proteus还提供了一个图形显示功能,可以将线路上变化的信号,以图形的方式实时地显示出来,其作用与示波器相似,但功能更多。这些虚拟仪器仪表具有理想的参数指标,例如极高的输入阻抗、极低的输出阻抗。这些都尽可能减少了仪器对测量结果的影响。
④Proteus可提供的调试手段Proteus提供了比较丰富的测试信号用于电路的测试。这些测试信号包括模拟信号和数字信号。
4
3 总体设计方案论证
3.1 开发方案举例
该系统主要由温度测量和数据采集两部分电路组成,实现的方法有很多种,下面将列出两种在日常生活中和工农业生产中经常用到的实现方案。
3.1.1 热敏电阻
由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。热敏电阻的外观如图3-1所示。
图3-1 热敏电阻外观图
3.1.2 数字温度芯片DS1621
采用数字温度芯片DS1621 测量温度,输出信号全数字化。便于单片机处理及控制,省去传统的测温方法的很多外围电路。且该芯片的物理化学性很稳定,它能用做工业测温元件,此元件线形较好。在0—100摄氏度时,最大线形偏差小于1摄氏度。DS1621 的最大特点之一采用了单总线的数据传输,由数字温度计DS1621和微控制器AT89C51构成的温度测量装置,它直接输出温度的数字信号,可直接与计算机连接。这样,测温系统的结构就比较简单,体积也不大。采用51 单片机控制,软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制,而且体积小,硬件实现简单,安装方便。
控制工作,还可以与PC 机通信上传数据,另外AT89S51 在工业控制上也有着广
5
泛的应用,编程技术及外围功能电路的配合使用都很成熟。
该系统利用AT89C51芯片控制温度传感器DS1621进行实时温度检测并显示,能够实现快速测量环境温度,并可以根据需要设定上下限报警温度。该系统扩展性非常强,它可以在设计中加入时钟芯片DS1302以获取时间数据,在数据处理同时显示时间,并可以利用AT24C16芯片作为存储器件,以此来对某些时间点的温度数据进行存储,利用键盘来进行调时和温度查询,获得的数据可以通过MAX232芯片与计算机的RS232接口进行串口通信,方便的采集和整理时间温度数据。
从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二。
测温电路的总体设计方框图如图3-2所示,控制器采用单片机AT89C51,温度传感器采用DS1621,用5位LED数码管以串口传送数据实现温度显示。
图3-2 测温电路的总体设计方框图
3.2 数据通信技术
目前,常用的微机和外设之间数据传输的串行总线有I2C总线、SPI总线等,其中,I2C总线采用同步串行双线(一根时钟线,一根数据线)方式,而SPI总线采用同步串行三线(时钟线,输入线,数据输入线)方式。这两种总线需要至少两根或两根以上的信号线。I2C是PHILIPS公司推出的一种串行总线。它是目前使用较广泛的芯片间的串行扩展总线。该总线用两条连线实现全双工同步数据传送。它可以使具有I2C总线的单片机直接与具有I2C总线接口的各种扩展器件连接。本次课程设计就采用这种通信方式。
美国达拉斯半导体公司推出了一项特有的单线技术。该技术于上述总线不同,它采用单根信号线,即可传输时钟,又能传输数据,而且数据传输时是双向的,因而这种单线技术具有线路简单,硬件开销少,成本低廉,便于扩展的优点。
6
4 系统各部分电路的选择和设计
4.1 系统的工作原理
本温度数据采集系统的主要功能是测量温度,并显示温度测量结果,并附带了单片机和PC机之间通讯接口。系统结构包括单片机部分、温度传感器、显示电路、通讯接口电路等几个部分。图4-1为系统的总体结构框图。
图4-1 测温系统的总体结构框图
系统工作原理是:电路在上电后,最先单片机利用模拟总线I2C对DS1621进行寻址,单片机在接收到DS1621应答后,单片机将设置/状态寄存器的值通过I2C总线写入该寄存器,之后DS1621在单片机控制下进行温度测量,然后DS1621把所采集的温度(-50摄氏度~+100摄氏度,精度为0.5摄氏度)传输给单片机,最后单片机把温度数据送到LED上显示。系统中附带的串行接口以供备用。系统详细的电路原理图可见附录部分。
4.2 AT89C51简介
4.2.1 概述
对于单片机的选择,可以考虑使用8031与8051系列,由于8031没有内部RAM,系统又需要大量内存存储数据,因而不适用。所以,我们选用51系列单片机AT89C51。AT89C51是美国ATMEL公司生产的低功耗,高性能CMOS8位单片机,片内含4KB的可编程的Flash只读程序存储器,兼容标准8051指令系统及引脚,并集成了 Flash 程序存储器,既可在线编程(ISP),也可用传统方法进行编程,因此,低价位AT89C51单片机可应用于许多高性价比的场合,可灵活应用于各种控制领域,对于简单的测温系统已经足够。单片机AT89C51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。AT89C51的主要特性如下:
7
①与MCS-51 兼容; ②4K字节可编程闪烁存储器; ③三级程序存储器锁定;
④128×8位内部RAM; ⑤32根可编程I/O线;
⑥两个16位定时器/计数器; ⑦5个中断源;
⑧可编程串行通道; ⑨片内振荡器和时钟电路。
4.2.2 AT89C51引脚功能
单片机芯片AT89C51为40引脚双列直插式封装。其各个引脚功能介绍如下,芯片AT89C51的引脚排列和逻辑符号如图4-2 所示。各引脚分别为:
①VCC:供电电压 ②GND:接地 ③P0口
P0口为一个8位漏级开路双向I/O口,每个管脚可吸收8TTL门电流。当P1口的管脚写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FLASH编程时,P0口作为原码输入口,当FLASH进行校验时,P0输出原码,此时P0外部电位必须被拉高。
④P1口
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流P1口管脚写入”1”后,电位被内部上拉为高可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
⑤P2口
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流
8
图4-2 AT89C51的引脚排列图
当P2口被写”1”时,其管脚电位被内部上拉电阻拉高,且作为输入。作为输入时P2口的管脚电位被外部拉低,将输出电流,这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址”1”时,它利用内部上拉的优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
⑥P3口
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入”1”后,它们被内部上拉为高电平,并用作输入。作为输入时,由于外部下拉为低电平,P3口将输出电流(ILL),也是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口,同时P3口同时为闪烁编程和编程校验接收一些控制信号。
⑦RST:复位输入端。当振荡器复位时,要保持RST两个机器周期的高电平时间。
⑧PSEN
外部程序存储器的选通信号。在由外部程序存储器取址期间,每个机器周期PSEN两次有效。但在访问外部数据存储器时,这两次有效的PSEN信号将不出现。
⑨EA/VPP
当EA保持低电平时,访问外部ROM;注意加密方式1时,EA将内部锁定为RESET;当EA端保持高电平时,访问内部ROM。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。 4.2.3 复位电路的设计
单片机的复位电路如图4-3所示。该复位电路采用手动复位与上电复位相结合的方式。当按下按键S1时,VCC通过R2电阻给复位输入端口一个高电平,实现复位功能,即手动复位。上电复位就是VCC通过电阻R2和电容C构成回路,该回路是一个对电容C1充电和放电的电路,所以复位端口得到一个周期性变化的电压值,并且有一定时间的电压值高于CPU复位电压,实现上电复位功能。
图4-3 单片机的复位电路
9
4.3数字温度传感器
4.3.1 DS1621的技术指标
DS1621是美国DALLAS公司生产的一种功能较强的数字式温度传感器和恒温控制器。数字接口电路简单,与I2C总线兼容,且可以使用一片控制器控制多达8片的DS1621。其数字温度输出达9位,精度为0.5摄氏度。DS1621可工作在最低2.7V电压下,适用于低功耗应用系统。
DS1621的引脚排列图如图4-4所示,引脚功能描述如表4-1所示。
引脚 符号 功能描述 2—线I2C 串行数据输入/输出 2—线I2C 串行时钟端 温度上下限超出输出 地 片选地址输入A2~A0 电源端(+2.7—5.5V) 表4-1 DS1621的引脚功能表 图4-4 DS1621的引脚排列图
1 2 3 4 5 6 SDA SCL TOUT GND A2~A0 VDD 10
4.3.2 DS1621的工作原理
斜坡累加电路
重预置 温度低敏感振荡器 计数 比较器 重预置电路 温度寄存器 温度低敏感振荡器 计数器 =0 图4-5 DS1621的构成原理框图
DS1621的构成原理框图如图4-5所示,在测量温度时使用了独有的在线温度测量技术。它通过在一个由对温度高度敏感的振荡器决定的计数周期内对温度低敏感的振荡器时钟脉冲的计数值的计算来测量温度。DS1621在计数器中预置了一个初值,它相当于-50摄氏度。如果计数周期结束之前计数器达到0,已预置了此初值的温度寄存器中的数字就会增加,从而表明温度高于-55摄氏度。与此同时,计数器斜坡累加电路被重新预置一个值,然后计数器重新对时钟计数,直到计数值为0。通过改变增加的每1 内的计数器的计数,斜坡累加电路可以补偿振荡器的非线性误差,以提高精度,任意温度下计数器的值和每一斜坡累加电路的值对应的计数次数须为已知。
DS1621通过计算可以得到0. 5摄氏度的精度,温度输出为9位,在发出读温度值请求后还会输出两位补偿值。表2给出了所测的温度和输出数据的关系。这些数据可通过2线制串行口连续输出,MSB在前,LSB在后。
4.4 单片机和DS1621接口电路
前面已经介绍了DS1621温度传感器以8位数字输出,数据输出与I2C总线兼容,可以方便地通过SDA,SCL以串行方式与单片机相连。而AT89C51面向主/从功能字节的I2C总线串行I/O口,所以多路温度数字量可以通过I2C总线直接送GAS97C2051单片机。
I2C总线(Inter IC BUS)是Philips公司推出的双向两线串行通信标准。由于它具有接口少、通信效率高等优点,现已得到广泛的应用I2C总线是一种串行的数据总线,挂在总线上的各集成电路模块(单片机和具有各种功能的电路芯片)通过一条串行的数据
11
线 (SDA)和一条串行的时钟线(SCL),按一定的通信协议进行寻址和信息的传输。每个电路模块都有唯一的地址,在信息的传输过程中,I2C总线上的电路模块有的是主控器,有的是被控器,主控器和被控器都可以是发送器或接收器,这完全取决于它所要完成的功能。采用I2C总线可最大限度地简化电路结构,实现电路的模块化、标准化设计。
I2C总线在进行数据传输时,由作为主控器的AT89C51来初始化一次数据的传输,并在I2C总线上提供时钟进行传送。信息传送的对象、方向和传送的开始、终止也由主控器(AT89C51)来决定。此时,在I2C总线上被主控器所寻址的集成电路模块称为被控器(DS162)。在I2C总线上,数据由发送器传出,并被接收器接收,接收器在每次正确接收到一个数据字节后,都要在数据总线(SDA)上给发送器一个应答信号。
因单片机AT89C51本身 没有I2C硬件资源,所以必须用软件来模拟I2C总线,本系统利用单片机AT89C51的P3.0和P3.1引脚分别作I2C总线的数据线和时钟线(见附录A)。AT89C51模拟I2C总线主要由软件设置来实现其功能。
4.5 七段LED数码显示电路
采用七段LED数码显示,LED显示器内部由7段发光二极管组成,因此亦称之为七段LED显示器,由于主要用于显示各种数字符号,故又称之为LED数码管。每个显示器还有一个圆点型发光二极管,用于显示小数点。在单片机AT89C51接收到DS1621所采集的温度数据后,单片机把所读到的数据送给数码管显示。系统具体的显示电路如图4-6所示。
图4-6 七段LED数码管显示电路
12
显示电路中单片机AT89C51的P0口直接驱动8段数码管(其中需要给P0外接上拉电阻)完成字形码的输出(字形选择)。而P2.1-P2.5控制6位LED进行分时选通,这样在任一时刻,只有一位LED是点亮的,但只要扫描的频率足够高(一般大于25Hz),由于人眼的视觉暂留特性,直观上感觉却是连续点亮的,这就是我们常说的动态扫描电路。
13
5 系统软件设计
5.1 编程语言选择
51的编程语言常用的有两种,一种是汇编语言,一种是C语言。汇编语言的机器代码生成效率很高但可读性却并不强,复杂一点的程序就更是难读懂,而C语言在大多数情况下其机器代码生成效率和汇编语言相当,C 语言很好的结构性和模块化更容易阅读和维护,用C 编写程序比汇编更符合人们的思考习惯,开发者可以更专心的考虑算法而不是考虑一些细节问题这样就减少了开发和调试的时间,而且C语言还可以嵌入汇编来解决高时效性的代码编写问题。
5.2 主程序的设计
主程序的主要功能是负责多点温度数据的实时采集、传输,处理和显示。其程序流程如图5-1所示。
初始化 生成地址字节1001000,循环次数3向设置/状态寄存器设置为连续工作方式 启动转换 地址字节加02H 循环次数减1为0? N 延时1S以上等待结果 生成地址字节1001000,循环次数3 读温度数据并存储 地址字节加02H 循环次数减1为0? N
N 读温度数据并存储及显示 图5-1 主程序流程图
14
5.3 温度采集模块设计
为本温度采集系统开发的软件程序,可以对DS1621内部的寄存器编程控制DS1621的工作方式,以及从这些数据寄存器读取温度值,最后把经过单片机数据处理后的温度送到LED上显示。AT89C51扮演着上传下达的角色,单片机端的程序采用了C语言。DS1621一侧的通信程序将利用并行端口P3.0和P3.1来模拟I2C 总线协议, 总线上的通信通过程序来实现。
整个软件采用了模块化的程序设计方法。为了实现AT89C51和DS1621之间I2C 协议之下的串行通信,编写了一些专用子程序。这些子程序段包括:符号定义、AT89C51的端口初始化、启动信号时序产生、停止信号时序产生、发送字节、读取字节、读取温度、显示。
系统电路在上电后开始工作,最先程序单片机进行初始化设置,然后单片机利用模拟I2C总线对DS1621进行寻址。单片机在接收到DS1621应答后,紧接着单片机利用命令(AAh、ACh、EEh、22h)将设置/状态寄存器的值通过I2C总线写入DS1621状态寄存器,该系统中把DS1621设置为连续温度转换工作方式,之后DS1261在单片控制下进行温度测量,然后DS1261把所采集的温度传输给单片机,最后单片机把温度数据送到LED上显示。详细程序可见附录2。
5.4 温度计算模块设计
计算温度子程序将从DS1621中读取的温度值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图5-2所示。
开始 N 温度零下? Y 温度值取补码置“—”标志 置“+”标志
计算小数位温度BCD值
结束 图5-2 温度计算流程图
15
计算整数位温度BCD值
5.5 串行总线编程
在本系统中,单片机AT89C51 作为主控器件,3个DS1621作为被控器,所以我们只要考虑主方式下的状态处理模块,即考虑AT89C51主发送和主接收方式下的状态处理模块。该电路中为了简化电路设计在I2C总线的时钟和数据上各加了一个上拉电阻,以获取一定的上拉电流使信号采集可靠。
本系统中挂在I2C总线上的各电路模块都有其节点地址。AT89C51作为主控器其节点地址无意义,作为被控器的3个DS1621都有其节点地址,其地址为1001A2A1A0 ,其中,1001是器件编号,已由芯片生产厂家规定,A2A1A0为DS1621的3个引脚,在电路中分别接高低电平决定2个DS1621的不同地址。2个DS1621的地址分别为1001000~1001010。
本系统中的I2C总线的寻址方式为的广播寻址,即AT89C51对挂在I2C总线上所有的DS1621的广播呼叫寻址。
AT89C51发出开始信号S后的第一个字节确定由AT89C51所选择的一个DS1621的地址,然后在第一个字节以后开始数据传送。
具体实现寻址的方法是:由AT89C51发出启动位S后紧跟着发送从器件DS1621的7位地址码,即S+SLA,在节点地址寻址中SLA为被寻址的从节点地址,主控设备在发送数据前,在时钟为高时,在数据线上发送一个由高到低的信号来表示开始传送数据,DS1621 接收到开始信号时,移入后续8 位(高7 位地址线和一个R/W 位)来确定进行如何操作,R/W 位为0 表示写,为1 表示读。读写操作完成后,在时钟为高时,在数据线上发送一个由低到高的信号表示传送结束。具体数据格式如图5-3所示,时序如图5-4所示。
图5-3 串行通信的数据格式
图5-4 串行通信的时序图
16
6 软硬件调试结果分析
本设计应用Proteus及Keil软件,首先根据自己设计的电路图用Proteus软件画出电路模型,关于这个软件的使用通过查一些资料和自己的摸索学习;然后用Keil软件对所编写的程序进行编译、链接,如果没有错误和警告便可生成程序的hex文件,调试好程序后将目标文件导入Proteus的AT89C51芯片中进行软件调试。最后进行三路温度的对比测试。数字温度计的仿真电路图如图6-1所示。
图6-1 仿真图
仿真结果分析:不断调整三路DS1621的温度值,发现LED显示器上的数值和DS1621C屏幕上的标准值相差无几,在误差允许的范围之内。当某一路的温度不在50-80 范围时,两个LED同时发光,表示告警信息。经调试,证明开发者最终设计出结构合理、美观,主要电气指标良好,性能稳定可靠的电路。
17
7 总结
不知不觉中,一周的课程设计实习已经接近尾声了。可能是假期快到的缘故,总感觉这次实习特别短暂。此刻,真是感慨万千啊!现在我可以自豪的说,这次实习我达到了预期的目标。因为在实习期间,我每天都在接触新的东西,每天都会有新的问题等待我去探讨去解决,每天都有新收获。
回想课设第一天,我们做点电脑前,不知道自己能干点什么,对于指导老师的讲解也是云里雾里的。因为头一回接触Proteus和Keil这两个软件。但是我相信,只要自己用心了,没有办不成的事。于是,我静下心来,仔细研究老师下发的教程。我珍惜每一次的上机机会,勤加练习,课下积极研究手册和相关书籍。两天过后,才算有点眉目了。到这时心里才算稍微安稳了一些,再加上以前学过名为Protel的电路设计软件,所以我的自信心加强了。
在这次设计过程中,体现出自己单独设计电路的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。
在此感谢我们的郝志华,田红霞,张国旭老师,老师严谨细致、一丝不苟的作风一直是我工作、学习中的榜样;老师循循善诱的教导和不拘一格的思路给予我无尽的启迪;这次简易数字温度计设计的每个实验细节和每个数据,都离不开老师您的细心指导。而您开朗的个性和宽容的态度,帮助我能够很顺利的完成了这次课程设计。
同时感谢对我帮助过的同学们,谢谢你们对我的帮助和支持,让我感受到同学的友谊。
18
参考文献
[1] 马忠梅等.单片机的C语言应用程序设计.北京:北京航空航天大学出版社,2007 [2] 周坚.单片机C语言轻松入门.北京:北京航空航天大学出版社,2007 [3] 何立民.单片机应用技术大全.北京:北京航空航天大学出版社,1994 [4] 袁希光.传感器技术手册.北京:国防工业出版社,1986 [5] 冯英.传感器电路原理与制作.成都:成都科技大学出版社,1997 [6] 行开先,叶济民.热敏电阻器.北京:机械工业出版社,1981
[7] 丁元杰.《单片微机原理及应用》(第二版).机械工业出版社,2005.2 [8] 张有德,赵志英.《单片微型机原理、应用于实验》.复旦大学出版社,2000.4 [9] 赵新民,王祁.智能仪器设计基础.哈尔滨:哈尔滨工业大学出版社,1999
19
附录A 多点温度采集系统电路原理图
20
附录B C语言源代码
#include \"reg51.h\" #include \"intrins.h\"
#define uchar unsigned char #define uint unsigned int
#define DiSdata P0 //七段码数据输出口 #define discan P2 //扫描数据输出口 sbit DIN=P0^7; //小数点控制 sbit Scl=P3^0; //串行时钟 sbit Sda=P3^1; //串行数据 sbit alarm=P1^7; sbit alarm2=P1^6; uint i; uint h; uint temp;
uchar dath[2]; //温度输入口 uchar ff2,ff1=0,t3=0; uchar code
dis_7[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
//共阴LED段码表 \"0\" \"1\" \"2\" \"3\" \"4\" \"5\" \"6\" \"7\" \"8\" \"9\" \"灭\" \"-\" uchar code scan_con[5]={0xfd,0xfb,0xf7,0xef,0xdf}; //LED显示控制,对应0的LED有效
uchar data display[5]={0x00,0x00,0x00,0x00,0x002}; //显示单元数据,共6个数据和一个运算暂用 uchar data display1[5]={0x01,0x02,0x03,0x04,0x052}; uchar data DD[4]={0x90,0x92,0x94}; //
void delay_us(uint t) //延时函数 {
for (;t>0;t--); } //
scan() //LED扫描函数
21
{ uchar k; for(k=0;k<5;k++) {
discan=scan_con[k]; //控制位送P2口 DiSdata=dis_7[display[k]]; //数据位送P0口 if (k==3){DIN=1;} else
DIN=0; delay_us(150); } } //
void delay(void) //延时函数 { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } //
void i_start(void) //I2C开始 { Sda=1; Scl=1; delay(); Sda=0; delay(); Scl=0; } //
void i_stop(void) //I2C终止
//小数点显示 22
{ Sda=0; Scl=1; delay(); Sda=1; delay(); Scl=0; Sda=0; } //
bit i_clock(void) //应答信号 { bit sample; Scl=1; delay(); sample=Sda; _nop_(); _nop_(); Scl=0; delay(); return(sample); } //
void i_ack(void) { Sda=0; i_clock(); Sda=1; } //
bit i_send(uchar i_data) //I2C发送 { uchar i; for(i=0;i<8;i++)
23
{
Sda=(bit)(i_data & 0x80); i_data=i_data<<1; i_clock(); } Sda=1;
return(~i_clock()); } //
uchar i_receive(void) //I2C接收 {
uchar i_data=0; uchar i; for(i=0;i<8;i++) {
i_data<<=1; Scl=0;delay(); Scl=1;delay() ; i_data|=Sda; }
Scl=0; delay(); return(i_data); } //
bit start_temperature_T(unsigned char d) //开始转换命令 { uchar t1; t1=DD[d]; i_start(); if(i_send(t1)) {
if(i_send(0xee)) { i_stop();
24
delay(); return(1); } else { i_stop(); delay(); return(0); } } else { i_stop(); delay(); return(0); } } //
bit read_temperature_T(unsigned char *p,unsigned char d) {
unsigned char t1,t2; t1=DD[d]; t2=DD[d]+0x01; i_start(); if(i_send(t1)) {
if(i_send(0xaa)) { i_start();
if(i_send(t2)) {
*(p+1)=i_receive(); i_ack(); *p=i_receive();
25
i_stop(); delay(); i_send(t1); i_send(0x22);
delay(); return(1); } else { i_stop(); delay(); return(0); } } else { i_stop(); delay(); return(0); } } else { i_stop(); delay(); return(0); } }
bit ds1621(unsigned char d) {
unsigned char t1; t1=DD[d]; i_start(); if(i_send(t1))
26
{
if(i_send(0xac)) { i_start(); if(i_send(0x0a)) {
i_stop();
delay(); return(1);
} else { i_stop(); delay(); return(0); } } else
{ i_stop(); delay(); return(0);
} } else { i_stop(); delay(); return(0); } } //
void chuli_temp(unsigned char d) {
27
unsigned char datah,f=1,datal,t; while(f)
{t=start_temperature_T(d); if(t)
{read_temperature_T(dath,d);f=0;} delay_us(20); }
datah=dath[1];datal=dath[0]; if(datal<20) alarm1=1; else alarm1=0; if(datah>80) alarm2=1; else alarm2=0; display[0]=d; f=0;
if((datah&0x80)!=0) {f=1;
display[1]=10;
datah=datah+1;
datah=~datah; datah=datah+1; display[2]=((datah/10)%10); display[3]=datah%10; if((datal&0x80)==0x80)
display[4]=5;
else
display[4]=0; } else {
display[1]=datah/100;
28
display[2]=((datah/10)%10); display[3]=datah%10; if((datal&0x80)==0x80)
display[4]=5;
else
display[4]=0;
}
if(!display[1]) {
display[1]=0x0a; if(!display[2]) {
display[2]=0x0a;
if(f) {display[2]=0x0b;f=2;} } }
if(f==1)display[1]=0x0b; }
void ex_int0() interrupt 0 { ff2=1; ff1=0; } //
void ex_int1() interrupt 2 { EA=0; ff1=1; ff2=0; EA=1; } //
main() //主函数 {
//符号位显示判断 //最高位为0时不显示 //次高位为0时不显示 //负温度时最高位显示\"-\" 29
uchar d=0,t4=1;
DiSdata=0xff; //初始化端口 discan=0xff; alarm=0; EA=1; EX0=1; EX1=1; IT0=1;IT1=1;
for(h=0;h<5;h++) //开机显示\"0000\" {
display[h]=0; } scan(); delay_us(3); for(d=0;d<3;d++) { ds1621(d);}
d=0; while(1) { if(ff1) {
chuli_temp(d); for(h=0;h<100;h++)
scan(); d++; if(d==3) }
d=0; if(ff2) { t3=t3+ff2; if(t3==3) t3=0;
chuli_temp(t3);
30
ff2=0;
} scan();
} }
31
因篇幅问题不能全部显示,请点此查看更多更全内容