基于AT89C52单片机的数字温度测量及显示系统设计.docx
- 文档编号:6782898
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:19
- 大小:185.42KB
基于AT89C52单片机的数字温度测量及显示系统设计.docx
《基于AT89C52单片机的数字温度测量及显示系统设计.docx》由会员分享,可在线阅读,更多相关《基于AT89C52单片机的数字温度测量及显示系统设计.docx(19页珍藏版)》请在冰豆网上搜索。
基于AT89C52单片机的数字温度测量及显示系统设计
河北工程大学
2014—2015学年
第
(二)学期
课程设计
课题名称:
基于AT89S52单片机的数字温度测量及显示系统设计
设计时间:
2015年06月
系部:
计算机科学与技术
班级:
计算机1401
小组成员:
张朔萌李丹丹郭星星石凤丹
指导老师:
赵建明
1.课程设计题目...........................................................................2
1.1实验题目................................................................................2
1.2小组成员贡献........................................................................2
2.设计方案...................................................................................2
2.1设计目的................................................................................2
2.2性能指标................................................................................2
3.数字温度计系统的硬件设计...................................................3
3.1数字温度计硬件框图............................................................3
3.2AT89C52单片机....................................................................3
3.3外围电路................................................................................4
3.4总设计图................................................................................4
4.数字温度计系统的软件分析及系统整体流程.......................4
4.1总体流程图............................................................................5
4.2子程序流程图........................................................................6
5.仿真结果...................................................................................8
6.总结...........................................................................................9
7.附录...........................................................................................10
1课程设计题目
1.1实验题目
基于单片机的数字温度计设计。
1.2小组成员所做贡献
姓名
学号
主要贡献
张朔萌
140210103
主程序的编写以及程序的编译、调试
郭星星
140210119
设计电路并在Proteus中进行仿真模拟
石凤丹
140210115
子程序的编写
李丹丹
140210132
整体实验的设计以及实验报告的设计和编辑
2设计方案
2.1设计目的
单片机是单片微型计算机的简称,其具有体积小、可靠性高、功能强、灵活方便等优点,故可以广泛应用于各种领域。
其中数字温度计就是一个典型的例子。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确等特点,其输出温度采用数字显示,主要用于对测温要求较高的场所,该设计主要使用的元件有单片机AT89C52,测温传感器使用DS18B20和LCD1602液晶显示器。
2.2性能指标
(1)基本范围-50℃-110℃;
(2)精度为0.5℃;
(3)液晶LCD显示;
(4)可以设定温度的上下限以及报警功能。
3数字温度计系统的硬件设计
3.1数字温度计硬件框图
数字温度计系统硬件框图如图1所示。
图1系统的硬件框图
3.2AT89C52单片机
AT89C52单片机引脚配置图,如图2所示。
图2AT89C52单片机引脚配置图
3.3外围电路
AT89C52的时序就是CPU在执行指令时所需控制信号的时间顺序。
选择了内部时钟方式,即利用芯片内部的振荡器,然后在引脚XTAL1和XTAL2两端跨接晶体或陶瓷谐振器,就构成了稳定的自激振荡器,其发出的脉冲直接送入内部时钟电路。
外接晶振时,C1和C2值通常选择为30PF左右。
C1和C2对频率有微调作用。
晶体的频率范围可在1.2~12MHZ之间选择。
AT89C52的复位电路是按键电平复位电路,相当于按复位键后复位端通过电阻与Vcc电源接通。
复位是单片机的初始化操作。
单片机在启动运行时,都需要先复位,其作用是使CPU和系统中其他部件都处于一个确定的初始状态,并从这个状态开始工作。
显示电路采用LCD1602液晶显示器显示。
故障状态指示电路采用发光二级管以及蜂鸣器对运行方式进行指示,可清楚看到系统的故障状态。
测温传感器DS18B20可以直接读出被测温度值,采用三线制和单片机相连,少了外部的硬件电路,具有低成本和易使用的特点。
3.4总设计图
数字温度计系统的硬件总设计图如图3所示。
图3总设计图
4数字温度计系统的软件设计及系统整体流程
整个系统的功能是由硬件电路配合软件来实现的,从软件的功能不同,可以分为两类:
主程序和子程序。
主程序是整个软件的核心,专门用来协调各个执行模块和操作者的联系。
子程序是用来完成各种实质性的工作的,如读温度子程序、转换温度子程序、计算温度子程序等。
各执行模块规划好以后,就可以规划监控软件了。
首先要根据系统的总体功能选择一种最合适的主程序结构,然后根据实时性的条件,合理安排监控软件和执行软件之间的调度关系。
4.1总体流程图
数字温度计系统总体流程图如图4所示。
图4主流序流程图
4.2子程序流程图
数字温度计系统子程序主要包含:
读温度子程序、转换温度子程序、计算温度子程序。
(1)读温度子程序流程图
读温度子程序流程图如图5所示。
图5读温度子程序流程图
(2)转换温度子程序流程图
转换温度子程序流程图如图6所示。
图6转换温度子程序流程图
(3)计算温度子程序流程图
计算温度子程序流程图如图7所示。
图7计算温度子程序流程图
5仿真结果
(1)正常温度显示
温度计正常温度显示如图8所示。
图8正常温度显示
(2)报警温度显示
温度计报警温度显示如图9所示。
图9报警温度显示
6总结
通过这次单片机课程设计,不仅让我加深了解了单片机课本上所学的知识,更通过自己的动手设计,将课本知识与动手操作能力相结合,让我对单片机及其系统设计的认识更进一步。
在此次的课程设计中我学会了很多的东西。
经过自己努力,基本上完成了设计要求的内容,在系统可行性分析、原理图设计等方面都作了许多实际工作,取得了一些结果,同时也发现了许多不足。
对于本次的课程设计还有很大提升空间,目前仅完成的是基本功能实现,还有很多的扩展功能可以提升。
附录
1.参考文献:
1.王思明.单片机原理及应用系统设计[M].北京:
科学出版社,2012.
2.李广弟.单片机基础[M].北京:
北京航空航天大学出版社,1994.
3.艾德才.pentium/80486实用汇编语言程序设计[M].北京:
清华大学出版社。
2.源程序
//使用1602LCD显示DS18B20转换的温度值
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitRS=P3^0;//RS--数据/命令选择端(H/L)
sbitLCDEN=P3^2;//使能端
sbitdeng=P1^6;//超过温度限制指示灯
sbitbeep=P1^7;//超过温度限制报警器
ucharhigh=30;//最高温度
ucharlow=10;//最低温度
unsignedcharr;
voiddelayUs()//短延时
{
_nop_();
}
voiddelayMs(uinta)//长延时
{
uinti,j;
for(i=a;i>0;i--)
for(j=100;j>0;j--);
}
//第一行开始地址为0x80,第二行开始地址为0xc0;
voidwriteComm(ucharcomm)//写命令:
RS=0,RW=0;
{
RS=0;
P2=comm;
LCDEN=1;
delayUs();
LCDEN=0;
delayMs
(1);
}
voidwriteData(uchardat)//写数据:
RS=1,RW=00
{
RS=1;
P2=dat;
LCDEN=1;
delayUs();
LCDEN=0;
delayMs
(1);
}
//init()为初始化函数
//显示模式,固定指令为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^7;//DS18B20的数据端 //初始化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; r=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('.'); } } } /******************************报警*******************************/ voidBEEP()//报警 {if((r>=high&&r<129)||r { beep=! beep; deng=1; } else {beep=1; deng=0; } } /******************************DS18B20*******************************/ voidmain() { uchartable[]="NowTemperature"; delayMs (1); sendChangeCmd(); init();//液晶初始化程序 writeComm(0x80); writeString(table,16); while (1) { delayMs(1000);//温度转换时间需要750ms以上 writeComm(0xc0); display(getTmpValue()); sendChangeCmd(); BEEP(); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 AT89C52 单片机 数字 温度 测量 显示 系统 设计