《最新51单片机课程设计数字温度计报告.doc》由会员分享,可在线阅读,更多相关《最新51单片机课程设计数字温度计报告.doc(22页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精品资料51单片机课程设计数字温度计报告.电子毕业设计数字温度计题目: 数显温度计 学院: 电子信息学院 班级: 学号: 姓名: 指导老师: 日期:数字温度计设计任务书一、 课程设计目的1、 加强学生理论联系实际的能力,提高学生的动手能力;2、 学会基本电子元器件的识别和检测;3、 学会应用EDA软件Proteus进行电路的设计和仿真;4、 基本掌握单片机的基本原理,并能将其应用于系统的设计。5、 通过实训,提高学生的学习兴趣,激发自主学习能力,培养创新意识。二、 设计任务先焊制一个单片机最小系统,并以制作的单片机最小系统为核心,设计并制作一个数字式温度计应用系统。三、 设计要求具有以下功能:
2、(1) 采用DS18B20作为温度传感器进行温度检测;(2) 对采集温度进行显示(显示温度分辨率0.1);(3) 采集温度数值应采用数字滤波措施,保证显示数据稳定;(4) 显示数据,无数据位必须消隐。目录数字温度计设计任务书 21、 设计思路(1) 设计原理 4(2) 系统方案及总体设计框图 42、 数字温度计应用系统的硬件设计(1) 单片机小系统基本组成及硬件图 (2) 外围电路工作原理及系统硬件图 (3) 主要芯片及其功能 3、 系统软件程序的设计软件流程框图 4、 系统调试(1) 仿真器介绍 (2) 调试结果及其分析(3) 系统设计电路的特点和方案的优缺点 5、 课程设计心得体会参考文献
3、附录 程序清单及注释一、 设计思路:设计方案及其总体设计框图单片机芯片AT89S521602显示器晶振控制温度检测电路DS18B20温度计设计系统流程图系统设计原理:本次课程设计是基于单片机的数字温度计设计,在开始课程设计的时候我们要理解并掌握对单片机的开发,学会使用KEIL及Proteus等仿真软件。根据设计任务要求选择好器件,编写好程序运行成功之后进行软件联调,验证系统是否正确。通过筛选,我们组选用单片机AT89S52作为主控制系统;用1602液晶显示模块芯片作为温度数据显示装置;智能温度传感器采用DS18B20器件作为测温电路主要组成部分。 开始进入缓冲区初始化复位DS18B20发跳过R
4、OM命令温度转换命令延时复位DS18B20,跳过ROM命令读存储器命令读温度命令更新数据缓冲区将温度转换为BCD码二、数字温度计应用系统的硬件设计1、单片机小系统的基本组成及其选择(1)单片机单片机选型参考 AT89S51、AT89S52 :具备ISP下载功能 ,可以使用USBASP程序下载线或者并口下载 STC89C51、STC89C52:使用串口线+MAX232烧写程序。 AT89C51、AT89C52 :可以在最小系统板上使用,但需要另外用编程器烧写程序 本次课程设计选用AT89S52型号单片机进行操作。AT89S52是一个低功耗,高性能CMOS 8位单片机,片内含8k Bytes IS
5、P(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS -51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S52可为许多嵌入式控制应用系统提供高性价比的解决方案。 AT89S52具有如下特点:40个引脚,8k Bytes Flash片内程序存储器,256 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个 全双工串
6、行通信口,看门狗(WDT)电路,片内时钟振荡器。 AT89S52引脚图 此外,AT89S52设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断 系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三 种封装形式,以适应不同产品的需求。 AT89S52引脚图 此外,AT89S52设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断 系统可继续工作,掉电模式冻结振荡器而保存RA
7、M的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三 种封装形式,以适应不同产品的需求。(4) 电源 电源适配器供电:DC座(三个管脚) usb供电:3、时钟石英晶振电路结构原理如右图所示 4、I/O口&接口 所有I/O用排针引出 串行通信口:P3.0,p3.1 ISP:p1.6,p1.7单片机共有4个8位双向并行I/O通道口,每位均有自己的锁存器、输出驱动器和输入缓冲器组成。这种结构,在数据输出时可以锁存,及输出新的数据以前,通道口上的原始数据不变。但对输入信息是不锁存的,所以从外部输入的信息必须保持到取数指令执行完为止。2、外围电路工作原理及
8、系统硬件图 3、主要芯片及其功能AT89S52(1)AT89S52各引脚及I/O口介绍 P0口也可用做访问片外数据存储器和程序存储器时的低8位地址/数据总线的复用口。这种情况下,P0口内含上拉电阻。在Flash编程时,P0口输入代码数据;在Flash校验时,P0口输出代码数据。在进行编程校验时,需外接10K的上拉电阻。P1口8位、双向I/O口,内含上拉电阻。P1口为用户使用的通用I/O口,每个引脚可驱动4个TTL负载。当用做输入时,每个端口首先置1。P1.0和P1.1引脚也用做定时器2的外部计数输入(P1.0/T2)和触发器输入(P1.1/T2DX)。在编程和校验期间,P1口可输入低字节地址。
9、 P2口8位、双向I/O口,内部具有上拉电阻。P2口可用做通用I/O,可以驱动4个TTL负载。对P2口各位写入1,可作为输入。每个引脚由外部负载拉为低电平时,经由内部上拉电阻向外输出电流。在访问16位地址的外部程序存储器和数据存储器时,P2口提供高8位地址。用MOVX DPTR类指令访问外部数据存储器时,P2口为高8位地址(即PCH);用MOVX R0和MOVX R1类指令访问外部数据存储器时,P2口上的内容是SFR P2的内容。在编程和校验时,P2口接收地址线的高位和一些控制信号。P3口8位、双向I/O口,内部含有上拉电阻。 P3口可用做通用I/O口,可驱动4个TTL负载。当用做输入熟,要先
10、将P3口各位置如外部负载将P3口拉低,则经过上拉电阻向外输出电流。在编程和校验时,P3口接收某些控制信号。 地址锁存允许/编程脉冲输入。 外部程序存储器读选通,低电平有效。 片外程序存储器访问允许。 XTAL1和XTAL2XTAL1是片内振荡器反相放大器和时钟发生器的输入端,XTAL2是片内振荡器反相放大器的输出端。 (2)AT89S52实物与仿真的区别DS18B20DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9-12位的数字值读数方式。DS18B20的性能特点
11、如下:(1)独特的单线接口仅需要一个端口引脚进行通信,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。(2)DS18B20支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点组网测温;(3)无须外部器件,全部传感元件及转换电路集成在形如一只三极管的集成电路内;(4)可通过数据线供电,电压范围为3.0-5.5;(5)零待机功耗;(6)温度以9或12位数字,对应的可分辨温度分别为0.5、0.25、0.125和0.0625,可实现高精度测温;(7)用户可定义报警设置;(8)报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;(9)负
12、电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;(10)测量结果直接输出数字温度信号,以一线总线串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力DS18B20采用3脚PR35封装或8脚SOIC封装,其引脚排列及内部结构框图如图及测温原理图如下所示:1602液晶显示屏调用子程序设置第二行显示位置与内容调用子程序设置第一行显示位置与内容 1602液晶显示流程图:延时初始化1602开始 三、系统软件程序的设计(见附录): 软件流程框图:发DS18B20复位命令初始化发跳过ROM命令调用显示子程序N发读取温度命令是否正确读取操作并进行校验NY初次上串YN字节是否读完
13、N读出温度值,温度计算,处理显示,数据刷新YN校验是否正确发温度转换开始命令移入温度暂存器主程序流程图读温度流程图结束四、系统调试:1、仿真器的介绍:Keil C51是Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。如果使用C语言编程,那么Keil几乎就是不
14、二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。 keil软件的开发运用 (1)Keil C51单片机软件开发系统的整体结构 C51工具包的整体结构,uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用IDE本身或其它编辑C或汇编源文件。然后分别由C51及C51编译器编译生成目标文件(.OBJ)。目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。ABS文件由OH51转换
15、成标准的Hex文件,以供调试器dScope51或tScope51使用进行级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。(2)使用独立的Keil仿真器时,注意事项 l 仿真器标配11.0592MHz的晶振,但用户可以在仿真器上的晶振插孔中换插其他频率的晶振。 l 仿真器上的复位按钮只复位仿真芯片,不复位目标系统。 l 仿真芯片的31脚(/EA)已接至高电平,所以仿真时只能使用片内ROM,不能使用片外ROM;但仿真器外引插针中的31脚并不与仿真芯片的31脚相连,故该仿真器仍可插入到扩展有外部ROM(其CPU的/EA引脚接至低电平)的目标系统中使用。 prot
16、eus软件的开发运用(1) Protues 软件介绍Proteus 是目前最好的模拟单片机外围器件的工具,它可以仿真51系列、AVR,PIC 等常用的MCU 及其外围电路。本文基于Proteus 6.9 和Keil uVision3 软件。Proteus 与其它单片机仿真软件不同的是,它不仅能仿真单片机CPU 的工作情况,也能仿真单片机外围电路或没有单片机参与的其它电路的工作情况。因此在仿真和程序调试时,关心的不再是某些语句执行时单片机寄存器和存储器内容的改变,而是从工程的角度直接看程序运行和电路工作的过程和结果。对于这样的仿真实验,从某种意义上讲,是弥补了实验和工程应用间脱节的矛盾和现象。(
17、2) proteus 的工作过程运行proteus 的ISIS 程序后,进入该仿真软件的主界面。在工作前,要设置view 菜单下的捕捉对齐和system 下的颜色、图形界面大小等项目。通过工具栏中的p 命令,在pick devices 窗口中选择电路所需的元件,放置元件并调整其相对位置,元件参数设置,元器件间连线,编写程序;在source 菜单的Define code generation tools 菜单命令下,选择程序编译的工具、路径、扩展名等项目;在source 菜单的Add/removesource files 命令下,加入单片机硬件电路的对应程序;通过debug 菜单的相应命令仿真程
18、序和电路的运行情况。Proteus 软件提供了30 多个元件库,数千种元件。元件涉及数字和模拟、交流和直流等。2、系统整体调试调试结果 结果分析 在运行仿真结果时通过改变温度传感器DS18B20的温度,然后调用各种子函数,可以改变液晶显示1602的第二行显示数据,说明程序编写正确。系统设计电路的特点和方案的优缺点我们组设计的数字温度计系统知识运用简单的AT89S52芯片的I/O口传输功能,通过几个小的读数据、传递数据、延时子函数实现温度的读取传输功能,是比较简单,容易实现的,所以我们的系统只是实现了一些简单的功能,系统整体来说比较简易,但好像这个温度计没有多大的应用价值,所以我们后续分析觉得这
19、个系统可以加一个温度复位系统提高AT89S52芯片的功能价值,也提高数字温度计的智能价值,还可以增加一个报警子函数,实现智能数字温度计更高的应用价值。五、课程设计心得体会: 经过这次单片机课程设计,终于完成了我的数字温度计的设计,虽然不能做到很完美,但从心底里说,还是高兴的,毕竟这次设计把实物都做了出来,高兴之余不得不深思呀!在本次设计的过程中,我发现很多的问题,也许是第一次进行这种系统的设计所以感觉完成这样一次小系统设计我长进了很多,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,举个例子,以前写的那几次,数据加减
20、时,我用的都是BCD码,这一次,我全部用的都是16进制的数直接加减,显示处理时在用除法去删分,感觉效果比较好,有好多的东西,只有我们去试着做了,才能真正的掌握,只学习理论有些东西是很难理解的,更谈不上掌握。从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。通过这次对数字温度计的设计与制作,让我了解了设计电路的程序,也让我了解了关于数字温度计的原理与设计理念,要设计一个电路总要先用仿真仿真成功之后才实际接线的。但是最后的成品却不一定与仿真时完全
21、一样,因为,再实际接线中有着各种各样的条件制约着。而且,在仿真中无法成功的电路接法,在实际中因为芯片本身的特性而能够成功。所以,在设计时应考虑两者的差异,从中找出最适合的设计方法。 通过这次学习,让我对各种电路都有了大概的了解,所以说,坐而言不如立而行,对于这些电路还是应该自己动手实际操作才会有深刻理解。从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。参考文献:12科技教育创新中国科技信息2010 年第11 期 CHINA SCIENCE
22、AND TECHNOLOGY INFORMATION Jun.2010附录:程序清单及其注释: /使用1602LCD显示DS18B20转换的温度值 #include #include #include #define uchar unsigned char #define uint unsigned int sbit RS = P26; /数据/命令选择端(H/L) sbit LCDEN = P27; /使能端 void delayUs() /短延时 _nop_(); void delayMs(uint a) /长延时 uint i, j; for(i = a; i 0; i-) for(j
23、= 100; j 0; j-); /第一行开始地址为0x80, 第二行开始地址为0xc0; /写命令:RS=0, RW=0; void writeComm(uchar comm) RS = 0; P1 = comm; LCDEN = 1; delayUs(); LCDEN = 0; delayMs(1); /写数据:RS=1, RW=00 void writeData(uchar dat) RS = 1; P1 = dat; LCDEN = 1; delayUs(); LCDEN = 0; delayMs(1); /初始化函数 /显示模式, 固定指令为00111000=0x38, 16*2显示
24、, 5*7点阵,8位数据接口 /显示开/关及光标设置00001100=0x0c /指令1: 00001DCB : D:开显示/关显示(H/L); C:显示光标/不显示(H/L), B:光标闪烁/不闪烁(H/L) /指令2: 000001NS : /N=1, 当读/写一个字符后地址指针加1, 且光标也加1; N=0则相反 /S=1, 当写一个字符, 整屏显示左移(N=1)或右移(N=0), 但光标不移动; S=0, 整屏不移动 void init() writeComm(0x38); /显示模式 writeComm(0x0c); /开显示, 关光标 writeComm(0x06); /写字符后地
25、址加1, 光标加1 writeComm(0x01); /清屏 void writeString(uchar * str, uchar length) uchar i; for(i = 0; i 0) i-; ds = 1; /产生一个上升沿, 进入等待应答状态 i = 4; while(i0) i-; void dsWait() unsigned int i; while(ds); while(ds); /检测到应答脉冲 i = 4; while(i 0) i-; /向DS18B20读取一位数据/读一位, 让DS18B20一小周期低电平, 然后两小周期高电平, /之后DS18B20则会输出持续
26、一段时间的一位数据bit readBit() unsigned int i; bit b; ds = 0; i+; /延时约8us, 符合协议要求至少保持1us ds = 1; i+; i+; /延时约16us, 符合协议要求的至少延时15us以上 b = ds; i = 8; while(i0) i-; /延时约64us, 符合读时隙不低于60us要求 return b;/读取一字节数据, 通过调用readBit()来实现unsigned char readByte() unsigned int i; unsigned char j, dat; dat = 0; for(i=0; i8; i
27、+) j = readBit(); /最先读出的是最低位数据 dat = (j 1); return dat;/向DS18B20写入一字节数据void writeByte(unsigned char dat) unsigned int i; unsigned char j; bit b; for(j = 0; j = 1;/写1, 将DQ拉低15us后, 在15us60us内将DQ拉高, 即完成写1 if(b) ds = 0; i+; i+; /拉低约16us, 符号要求1560us内 ds = 1; i = 8; while(i0) i-; /延时约64us, 符合写时隙不低于60us要求
28、else /写0, 将DQ拉低60us120us ds = 0; i = 8; while(i0) i-; /拉低约64us, 符号要求 ds = 1; i+; i+; /整个写0时隙过程已经超过60us, 这里就不用像写1那样, 再延时64us了 /向DS18B20发送温度转换命令void sendChangeCmd() dsInit(); /初始化DS18B20, 无论什么命令, 首先都要发起初始化 dsWait(); /等待DS18B20应答 delayMs(1); /延时1ms, 因为DS18B20会拉低DQ 60240us作为应答信号 writeByte(0xcc); /写入跳过序列
29、号命令字 Skip Rom writeByte(0x44); /写入温度转换命令字 Convert T/向DS18B20发送读取数据命令void sendReadCmd() dsInit(); dsWait(); delayMs(1); writeByte(0xcc); /写入跳过序列号命令字 Skip Rom writeByte(0xbe); /写入读取数据令字 Read Scratchpad/获取当前温度值int getTmpValue() unsigned int tmpvalue; int value; /存放温度数值 float t; unsigned char low, high;
30、 sendReadCmd(); /连续读取两个字节数据 low = readByte(); high = readByte(); /将高低两个字节合成一个整形变量 /计算机中对于负数是利用补码来表示的 /若是负值, 读取出来的数值是用补码表示的, 可直接赋值给int型的value tmpvalue = high; tmpvalue 0 ? 0.5 : -0.5); /大于0加0.5, 小于0减0.5 return value;void display(int v) unsigned char count; unsigned char datas = 0, 0, 0, 0; unsigned i
31、nt tmp = abs(v); datas0 = tmp / 1000; datas1 = tmp % 1000 / 100; datas2 = tmp % 100 / 10; datas3 = tmp % 10; writeComm(0xc0+3); if(v 0) writeString(- , 2); else writeString(+ , 2); if(datas0 != 0) writeData(0+datas0); for(count = 1; count != 4; count+) writeData(0+datascount); if(count = 2) writeData(.); /*DS18B20*/void main() uchar table = Now Temperature ; delayMs(1); sendChangeCmd(); init(); writeComm(0x80); writeString(table, 16); while(1) delayMs(1000); /温度转换时间需要750ms以上 writeComm(0xc0); display(getTmpValue(); sendChangeCmd();
限制150内