单片机课程设计报告基于单片机的温控系统.docx

上传人:可****阿 文档编号:30876725 上传时间:2022-08-07 格式:DOCX 页数:8 大小:20KB
返回 下载 相关 举报
单片机课程设计报告基于单片机的温控系统.docx_第1页
第1页 / 共8页
单片机课程设计报告基于单片机的温控系统.docx_第2页
第2页 / 共8页
点击查看更多>>
资源描述

《单片机课程设计报告基于单片机的温控系统.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告基于单片机的温控系统.docx(8页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、单片机课程设计报告基于单片机的温控系统 职业学院机械与电子工程学院基于单片机温控系统课程设计报告班级电信班学生姓名学号指导教师时间2021目录摘要I1系统方案设计及组成I2系统设计12.1温度传感器的工作原理与单片机的连接12.2DS1302原理及管脚22.3单片机与报警电路32.4显示电路32.41基本操作时序43系统软件设计4摘要本课题主要介绍基于xxxx单片机和xxxx数字温度传感器的温度测量系统。该系统利用xxxx单片机分别采集各个温度点的温度,实现温度显示、报警等功能以及用DS1302时钟芯片在液晶显示当前时间日期。直观,实用。它以xxxx单片机为主控制芯片,采用数字温度传感器xxx

2、x实现温度的检测,测量精度可以达到0.5。该系统采用了1602显示模块,形象直观的显示测出的温度值。基于xxxx单片机的单总线温度测控系统具有硬件组成简单、读数方便、精度高、测温范围广等特点,在实际工程中得到广泛应用。 关键词:温度传感器; 单片机; 温度控制; DS1302;LCD1系统方案设计及组成该方案使用了xxxx单片机作为控制核心,以智能温度传感器xxxx为温度测量元件,对各点温度进行检测,设置温度上下限,超过其温度值就报警。以及用DS1302时钟芯片在液晶显示当前时间日期。显示电路采用1602液晶模块显示,使用三极管,电阻和蜂鸣器组成的报警电路,按钮处理模块等。具有温度控制,实时时

3、钟,报警等功能。 89C52CPU控制模块按键处理模块温度采集模块报警电路LCD显示模块DS1302时钟采集模块图2-1温度控制系统方案框2系统设计2.1温度传感器的工作原理与单片机的连接温度传感器的单总线(1-Wire)与单片机的P27连接,P27是单片机的高位地址线。P2端口是一个带内部上拉电阻的8位双向IO,其输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对该端口写“1”,可通过内部上拉电阻将其端口拉至高电平,此时可作为输入口使用,这是因为内部存在上拉电阻,某一引脚被外部信号拉低时会输出一个电流。 如1所示:xxxx与单片机的接口电路非常简单。xxxx只有三个引脚,一个接地,一

4、个接电源,一个数字输入输出引脚接单片机I/O口,电源与数字输入输出脚间需要接一个4.7K的电阻。 图1温度传感器与单片机的连接图xxxx的工作原理xxxx的工作过程a初始化: xxxx所有的数据交换都由一个初始化序列开始。由主机发出的复位脉冲和跟在其后的由xxxx发出的应答脉冲构成。当xxxx发出响应主机的应答脉冲时,即向主机表明它已处在总线上并且准备工作。 b.ROM命令: ROM命令通过每个器件64-bit的ROM码,使主机指定某一特定器件(如果有多个器件挂在总线上)与之进行通信。xxxx的ROM如表3-6所示,每个ROM命令都是8bit长。 c.功能命令: 主机通过功能命令对xxxx进行

5、读/写Scratchpad存储器,或者启动温度转换。 xxxx的信号方式xxxx采用严格的单总线通信协议,以保证数据的完整性。该协议定义了几种信号类型:复位脉冲、应答脉冲、写0、写1、读0和读1。除了应答脉冲所有这些信号都由主机发出同步信号。总线上传输的所有数据和命令都是以字节的低位在前。 a.初始化序列:复位脉冲和应答脉冲b.读和写时序在写时序期间,主机向xxxx写入指令; 而在读时序期间,主机读入来自xxxx的指令。在每一个时序,总线只能传输一位数据。读/写时序如图3-4所示。 写时序存在两种写时序:“写1”和“写0”。主机在写1时序向xxxx写入逻辑1,而在写0时序向xxxx写入逻辑0。

6、所有写时序至少需要60s,且在两次写时序之间至少需要1s的恢复时间。两种写时序均以主机拉低总线开始。 读时序xxxx只能在主机发出读时序时才能向主机传送数据。所以主机在发出读数据命令后,必须马上产生读时序,以便xxxx能够传送数据。所有读时序至少60s,且在两次独立的读时序之间至少需要1s的恢复时间。 2.2DS1302原理及管脚1、DS1302引脚排列:如下图2、DS1302的控制字节DS1302的控制字如下图所示。 控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址

7、;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。3、数据输入输出(I/O)在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。 2.3单片机与报警电路系统中的报警电路是由三极管,蜂鸣器,发光二极管和限流电阻组成,并与单片机的P2.3端口连接。当温度超过预设的最高温度或最低温度时,蜂鸣器发出响声。 报警电路2.4显示电路采用技术成熟,价格便宜的1602液晶显示器做为输出显示。本次设计使用的16

8、02液晶显示器为5V电压驱动,带背光,可显示两行,每行16个字符,不能显示汉字,内置128个字符的ASCII字符集字库,只有并行接口,无串行接口。 2.41基本操作时序读状态输入:RS=L,R/W=H,E=H输出:D0D7=状态字。 读数据输入:RS=H,R/W=H,E=H输出:无。 写指令输入:RS=L,R/W=L,D0D7=指令码,E=高脉冲输出:D0D7=数据。 写数据输入:RS=H,R/W=L,D0D7=数据,E=高脉冲输出:无2.5按键处理模块按键处理可以调整当前准确时间,日期,可以调整所需要监控温度的上下限,达到温度的上下限是,蜂鸣器报警,如图所示就是按键的分布图还有在硬件上安装了

9、两个继电器,当温度报警时,触发继电器控制外围电路3系统软件设计本次软件是采用模块化编程,就是把程序中的函数,定义等代码进行分类,实际上是两个文件.C与.h,它们的文件名通常是相同的,.h文件用于声明与定义; .C文件用于函数的实现。采用模块化编程的好处是: 1、整个工程脉络清晰,代码规划合理。 2、程序模块化,有利于代码的积累,重复使用,快速建立工程3、可以将程序模块编译未LIB库文件,有利于源代码的保密。 3.1主程序及流程图_MAIN_H_#ifndef_MAIN_H_#define_MAIN_H_#include“reg52.h“#include“xxxx.H“#include“STRI

10、NG.H“#include“Delay.h“#include“Lcd.h“#include“DS1302.h“#include“xxxx.h“#include“Key.h“#include“DispMeau.h“#defineucharunsignedchar#defineuintunsignedintexterncharDispFlag;externuintLTemper;externuintHTemper;externucharTemper10;externucharTime10;externucharDate10;#endif_MAIN_C_#include“Main.h“charDis

11、pFlag;/允许显示标志0:不允许,1:允许ucharTemper10=“;/保存温度数据ucharTime10=“:“;/保存时分秒数据ucharDate10=“/“;/保存年月日数据uintLTemper=2021;uintHTemper=5000;/ucharTimeStatus=0;sbitbell=P23;sbitled1=P24;sbitled2=P25;sbitled3=P26;voidWarnDisp(uinttpTmp)if(tpTmp=HTemper)led1=0;led2=0;led3=1;bell=0;elseled1=0;led2=1;led3=0;bell=1;v

12、oidmain()uintTmp=0;Init1302();/初始化DS1302Int_lcd();/初始化lcdET0=1;/时间中断0允许中断EA=1;/中断允许TMOD=0x01;/使用时间0记数TH0=(65536-15536)/256;/TL0=(65536-15536)%256;/TR0=1;/允许记数0记数DispFlag=0;/不允许显示led1=0;led2=0;led3=0;bell=1;Tmp=readtmp();/取温度delay(40000);Tmp=readtmp();/取温度delay(40000);/TimeStatus=0;while(1)if(DispFla

13、g=0)/if(TimeStatus=0)/不在时间调整状态DealTime(Time,Date);/获取需要显示的时间数据DealKey();/按键处理Tmp=readtmp();/取温度WarnDisp(Tmp);/警报指示DealTemper(Tmp,Temper);/将温度值转化成显示数据DispFlag=1;/允许显示voidt(void)interrupt1using0TH0=(65536-15530)/256;TL0=(65536-15530)%256;if(DispFlag=1)ScrDisp(0x80,Date);/显示日期(位置,数据)ScrDisp(0xc0,Time);

14、/显示时间ScrDisp(0x89,Temper);/显示温度DispFlag=0;3.2各子程序及流程图一、DS1302_DS1302_H_#ifndef_DS1302_H_#define_DS1302_H_#include“Main.h“voidv_WTInputByte(unsignedcharucDa);unsignedcharuc_RTOutputByte(void);voidv_W1302(unsignedcharucAddr,unsignedcharucDa);unsignedcharuc_R1302(unsignedcharucAddr);voidInit1302(void);

15、voidDealTime(unsignedchar*tpTime,unsignedchar*tpDate);voidSaveDate(unsignedchar*tpDate);voidSaveTime(unsignedchar*tpTime);#endif_DS1302_C_#include“Main.h“sbitT_RST=P20;/*实时时钟复位线引脚*/sbitT_IO=P21;/*实时时钟数据线引脚*/sbitT_CLK=P22;/*实时时钟时钟线引脚*/sbitACC0=ACC0;sbitACC7=ACC7;/*名称:v_RTInputByte*说明:*功能:往DS1302写入1By

16、te数据*调用:*输入:ucDa写入的数据*返回值:无*/voidv_WTInputByte(ucharucDa)uchari;ACC=ucDa;for(i=8;i0;i-)T_IO=ACC0;/*相当于汇编中的RRCT_CLK=1;T_CLK=0;ACC=ACC1;/*名称:ucharuc_RTOutputByte*说明:*功能:从DS1302读取1Byte数据*调用:*输入:*返回值:ACC*/ucharuc_RTOutputByte(void)uchari;for(i=8;i0;i-)ACC=ACC1;/*相当于汇编中的RRCACC7=T_IO;T_CLK=1;T_CLK=0;retur

17、n(ACC);/*名称:v_W1302*说明:先写地址,后写命令/数据*功能:往DS1302写入数据*调用:v_RTInputByte()*输入:ucAddr:DS1302地址,ucDa:要写的数据*返回值:无*/voidv_W1302(ucharucAddr,ucharucDa)T_RST=0;T_CLK=0;T_RST=1;v_WTInputByte(ucAddr);/*地址,命令*/v_WTInputByte(ucDa);/*写1Byte数据*/T_CLK=1;T_RST=0;/*名称:uc_R1302*说明:先写地址,后读命令/数据*功能:读取DS1302某地址的数据*调用:v_RTI

18、nputByte(),uc_RTOutputByte()*输入:ucAddr:DS1302地址*返回值:ucDa:读取的数据*/ucharuc_R1302(ucharucAddr)ucharucDa;T_RST=0;T_CLK=0;T_RST=1;v_WTInputByte(ucAddr);/*地址,命令*/ucDa=uc_RTOutputByte();/*读1Byte数据*/T_CLK=1;T_RST=0;return(ucDa);/*名称:Init1302*说明:*功能:初始化DS1302*调用:*输入:*返回值:无*/voidInit1302(void)v_W1302(0x8e,0x00

19、);/控制写入WP=0v_W1302(0x90,0xa5);/+48是为了转换为ACSII码voidDealTime(uchar*tpTime,uchar*tpDate)uchard;/时间处理tpTime8=0x00;/数组结束符0tpDate8=0x00;/数组结束符0d=uc_R1302(0x81);/读取时间秒tpTime6=(d4&0x0f)+48;/处理十秒tpTime7=(d&0x0f)+48;/处理秒d=uc_R1302(0x83);/读取时间秒tpTime3=(d4&0x0f)+48;/处理十分tpTime4=(d&0x0f)+48;/处理分d=uc_R1302(0x85);

20、/读取时tpTime0=(d4&0x0f)+48;/处理十时tpTime1=(d&0x0f)+48;/处理时d=uc_R1302(0x8D);/读取年tpDate0=(d4&0x0f)+48;/处理十年tpDate1=(d&0x0f)+48;/处理年d=uc_R1302(0x89);/读取月tpDate3=(d4&0x0f)+48;/处理十月tpDate4=(d&0x0f)+48;/处理月d=uc_R1302(0x87);/读取日tpDate6=(d4&0x0f)+48;/处理十日tpDate7=(d&0x0f)+48;/处理日voidSaveDate(uchar*tpDate)uchary,

21、m,d;y=(tpDate0-48)=1;/必须在15us内读取DQ=1;if(DQ)outdata|=0x80;delay_10us(4);return(outdata);/*写一字节*/voidwritebyte(ucharindata)uchari;for(i=0;i=1;delay_10us(4);/*读温度*/uintreadtmp(void)uinttmp;uchartl,th,temp,temp1;reset();writebyte(0xcc);/跳过序列号writebyte(0x44);/启动温度转换reset();writebyte(0xCC);writebyte(0xBE)

22、;/读9个寄存器,前两个为温度tl=readbyte();/低位th=readbyte();/高位temp=tl&0x0f;/取低四位temp=temp*6.25;/小数部分tl=4;th=3)if(tpDate7=2)if(tpTime13)tpTime1+;elsetpTime0=0;tpTime1=0;elseif(tpTime19)tpTime1+;elsetpTime0+;tpTime1=0;DispFlag=1;break;case2:/调整时间分位if(tpTime49)tpTime4+;elseif(tpTime35)tpTime3+;tpTime4=0;elsetpTime3

23、=0;tpTime4=0;DispFlag=1;break;case3:if(tpTime79)tpTime7+;elseif(tpTime65)tpTime6+;tpTime7=0;elsetpTime6=0;tpTime7=0;DispFlag=1;break;case4:SaveTime(tpTime);return4;/保存时间break;case5:return5;/取消break;default:break;if(DispFlag=1)DispFlag=0;ScrDisp(0xc0,tpTime);ucharSetTMP(ucharLHmode,uint*tpTEMP)ucharD

24、ispFlag=0;uchartpTMP10;uinttpTemper=0;ClrScr();switch(LHmode)case1:DispSetLTMP(0x80);break;case2:default:DispSetHTMP(0x80);break;DealTemper(tpTemper,tpTMP);ScrDisp(0xc0,tpTMP);while(1)switch(GetKey()case0:break;case1:/调整温度整数位if(tpTemper10000)tpTemper+=100;elsetpTemper=tpTemper%100;DispFlag=1;break;c

25、ase2:/调整温度小数位if(tpTemper%1000)MenuDeep-;DispMeau(MenuDeep);break;case2:/向下移动光标if(TimeStatus=0)break;if(MenuDeep3)MenuDeep+;DispMeau(MenuDeep);break;case3:break;case4:/确定if(TimeStatus=1)switch(MenuDeep)case0:SetDate(Date);break;case1:SetTime(Time);break;case2:SetTMP(1,<emper);break;case3:SetTMP(2,&

26、HTemper);break;TimeStatus=0;elseDispMeau(MenuDeep);TimeStatus=1;break;case5:/取消TimeStatus=0;break;default:break;if(TimeStatus=0)return0;return0;六菜单显示功能:把菜单显示出来,人性化,易操作_xxxxU_H_#ifndef_xxxxU_H_#define_xxxxU_H_voidScrDisp(unsignedchartpAddr,unsignedchar*tpStr);voidDispSetDate(unsignedchartpAddr);voidD

27、ispSetTime(unsignedchartpAddr);voidDispSetLTMP(unsignedchartpAddr);voidDispSetHTMP(unsignedchartpAddr);voidDispCursor(unsignedchartpAddr);voidDispMeau(unsignedchartpDeep);voidClrScr(void);#endif_xxxxU_C_#include“Main.h“/*功能:把tpStr数组数据在tpAddr位置开始显示输入参数:uchartpAddr:显示起始位置uchar*tpStr:显示内容输出:无返回:空*/void

28、ScrDisp(uchartpAddr,uchar*tpStr)uchari,len;len=strlen(char*)tpStr);/获取显示内容字节数lcd_w_cmd(tpAddr);/设置显示位置for(i=0;ilen;i+)/显示字符串lcd_w_dat(tpStri);voidClrScr(void)/清除屏幕ScrDisp(0x80,“);ScrDisp(0xc0,“);voidDispSetDate(uchartpAddr)ScrDisp(tpAddr,“SetDate“);voidDispSetTime(uchartpAddr)ScrDisp(tpAddr,“SetTime

29、“);voidDispSetLTMP(uchartpAddr)ScrDisp(tpAddr,“SetLowTMP“);voidDispSetHTMP(uchartpAddr)ScrDisp(tpAddr,“SetHighTMP“);voidDispCursor(uchartpAddr)/显示尖头指示符号lcd_w_cmd(tpAddr);/设置显示位置lcd_w_dat(0x7f);voidDispMeau(uchartpDeep)/DispCursor(0x8d);switch(tpDeep/2)case0:DispSetDate(0x80);DispSetTime(0xc0);if(tpDeep%2=0)DispCursor(0x8d);elseDispCursor(0xcd);break;case1:DispSetLTMP(0x80);DispSetHTMP(0xc0);if(tpDeep%2=0)DispCursor(0x8d);elseDispCursor(0xcd);break;default:break; 8

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com