基于51单片机课程设计报告书_第1页
基于51单片机课程设计报告书_第2页
基于51单片机课程设计报告书_第3页
基于51单片机课程设计报告书_第4页
基于51单片机课程设计报告书_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/基于51单片机课程设计报告院系:电子通信工程团组:电子设计大赛1组姓名:指导老师:2目录

一、摘要………………3二、系统方案的设计…3三、硬件资源…………5四、硬件总体电路搭建……………13五、程序流程图…………14六、设计感想……………14七、参考文献……………16附录………17附录1程序代码………………17一、摘要本设计以STC89C51单片机为核心的温度控制系统的工作原理和设计方法。温度信号由温度芯片DS18B20采集,并以数字信号的方式传送给单片机。文中介绍了该控制系统的硬件部分,包括:温度检测电路、温度控制电路。单片机通过对信号进行相应处理,从而实现温度控制的目的。文中还着重介绍了软件设计部分,在这里采用模块化结构,主要模块有:数码管显示程序、键盘扫描及按键处理程序、温度信号处理程序、led关键词:STC89C51单片机DS18B20温度芯片温度控制,LED报警提示.二、系统方案的设计1、设计要求基本功能:不加热时实时显示时间,并可手动设置时间;设定加热水温功能。人工设定热水器烧水的温度,范围在20~70度之间,打开开关后,根据设定温度与水温确定是否加热,及何时停止加热,可实时显示温度;设定加热时间功能。限定烧水时间,加热时间内超过温度上限或低于温度下限报警,并可实时显示温度。2、系统设计的框架本课题设计的是一种以STC89C51单片机为主控制单元,以DS18B20为温度传感器的温度控制系统。该控制系统可以实时存储相关的温度数据并记录当前的时间。其主要包括:电源模块、温度测量及调理电路、键盘、数码管显示、指示灯、报警、继电器及单片机最小系统。图1系统设计框架3工作原理温度传感器DS18B20从设备环境的不同位置采集温度,单片机STC8951获取采集的温度值,经处理后得到当前环境中一个比较稳定的温度值,再根据当前设定的温度上下限值,通过加热和降温对当前温度进行调整。当采集的温度经处理后超过设定温度的上限时,单片机通过三极管驱动继电器开启降温设备<压缩制冷器>,当采集的温度经处理后低于设定温度的下时,单片机通过三极管驱动继电器开启升温设备<加热器>,这里采用通过LED1和LED2取代!!!当由于环境温度变化太剧烈或由于加热或降温设备出现故障,或者温度传感头出现故障导致在一段时间内不能将环境温度调整到规定的温度限内的时候,单片机通过三极管驱动扬声器发出警笛声,这里采用HLLED提示。加热器继电器2加热器继电器2三、硬件资源1、器件选择:1.51单片机一块STC89c51STC8951是一个低功耗,高性能CMOS8位单片机,片内含8kBytesISP<In-systemprogrammable>的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及STC8951引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,功能强大的微型计算机的STC8951可为许多嵌入式控制应用系统提供高性价比的解决方案。STC8951具有如下特点:40个引脚,8kBytesFlash片内程序存储器,128bytes的随机存取数据存储器〔RAM,32个外部双向输入/输出〔I/O口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信,片内时钟振荡器。此外,STC8951设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。由于系统控制方案简单,数据量也不大,考虑到电路的简单和成本等因素,因此在本设计中选用STC8951单片机作为主控芯片。主控模块采用单片机最小系统是由于STC8951芯片内含有8kB的E2PROM,无需外扩存储器,电路简单可靠,其时钟频率为0~24MHz,并且价格低廉,批量价在10元以内。其单片机的外围引脚有40个,分别是:第20脚和40脚分别是电源,即GND和Vcc;第9脚是复位脚RST;第18脚是时钟XTAL2脚,片内振荡电路的输出端;第19脚是时钟XTAL1脚,片内振荡电路的输入端;第29脚:~PSEN脚,当访问外部程序存储器时,此引脚输出负脉冲选通信号,PC的16位地址数据将出现在P0和P2口上;第30脚:ALE/~PROG,当访问外部数据存储器时,ALE〔地址锁存的输出用于锁存地址的低字节;第31脚:~EA/Vpp为程序存储器内外部选通信号;P0^0-P0^7.P1^0-P1^7.P2^0-P2^7.P3^0-P3^7.这32个引脚为数据的输出及输入引脚,即I/0口;单片机图如下:2、8位7段共阴数码管一个7段数码管一般由8个发光二极管组成,其中由7个细长的发光二极管组成数字显示,另外一个圆形的发光二极管显示小数点。当发光二极管导通时,相应的一个点或一个笔画发光。控制相应的二极管导通,就能显示出各种字符,尽管显示的字符形状有些失真,能显示的数符数量也有限,但其控制简单,使有也方便。发光二极管的阳极连在一起的称为共阳极数码管,阴极连在一起的称为共阴极数码管,如图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,F3、温度显示DS18B20一个DS18B20采用3脚TO-92封装或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字节写上、下限温度数据命令,紧跟该命令之后,再传送两字节数据。DS18B20在出厂时默认配置为12位,其中最高位为符号位,即温度值共11位,单片机在读取数据时,一次会读两字节共16位,读完后将低11位的二进制数转换为十进制后再乘以0.0625变为所测的温度值。另外,还需要判断温度的正负。前5个数字为符号位,这5位同时变化,我们只需判断11位就可以了。前5位为1时,读取的温度为负值,且测到的数值需要取反再加一再乘以0.0625才可以得到实际的温度值。前5位为0时,读取的温度为正值,只要将测得的数值乘以0.0625即可得到实际温度值。由于提前给DS18B20赋了上限、下限值,所以当温度超过上限或者不足下限时,会伴有LED灯闪烁和蜂鸣器响作为警报。4、按键在按下键时,实际情况下,都会出现抖动。其直观图如下:按键消抖一般采用硬件和软件消抖两种方法。硬件消抖是利用电路滤波的原理实现,软件消抖是通过按键延时来实现。在微机系统中一般都采用软件延时的消抖方法,本文用的是软件延时的消抖方法。5、74HC573锁存器高性能硅门CMOS器件SL74HC573跟LS/AL573的管脚一样。器件的输入是和标准CMOS输出兼容的;加上拉电阻,他们能和LS/ALSTTL输出兼容。当锁存使能端LE为高时,这些器件的锁存对于数据是透明的〔也就是说输出同步相当于图上的Dx-Qx相通,I/0口可以进行数据交换。当锁存使能变低时,符合建立时间和保持时间的数据会被锁存。在这里我们是将LE接高电平,把锁存器当作驱动器,驱动数码管的显示;6、晶振其晶振的运用,在这地方我们用的是12MHz,主要用在单片机的最小系统中,参照单片机最小系统图示;电阻.电容.导线等<一>单片机最小系统电路在课题设计的温度控制系统设计中,控制核心是STC89C52单片机,该单片机为51系列增强型8位单片机,它有32个I/O口,片内含4KFLASH工艺的程序存储器,便于用电的方式瞬间擦除和改写,而且价格便宜,其外部晶振为12MHz,一个指令周期为1μS。使用该单片机完全可以完成设计任务,其最小系统主要包括:复位电路、震荡电路以及存储器选择模式〔EA脚的高低电平选择,电路如下图2所示:图2单片机最小系统<二>温度传感器电路采用一线制数字温度传感器DS18B20来作为本课题的温度传感器。传感器输出信号进4.7K的上拉电阻直接接到单片机的P1.0引脚上。DS18B20温度传感器是美国达拉斯<DALLAS>半导体公司推出的应用单总线技术的数字温度传感器。该器件将半导体温敏器件、A/D转换器、存储器等做在一个很小的集成电路芯片上。本设计中温度传感器之所以选择单线数字器件DS18B20,是在经过多方面比较和考虑后决定的,主要有以下几方面的原因:〔1系统的特性:测温范围为20℃~70℃,测温精度为士0.5〔2系统成本:由于计算机技术和微电子技术的发展,新型大规模集成电路功能越来越强大,体积越来越小,而价格也越来越低。一支DS18B20的体积与普通三极管相差无几,价格只有十元人民币左右。〔3系统复杂度:由于DS18B20是单总线器件,微处理器与其接口时仅需占用1个I/O端口且一条总线上可以挂接几十个DS18B20,测温时无需任何外部元件,因此,与模拟传感器相比,可以大大减少接线的数量,降低系统的复杂度,减少工程的施工量。〔4系统的调试和维护:由于引线的减少,使得系统接口大为简化,给系统的调试带来方便。同时因为DS18B20是全数字元器件,故障率很低,抗干扰性强,因此,减少了系统的日常维护工作。DS18B20温度传感器只有三根外引线:单线数据传输总线端口DQ,外供电源线VDD,共用地线GND。DS18B20有两种供电方式:一种为数据线供电方式,此时VDD接地,它是通过内部电容在空闲时从数据线获取能量,来完成温度转换,相应的完成温度转换的时间较长。这种情况下,用单片机的一个I/O口来完成对DS18B20总线的上拉。另一种是外部供电方式<VDD接+5V>,相应的完成温度测量的时间较短。在本设计中采用外部供电方式实现DS18B20传感器与单片机的连接,其接口电路如图4所示。图4温度传感器接口<三>按键接口电路本课题设计采用的键盘模块,其接口原理图如下图8所示:图8键盘模块电路四、硬件总体电路搭建五、程序流程图六、设计感想首先通过此次课程设计,让我们对所学的计算机控制技术理论知识更加熟悉了解,对理论学习时没有掌握牢固的一些知识以及一些在学习中存在的漏洞进行学习并加以弥补,也让我们明白学习一门课程就要认真地对待,掌握牢固,并要在实践中加以运用。只有能运用自如的知识才是属于自己的东西。比较熟练,在学习此软件过程中其次,此次课程设计我们尝试用proteus软件进行仿真设计。对于proteus,我们之前对它的一些应用比较熟悉,所以此次运用起来通过查找图书馆的资料以及在网上的学习让我们意外收获了一些其他的知识,拓展了知识面,也丰富了自己的阅历。第三,通过这次课程设计,我们学会了单片机完成某一项功能,需要从两个方面入手:一是软件的实现即汇编语言程序的编写,二是硬件电路的实现。两方面比较,程序编写时相对较难的一部分。我们团组认为这是一个建模的过程,即将实际的控制问题转换成我们所熟悉的数学模型,这是一个很抽象的问题,有时真的是难以想象。所以我们觉得这种困难最好的解决办法就是通过平时的积累,多多学习。此次设计培养了我们对于计算机控制设计的一些兴趣,当看着自己设计的东西,通过仿真可以出现自己期望的结果时,那种愉悦的心情是前所未有的,同时当出现问题,通过自己查找资料检查电路之后排除问题的过程也锻炼了我们对于学习的一种深入和坚持,锻炼了我们独立思考的能力和最初的创新意识,让我们真正体会到学习的乐趣。第五,我们再次巩固了一些以前的东西,仿真软件的运用,课程设计的书写,计算机的一些应用软件的应用,以及对word的了解也更深入了。最后一点,也使最深刻的体会,就是在设计过程中,基本上用到的都是我们学过的一些原理,所以学以致用在这次设计中可谓体现的淋漓尽致,要把所学的知识联系起来综合运用。这些都将成为我们以后的工作学习的铺路石,使我们在大学里收获的最实用的东西,而不是仅仅只是纸上谈兵,而是通过我们亲自动手来完成的经验对每个人来说都是一笔财富,所以这次《单片机控制技术》课程设计对我们来说绝对是一次难得的锻炼的机会。七、参考文献[1]马彪《单片机应用技术》同济大学出版社[2]郭天祥《51单片机C语言教程》电子工业出版社[3]陈海宴《51单片机原理及应用》北京航空航天大学出版社附录………附录1程序代码………………1:main主函数#include"ds18b.h"#include<reg52.h>sbitadd=P3^0; // 加sbitcut=P3^1; // 减sbitset=P3^2; // 设置sbitp00=P0^0;sbitp01=P0^1;sbitp02=P0^2;sbitp03=P0^3; // //位选控制声明sbitp04=P0^4;sbitp05=P0^5;sbitp06=P0^6;sbitp07=P0^7;sbitLled=P2^0; //低于温度下限值此灯点亮sbitHled=P2^1; //高于温度上限值此灯点亮sbitLHled=P2^2;//达到加热预设时间此灯点亮unsignedchartab4[4]={0}; // 定义一个tab4号数组用来存放温度的上限值与下限值unsignedchartab8[9]={0}; //unsignedchartab9[6]={0}; //定义一个tab9号数组用来存放用户的给定的加热时间unsignedcharcodetab7[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};//位选控制查表的方法控制unsignedcharcodetab[]={ 0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//共阳数码管数字码uchartab1[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};//定义一个tab1号数组用来存放温度转换值unsignedcharshi=10,fen=35,miao,L; //你懂得不用多讲unsignedcharLED; //定义一个char变量用来控制数码管上的秒的闪烁unsignedchartt,i,flag=0;unsignedintwen;//定义一个无符号整形变量用来存放温度返回值unsignedcharTH,TL; //存放用户的设定的温度上下限值voiddelay<unsignedintZ>// 延时函数{unsignedintx,y; for<x=Z;x>0;x--> for<y=110;y>0;y-->; }voidinit<> //初始化 { P2=0xff; P3=0xff;TMOD=0x11;//开启定时器0,1TH1=<65536-5000>/256;//5MsTL1=<65536-5000>%256;EA=1;ET1=1; //你懂得不用多讲TR1=1;TH0=<65536-50000>/256;//50MsTL0=<65536-50000>%256;ET0=1;//你懂得不用多讲TR0=1; }voidmain<>{ init<>;//初始化I/O端口即定时器0.1; while<1> { if<<flag==0>||<flag==1>>//当第一次按下设置键进入手动设置当前时间 { tab8[4]=fen/10;tab8[5]=fen%10;tab8[6]=shi/10;tab8[7]=shi%10; wen=dispaly<>; tab1[2]=wen/100; tab1[1]=wen%100/10; //你懂得不用多讲 tab1[0]=wen%10; tab8[8]=tab1[2]*10+tab1[1]; for<L=0;L<50;L++> for<i=0;i<8;i++> { P1=0; P1=tab[tab1[1]]; p00=0;p01=1;p02=1;p03=1;p04=1;p05=1;p06=1;p07=1;delay_ms<2>; P1=tab[tab1[2]]; 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;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=tab[tab8[6]]; p00=1;p01=1;p02=1;p03=1;p04=1;p05=1;p06=1;p07=0;delay_ms<2>; P1=tab[tab8[7]]; 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=1;p07=1;delay_ms<2>; P1=tab[tab8[4]]; p00=1;p01=1;p02=1;p03=1;p04=0;p05=1;p06=1;p07=1;delay_ms<2>; P1=tab[tab8[5]]; p00=1;p01=1;p02=1;p03=0;p04=1;p05=1;p06=1;p07=1;delay_ms<2>; } } if<<flag==2>|<flag==3>>//当第二或者第三次按下设置键进入温度上下限门槛设置 { tab4[2]=tab8[2]/100;tab4[1]=tab8[2]%100/10;tab4[0]=tab8[2]%10;//H tab[2] tab4[6]=tab8[3]/100;tab4[5]=tab8[3]%100/10;tab4[4]=tab8[3]%10; //L tab[3] for<i=0;i<8;i++> { //动态扫描 P1=tab[tab4[i]];if<i==3> P1=0x6e;if<i==7> P1=0x1c; P0=tab7[i]; delay<5>; } } if<flag==4>//当第四次按下设置键进入用户给定加热时间设置 { tab9[1]=TL%10;tab9[2]=TL/10;tab9[4]=TH%10;tab9[5]=TH/10; for<i=0;i<8;i++> { P1=tab[tab9[i]];if<<i==3>||<i==0>>P1=0x02;if<<i==7>||<i==6>>P1=0x02; P0=tab7[i]; delay<5>; } } }}voidtimer1<>interrupt3{TH0=<65536-5000>/256;//5MsTL0=<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>tab8[2]++;if<flag==3>tab8[3]++; } } //你懂得不用多讲if<cut==0>{delay<10>;if<cut==0>{while<!cut>;if<flag==4>TH++;if<flag==1>{shi++;if<shi==24>shi=0;}if<flag==2>tab8[2]--;if<flag==3>tab8[3]--; } } //你懂得不用多讲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<tab8[8]<=tab8[3]>Lled=0;elseLled=1; //判断当前温度是否低于预设温度 若是开启LED提示if<tab8[8]>=tab8[2]>Hled=0;elseHled=1; ////你懂得不用多讲if<TL>=60>TL=0;if<TH>=24>TH=0;if<<fen>=TL>&&<shi>=TH>>LHled=0;elseLHled=1; //判断用户预设加热时间是否达到若是开启LED}voidtimer0<>interrupt1{ TH1=<65536-50000>/256;TL1=<65536-50000>%256; //你懂得不用多讲 tt++;LED++;if<tt>=18>{tt=0;miao++;}if<miao==60>{fen++;miao=0; } if<fen==60>{shi++;fen=0;} if<shi==24>shi=0;}2:ds18B20.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论