《基于AT89S51单片机实现的温度计设计毕业设计(论文)word格式.doc》由会员分享,可在线阅读,更多相关《基于AT89S51单片机实现的温度计设计毕业设计(论文)word格式.doc(35页珍藏版)》请在三一办公上搜索。
1、第一章 绪论 1.1 课题的设计目的1. 巩固、加深和扩大单片机应用的知识面,提高综合及灵活运用所学知识解决工业控制的能力。2. 培养针对课题需要,选择和查阅有关手册、图表及文献资料的自学能力,提高组成系统、编程、调试的动手能力。3. 通过对课题设计方案的分析、选择、比较、熟悉单片机用系统开发、研制的过程,软硬件设计的方法、内容及步骤。1.2 课题研究的内容数字温度计采用温度敏感元件也就是温度传感器(如铂电阻,热电偶,半导体,热敏电阻等),将温度的变化转换成电信号的变化,如电压和电流的变化,温度变化和电信号的变化有一定的关系,如线性关系,一定的曲线关系等,这个电信号可以使用模数转换的电路即A/
2、D转换电路将模拟信号转换为数字信号,数字信号再送给处理单元,如单片机或者PC机等,处理单元经过内部的软件计算将这个数字信号和温度联系起来,成为可以显示出来的温度数值,如摄氏度,然后通过显示单元,如LED,LCD或者电脑屏幕等显示出来给人观察。这样就完成了数字温度计的基本测温功能。 本文是基于AT89S51单片机,采用数字温度传感器DS18B20,利用DS18B20不需要A/D转换,课直接进行温度采集显示,报警的数字温度计设计。包括传感器数据采集电路,温度显示电路,上下限报警调整电路,单片机主板电路等组成。第二章 开发工具Proteus与Keil Proteus软件 Proteus简介Prote
3、us软件是英国Labcenter electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术 )。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持805
4、1、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即将增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。 该软件的特点是:1. 实现了单片机仿真和SPICE电路仿真相结合,具有模拟电路仿真、数字电路仿真、各种单片机(51系列、AVR、PIG等常用的MCU)及其外围电路(如LCD、RAM、ROM、键盘、LED、A/D、D/A)组成的系统仿真。2. 提供了多种虚拟仪器。如示波器、逻辑分析仪、信号发生器等,调试非常方便。3. 提供软件调试功能,同时支
5、持第三方的软件编译和调试环境,如Keil等软件。4. 具有强大的原理图绘制功能。Proteus与其它单片机仿真软件不同的是,它不仅能仿真单片机CPU的工作情况,也能仿真单片机外围电路或没有单片机参与的其它电路的工作情况。因此在仿真和程序调试时,关心的不再是某些语句执行时单片机寄存器和存储器内容的改变,而是从工程的角度直接看程序运行和电路工作的过程和结果。对于这样的仿真实验从某种意义上讲,是弥补了实验和工程应用阉脱节的矛盾和现象。同时,当硬件调试成功后,利用Proteus ARES软件,很容易获得其PCB图,为今后的制造提供了方便。 Keil软件 Keil软件简介Keil C51是美国Keil
6、Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。Keil C51软件是一个基于32位Windows环境的应用程序,支持C语言和汇编语言编程,其以上的版本将编译和仿真软件统一为Vision(
7、通常称为V2)。Keil提供包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,由以下几部分组成:Vision IDE集成开发环境C51编译器、A51汇编器、LIB51库管理器、BL51连接/定位器、OH51目标文件生成器以及 Monitor-51、RTX51实时操作系统。 Keil软件调试功能应用Keil进行软件仿真开发的主要步骤为:编写源程序并保存建立工程并添加源文件设置工程编译/汇编、连接,产生目标文件程序调试。Keil使用“工程”(Project)的概念,对工程(而不能对单一的源程序)进行编译/汇编、连接等操作。工程的建立、设置、编译/汇编及连接产生目标
8、文件的方法非常易于掌握。首先选择菜单File-New,在源程序编辑器中输入汇编语言或C语言源程序(或选择File-Open,直接打开已用其它编辑器编辑好的源程序文档)并保存,注意保存时必须在文件名后加上扩展名.asm(.a51)或.c;然后选择菜单Project-New Project,建立新工程并保存(保存时无需加扩展名,也可加上扩展名.uv2);工程保存后会立即弹出一个设备选择对话框,选择CPU后点确定返回主界面。这时工程管理窗口的文件页(Files)会出现“Target1”,将其前面+号展开,接着选择Source Group1,右击鼠标弹出快捷菜单,选择“Add File to Grou
9、p Source Group1”,出现一个对话框,要求寻找并加入源文件(在加入一个源文件后,该对话框不会消失,而是等待继续加入其它文件)。加入文件后点close返回主界面,展开“Source Group1”前面+号,就会看到所加入的文件,双击文件名,即可打开该源程序文件。紧接着对工程进行设置,选择工程管理窗口的Target1,再选择Project-Option for TargetTarget1(或点右键弹出快捷菜单再选择该选项),打开工程属性设置对话框,共有8个选项卡,主要设置工作包括在Target选项卡中设置晶振频率、在Debug选项卡中设置实验仿真板等,如要写片,还必须在Output选项
10、卡中选中“Creat Hex Fi”;其它选项卡内容一般可取默认值。工程设置后按F7键(或点击编译工具栏上相应图标)进行编译/汇编、连接以及产生目标文件。成功编译/汇编、连接后,选择菜单Debug-Start/Stop Debug Session(或按Ctrl+F5键)进入程序调试状态,Keil提供对程序的模拟调试功能,内建一个功能强大的仿真CPU以模拟执行程序。Keil能以单步执行(按F11或选择Debug-Step)、过程单步执行(按F10或选择Debug-Step Over)、全速执行等多种运行方式进行程序调试。如果发现程序有错,可采用在线汇编功能对程序进行在线修改(Debug-Inli
11、ne Assambly),不必执行先退出调试环境、修改源程序、对工程重新进行编译/汇编和连接、然后再次进入调试状态的步骤。对于一些必须满足一定条件才能被执行的、难以用单步执行方式进行调试的程序行,可采用断点设置的方法处理(Debug-Insert/Remove Breakpoint或Debug-Breakpoints等)。在模拟调试程序后,还须通过编程器将.hex目标文件烧写入单片机中才能观察目标样机真实运行状况。第三章 系统总体设计方案 总体设计方案框图温度测量单片机信号放大显示电路语音报警按键 图2-1 系统组成3.2 系统工作原理本设计是基于单片机对数字信号的高敏感和可控性、温度传感器可
12、以产生数字信号。其基本构成如图2-1所示。该系统利用单片机AT89S52作为系统的控制中心,采用温度传感器DS18B20,将测量到的温度值送入单片机中,经过数据处理后,进行实时显示,并通过按键控制测量结果。第四章 软件设计仿真 AT89S52单片机At89S52 是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非 易失性存储器技术制造,与工业80C52 产品指令和引脚完 全兼容。片上Flash允许程序存储器在系统可编程,亦适于 常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式
13、控制应用系统提 供高灵活、超有效的解决方案。 AT89S52具有以下标准功能: 8k字节Flash,256字节RAM, 32 位I/O 口线,定时器,2 个数据指针,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口, 片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻 辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工 作。掉电保护方式下,RAM内容被保存,振荡器被冻结, 单片机一切工作停止,直到下一个中断或硬件复位为止。故80C52单片机管脚图:部分引脚说明:1. 时钟电路引脚XTAL1 和XTAL2:
14、XTAL2(18 脚):接外部晶体和微调电容的一端;在8052 片内它是振荡电路反相放大器的输出端,振荡电路的频率就是晶体固有频率。若需采用外部时钟电路时,该引脚输入外部时钟脉冲。要检查振荡电路是否正常工作,可用示波器查看XTAL2 端是否有脉冲信号输出。XTAL1(19 脚):接外部晶体和微调电容的另一端;在片内它是振荡电路反相放大器的输入端。在采用外部时钟时,该引脚必须接地。2. 控制信号引脚RST,ALE,PSEN 和EA:RST/VPD(9 脚):RST 是复位信号输入端,高电平有效。当此输入端保持备用电源的输入端。当主电源Vcc 发生故障,降低到低电平规定值时,将5V 电源自动两个机
15、器周期(24个时钟振荡周期)的高电平时,就可以完成复位操作。RST 引脚的第二功能是VPD,即接入RST 端,为RAM 提供备用电源,以保证存储在RAM 中的信息不丢失,从而合复位后能继续正常运行。ALE/PROG(30 脚):地址锁存允许信号端。当8952 上电正常工作后,ALE 引脚不断向外输出正脉冲信号,此频率为振荡器频率fOSC 的1/6。CPU 访问片外存储器时,ALE 输出信号作为锁存低8 位地址的控制信号。平时不访问片外存储器时,ALE 端也以振荡频率的1/6 固定输出正脉冲,因而ALE 信号可以用作对外输出时钟或定时信号。如果想确定芯片的好坏,可用示波器查看ALE端是否有脉冲信
16、号输出。如有脉冲信号输出,则基本上是好的。ALE 端的负载驱动能力为8 个LS 型TTL(低功耗甚高速TTL)负载。此引脚的第二功能PROG 在对片内带有4KB EPROM 的8052 编程写入(固化程序)时,作为编程脉冲输入端。PSEN(29 脚):程序存储允许输出信号端。在访问片外程序存储器时,此端定时输出负脉冲作为读片外存储器的选通信号。此引肢接EPROM 的OE 端。PSEN 端有效,即允许读出EPROMROM 中的指令码。PSEN 端同样可驱动8 个LS 型TTL 负载。要检查一个小系统上电后CPU 能否正常到EPROMROM 中读取指令码,也可用示波器看PSEN 端有无脉冲输出。如
17、有则说明基本上工作正常。EA/Vpp(31 脚):外部程序存储器地址允许输入端/固化编程电压输入端。当EA 引脚接高电平时,CPU只访问片内EPROM/ROM并执行内部程序存储器中的指令,但当PC(程序计数器)的值超过0FFFH时,将自动转去执行片外程序存储器内的程序。当输入信号EA 引脚接低电平(接地)时,CPU 只访问外部EPROM/ROM 并执行外部程序存储器中的指令,而不管是否有片内程序存储器。对于无片内ROM 的8031 或8032,需外扩EPROM,此时必须将EA 引脚接地。此引脚的第二功能是Vpp 是对片内EPROM固化编程时,作为施加较高编程电压(一般12V21V)的输入端。3
18、. 输入/输出端口P0/P1/P2/P3:P0口(,3932 脚):P0口是一个漏极开路的8 位准双向I/O口。作为漏极开路的输出端口,每位能驱动8 个LS 型TTL 负载。当P0 口作为输入口使用时,应先向口锁存器(地址80H)写入全1,此时P0 口的全部引脚浮空,可作为高阻抗输入。作输入口使用时要先写1,这就是准双向口的含义。在CPU 访问片外存储器时,P0口分时提供低8 位地址和8 位数据的复用总线。在此期间,P0口内部上拉电阻有效。P1口(,18 脚):P1口是一个带内部上拉电阻的8 位准双向I/O口。P1口每位能驱动4 个LS 型TTL 负载。在P1口作为输入口使用时,应先向P1口锁
19、存地址(90H)写入全1,此时P1口引脚由内部上拉电阻拉成高电平。P2口,2128 脚):P2口是一个带内部上拉电阻的8 位准双向I/O口。P口每位能驱动4个LS 型TTL 负载。在访问片外EPROM/RAM 时,它输出高8 位地址。P3口,1017 脚):P3口是一个带内部上拉电阻的8 位准双向I/O口。P3口每位能驱动4个LS型TTL负载。P3口与其它I/O 端口有很大的区别,它的每个引脚都有第二功能,如下:(RXD)串行数据接收。:(RXD)串行数据发送。:(INT0#)外部中断0输入。:(INT1#)外部中断1输入。:(T0)定时/计数器0的外部计数输入。:(T1)定时/计数器1的外部
20、计数输入。:(WR#)外部数据存储器写选通。:(RD#)外部数据存储器读选通。4.2 温度传感器DS18B20衡量温湿度传感器的原则主要有测量范围、工作环境、线性度、不重复性、迟滞、灵敏度、零点时间漂移、响应速度、稳定性及其体积大小等。DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO92小体积封装形式;温度测量范围为55125,可编程为9位12位A/D转换精度,测温分辨率可达,被测温度用符号扩展的16位数字量方式串行输出;其工作电源既可在远端引入,也可采用寄生电源方式产生;多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与诸多DS18B20通信,占
21、用微处理器的端口较少,可节省大量的引线和逻辑电路。以上特点使DS18B20非常适用于远距离多点温度检测系统。及单片机管脚图如下: 显示电路使用7SEG-mpx2-cc 型数字LED显示温度。此元件有四个LED数码管,可同时显示多位数字,可精确温度到小数点后两位,精确度很高。而且管脚驱动接线简单。 总体仿真采用proteus仿真软件进行仿真,在仿真之前按照预先设计好的电路图进行连线,以及布局,最后确定线路已连接好,再运行开始仿真。数字温度计的仿真结果如下图所示: (1)点击全速执行按钮。(2)改变温度传感器的设置值,可以观察到输出电平值的改变,从而可以确定转换是否正常,并且可以观察到LED显示的
22、数据随着变化。(3)如果LED显示值与传感器的设置值不一致,则可对通过改变电阻的值来改变运算放大器的放大倍数,直到显示值与预设值一致为止。改变传感器预设值,重复上述过程。第五章 总结与体会通过此次的专业设计,我学会了如何运用Proteus和Keil,并且在Keil软件中如何将.c文件转换成.hex文件。在本次设计中,使我深深地体会到理论知识与实践之间的差别。有时候虽然理论上的除了结论,或者可行,可是到了实践上就不免困难重重。通过这次专业设计,不仅巩固了知识,而且让所学的知识通过熟练地运用软件达到所需的目的,这是让人很欣慰的,也激发了我学习的兴趣。在专业设计上遇到了很多的困难,也让我看到了自身学
23、习上的不足之处。有很多知识不仅仅是课本上的,还需要自己课后多总结,多查阅资料以弥补新的知识。专业设计转眼就结束了,可带给我的收获却是很多,也让我学到了如何解决困难,查阅资料的习惯。单片机技术的发展速度很快,我们必须学好基础知识,多动手实践,这次设计让我深刻体会到熟练运用软件的重要性。虽然只是用了一次,但我会随时随地的去运用运用。这次的设计无疑为我以后的设计打下了很好的基础。参考文献1. 单片机控制实习与专题制作 蔡朝洋编著北京航空航天大学出版社2 单片机原理及应用技术中国矿业大学出版社3 微型计算机原理及应用中国电力出版社4 MCS-51单片机原理及应用天津大学出版社5 单片微型计算机原理接口
24、与应用北京邮电大学出版社(第1版)附录A:源程序代码#include reg52.h ;头文件#include intrins.h#define uchar unsigned char ;定义无符号字符sbit P3_2=P32; ; 定义P3_2为P3口的第二位sbit P3_3=P33;sbit P3_4=P34;sbit P3_5=P35;sbit DATA = P36;sbit alarm=P37;sbit red=P14;unsigned int temp1; unsigned char tempz,tempx;unsigned char a,k;char sz,xz,sx,xx;u
25、nsigned char buf4;unsigned char code;table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;void delay(unsigned char num)while(num-) ;void delay1(unsigned char x) unsigned char j; while(x-) for(j=0;j100;j+); void xdisplay(char x,char y)static unsigned char flag=0,z=0;if(a=0)if(x=0)P0=tabley;P2=0xf7
26、;delay1(1);P2=0xff;P0=tablex%10|0x80;P2=0xfb;delay1(1);P2=0xff;P0=table(x%100)/10;P2=0xfd;delay1(1);P2=0xff;if(x/100!=0)P0=tablex/100;P2=0xfe;delay1(1);P0=0x00;P2=0xff;if(a=1)if(flag=0)P0=tabley;P2=0xf7;delay1(1);P2=0xff;z+;if(z=20)z=0;flag=1;if(flag=1)P2=0xff;delay1(1);z+;if(z=20)z=0;flag=0;if(x=0)
27、P0=tablex%10|0x80;P2=0xfb;delay1(1);P2=0xff;P0=table(x%100)/10;P2=0xfd;delay1(1);P2=0xff;if(x/100!=0)P0=tablex/100;P2=0xfe;delay1(1);P2=0xff;if(x=0)if(flag=0)P0=tablex%10|0x80;P2=0xfb;delay1(1);P2=0xff;P0=table(x%100)/10;P2=0xfd;delay1(1);P2=0xff;if(x/100!=0)P0=tablex/100;P2=0xfe;delay1(1);P2=0xff;z
28、+;if(z=20)z=0;flag=1;if(flag=1)P2=0xff;delay1(1);P2=0xff;z+;if(z=20)z=0;flag=0;P0=tabley;P2=0xf7;delay1(1);P2=0xff;if(x0)if(flag=0)P0=table(-x)%10|0x80;P2=0xfb;delay1(1);P2=0xff;P0=table(-x)/10;P2=0xfd;delay1(1);P2=0xff;P0=0x40;P2=0xfe;delay1(1);P2=0xff;z+;if(z=20)z=0;flag=1;if(flag=1)P2=0xff;delay1
29、(1);P2=0xff;z+;if(z=20)z=0;flag=0;P0=tabley;P2=0xf7;delay1(1);P2=0xff;void display() unsigned char i; unsigned char code Ss4=0xfe,0xfd,0xfb,0xf7; for(i=0;i0;i-) DATA = 0; / 给脉冲信号 dat=1; DATA = 1; / 给脉冲信号 if(DATA) dat|=0x80; delay(8); return(dat);/写一个字节void WriteOneChar(unsigned char dat) uchar i=0;
30、for (i=8; i0; i-) DATA = 0; DATA = dat&0x01; delay(10); DATA = 1; dat=1; delay(8);/读取温度int ReadTemperature(void) uchar a=0; uchar b=0; int t=0; Init_DS18B20(); WriteOneChar(0xCC); / 跳过读序号列号的操作 WriteOneChar(0x44); / 启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); /跳过读序号列号的操作 WriteOneChar(0xBE); /读取温度寄存器等(
31、共可读9个寄存器) 前两个就是温度 a=ReadOneChar();/低位 b=ReadOneChar();/高位 t=b; t=8; t=t|a;return(t); void xiaodou(unsigned char a ) if(a=0) delay(10);void tiaozheng( )xiaodou(P3_2);if(P3_2=0)while(!P3_2);a=0;k+;if(k=3)k=0;xiaodou(P3_3);if(P3_3=0)while(!P3_3);if(k!=0)a+;if(a=3)a=0;xiaodou(P3_4);if(P3_4=0)while(!P3_4
32、);if(k=1)switch(a)case 0: break;case 1: sx+;if(sx=10)sx=0;break;case 2: sz+ ;if(sz=115)sz=-50;break;if(k=2)switch(a)case 0: break;case 1: xx+;if(xx=10)xx=0;break;case 2: xz+;if(xz=115)xz=-50;break; xiaodou(P3_5); if(P3_5=0) while(!P3_5);if(k=1)switch(a)case 0: break;case 1: sx-;if(sx0)sx=9;break;cas
33、e 2: sz-;if(sz=-51)sz=115;break;if(k=2)switch(a)case 0: break;case 1: xx-;if(xx4; tempx=temp&0x0F; tempx=tempx*6/10;buf1=tabletempz/10; elsetempz=temp4; tempx=temp&0x0F; tempx=tempx*6/10;if(tempz/100!=0)buf0=tabletempz/100;else buf0=0x00;buf1=table(tempz%100)/10;buf2=tabletempz%10|0x80; buf3=tabletempx;void time0( ) interrupt 1unsigned char i=0; TH0=0xb1; TL0=0xd0; led_process(temp1);for(i=0;isz|tempzsx|tempxxx) alarm=0;red=0; else alarm=1; red=1; 附录B:系统总图