1、1.2 硬件构成1.21 主控制器AT89C51具有以下标准功能:8K字节FLASH,256字节RAM,32位I/O总线,看门狗定时器2个数据指针,3个16位定时器、计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。P0口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0也被作为低8位地址/数据使用。在这种模式下,P0具有内部上拉电阻。在FLASH编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。P1口:P1口是一个具有内部上拉电
2、阻的8位双向I/O口,P1输出缓冲器能驱动4个TTL逻辑电平。对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入口使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流。P2口:P2口是一个具有内部上拉电阻的8位双向I/O口,P2口输出缓冲器驱动4个TTL逻辑电平。对P2端口写1时,内部上拉电阻把端口拉高,此时可以作为输入口使用。1.22 数码管显示显示电路采用共阳LED数码管,从P3口RXD,TXD串口输出段码。1.23 温度传感器DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被
3、测温度,并且可根据实际要求通过简单的编程实现位的数字值读数方式。DS18B20的性能特点如下:a独特的单线接口仅需要一个端口引脚进行通信;b多个DS18B20可以并联在惟一的三线上,实现多点组网功能;c无须外部器件;d可通过数据线供电,电压范围为3.05.5;e零待机功耗;f温度以或位数字;g用户可定义报警设置;h报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;i负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;DS18B20温度传感器的内部存储器还包括一个高速暂存和一个非易失性的可电擦除的EERAM。高速暂存RAM的结构为字节的存储器,结构如图3所示。头个字节
4、包含测得的温度信息,第和第字节和的拷贝,是易失的,每次上电复位时被刷新。第个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义如图3所示。低位一直为,是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为,用户要去改动,R1和0决定温度转换的精度位数,来设置分辨率。温度 LSB温度 MSBTH用户字节1TL用户字节2配置寄存器保留CRC图2 DS18B20字节定义DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。因此,在实际应用中要将分
5、辨率和转换时间权衡考虑。高速暂存的第、字节保留未用,表现为全逻辑。第字节读出前面所有字节的CRC码,可用来检验数据,从而保证通信数据的正确性。当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第、字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625LSB形式表示。当符号位时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。表2是一部分温度值对应的二进制温度数据。DS18B20完成温度转换后,就把测得
6、的温度值与RAM中的TH、T字节内容作比较。若TH或TTL,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令作出响应。因此,可用多只DS18B20同时测量温度并进行报警搜索。在64位ROM的最高有效字节中存储有循环冗余检验码(CRC)。主机ROM的前56位来计算CRC值,并和存入DS18B20的CRC值作比较,以判断主机收到的ROM数据是否正确。DS18B20的测温原理是这这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器的脉冲输入。器件中还有一个计数门,当计数门打开时
7、,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将55所对应的一个基数分别置入减法计数器、温度寄存器中,计数器和温度寄存器被预置在55所对应的一个基数值。减法计数器对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器的预置值减到时,温度寄存器的值将加,减法计数器的预置将重新被装入,减法计数器重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度
8、寄存器值大致被测温度值。2 硬件电路设计2.1 主控制器 单片机AT89S51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。AT89C51是一种低功耗,高性能的8位微控制器,具有8K在系统可编程FLASH存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上FLASH允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程FLASH,使得AT89S52为众多嵌入式控制应用系统提供高灵活,超有效的解决方案。图3 主控制器电路2.2
9、显示电路 显示电路采用集成的数码管,为共阳极结构,采用动态显示,P1口作为输出编码端,P2.0到P2.7作为位选控制端,其中P1做输出端口需要上拉电阻,通过设置不同的段码可以显示温度,可以对温度进行实时检测。 图4 显示电路2.3 数据采集电路DS18B20的内部结构主要包括:寄生电源,温度传感器,64位激光ROM和单总线接口,存放中间数据的高速暂存器RAM,用于存储用户设定温度上下限值得TH和TL触发器,存储和逻辑控制,8位循环冗余码发生器等七部分。DS18B20测量温度时使用特有的温度测量技术,将被测温度转换成数值信号,测量结果将存入温度寄存器中。图5 数据采集电路2.4 报警电路 当温度
10、超过设定的上下限温度时,蜂鸣器会发出声响,下图为报警电路。图6 报警电路 3 软件设计3.1 主程序设计系统的主程序主要用来初始化一些参数,对DS18B20的配置数据进行一系列的设定。另外对DS18B20的状态不断的查询,以读取当前的温度值,并对温度进行处理,温度值的BCD码处理后,将其段码送显示缓冲区,以备定时扫描服务程序处理。图7 主程序流程图3.2 温度转换程序读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。其程序流程图如下所示。图8 温度转换流程图3.3 温度显示程序和报警电路程序 此程序是将采集到得数据用LED数码管显示,然后
11、将实际温度与设置的报警上下限进行比较,决定是否发出报警信号。由于T为实际温度的绝对值,TH,TL也是温度的绝对值,因此判断大小关系时,要通过正负号来确定。图9温度显示流程图图10报警程序流程图4 调试分析4.1 软件调试本次设计采用的是keil仿真器进行软件调试,此系统可以开发应用软件,以及对硬件电路进行诊断、调试等。它的具体功能是可以进行CPU仿真,可以单步、跟踪、断点和全速运行,而且,程序的编译过程中,可以对设计软件进行自诊断,并自动给出故障原因。同时用户调试程序时,可以通过窗口观察寄存器的工作状况,以便及时发现和排除编程中可能出现的错误。软件的调试是利用keil软件,模块化调试,通过观察
12、存储单元数据的变化,查找并解决程序的语法和逻辑错误,具体的调试步骤如下:1. 把系统的各个模块在仿真软件中逐个调试,如数据采集模块、显示模块等。2. 对各个需要赋值模块调试时,赋入初值,单步调试,观察数据窗口,看输出结果是否为设计时想要的结果。3. 把各个模块组合起来,全速运行,看程序是否能流畅的,是否能实现设计的系统的所有功能。4.1 软硬联调本设计是采用Proteus软件实现电路图设计和仿真的,Proteus软件与Keil软件联合使用,实现设计要求。在Keil软件中创建新文件,输入所编写的c语言程序并保存,在编译源程序无误后,会产出相应的”.HEX”文件;将所生成的”.HEX”文件加载到已
13、绘制好的Proteus原理图中,使Proteus与Keil真正连接起来,实现联合调试。调试结果下15所示。、图11仿真测试图5 结论及进一步设想根据实验结果,本设计基本完成了设计要求,但上下限阈值的设置过于繁琐,在原有结构的基础上,可以更简化。本课程设计的主要任务是设计一个89C51单片机为核心的数字温度计。从确定课设题目,到查阅质料确定总体方案设计,硬件电路仿真的设计,硬件电路的优化,软件的设计,软件的优化,检验仿真电路,调试软件程序,到最后的软硬件联调,都是我努力去完成的。在最后的仿真电路图中达到了我想要的结果,并且对串口通讯有了更一步的认识。对单片机也有了更加深刻的了解。对以后很好的应用
14、单片机打下了深刻的基础。参考文献1 刘复华.单片机及其应用系统.北京:清华大学出版社,19922 韩志军.单片机系统设计与应用实例.北京:机械工业出版社,20103 余永全.ATMEL89系列单片机应用技术.北京:北京航空航天大学出版社,20024 马中梅.单片机的C语言程序设计.北京:北京航空航天大学出版社,19995 胡汗才.单片机原理及系统设计.北京:清华大学出版社,20026 李华.MCS-51单片机实用接口技术.北京:北京航空航天出版社大学,19997 方彦军,孙建.智能仪器技术及其应用.北京:化学工业出版社,20038 孙传友.测控系统原理与设计.北京:9 刘守义等.单片机应用技术
15、.西安:西安电子科技大学出版社,200210 何立民.单片机高级教程.北京:北京航空航天大学出版社,2000课设体会经过了两个星期的课设,让我对以前学的理论知识有了较深的体会,要用理论指导实践,在实践中发现自己的不足之处,不断完善自己。这一周的课程设计让我体会到很多东西,不仅仅是知识本身的,更多的是自己动手能力和逻辑思维能力的锻炼,同时,也知道自己还有许多要学的东西。在社会实践中,单片机是一个热门的话题,所以我要认真学习单片机的知识,这对我们找工作是很有帮组的,遇到问题并不可怕关键是我们要找到方法去解决问题,一定要勤于动手,这样自己才会有提高。当然在这次宝贵的课程设计活动中,经验才是对于我们最
16、大的收获,而且还增强了自身对未知问题以及对知识的深化认识的能力,用受益匪浅这个词语来概括这次难忘的活动我觉得再合适不过了。但是,光是完成了作品还是不可以自我满足的,在从一开始的时候就怀着将作品制作得更加人性化,更加令人满意,更加地使功能完美又方便地被应用领域这个最终目的下,随着对单片机这门学科的认识加深,到达了拓展的程度,我想这个目的将在不远的时期内被实现。最后感谢老师及同学在这两个星期对我的帮助。附录1 电路原理图附录2 元件清单元件名称型号数量单片机AT89C511温度传感器DS18B20数码管7SEG-MPX8-CA按键BUTTON16电阻RES10三极管2N2926蜂鸣器SOUNDER
17、附录3 程序源#include#define uchar unsigned char#define uint unsigned intuchar code table=0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e;uchar code address=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;sbit DQ=P30;sbit dot=P10;sbit fm=P35;uchar a,i,temp1,temp2,c,t1,t2,yz1,yz2;bi
18、t flag,flag1;uint temp;void delay(uint m) while(m-);void Init() uchar i=0; DQ=1; delay(8); DQ=0; delay(80); delay(14); i=DQ; delay(20);uchar read_byte() uchar byte=0; for (i=0;i=1; if(DQ) byte|=0x80; delay(4); return(byte);void write_byte(uchar byte) DQ=CY; delay(5);void read_temp() Init(); write_by
19、te(0xcc); / Skip ROM write_byte(0x44); / 启动温度转换 delay(10); /Skip ROM write_byte(0xbe); /读取温度寄存器 temp1=read_byte(); /低位 temp2=read_byte(); /高位void ds() read_temp(); temp=temp1&0x0f; if(temp2127) flag=1; temp1=temp1; temp2=temp2; temp+=0x01; temp=temp*625; temp1=temp1&0xf0; /取整数部分 temp1=temp1/16; temp
20、2=temp2*16; temp1+=temp2; if(flag) temp1+=0x01;void xs() for(i=0;4;i+) /显示小数部分 P2=addressi; P1=tabletemp%10; delay(750); temp/=10; P2=0xef; /显示整数部分 P1=tabletemp1%10; dot=1; if(temp1/100|temp1/10) /高位去0 P2=0xdf; P1=tabletemp1/10%10; if(temp1/100) /高位去0 P2=0xbf; P1=tabletemp1/100%10; delay(800); if(fl
21、ag) /加负号 P2=0x7f; P1=0x02; flag=0;void bj() fm=1; delay(100); fm=0;void jp() uchar t,tempt,p; P0=0xfe; tempt=P0; tempt=tempt& if(tempt!=0xf0) switch(tempt) case(0xe0):flag1=0;flag=0;p=1;break; /shangxian case(0xd0):flag=1;p=2; /xiaxian case(0xb0):a+;t=1; case(0x70):t=2; while(temp! P0=0xfd;t=3;t=4;t
22、=5;t=6; while(tempt! P0=0xfb;t=7;t=8;t=9;t=0; P0=0xf7;flag1=1; if(p=1)yz1=t1*10+t2; if(p=2)yz2=t1*10+t2; a=0; break;a=0; /case(0xb7): /case(0x77): if(a=1) t1=t; P1=tablet1; if(a=2) t2=t; P1=tablet2; void main() uchar t; t1=0; t2=0; yz1=30; yz2=10; flag1=1; while(1) ds(); t=temp1%100; if(t=yz1&flag=0&flag1=
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1