河南理工大学单片机课程设计_第1页
河南理工大学单片机课程设计_第2页
河南理工大学单片机课程设计_第3页
河南理工大学单片机课程设计_第4页
河南理工大学单片机课程设计_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

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

文档简介

年4月19日河南理工大学单片机课程设计文档仅供参考,不当之处,请联系改正。河南理工大学《单片机应用与仿真训练》设计报告多机温度检测系统设计姓名:学号:专业班级:电气09-6班指导老师:王莉所在学院:电气工程与自动化学院5月20日目录目录 I摘要 II1概述 11.1下位机温度采集发送系统 11.2上位机显示及报警系统 12系统总体方案及硬件设计 32.1主要硬件简介 32.2各部分电路设计 53软件设计 93.1功能需求分析 94实验仿真 115课程设计体会 12参考文献 13附录一源程序 14附录二系统原理图 31 32附录三实物图片 32摘要本设计是采用AT89S528位单片机作为控制核心设计了温度测量系统,该系统由温度检测模块、微控制器模块、串口通信模块、数码管显示和报警模块等四部分组成,能对0℃~99℃范围的温度进行测量,同时利用4位八段数码管能够实时显示环境温度。该系统结构简单,成本低,具有较好的应用价值。本系统首先由下位AT89S52单片机经过p2.3口不断循环采集数字化温度传感器DS18B20的温度数据,然后转换成十进制温度值,经过串行口发送至上位AT89S52单片机,由上位机经过串行口接收数据,再与报警温度进行比较,判断是否进行报警,上位机同时驱动四位八段数码管将温度显示出来。实现本系统的主要难点在于温度的采集和传送。DS18B20只需要接到单片机的一个I/O口上,由于单总线为开漏因此需要外接一个4.7K的上拉电阻。其功能强大,但需要不断地发送采集命令以及循环读取它传出的数值,然后进行换算成十进制温度。单片机串口通信是单片机一个非常有用的功能,能够构建多机系统来实现更为强大的功能,而且经过MAX232能够进行远距离的通信,实现远程控制,可是对于单片机初学者来说不太容易掌握其发送接收的时序和数据格式,因此我们采用了简单的直接通信而未进行数据发送前的请求应答和数据发送完得数据检查校错。当然,由于我们是首次设计这样完整的应用系统,可能实现的功能不太完善。关键词:单片机;温度检测;串口通信第一章概述1.1下位机温度采集发送系统下位机温度采集发送系统是本系统的主要核心之一,它的主要功能是采集DS18B20的温度数据,进行转换,并经过串口发送出去。该温度测量系统采用8051内核Atmel公司的AT89S52八位单片机。温度采集发送系统由温度检测模块、下位控制器模块、发送放大模块三部分组成,如图1-1温度测量系统的系统框图:温度温度采集下位机控制模块发送放大模块图1-1温度测量系统的系统框图温度检测模块中温度传感器DS18B20采集温度数据,经过P2.3口传给下位单片机,微控制模块进行数据转换,得出十进制温度值,然后经过串行口经MAX232将数据发送出去。1.2上位机显示及报警系统上位机系统的主要功能是接收下位机发送过来的温度数据,与报警温度进行比较,判断是否发送报警信号,并同时直接驱动四位八段数码管进行显示。上位机系统由串口接收模块、处理控制模块、数码管显示模块和报警模块四部分组成,如图1-2上位机系统框图:数码管显示串口接收处理控制数码管显示串口接收处理控制报警报警控制模块图1-2上位机系统框图串行口接收数据后进行判断是否报警,并由P0口和P2.0~P2.3直接驱动数码管显示温度数据。报警控制模块经过按钮电路能够改变报警温度的上下限实现系统的灵活功能。第二章系统总体方案及硬件设计2.1主要硬件简介=1\*GB2⑴单片机简介所谓单片机,全称是单片微型计算机,又控制器。它是在一块半导体芯片上,集成了CPU,ROM,RAM,I/O口、定时器/计数器、中断系统、AD模数转换器等功能部件,构成了一台完整的数字电子机。当前单片机己成功地运用在智能仪表、机电设备、过程控制、数据处自动检测和家用电器等各个方面。单片机在控制领域中,有如下几个特点:1)小巧灵活、成本低、易于产品化,能方便地组装成各种智能式控备及各种智能仪器仪表。2)面向控制,能针对性地解决从简单到复杂的各类控制任务,因而得最佳的性能价格比。3)抗干扰能力强,适应温度范围宽,在各种恶劣的环境下都能可靠作,这是其它机种无法比拟的。4)能够很方便地实现多机和分布式控制,使整个控制系统的效率和性大为提高AT89S52单片机是Atmel公司推出的和工业80C51产品为完全兼容的8位机,其特有的布尔处理机,在逻辑处理与控制方面具有突出优点。特点如下:*与MCS-51单片机产品兼容*8K字节在系统可编程Flash存储器*1000次擦写周期*全静态操作:0Hz~33Hz*三级加密程序存储器R*32个可编程I/O口线*三个16位定时器/计数器*八个中断源*全双工UART串行通道*8位微控制器*低功耗空闲和掉电模式*掉电后中断可唤醒*8K字节在系统可编程*看门狗定时器*双数据指针*掉电标识符图2-1为AT89S52的引脚图:图2-1AT89S52引脚图=2\*GB2⑵DS18B20简介数字化温度传感器是DALLAS最新单线数字温度传感器,支持“一线总线”接口,测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。DS1822的精度较差为±2°C。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。其适合于现场温度测量,能够程序设定9~12位的分辨率,精度为±0.5°C。可选更小的封装方式,更宽的电压适用范围。分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列如下图2-2DS18B20管脚图DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的E2RAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。暂存存储器包含了8个连续字节,前两个字节是测得的温度信息,第一个字节的内容是温度的低八位,第二个字节是温度的高八位。第三个和第四个字节是TH、TL的易失性拷贝,第五个字节是结构寄存器的易失性拷贝,这三个字节的内容在每一次上电复位时被刷新。第六、七、八个字节用于内部计算。第九个字节是冗余检验字节。根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。DS18B20产品的特点(1)只要求一个端口即可实现通信。(2)在DS18B20中的每个器件上都有独一无二的序列号。(3)实际应用中不需要外部任何元器件即可实现测温。(4)测量温度范围在-55°C-+125°C之间。(5)数字温度计的分辨率用户能够从9位到12位选择。(6)内部有温度报警上、下限设置。2.2各部分电路设计=1\*GB2⑴、单片机最小系统设计最小应用系统设计是单片机应用系统的设计基础。它包括单片机的选择、时钟系统设计、复位电路设计、简单的I/O口扩展、掉电保护等。本次设计采用的是AT89C52,其特点是8字节FLASH闪速存储器,256字节,32个I/O口线,3个16位定时/计数器,掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位.主演的是它与C51系列产品指令和引脚完全兼容.最小系统的时钟电路采用12MHZ晶振,机器周期为1us,连接两个30pF的电容,连接到AT89S52的XATL1,XATL2上面,如3.2图所示。复位电路采用的是上电+按钮电平复位,是利用电容充电来实现上电复位。当按钮按下后,电源施加在单片机复位端RST上,实现单片机复位功能.。最小系统设计如图2-3所示图2-3单片机最小系统设计图=2\*GB2⑵DS18B20与AT89S52单片机接口电路的设计DSl8B20数字温度计提供9位(二进制)温度读数,指示器件的温度信息经过单线接口送入DSl8B20或从DSl8B20送出,因此从主机CPU到DSl8B20仅需一条线,DS18B20与AT89C52单片机的接口电路如图2-4所示,其中DS18B20与单片机的接口为P2.3。图2-4DS18B20模块设计=3\*GB2⑶下位机与上位机串行通信电路设计本系统采用的是下位机采集温度信息并换算,经过串行口发送至上位机,因此需用到单片机的串行口。单片机的串行口是一个可编程的全双工串行通信接口。它可用作异步通信方式,与串行传送信息的外部设备相连接,或用于经过标准异步通信协议进行全双工的AT89S52多机系统也能经过同步方式,使用TTL或CMOS移位寄存器来扩充I/O口。AT89S52单片机经过管脚RXD(P3.0,串行数据接收端)和管脚TXD(P3.1,串行数据发送端)与外界通信。SBUF是串行口缓冲寄存器,包括发送寄存器和接收寄存器。它们有相同名字和地址空间,但不会出现冲突,因为它们两个一个只能被CPU读出数据,一个只能被CPU写入数据。本系统串行通信具体设计如图2-5,图中标号IRXD和ITXD分别代表下位机得RXD口和TXD口。图2-5串行通信设计串行口的控制与状态寄存器简介=1\*GB3①串行口控制寄存器SCON它用于定义串行口的工作方式及实施接收和发送控制。字节地址为98H,其各位定义如下表:D7D6D5D4D3D2D1D0SM0SM1SM2RENTB8RB8TIRISM0、SM1:串行口工作方式选择位,其定义如下:SM0、SM1工作方式功能描述波特率00方式08位移位寄存器Fosc/1201方式110位UART可变10方式211位UARTFosc/64或fosc/3211方式311位UART可变其中fosc为晶体震荡器频率SM2:多机通信控制位。在方式0时,SM2一定要等于0。在方式1中,当(SM2)=1则只有接收到有效停止位时,RI才置1。在方式2或方式3当(SM2)=1且接收到的第九位数据RB8=0时,RI才置1。REN:接收允许控制位。由软件置位以允许接收,又由软件清0来禁止接收。TB8:是要发送数据的第9位。在方式2或方式3中,要发送的第9位数据,根据需要由软件置1或清0。例如,可约定作为奇偶校验位,或在多机通信中作为区别地址帧或数据帧的标志位。RB8:接收到的数据的第9位。在方式0中不使用RB8。在方式1中,若(SM2)=0,RB8为接收到的停止位。在方式2或方式3中,RB8为接收到的第9位数据。TI:发送中断标志。在方式0中,第8位发送结束时,由硬件置位。在其它方式的发送停止位前,由硬件置位。TI置位既表示一帧信息发送结束,同时也是申请中断,可根据需要,用软件查询的办法获得数据已发送完毕的信息,或用中断的方式来发送下一个数据。TI必须用软件清0。RI:接收中断标志位。在方式0,当接收完第8位数据后,由硬件置位。在其它方式中,在接收到停止位的中间时刻由硬件置位(例外情况见于SM2的说明)。RI置位表示一帧数据接收完毕,可用查询的办法获知或者用中断的办法获知。RI也必须用软件清0。=2\*GB3②特殊功能寄存器PCONPCON是为了在CHMOS的AT89S52单片机上实现电源控制而附加的。其中最高位是SMOD。它是一个特殊功能寄存器,没有位寻址功能,字节地址为87H。PCON电源管理寄存器结构D7D6D5D4D3D2D1D0SMODGF1GF0PDIDL其中D7位(SMOD)为波特率选择位。=4\*GB2⑷LED显示电路设计上位机接收到温度数据后需要直接驱动四位八段数码管将温度值显示出来,本系统采用的是共阴四位八段数码管,其具体设计如图2-6。图2-6数码管显示电路设计=5\*GB2⑸键盘电路设计本系统只需用键盘实现简单的改变报警上下限,因此只需要简单的四个按钮即可,键盘电路具体设计如图2-7。图2-7键盘电路设计第三章软件设计3.1功能需求分析本系统需要具体实现的功能可划分为以下几个部分:温度数据采集温度数据换算温度数据传送与接收温度显示报警上下限调整温度数据与报警上下限比较及报警系统又分为上位机和下位机两部分,易知前三个要求属于下位机的功能范畴,要求三至要求六属于上位机的功能范畴。根据下位机的功能范畴,可设计出其工作流程图如下:开始开始串口初始化并发送温度DS18B20初始化系统初始化采集DS18B20温度并换算图3-1下位机工作流程图由流程图可知,可将下位机的程序划分为若干个实现单一功能的子程序,如DS18B20初始化程序、温度采集程序、温度换算程序、串口初始化程序和串口发送程序等。根据上位机的功能范畴,可将上位机得工作流程设计如下:开始开始系统初始化串口初始化串口中断开中断显示温度值关中断接收数据扫描键盘改变报警上下限图3-2上位机工作流程图第四章仿真实验第五章总结体会经过这次单片机课程设计,我们不但加深了对单片机理论的理解,将很多课本理论很好地应用到实际当中,而且我们还学会了如何去培养我们的学习精神和团队协作能力,从而不断地战胜自己,超越自己。经过这次完成这次的设计,我们发现了我们在课堂上学习的知识是十分宝贵且有用的,也发现了我们在课堂学习过程中的不足和大意,有很多东西都在课堂上被我们忽略来了,为了完成本次的设计,我们不断地翻阅书籍、请教同学,重新学习了课堂上的知识,虽然还没能做到融会贯通、厚积薄发,但毕竟窥一管而知全豹,走进了单片机应用的辽阔世界,了解到了单片机系统的强大功能,开阔了视野,提高了设计能力,使更多的知识成为了自己的东西,相信这些在我们今后的学习和工作生涯中将会是一笔宝贵的财富。在这次设计中,串口通信是我们的一大难点,不断的仿真和不断的错误和失败告诉我们基础知识的不踏实,正如老师所言“基础不牢,地动山摇”,于是我们重新认真的看课本重新的学习,终于实现了串口发送和接受功能。本次设计我们使用的是C51语言,虽然c语言结构明确,可读性强,但由于单片机的硬件资源有限,在数据定义和特殊寄存器的选用及修改上比较固定,对于新手来说有些理解和实现,因此C语言编程时很多地方程序结构固定,而我们又没有系统深入的学习过C51语言,因此在这次设计中我们部分的借鉴了别人的程序,虽然这一部分不是我们写的,可是我们认真读懂了它而且学到了很多东西,包括编程思想和设计技巧,这些都提高了我们的学习能力和模仿能力。总之,经过这次的课程设计,使我们认识到了不足,看清了学习的方向,找到了学习的动力,提高了动手能力和学习能力,收获很大。参考文献[1]贾振国.DS1820及高精度温度测量的实现[J].电子技术应用,(1):58-59.[2]郭爱芳主编.传感器原理及应用.西安电子科技大学出版社..5[3]姜志海,赵艳雷,单片机的C语言程序设计与应用北京;电子工业出版社[4]张齐朱西宁,单片机应用系统设计技术北京电子工业出版社[5]余发山王福忠,单片机原理及应用技术徐州中国矿业大学出版社附录一源程序//上位机程序/*名称:DS18b20多级测温上位机程序内容:接收下位机温度数据数码管显示能够显示负温度超过设定温度报警*/#include<reg52.h>//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include"delay.h"#defineDataPortP0//定义数据端口程序中遇到DataPort则用P0替换/* 按键位定义*/sbitKEY_ADD=P1^3;//定义按键输入端口sbitKEY_DEC=P1^2;sbitKEY_MAX=P1^1;sbitKEY_MIN=P1^0;unsignedcharcodeDuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码值0~9unsignedcharcodeWeiMa[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//分别对应相应的数码管点亮,即位码unsignedcharNegTemp;//负温度标志unsignedcharTempflag;//温度显示标志unsignedintTempH,TempL;//温度数据unsignedintTempMax=60,TempMin=10;//温度上下限unsignedcharTempData[4];//存储显示值的全局变量unsignedcharRecieveData[3];//存储串口数据的全局变量staticunsignedintp;//下位机数据的位变量voidcsh(void);//串口初始化程序voidInit_Timer0(void);//定时器初始化程序unsignedintLimit_Adjust(unsignedintTemp);//键盘温度上下限调整程序voidDisplay(unsignedcharNegTemp,unsignedintTempH,TempL);//数码管显示程序/*串口通讯初始化*/voidcsh() { SCON=0x50; //SCON:模式1,8-bitUART,使能接收 PCON=0; TH1=0xF3; TL1=0XF3; TMOD=0X20; //TMOD:timer1,mode2,8-bit重装 EA=1; ET1=0; ES=1; TR1=1; }/*主函数*/voidmain(void){ Init_Timer0();//定时器初始化 csh();//串口通讯初始化 while(1)//主循环{/* 串口接收数据*/ ES=0; TI=0; SBUF=p; while(!TI); TI=0; ES=1; DelayUs2x(100); p++; if(p>3) p=0;NegTemp=RecieveData[0];TempH=RecieveData[1];TempL=RecieveData[2];/* 扫描键盘,调整温度上下限长按按KEY_ADD键或KEY_DEC键可连续调整*/ while(!KEY_MAX)//检测到最大值调整键按下 { Display(0,TempMax,0);//显示温度上限 TempMax=Limit_Adjust(TempMax); //调整温度上限 } while(!KEY_MIN) //检测到最小值调整键按下 { Display(0,TempMin,0);//显示温度下限 TempMin=Limit_Adjust(TempMin); //调整温度下限 } Display(NegTemp,TempH,TempL);//调用数码管显示 } //主循环结束}/* 串口中断*/voidintrr()interrupt4 { RecieveData[p]=SBUF; RI=0; }/*定时器初始化子程序*/voidInit_Timer0(void){TMOD|=0x01; //使用模式1,16位定时器,使用"|"符号能够在使用多个定时器时不受影响 //TH0=0x00; //给定初值//TL0=0x00;EA=1;//总中断打开ET0=1;//定时器中断打开TR0=1;//定时器开关打开}/*定时器中断子程序*/voidTimer0_isr(void)interrupt1{TH0=(65536-)/256; //重新赋值2msTL0=(65536-)%256;}/* 数码管显示程序*/voidDisplay(unsignedcharNegTemp,unsignedintTempH,TempL){unsignedinti,j;/*温度显示标志处理,超温报警*/ if(TempH>TempMax)Tempflag=0x76; //显示"H" elseif(TempH<TempMin) Tempflag=0x38; //显示"L" else Tempflag=0x39;//显示C符号/*温度数据处理*/ NegTemp=0;//本实例对负温度暂不作处理,如果进行测温范围扩展至负温度,应屏蔽本句 if(!NegTemp==0) //负温度(18B20所测负温度整数位只有两位){ TempData[0]=NegTemp;if((TempH%100)/10==0)//消隐 TempData[1]=0; else TempData[1]=DuanMa[(TempH%100)/10];//十位温度 TempData[2]=DuanMa[(TempH%100)%10]|0x80;//个位温度,带小数点 TempData[3]=DuanMa[TempL]; }elseif(TempH/100==0) //正温度整数位只有两位( { TempData[0]=DuanMa[(TempH%100)/10];//十位温度 TempData[1]=DuanMa[(TempH%100)%10]|0x80;//个位温度,带小数点 TempData[2]=DuanMa[TempL]; TempData[3]=Tempflag; } else//温度整数位为三位 { TempData[0]=DuanMa[TempH/100];//百位温度TempData[1]=DuanMa[(TempH%100)/10];//十位温度TempData[2]=DuanMa[(TempH%100)%10]|0x80;//个位温度,带小数点TempData[3]=DuanMa[TempL]; }/*温度数据显示*/ for(j=0;j<100;j++) { for(i=0;i<4;i++) { //DataPort=0;//清空数据,防止有交替重影P2=WeiMa[i];//取位码DataPort=TempData[i];//取显示数据,段码 DelayUs2x(200);//扫描间隙延时,时间太长会闪烁,太短会造成重影 } } }/*键盘温度上下限调整程序,含参数unsignedintTemp,返回值为本参数调整后的值长按按KEY_ADD键或KEY_DEC键可连续调整Temp数值*/unsignedintLimit_Adjust(unsignedintTemp)//键盘温度上下限调整程序{unsignedcharkey_press_num=0;if(!KEY_ADD)//如果检测到低电平,说明按键按下{ DelayMs(10);//延时去抖,一般10-20msif(!KEY_ADD)//再次确认按键是否按下,没有按下则退出 { while(!KEY_ADD) { key_press_num++;DelayMs(10);//10x200=ms=2s if(key_press_num==200)//大约2s { key_press_num=0;//如果达到长按键标准//则进入长按键动作while(!KEY_ADD)//这里用于识别是否按键还在按下 //如果按下执行相关动作,否则退出 { if((Temp<99)&&(TempMin<TempMax))//加操作 Temp++; Display(0,Temp,0);DelayMs(50);//用于调节长按循环操作的速度,能够自行调整此值以便达到最佳效果 } } }key_press_num=0;//防止累加造成错误识别 if((Temp<99)&&(TempMin<TempMax))//加操作 Temp++; Display(0,Temp,0); } }if(!KEY_DEC)//如果检测到低电平,说明按键按下{ DelayMs(10);//延时去抖,一般10-20msif(!KEY_DEC)//再次确认按键是否按下,没有//按下则退出 { while(!KEY_DEC) { key_press_num++;DelayMs(10); if(key_press_num==200)//大约2s { key_press_num=0;while(!KEY_DEC) { if((Temp>0)&&(TempMax>TempMin))//减操作 Temp--; Display(0,Temp,0);DelayMs(50);//用于调节长按循环操作的速度 } } }key_press_num=0;//防止累加造成错误识别 if((Temp>0)&&(TempMax>TempMin))//减操作 Temp--; Display(0,Temp,0); } }returnTemp;}//延时#include"delay.h"/*uS延时函数,含有输入参数unsignedchart,无返回值unsignedchar是定义无符号字符变量,其值的范围是0~255这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5uS*/voidDelayUs2x(unsignedchart){while(--t);}/*mS延时函数,含有输入参数unsignedchart,无返回值unsignedchar是定义无符号字符变量,其值的范围是0~255这里使用晶振12M,精确延时请使用汇编*/voidDelayMs(unsignedchart){while(t--){//大致延时1mSDelayUs2x(245); DelayUs2x(245);}}//显示#include"display.h"/*数码管显示函数,含有输入参数unsignedcharNegTemp,unsignedintTempH,TempL无符号字符变量NegTemp为负温度标志,无符号整型变量TempH、TempL分别为温度数据整数位和小数位用于完成温度显示标志处理,温度数据处理和温度数据显示*/voidDisplay(unsignedcharNegTemp,unsignedintTempH,TempL)//数码管显示程序{unsignedinti,j;/*温度显示标志处理*/ if(TempH>TEMPMAX)//如果超温则提示Tempflag=0x76; //显示"H" elseif(TemL<TEMPMIN) Tempflag=0x38; //显示"L" else Tempflag=0x39;//显示C符号/*温度数据处理*/ if(!NegTemp==0) //负温度(负温度整数位只有两位){ TempData[0]=NegTemp;if((TempH%100)/10==0)//消隐 TempData[1]=0; else TempData[1]=DuanMa[(TempH%100)/10];//十位温度 TempData[2]=DuanMa[(TempH%100)%10]|0x80;//个位温度,带小数点 TempData[3]=DuanMa[TempL]; }elseif(TempH/100==0) //正温度整数位只有两位( { TempData[0]=DuanMa[(TempH%100)/10];//十位温度 TempData[1]=DuanMa[(TempH%100)%10]|0x80;//个位温度,带小数点 TempData[2]=DuanMa[TempL]; TempData[3]=Tempflag; } else//温度整数位为三位 { TempData[0]=DuanMa[TempH/100];//百位温度TempData[1]=DuanMa[(TempH%100)/10];//十位温度TempData[2]=DuanMa[(TempH%100)%10]|0x80;//个位温度,带小数点TempData[3]=DuanMa[TempL]; }/*温度数据显示*/ for(j=0,j<100,j++) { for(i=0,i<4,i++) { DataPort=0;//清空数据,防止有交替重影P2=WeiMa[i];//取位码DataPort=TempData[i];//取显示数据,段码 DelayUs2x(200);//扫描间隙延时,时间太长会闪烁,太短会造成重影 } } }//按键控制#include"key.h"/*键盘温度上下限调整程序,含参数unsignedintTemp,返回值为本参数调整后的值长按按KEY_ADD键或KEY_DEC键可连续调整Temp数值*/unsignedintLimit_Adjust(unsignedintTemp)//键盘温度上下限调整程序{unsignedcharkey_press_num=0;if(!KEY_ADD)//如果检测到低电平,说明按键按下{ DelayMs(10);//延时去抖,一般10-20msif(!KEY_ADD)//再次确认按键是否按下,没有按下则退出 { while(!KEY_ADD) { key_press_num++;DelayMs(10);//10x200=ms=2s if(key_press_num==200)//大约2s { key_press_num=0;//如果达到长按键标准//则进入长按键动作while(!KEY_ADD)//这里用于识别是否按键还在按下 //如果按下执行相关动作,否则退出 { if((Temp<99)&&(Temp<=TempMax))//加操作 Temp++; Display(0,Temp,0);DelayMs(50);//用于调节长按循环操作的速度,能够自行调整此值以便达到最佳效果 } } }key_press_num=0;//防止累加造成错误识别 if((Temp<99)&&(Temp<=TempMax))//加操作 Temp++; Display(0,Temp,0); } }if(!KEY_DEC)//如果检测到低电平,说明按键按下{ DelayMs(10);//延时去抖,一般10-20msif(!KEY_DEC)//再次确认按键是否按下,没有//按下则退出 { while(!KEY_DEC) { key_press_num++;DelayMs(10); if(key_press_num==200)//大约2s { key_press_num=0;while(!KEY_DEC) { if((Temp>0)&&(Temp>=TempMin))//减操作 Temp--; Display(0,Temp,0);DelayMs(50);//用于调节长按循环操作的速度 } } }key_press_num=0;//防止累加造成错误识别 if((Temp>0)&&(Temp>=TempMin))//减操作 Temp--; Display(0,Temp,0); } }returnTemp;}//下位机/*名称:DS18b20多级测温下位机程序内容:读取DS18B20温度负温度转换温度数据发送至上位机*/#include<reg52.h>//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include"18b20.h"#include"delay.h"bitReadTempFlag;//定义读时间标志unsignedcharNegTemp;//负温度标志unsignedintTempH,TempL,temp;//温度数据unsignedcharSendData[3];//存储串口数据的全局变量voidInit_Timer0(void);//定时器初始化/*串口通讯初始化voidUART_Init(void){SCON=0x50; //SCON:模式1,8-bitUART,使能接收TMOD|=0x20;//TMOD:timer1,mode2,8-bit重装TH1=0xFD;//TH1:重装值9600波特率晶振11.0592MHzTR1=1;//TR1:timer1打开 EA=1;//打开总中断ES=1;//打开串口中断 TI=1;}*//*串口通讯初始化*///初始化串行口voidcsh() { SCON=0x50; //SCON:模式1,8-bitUART,使能接收 PCON=0; TH1=0xF3; TL1=0XF3; TMOD=0X20; //TMOD:timer1,mode2,8-bit重装 EA=1; ET1=0; ES=1; TR1=1; }/*主函数*/voidmain(void){//unsignedinti;Init_Timer0();//定时器初始化//UART_Init();//串口通讯初始化csh();//串口通讯初始化while(1)//主循环{/*温度数据处理*/ if(ReadTempFlag==1) { ReadTempFlag=0; temp=ReadTemperature(); if(temp&0x8000) { NegTemp=0x40;//负号标志 temp=~temp;//取反加1 temp+=1; } else NegTemp=0; TempH=temp>>4; TempL=temp&0x0F; TempL=TempL*6/10;//小数近似处理 }SendData[0]=NegTemp;SendData[1]=TempH;SendData[2]=TempL; }}voidintrr()interrupt4 { charp; p=SBUF; RI=0; p++; if(p>3) p=0; ES=0; TI=0; SBUF=SendData[p]; while(!TI); TI=0; ES=1; }/*定时器初始化子程序*/voidInit_Timer0(void){TMOD|=0x01; //使用模式1,16位定时器,使用"|"符号能够在使用多个定时器时不受影响 //TH0=0x00; //给定初值//TL0=0x00;EA=1;

温馨提示

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

评论

0/150

提交评论