《单片机原理及应用》 课程设计说明书
设计题目:基于单片机的数字温度计 学 院:工学院
专 业:电气工程及其自动化(4)班 设 计 者:马骙 魏坤波 学 号:09123023 09171037 指导老师:吴敏
设计时间:2012年5月21日~2012年6月2日
单片机原理及应用课程设计 第 2 页 共 20 页
目 录
摘要„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„1 1 引言„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„1 2总体设计方案„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„1 2.1设计原理及相关说明„„„„„„„„„„„„„„„„„„„„„„„„„„„1 2.2总体设计框图„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„1 3各芯片设计及对其的调用„„„„„„„„„„„„„„„„„„„„„„„„„„„2 3.1 AT89S52单片机主控模块„„„„„„„„„„„„„„„„„„„„„„„„„2 3.2 DS18B20温度传感器模块„„„„„„„„„„„„„„„„„„„„„„„„„3 3.2.1 DS18B20的主要特性„„„„„„„„„„„„„„„„„„„„„„„„4 3.2.2 DS18B20的外形和内部结构„„„„„„„„„„„„„„„„„„„„„5 3.2.3 DS18B20的工作原理„„„„„„„„„„„„„„„„„„„„„„„„5 3.3 LED数码管显示模块„„„„„„„„„„„„„„„„„„„„„„„„„„6 3.4 蜂鸣器„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„7 4 系统软件设计„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„8 4.1.初始化程序„„„„„„„„„„„„„„„„„ „„„„„„„„8 4.2.读出温度子程序„„„„„„„„„„„„„„„„„„„„„„„„„„8 4.3读、写时序子程序„„„„„„„„„„„„„„„„„„„„„„„„„„9
4.4.温度处理子程序„„„„„„„„„„„„„„„„„„„„„„„„„„10 4.5.显示程序„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„10
4.6延时程序„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„11 5 调试„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„12 5.1 调试步骤„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„12 结论„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„13 致谢„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„14 参考文献„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„14 附录 元件清单„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„15 附录1„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„16 附录2„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„16
单片机原理及应用课程设计 第 3 页 共 20 页
基于单片机的数字温度计
作者:马骙、魏坤波 指导老师:吴敏 (安徽农业大学工学院 电气工程及自动化4班)
摘要:在这个信息化高速发展的时代,单片机作为一种最经典的微控制器,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,作为自动化专业的学生,我们学习了单片机,就应该把它熟练应用到生活之中来。本文将介绍一种基于单片机控制的数字温度计,本文设计的数字温度计具有读数方便,测温范围广,测温精确,数字显示,适用范围宽等特点。
关键词:单片机,数码管显示,温度计,DS18B20,AT89S52
1 引言
本设计实现一个温度显示,可以利用DS18B20读取环境温度并传至LED,使之显示于LED数码显示管上。蜂鸣器可以实现闹钟报警功能。当温度低于15度是蜂鸣器实现报警并且数码管亮。增加了复位按键实现复位功能。
2 总体设计方案
2.1设计原理及相关说明
设计原理:利用DS18B20读取环境温度,并利用P3.6端口将相关信息传送至AT89S52主芯片之中,利用P0端口使之显示于LED数码显示管上,
2.2总体设计框图
数字温度计设计框图如图1所示:
单片机原理及应用课程设计 第 4 页 共 20 页
电源电路 复位电路 单 片 机 温度传感器 显示 电路 晶振电路 蜂鸣器
图1数字温度设计框图
3 各芯片的设计及其调用
3.1 AT89S52单片机主控模块
对于单片机的选择,可以考虑使用8052系列,AT89S52 是美国 ATMEL 公司生产的低功耗,高性能 CMOS8 位单片机,片内含 4kbytes 的可编程的 Flash 只读程序存储器,兼容标准 8051 指令系统及引脚。它集Flash 程序存储器既可在线编程(ISP),也可用传统方法进行编程,所以低价位 AT89S52单片机可为提供许多高性价比的应用场合,可灵活应用于各种控制领域,对于简单的测温系统已经足够。单片机AT89S52 具有低电压供电和体积小等特点,四个端口只需要两
单片机原理及应用课程设计 第 5 页 共 20 页
个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。
由图2可知,单片机的18和19管脚接时钟电路,19管脚接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,18管脚接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出,9引脚是复位输入端,接上电容、电阻及开关后构成上电复位电路。
图2 主控制器 AT89S52
3.2 DS18B20 温度传感器模块
单片机原理及应用课程设计 第 6 页 共 20 页
图5 DS18B20 温度传感器模块
3.3.1 DS18B20的主要特性
●适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电
●独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯
●DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温
●DS18B20在使用中不需要任何外围元件,全部 传感元件及转换电路集成在形如一只三极管的集成电路内
●温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃ ●可编程 的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温
●在9位分辨率时最多在 93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快
●测量结果直接输出数字温度信号,以\"一 线总线\"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力
●负压特性:电源极性接反时,芯片不会因发热而烧毁, 但不能正常
单片机原理及应用课程设计 第 7 页 共 20 页
工作
3.3.2 DS18B20 的外形和内部结构
图6 DS18B20 外部结构
DS18B20外部结构如图6,本设计采用PR-35封装,各引脚定义如下:
●DQ为数字信号输入/输出端; ●GND为电源地;
●VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
图7 DS18B20 内部结构
DS18B20内部结构主要由四部分组成:64位光刻ROM 、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
3.3.3 DS18B20工作原理
单片机原理及应用课程设计 第 8 页 共 20 页
图8 DS18B20测温原理框图
DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s 减为750ms。 DS18B20测温原理如图8所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振 随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对 低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重 新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即 为所测温度。图8中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
3.3 LED 数码显示模块
如图9所示,本设计采用LED显示模块,它属于8位共阴极数码管。
图9 LED数码管显示模块
单片机原理及应用课程设计 第 9 页 共 20 页
3.4 蜂鸣器
图12 蜂鸣器模块
本设计采用的是无源蜂鸣器如下图:
图13 无源蜂鸣器
该蜂鸣器接入电路时,靠近+极标志的管脚接+5V电源,负极接8550集电极,8550发射极接地,基极接2K电阻。
单片机原理及应用课程设计 第 10 页 共 20 页
4 系统软件设计
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。
4.1.初始化程序
短延时 DQ置1
延时100us DQ置0 延时90us DQ置1
X=DQ 延时至少60us X=~DQ 结束 图5 初始化程序流程图
4.2.读出温度子程序
八位,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。其程序流程图如图6所示
读出温度子程序的主要功能是读出RAM中的2字节,读出温度的低八位和
单片机原理及应用课程设计 第 11 页 共 20 页
初始化
取中间八位 读取温度的低八位和高八位 写入跳过ROM、读取暂存器和CRC字节指令 初始化 延时2ms 发跳过ROM指令 开始温度转换
结束
图6读温度程序流程图
4.3.读、写时序子程序
读写的程序是本次设计中的重点和难点,通过我们对其时序的分析,从而写出高效的程序。
单片机原理及应用课程设计 第 12 页 共 20 页
延时15us DQ=0 DQ置0 短延时 DQ置1
延时40us 延时450us DQ置1 dat&=0x01 dat>>1 延时15-60us
X=DQ DQ=1 延时至少60us
结束 X=~DQ 结束 图7 写时序子程序流程 图8 读时序子程序流程图
4.4.温度处理子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图9所示
4.5.显示程序
此函数实现的对数码管显示的处理,其亮点在于可以直接对数码管进行操
作,其本身是个两变量函数,第一个变量是要开通的位选,第二个变量是要显示的数据,这样我们可以直接方便而又简单直观的对数码管进行操作。程序流程图如图12。
单片机原理及应用课程设计 第 13 页 共 20 页
图9 温度处理程序流程图 图10 显示数据刷新流程图
结束 显示个位和小数位 结束 显示十位 显示百位 shi=0? 延时1ms bai=0? P0.7=0 n=2? 求百位、十位、个位和小数位 送段码 取反flag=1 位选值左移n位 ht>128? 送位选 开始flag=0 关断位选 4.6延时程序
延时程序主要分为短延时和长延时,短延时如果要求十分的精确可以采用定时器,如果要求不太高的话可以采用普通函数的叠加,可以近似时间的延时。长延时同样的道理,不过要求不是很精确的话,可以采取语言结构的循环来实现延时。
单片机原理及应用课程设计 第 14 页 共 20 页
表1 delay15()延时函数的取值采样
n的取值 时间(us) 1 17 2 3 4 10 15 20 22 23 24 48 69 90 216 321 426 468 489 510
5 调试
5.1 调试步骤
系统的调试以程序调试为主,软件调试可以先编写显示程序并进行硬件的正确性检验,然后分别进行主程序、读出温度子程序、温度转换命令子程序、计算温度子程序和显示数据刷新子程序等的编写及调试。
由于DS18B20与单片机采用串行数据传送,因此,对DS18B20进行读/写编程时必须严格地保证读/写时序;否则将无法读取测量结果。本程序采用单片机汇编语言编写,用Keil C51编译器编程调试。软件调试到能显示温度值,而且在有温度变化时显示温度能改变,就基本完成。
调试运行图
单片机原理及应用课程设计 第 15 页 共 20 页
结 论
当LED显示屏闪现出温度,我绷紧的神经如释重负般瞬间舒缓,历尽曲折的温度计作品终于得以实现。太多的失败急切渴望成功的到来。如同其他课程设计一样,从确定设计方案到系统仿真完工往往都会遇到很多意想不到的问题。解决这些问题是对掌握课本知识以外各方面综合能力的考验。所以每当一个课程设计做下来,我感觉不仅全面复习了之前学过的专业知识,还更深层次熟练掌握并运用学过的知识,真正巩固知识。
本次设计涉及两个方面,汇编语言程序设计和单片机工作电路设计。软件设计方面,我们在参考别人成功先例的基础上根据自己设计的需要编制程序,其中历经不少曲折,最让我们感叹的是:编汇编语言一定要细心,稍有疏忽,程序就没办法正常工作。
俗话说“好的开始是成功的一半”。说起课程实训,我认为最重要的就是做好设计的预习,认真的研究老师给的题目。其次,老师对实验的讲解要一丝不苟的去听去想,因为只有都明白了,做起设计就会事半功倍,如果没弄明白,就迷迷糊糊的去选题目做设计,到头来一点收获也没有。最后,要重视程序的模块化,修改的方便,也要注重程序的调试,掌握其方法。
单片机原理及应用课程设计 第 16 页 共 20 页
致 谢
这次毕业设计的完成,首先感谢学校和吴敏老师,感谢学校给了我们这样一个学习的机会,在我们丰富了自身的同时不仅使我学到了很多新的知识,更使我认识到了自己的不足。从这次设计的开始到完成整个过程中,我遇到了很多意想不到的困难,但在吴敏老师的指导和帮助下,我也基本完成了任务,同时也受益非浅。老师给了我很多关于设计方面的资料和建议,并指出了我的错误和不足,她平易近人但有严肃认真的工作态度,她不拘小节却有细致严谨的敬业精神,我们的每一步成果都是和老师的心血分不开的。虽然毕业设计即将完成,但我学到了很多新的东西和道理,相信在我以后的人生道路上都会受用的。其中,我的一些同学也给了我很多帮助,借此机会向老师和帮助我的每一个人表示真挚的谢意。
参 考 文 献
1 张俊漠.单片机中级教程.北京航空航天大学.2006.03
2 全国大学生电子设计竞赛获奖作品选编.北京理工大学出版社.2005.03 3 李鹏,等.计算机通信技术及其程序设计.西安电子科技大学出版社.1998 4 姚彬.电子元器件与电子实习实训教程.机械工业出版社.1996
5 宋贤法,韩晶等编著.电路设计实力指导教程.机械工业出版社.2003
6 范红刚,魏学海,任思璟编著.51单片机自学笔记. 北京航空航天大学.2001.01
7 黄友锐,编著.单片机原理及应用.合肥工业大学出版社.2006.10
8 Donald A. Neamen. Electronic Circuits Analysis and Design. 2nd ed. McGrawhill Companies, Inc.2001. 9 Sergio Franco. Design With Operational Amplifiers and Analog Integrated Circuits. McGraw-Hill Company.2002.
10 Allan R.Hambley. Electronics. 2nd ed.Prentice Hall Inc.2000.
单片机原理及应用课程设计 第 17 页 共 20 页
附录 元件清单
单片机原理及应用课程设计 第 18 页 共 20 页
附录1 系统电路原理图
附录2 系统程序
单片机原理及应用课程设计 第 19 页 共 20 页
附录3 系统程序
/******************************************************************************************* #include 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, 0x7F,0x6F,0x00 }; char Alarm_Temp_HL[1] ={30}; uchar CurrentT =0; uchar Temp_Value[] ={0x00,0x00}; uchar Display_Digit[] ={0,0,0,0}; bit HI_Alarm =0; bit DS18B20_IS_OK =1; uint Time0_Count =0; void Delay(uint x) { while(--x); } uchar Init_DS18B20() { uchar status ; DQ =1;Delay(8); DQ =0;Delay(90); DQ =1;Delay(8); status =DQ; Delay(100); DQ =1; return status; } uchar ReadOneByte() { uchar i,dat =0; DQ =1;_nop_(); for (i=0;i<8;i++) { DQ=0;dat>>=1;DQ=1;_nop_();_nop_(); if(DQ) dat|=0x80; Delay(30);DQ=1; } return dat; } void WriteOneByte(uchar dat) { uchar i; for (i=0;i<8;i++) { DQ=0;DQ=dat 0x01;Delay(5);DQ=1;dat>>=1; } } void Read_Temperature() { if (Init_DS18B20()==1) DS18B20_IS_OK=0; else { WriteOneByte(0xCC); WriteOneByte(0x44); Init_DS18B20(); WriteOneByte(0xCC); WriteOneByte(0xBE); Temp_Value[0]=ReadOneByte(); Temp_Value[1]= ReadOneByte(); Alarm_Temp_HL[0]= ReadOneByte(); Alarm_Temp_HL[1]= ReadOneByte(); DS18B20_IS_OK=1; } } void Set_Alarm_Temp_Value() { Init_DS18B20(); WriteOneByte(0xCC); WriteOneByte(0x4E); WriteOneByte(Alarm_Temp_HL[0]); WriteOneByte(Alarm_Temp_HL[1]); WriteOneByte(0x7F); Init_DS18B20(); WriteOneByte(0xCC); WriteOneByte(0x48); } void Display_Temperature() { uchar i; uchar t=150; uchar ng=0,np=0; char Signed_Current_Temp; if ((Temp_Value[1]&0xF8)==0xF8) & 、 单片机原理及应用课程设计 第 20 页 共 20 页 { Temp_Value[1]= ~Temp_Value[1]; Temp_Value[0]= ~Temp_Value[0]+1; if(Temp_Value[0]==0x00) Temp_Value[1]++; ng=1;np=0XFD; } Display_Digit[0]=df_Table[Temp_Value[0]&0x0F]; CurrentT =((Temp_Value[0]&0xF0)>>4)|(( Temp_Value[1]&0x07)<<4); Signed_Current_Temp=ng? CurrentT: CurrentT; HI_Alarm=Signed_Current_Temp>= Alarm_Temp_HL[0]?1:0; LO_Alarm=Signed_Current_Temp<= Alarm_Temp_HL[1]?1:0; Display_Digit[3]=CurrentT/100; Display_Digit[2]=CurrentT % 100 / 10; Display_Digit[1]=CurrentT % 10; if(Display_Digit[3]==0) { Display_Digit[3]=10; np=0xF7; if(Display_Digit[2]==0) { Display_Digit[2]=10; np=0xEF; } } for(i=0;i<30;i++) { P0=0x39;P2=0x7F;Delay(t);P2=0xFF; P0=0x63;P2=0xBF;Delay(t);P2=0xFF; P0=DSY_CODE[Display_Digit[1]]; P2=0xDF;Delay(t);P2=0xFF; P0=(DSY_CODE[Display_Digit[1]])|0x80; P2=0xEF;Delay(t);P2=0xFF; P0=DSY_CODE[Display_Digit[2]]; P2=0xF7;Delay(t);P2=0xFF; P0=DSY_CODE[Display_Digit[3]]; P2=0xF7;Delay(t);P2=0xFF; if(ng) { P0=0x40;P2=np;Delay(t);P2=0xFF; } } } void T0_INT() interrupt 1 { TH0=-1000/512; TL0=-1000%512; BEEP=!BEEP; if(++Time0_Count==400) { Time0_Count=0; if(HI_Alarm) HI_LED= ~HI_LED;else HI_LED=1; if(LO_Alarm) LO_LED= ~LO_LED;else LO_LED=1; } } void main(void) { IE=0x82; TMOD=0x01; TH0=-1000/512; TL0=-1000%512; TR0=0; HI_LED=1; LO_LED=1; Set_Alarm_Temp_Value(); Read_Temperature(); Delay(50000); Delay(50000); while(1) { Read_Temperature(); if(DS18B20_IS_OK) { if(HI_Alarm==1 || LO_Alarm==1) TR0=1; else TR0=0; Display_Temperature(); } else { P0=P2=0x00; } } } 因篇幅问题不能全部显示,请点此查看更多更全内容