数字温度计单片机.docx
- 文档编号:8883969
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:21
- 大小:225.86KB
数字温度计单片机.docx
《数字温度计单片机.docx》由会员分享,可在线阅读,更多相关《数字温度计单片机.docx(21页珍藏版)》请在冰点文库上搜索。
数字温度计单片机
单片机课程设计报告
题目:
数字温度计
院(系)工学院
专业电子信息工程
年级10-2
姓名宋玉学号10043206
指导教师舒昌
2013年12月6日
电子信息工程专业10级学生单片机原理课程设计任务书
课程设计题目
三、数字温度计
指导教师
舒昌
职称
讲师
设计任务和要求:
1.基本要求
(1)采用DS18B20作为温度传感器进行温度检测
(2)对采集温度进行显示(显示温度分辨率0.1℃)
(3)采集温度数值应采用数字滤波措施,保证显示数据稳定
(4)显示数据,无数据位必须消隐。
2.设计步骤
(1)使用Proteus按设计要求绘制电路图。
(2)按要求编写相应程序。
(3)使用Proteus仿真程序,对程序进行调试。
(4)撰写课程设计报告
3.撰写课程设计报告
课程设计报告内容包括题目、摘要、目录、正文、结论、致谢、参考文献等。
学生在完成上述全部工作之后,应将全部内容以先后顺序写成设计报告一份,阐述整个设计内容,要求重点突出、特色鲜明、语言简练、文字通畅,字迹工整。
报告书以A4纸打印,装订成册(文字不少于3000字)。
数字温度计
摘要:
随着信息化的高速发展,单片机作为一种最经典的微控制器,已普及到我们生活中的各个领域,本次课程设计介绍一种基于单片机的智能数字温度计,具有读数方便,测温范围广,测温精确,数字显示,适用范围宽,性价比很高等特点。
它的主要元件是:
控制器—AT89C2051、温度传感器—DS18B20、数码管—LED。
主要原理是利用DS18B20可以很好的转换温度值,并且直接显示温度值,它的性能优于传统的感温元件并且省去了A\D、和模拟开关的设计。
AT89C2051体积小并且还可以直接驱动LED,这样大大化简了设计的难度并且降低了成本。
一、设计任务、要求及目的
1.设计任务
(1)焊制单片机最小系统,以其为核心,设计并制作一个数字式温度计。
(2)使用Proteus按设计要求绘制电路图。
(3)按要求编写相应程序。
(4)使用Proteus仿真程序,对程序进行调试。
(5)撰写课程设计报告。
2.基本要求
(1)采用DS18B20作为温度传感器进行温度检测。
(2)对采集温度进行显示(显示温度分辨率0.1℃)。
(3)采集温度数值应采用数字滤波措施,保证显示数据稳定。
(4)显示数据,无数据位必须消隐。
3.设计目的
(1)加强学生理论联系实际的能力,提高学生的动手能力。
(2)学会基本电子元器件的识别和检测。
(3)学会应用EDA软件Proteus进行电路的设计和仿真。
(4)基本掌握单片机的基本原理,并能将其应用于系统的设计。
(5)通过实训,提高学生的学习兴趣,激发自主学习能力,培养创新意识。
二、设计思路
1.设计原理:
本次课程设计是基于单片机的数字温度计设计,在开始课程设计的时候我们要理解并掌握对单片机的开发,学会使用KEIL及Proteus等仿真软件。
根据设计任务要求选择好器件,编写好程序运行成功之后进行软件联调,验证系统是否正确。
通过筛选,我们组选用单片机AT89S52作为主控制系统;用1602液晶显示模块芯片作为温度数据显示装置;智能温度传感器采用DS18B20器件作为测温电路主要组成部分。
2.设计方案及其总体设计框图
(1)温度计设计系统流程图
程序设计流程图如图1所示。
图1设计流程图
(2)设计方案图
图2设计方案图
三、数字温度计应用系统的硬件设计
1.元器件的选取
(1)选用AT89S52型号单片机进行操作
AT89S52是一个低功耗,高性能CMOS8位单片机,片内含8kBytesISP的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,功能强大的微型计算机的AT89S52可为许多嵌入式控制应用系统提供高性价比的解决方案。
AT89S52具有如下特点:
40个引脚,8kBytesFlash片内程序存储器,256bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通口,此外,AT89S52设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。
空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。
同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。
图3AT89S52引脚图
(2)DS18B20
能直接读出被测温度,并且可根据实际要求通过简单的编程实现9-12位的数字值读数方式。
性能特点如下:
1.独特的单线接口仅需要一个端口引脚进行通信,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
2.DS18B20支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点组网测温;3.无须外部器件,全部传感元件及转换电路集成在形如一只三极管的集成电路内;4.可通过数据线供电,电压范围为3.0-5.5V;5.零待机功耗;6.温度以9或12位数字,对应的分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温;7.用户可定义报警设置;8.报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;9.负电压特性,电源极性接反时,不会因发热而烧毁,但不能正常工作;10.测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力
DS18B20采用3脚PR35封装或8脚SOIC封装,其引脚排列及内部结构框图
图4内部结构框图
(3)1602液晶显示屏
1602液晶显示流程图如图5所示:
图5液晶显示流程图
2.单片机小系统的基本组成及硬件图
图6单片机小系统的基本组成及硬件图
3.外围电路工作原理及系统硬件图
图7外围电路工作原理及系统硬件图
四、系统软件程序的设计:
1.软件流程框图:
(b)读温度流程图
图8软件流程框图
五、课程设计心得体会:
经过此次单片机课程设计,终于完成了数字温度计,虽然不是很完美,但是是我一个进步的起点。
此次设计使我发现单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,例如以前写的那几次,数据加减时,我用的都是BCD码,这一次,我全部用的都是16进制的数直接加减,显示处理时在用除法去删分,感觉效果比较好,有好多的东西,只有我们去试着做了,才能真正的掌握,只学习理论有些东西是很难理解的并且意识到要理论联系实际,把我们所学的理论知识用到实际当中,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。
另一方面让我了解了设计电路的程序以及关于数字温度计的原理与设计理念,要设计一个电路总要先用仿真仿真成功之后才实际接线的。
但是最后的成品却不一定与仿真时完全一样,因为,再实际接线中有着各种各样的条件制约着。
而且,在仿真中无法成功的电路接法,在实际中因为芯片本身的特性而能够成功。
所以,在设计时应考虑两者的差异,从中找出最适合的设计方法。
通过这次学习,让我对各种电路都有了大概的了解,所以说,从实践中获取真理,对于这些电路还是应该自己动手实际操作才会有深刻理解。
六、参考文献:
[1]曹天汉,单片机原理与接口技术,电子工业出版社,2006
[2]科技教育创新中国科技信息2010年第11期
附件:
程序
//使用1602LCD显示DS18B20转换的温度值
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitRS=P2^6;//数据/命令选择端(H/L)
sbitLCDEN=P2^7;//使能端
voiddelayUs()//短延时
{
_nop_();
}
voiddelayMs(uinta)//长延时
{
uinti,j;
for(i=a;i>0;i--)
for(j=100;j>0;j--);
}
//第一行开始地址为0x80,第二行开始地址为0xc0;
//写命令:
RS=0,RW=0;
voidwriteComm(ucharcomm)
{
RS=0;
P1=comm;
LCDEN=1;
delayUs();
LCDEN=0;
delayMs
(1);
}
//写数据:
RS=1,RW=00
voidwriteData(uchardat)
{
RS=1;
P1=dat;
LCDEN=1;
delayUs();
LCDEN=0;
delayMs
(1);
}
//初始化函数
//显示模式,固定指令为00111000=0x38,16*2显示,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,整屏不移动
voidinit()
{
writeComm(0x38);//显示模式
writeComm(0x0c);//开显示,关光标
writeComm(0x06);//写字符后地址加1,光标加1
writeComm(0x01);//清屏
}
voidwriteString(uchar*str,ucharlength)
{
uchari;
for(i=0;i { writeData(str[i]); } } /*****************************DS18B20*******************************/ sbitds=P3^4; //初始化DS18B20 //让DS18B20一段相对长时间低电平,然后一段相对非常短时间高电平,即可启动 voiddsInit() { //对于11.0592MHz时钟,unsignedint型的i,作一个i++操作的时间大于为8us unsignedinti; ds=0; i=100;//拉低约800us,符合协议要求的480us以上 while(i>0)i--; ds=1;//产生一个上升沿,进入等待应答状态 i=4; while(i>0)i--; } voiddsWait() { unsignedinti; while(ds); while(~ds);//检测到应答脉冲 i=4; while(i>0)i--; } //向DS18B20读取一位数据 //读一位,让DS18B20一小周期低电平,然后两小周期高电平, //之后DS18B20则会输出持续一段时间的一位数据 bitreadBit() { unsignedinti; bitb; ds=0; i++;//延时约8us,符合协议要求至少保持1us ds=1; i++;i++;//延时约16us,符合协议要求的至少延时15us以上 b=ds; i=8; while(i>0)i--;//延时约64us,符合读时隙不低于60us要求 returnb; } //读取一字节数据,通过调用readBit()来实现 unsignedcharreadByte() { unsignedinti; unsignedcharj,dat; dat=0; for(i=0;i<8;i++) { j=readBit(); //最先读出的是最低位数据 dat=(j<<7)|(dat>>1); } returndat; } //向DS18B20写入一字节数据 voidwriteByte(unsignedchardat) { unsignedinti; unsignedcharj; bitb; for(j=0;j<8;j++) { b=dat&0x01; dat>>=1;//写"1",将DQ拉低15us后,在15us~60us内将DQ拉高,即完成写1 if(b) { ds=0; i++;i++;//拉低约16us,符号要求15~60us内 ds=1; i=8;while(i>0)i--;//延时约64us,符合写时隙不低于60us要求 } else//写"0",将DQ拉低60us~120us { ds=0; i=8;while(i>0)i--;//拉低约64us,符号要求 ds=1; i++;i++;//整个写0时隙过程已经超过60us,这里就不用像写1那样,再延时64us了 } } } //向DS18B20发送温度转换命令 voidsendChangeCmd() { dsInit();//初始化DS18B20,无论什么命令,首先都要发起初始化 dsWait();//等待DS18B20应答 delayMs (1);//延时1ms,因为DS18B20会拉低DQ60~240us作为应答信号 writeByte(0xcc);//写入跳过序列号命令字SkipRom writeByte(0x44);//写入温度转换命令字ConvertT } //向DS18B20发送读取数据命令 voidsendReadCmd() { dsInit(); dsWait(); delayMs (1); writeByte(0xcc);//写入跳过序列号命令字SkipRom writeByte(0xbe);//写入读取数据令字ReadScratchpad } //获取当前温度值 intgetTmpValue() { unsignedinttmpvalue; intvalue;//存放温度数值 floatt; unsignedcharlow,high; sendReadCmd(); //连续读取两个字节数据 low=readByte(); high=readByte(); //将高低两个字节合成一个整形变量 //计算机中对于负数是利用补码来表示的 //若是负值,读取出来的数值是用补码表示的,可直接赋值给int型的value tmpvalue=high; tmpvalue<<=8; tmpvalue|=low; value=tmpvalue; //使用DS18B20的默认分辨率12位,精确度为0.0625度,即读回数据的最低位代表0.0625度 t=value*0.0625; //将它放大10倍,使显示时可显示小数点后一位,并对小数点后第二位进行4舍5入 //如t=11.0625,进行计数后,得到value=111,即11.1度 //如t=-11.0625,进行计数后,得到value=-111,即-11.1度 value=t*10+(value>0? 0.5: -0.5);//大于0加0.5,小于0减0.5 returnvalue; } voiddisplay(intv) { unsignedcharcount; unsignedchardatas[]={0,0,0,0}; unsignedinttmp=abs(v); datas[0]=tmp/1000; datas[1]=tmp%1000/100; datas[2]=tmp%100/10; datas[3]=tmp%10; writeComm(0xc0+3); if(v<0) { writeString("-",2); } else { writeString("+",2); } if(datas[0]! =0) { writeData('0'+datas[0]); } for(count=1;count! =4;count++) { writeData('0'+datas[count]); if(count==2) { writeData('.'); } } } /******************************DS18B20*******************************/ voidmain() { uchartable[]="NowTemperature"; delayMs (1); sendChangeCmd(); init(); writeComm(0x80); writeString(table,16); while (1) { delayMs(1000);//温度转换时间需要750ms以上 writeComm(0xc0); display(getTmpValue()); sendChangeCmd(); } } 电气信息工程系单片机课程设计成绩评定表 专业: 电子信息工程班级: 10-2学号: 10043206姓名: 宋玉 课题名称 设计任务与要求 1.基本要求 (1)采用DS18B20作为温度传感器进行温度检测。 (2)对采集温度进行显示(显示温度分辨率0.1℃)。 (3)采集温度数值应采用数字滤波措施,保证显示数据稳定。 (4)显示数据,无数据位必须消隐。 2.设计步骤 (1)焊制单片机最小系统,以其为核心,设计并制作一个数字式温度计。 (2)使用Proteus按设计要求绘制电路图。 (3)按要求编写相应程序。 (4)使用Proteus仿真程序,对程序进行调试。 (5)撰写课程设计报告。 指导教师评语 成绩: 指导教师: 时间: 2013年12月6日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 温度计 单片机
![提示](https://static.bingdoc.com/images/bang_tan.gif)