1、基于51单片机课程设计报告院 系:电子通信工程 团 组:电子设计大赛1组姓 名:指导老师:2012/8/15目录一、摘要 3二、系统方案的设计 3三、硬件资源 5四、 硬件总体电路搭建 13五、程序流程图14六、设计感想 14七、参考文献16附录17附录 1 程序代码17一、摘要本设计以STC89C51单片机为核心的温度控制系统的工作原理和设计方法.温度信号由温度芯片DS18B20采集,并以数字信号的方式传送给单片机。文中介绍了该控制系统的硬件部分,包括:温度检测电路、温度控制电路。单片机通过对信号进行相应处理,从而实现温度控制的目的。文中还着重介绍了软件设计部分,在这里采用模块化结构,主要模
2、块有:数码管显示程序、键盘扫描及按键处理程序、温度信号处理程序、led控制程序、超温报警程序.关键词:STC89C51单片机 DS18B20温度芯片 温度控制 ,LED报警提示.二、系统方案的设计1、设计要求基本功能:不加热时实时显示时间,并可手动设置时间;设定加热水温功能.人工设定热水器烧水的温度,范围在2070度之间,打开开关后,根据设定温度与水温确定是否加热,及何时停止加热,可实时显示温度;设定加热时间功能。限定烧水时间,加热时间内超过温度上限或低于温度下限报警,并可实时显示温度。2、系统设计的框架本课题设计的是一种以STC89C51单片机为主控制单元,以DS18B20为温度传感器的温度
3、控制系统。该控制系统可以实时存储相关的温度数据并记录当前的时间。其主要包括:电源模块、温度测量及调理电路、键盘、数码管显示、指示灯、报警、继电器及单片机最小系统。图1 系统设计框架3 工作原理温度传感器 DS18B20 从设备环境的不同位置采集温度,单片机STC8951 获取采集的温度值,经处理后得到当前环境中一个比较稳定的温度值,再根据当前设定的温度上下限值,通过加热和降温对当前温度进行调整。当采集的温度经处理后超过设定温度的上限时,单片机通过三极管驱动继电器开启降温设备 (压缩制冷器) ,当采集的温度经处理后低于设定温度的下时 , 单片机通过三极管驱动继电器开启升温设备 (加热器) ,这里
4、采用通过LED1和LED2取代!!!当由于环境温度变化太剧烈或由于加热或降温设备出现故障,或者温度传感头出现故障导致在一段时间内不能将环境温度调整到规定的温度限内的时候,单片机通过三极管驱动扬声器发出警笛声,这里采用HLLED提示。加热器继电器2三、硬件资源1、器件选择:1。51单片机一块STC89c51STC8951 是一个低功耗,高性能CMOS 8位单片机,片内含8k Bytes ISP(Insystem programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及STC8951引脚结构,芯
5、片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的STC8951可为许多嵌入式控制应用系统提供高性价比的解决方案。STC8951具有如下特点:40个引脚,8k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信,片内时钟振荡器。此外,STC8951设计和配置了振荡频率可为0Hz并可通过软件设置省电模式.空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数
6、据,停止芯片其它功能直至外中断激活或硬件复位.同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求.由于系统控制方案简单 ,数据量也不大 ,考虑到电路的简单和成本等因素 ,因此在本设计中选用 STC8951单片机作为主控芯片.主控模块采用单片机最小系统是由于STC8951芯片内含有8 kB的 E2PROM ,无需外扩存储器 ,电路简单可靠 ,其时钟频率为 024 MHz ,并且价格低廉 ,批量价在 10元以内。其单片机的外围引脚有40个,分别是:第20脚和40脚分别是电源,即GND和Vcc;第9脚是复位脚RST;第18脚是时钟XTAL2脚,片内振荡电路的输出端;第1
7、9脚是时钟XTAL1脚,片内振荡电路的输入端;第29脚:PSEN脚,当访问外部程序存储器时,此引脚输出负脉冲选通信号,PC的16位地址数据将出现在P0和P2口上;第30脚:ALE/PROG,当访问外部数据存储器时,ALE(地址锁存)的输出用于锁存地址的低字节;第31脚:EA/Vpp为程序存储器内外部选通信号;P00P07.P10-P17.P20-P27.P30-P37。这32个引脚为数据的输出及输入引脚,即I/0口;单片机图如下:2、8位7段共阴数码管一个 7段数码管一般由8个发光二极管组成,其中由7个细长的发光二极管组成数字显示,另外一个圆形的发光二极管显示小数点。当发光二极管导通时,相应的
8、一个点或一个笔画发光。控制相应的二极管导通,就能显示出各种字符,尽管显示的字符形状有些失真,能显示的数符数量也有限,但其控制简单,使有也方便。发光二极管的阳极连在一起的称为共阳极数码管,阴极连在一起的称为共阴极数码管,如图4。9所示。共阴数码管共阴数码管的编码为:0x3F,0x0C,0x76,0x5E,0x4D,0x5B,0x7B,0x0E,0x7F,0x5F,0x6F,0x79,0x33,0x7C,0x73,0x630 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,A , B, C, D, E, F 3、温度显示DS18B20一个DS18B20采用3脚TO-92封
9、装或8脚的SOIC封装,如图1所示.各引脚的功能:GND为电压地;DQ为单数据总线;V为电源电压;NC为空引脚。图1DS18B20引脚图 DS18B20的DQ单数据总线与单片机P3.7连接,GND电压地、V电源电压分别和电压地和5伏直流电源连接。本文设计的系统主机只对一个DS18B20进行操作,因此不需要读取ROM编码以及匹配ROM编码,只要跳过ROM命令,就可以进行如下温度转换和读取操作。(1)CCH跳过ROM,直接向DS18B20发送温度变换命令.(2)44H-读暂存器。读内部RAM中9字节的温度数据。(3)BEH写暂存器。发出向内部RAM的第2、3字节写上、下限温度数据命令,紧跟该命令之
10、后,再传送两字节数据。 DS18B20在出厂时默认配置为12位,其中最高位为符号位,即温度值共11位,单片机在读取数据时,一次会读两字节共16位,读完后将低11位的二进制数转换为十进制后再乘以0。0625变为所测的温度值。另外,还需要判断温度的正负。前5个数字为符号位,这5位同时变化,我们只需判断11位就可以了.前5位为1时,读取的温度为负值,且测到的数值需要取反再加一再乘以0。0625才可以得到实际的温度值。前5位为0时,读取的温度为正值,只要将测得的数值乘以0。0625即可得到实际温度值.由于提前给DS18B20赋了上限、下限值,所以当温度超过上限或者不足下限时,会伴有LED灯闪烁和蜂鸣器
11、响作为警报。 4、按键在按下键时,实际情况下,都会出现抖动.其直观图如下: 按键消抖一般采用硬件和软件消抖两种方法。硬件消抖是利用电路滤波的原理实现,软件消抖是通过按键延时来实现。在微机系统中一般都采用软件延时的消抖方法,本文用的是软件延时的消抖方法.5、74HC573锁存器 高性能硅门 CMOS 器件SL74HC573 跟 LS/AL573 的管脚一样.器件的输入是和标准 CMOS 输出兼容的;加上拉电阻,他们能和 LS/ALSTTL 输出兼容.当锁存使能端LE为高时,这些器件的锁存对于数据是透明的(也就是说输出同步)相当于图上的Dx-Qx相通,I/0口可以进行数据交换.当锁存使能变低时,符
12、合建立时间和保持时间的数据会被锁存。在这里我们是将LE接高电平,把锁存器当作驱动器,驱动数码管的显示;6、晶振其晶振的运用,在这地方我们用的是12MHz,主要用在单片机的最小系统中,参照单片机最小系统图示;7. 电阻。电容。导线等(一)单片机最小系统电路在课题设计的温度控制系统设计中,控制核心是STC89C52单片机,该单片机为51系列增强型8位单片机,它有32个I/O口,片内含4K FLASH工艺的程序存储器,便于用电的方式瞬间擦除和改写,而且价格便宜,其外部晶振为12MHz,一个指令周期为1S。使用该单片机完全可以完成设计任务,其最小系统主要包括:复位电路、震荡电路以及存储器选择模式(EA
13、脚的高低电平选择),电路如下图2所示:图2 单片机最小系统(二)温度传感器电路采用一线制数字温度传感器DS18B20来作为本课题的温度传感器.传感器输出信号进4。7K的上拉电阻直接接到单片机的P1。0引脚上.DS18B20温度传感器是美国达拉斯(DALLAS)半导体公司推出的应用单总线技术的数字温度传感器。该器件将半导体温敏器件、A/D转换器、存储器等做在一个很小的集成电路芯片上。本设计中温度传感器之所以选择单线数字器件DS18B20,是在经过多方面比较和考虑后决定的,主要有以下几方面的原因:(1)系统的特性:测温范围为2070 ,测温精度为士0。5;温度转换精度912位可变,能够直接将温度转
14、换值以16位二进制数码的方式串行输出;12位精度转换的最大时间为750ms;可以通过数据线供电,具有超低功耗工作方式。(2)系统成本:由于计算机技术和微电子技术的发展,新型大规模集成电路功能越来越强大,体积越来越小,而价格也越来越低.一支DS18B20的体积与普通三极管相差无几,价格只有十元人民币左右.(3)系统复杂度:由于DS18B20是单总线器件,微处理器与其接口时仅需占用1个I/O端口且一条总线上可以挂接几十个DS18B20,测温时无需任何外部元件,因此,与模拟传感器相比,可以大大减少接线的数量,降低系统的复杂度,减少工程的施工量。(4)系统的调试和维护:由于引线的减少,使得系统接口大为
15、简化,给系统的调试带来方便。同时因为DS18B20是全数字元器件,故障率很低,抗干扰性强,因此,减少了系统的日常维护工作。DS18B20温度传感器只有三根外引线:单线数据传输总线端口DQ ,外供电源线VDD,共用地线GND.DS18B20有两种供电方式:一种为数据线供电方式,此时VDD接地,它是通过内部电容在空闲时从数据线获取能量,来完成温度转换,相应的完成温度转换的时间较长。这种情况下,用单片机的一个I/O口来完成对DS18B20总线的上拉。另一种是外部供电方式(VDD接+5V),相应的完成温度测量的时间较短.在本设计中采用外部供电方式实现DS18B20传感器与单片机的连接,其接口电路如图4
16、所示。图4 温度传感器接口(三)按键接口电路本课题设计采用的键盘模块,其接口原理图如下图8所示:图8 键盘模块电路四、 硬件总体电路搭建五、程序流程图六、设计感想首先通过此次课程设计,让我们对所学的计算机控制技术理论知识更加熟悉了解,对理论学习时没有掌握牢固的一些知识以及一些在学习中存在的漏洞进行学习并加以弥补,也让我们明白学习一门课程就要认真地对待,掌握牢固,并要在实践中加以运用。只有能运用自如的知识才是属于自己的东西. 比较熟练,在学习此软件过程中其次,此次课程设计我们尝试用proteus软件进行仿真设计。对于proteus,我们之前对它的一些应用比较熟悉,所以此次运用起来通过查找图书馆的
17、资料以及在网上的学习让我们意外收获了一些其他的知识,拓展了知识面,也丰富了自己的阅历. 第三,通过这次课程设计,我们学会了单片机完成某一项功能,需要从两个方面入手:一是软件的实现即汇编语言程序的编写,二是硬件电路的实现.两方面比较,程序编写时相对较难的一部分。我们团组认为这是一个建模的过程,即将实际的控制问题转换成我们所熟悉的数学模型,这是一个很抽象的问题,有时真的是难以想象。所以我们觉得这种困难最好的解决办法就是通过平时的积累,多多学习。 此次设计培养了我们对于计算机控制设计的一些兴趣,当看着自己设计的东西,通过仿真可以出现自己期望的结果时,那种愉悦的心情是前所未有的,同时当出现问题,通过自
18、己查找资料检查电路之后排除问题的过程也锻炼了我们对于学习的一种深入和坚持,锻炼了我们独立思考的能力和最初的创新意识,让我们真正体会到学习的乐趣。 第五,我们再次巩固了一些以前的东西,仿真软件的运用,课程设计的书写,计算机的一些应用软件的应用,以及对word的了解也更深入了。 最后一点,也使最深刻的体会,就是在设计过程中,基本上用到的都是我们学过的一些原理,所以学以致用在这次设计中可谓体现的淋漓尽致,要把所学的知识联系起来综合运用。这些都将成为我们以后的工作学习的铺路石,使我们在大学里收获的最实用的东西,而不是仅仅只是纸上谈兵,而是通过我们亲自动手来完成的经验对每个人来说都是一笔财富,所以这次单
19、片机控制技术课程设计对我们来说绝对是一次难得的锻炼的机会.七、参考文献1 马彪 单片机应用技术同济大学出版社 2 郭天祥 51单片机C语言教程 电子工业出版社3 陈海宴 51单片机原理及应用北京航空航天大学出版社 附录附录 1 程序代码1:main主函数#includeds18b。h”#includereg52。hsbit add=P30;/加sbit cut=P31;/减sbit set=P32;/设置 sbit p00=P00; sbit p01=P01; sbit p02=P02; sbit p03=P03; / /位选控制 声明sbit p04=P04; sbit p05=P05; s
20、bit p06=P06; sbit p07=P07;sbit Lled=P20;/低于温度下限值 此灯点亮sbit Hled=P21; /高于温度上限值 此灯点亮sbit LHled=P22; / 达到加热预设时间此灯点亮unsigned char tab44=0; / 定义一个tab4号数组用来存放温度的上限值与下限值unsigned char tab89=0; /unsigned char tab96=0; / 定义一个tab9号数组用来存放用户的给定的加热时间 unsigned char code tab7=0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F;
21、 /位选控制 查表的方法控制unsigned char code tab=0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6;/共阳数码管数字码uchar tab1=0,0,0,0,0,0,0,0,0,0,0,0,0,0; /定义一个tab1号数组用来存放温度转换值unsigned char shi=10,fen=35,miao,L; /你懂得 不用多讲unsigned char LED; /定义一个char变量用来控制数码管上的秒的闪烁unsigned char tt,i,flag=0;unsigned int wen; /定义一个无符号整形变
22、量用来存放温度返回值unsigned char TH,TL; /存放用户的设定的温度上下限值 void delay (unsigned int Z)/ 延时函数 unsigned int x,y; for(x=Z;x0;x-) for(y=110;y0;y-); void init ()/初始化 P2=0xff; P3=0xff; TMOD=0x11; /开启定时器 0,1 TH1=(65536-5000)/256;/5Ms TL1=(655365000)256; EA=1; ET1=1;/你懂得不用多讲 TR1=1; TH0=(6553650000)/256;/50Ms TL0=(65536
23、50000)256; ET0=1; /你懂得不用多讲 TR0=1; void main () init (); /初始化I/O端口即定时器0.1;while(1) if((flag=0)|(flag=1)) /当第一次按下设置键 进入手动设置当前时间 tab84=fen/10; tab85=fen10; tab86=shi/10;tab87=shi%10; wen=dispaly(); tab12=wen/100;tab11=wen100/10; /你懂得不用多讲tab10=wen10; tab88=tab1210+tab11; for(L=0;L50;L+)for(i=0;i8;i+) P1
24、=0;P1=tabtab11;p00=0;p01=1;p02=1;p03=1;p04=1;p05=1;p06=1;p07=1;delay_ms(2);P1=tabtab12; p00=1;p01=0;p02=1;p03=1;p04=1;p05=1;p06=1;p07=1; delay_ms(2); if(LED=20) P1=0x02; p00=1;p01=1;p02=1;p03=1;p04=1;p05=0;p06=1;p07=1; delay_ms(2); if(LED=40) LED=0; P1=0x02; p00=1;p01=1;p02=1;p03=1;p04=1;p05=1;p06=1
25、;p07=1; delay_ms(2); if(flag=1) P1=0x02; p00=1;p01=1;p02=1;p03=1;p04=1;p05=0;p06=1;p07=1; delay_ms(2); P1=tabtab86;p00=1;p01=1;p02=1;p03=1;p04=1;p05=1;p06=1;p07=0; delay_ms(2); P1=tabtab87;p00=1;p01=1;p02=1;p03=1;p04=1;p05=1;p06=0;p07=1; delay_ms(2); P1=0x9c; p00=1;p01=1;p02=0;p03=1;p04=1;p05=1;p06=
26、1;p07=1; delay_ms(2); P1=tabtab84;p00=1;p01=1;p02=1;p03=1;p04=0;p05=1;p06=1;p07=1; delay_ms(2); P1=tabtab85;p00=1;p01=1;p02=1;p03=0;p04=1;p05=1;p06=1;p07=1; delay_ms(2); if(flag=2)(flag=3)/当第二或者第三次按下设置键 进入温度上下限门槛设置 tab42=tab82/100; tab41=tab82100/10; tab40=tab8210; /Htab2 tab46=tab83/100; tab45=tab8
27、3100/10; tab44=tab83%10;/L tab3 for(i=0;i8;i+) /动态扫描P1=tabtab4i; if(i=3) P1=0x6e ; if(i=7) P1=0x1c ;P0=tab7i;delay(5); if(flag=4)/当第四次按下设置键 进入用户给定加热时间设置 tab91=TL10;tab92=TL/10;tab94=TH%10;tab95=TH/10; for(i=0;i8;i+)P1=tabtab9i; if((i=3)(i=0) P1=0x02; if(i=7)|(i=6)) P1=0x02;P0=tab7i;delay(5); void ti
28、mer1() interrupt 3 TH0=(655365000)/256;/5Ms TL0=(65536-5000)%256; /开辟一个每隔5Ms扫描按键 检测是否邮件按下if(add=0) delay(10); if(add=0) while(!add) ; if(flag=4)TL+;if(flag=1) fen+; if(fen=60) fen=0;if (flag=2)tab82+;if(flag=3)tab83+; /你懂得不用多讲if(cut=0) delay(10); if(cut=0) while(!cut) ; if(flag=4)TH+;if(flag=1) shi+
29、; if(shi=24) shi=0;if (flag=2)tab82-; if(flag=3)tab83-; /你懂得不用多讲if(set=0) delay(10); if(set=0) while(!set) ;flag+;if(flag=5)flag=0; if(flag=1) TR0=0; if(flag=3) TR0=1; /当第一次按下设置键关闭定时器0, if(tab88=18) tt=0;miao+; if(miao=60) fen+; miao=0; if(fen=60)shi+; fen=0; if(shi=24) shi=0; 2:ds18B20.h库文件include”
30、ds18b。h includereg52.h#includeintrins。hdefine uchar unsigned char define uint unsigned int sbit DQ=P37; / 定义p37用来操控DS18B20void delay_us(uint a) /微妙机延时子函数do _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); while(-a);void delay_ms(uint a) /毫秒级延时子函数uchar x,y;for(x=a;x0;x-)for(y=1
31、10;y0;y-);uchar ds18b20_reset()/复位DS18B20uchar a;DQ=0;delay_us(60);DQ=1;delay_us(9); if(DQ)a=1;delay_ms(2);return a;void ds18b20_write(uchar a) /写uchar i;for(i=0;i8;i+) DQ=0; if(a&0x01) DQ=1; else DQ=0; delay_us(5); DQ=1;/至高下一位数据准备 a=1; uchar ds18b20_read() /读uchar j,b;for(j=0;j8;j+)DQ=0;b=1;DQ=1;if
32、(DQ)b=b|0x80;delay_us(2);DQ=1;/至高为下一位数据 准备return b;unsigned int dispaly() /启动温度转化 并返回温度转换至uint H,L; ds18b20_reset(); ds18b20_write(0xcc); ds18b20_write(0x44); delay_ms(20); ds18b20_reset(); ds18b20_write(0xcc); ds18b20_write(0xbe); L= ds18b20_read(); H= ds18b20_read(); H=H256+L; H=H*0。625; return H;3:18B20头文件ifndef _DS18B20_H_#define _DS18B20_H_define uchar unsigned char define uint unsigned int uint output(void); void delay_ms(uint a);#endif22