




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
机械与电子工程学院基于单片机温控系统课程设计报告目 录摘 要I1系统方案设计及组成I2系统设计12.1温度传感器的工作原理与单片机的连接12.2 DS1302原理及管脚22.3单片机与报警电路32.4显示电路32.41基本操作时序43系统软件设计4摘 要本课题主要介绍基于AT89C51单片机和DS18B20数字温度传感器的温度测量系统。该系统利用AT89C51单片机分别采集各个温度点的温度,实现温度显示、报警等功能以及用DS1302时钟芯片在液晶显示当前时间日期。直观,实用。它以AT89C51单片机为主控制芯片,采用数字温度传感器DS18B20实现温度的检测,测量精度可以达到0.5。该系统采用了1602显示模块,形象直观的显示测出的温度值。基于AT89C51单片机的单总线温度测控系统具有硬件组成简单、读数方便、精度高、测温范围广等特点,在实际工程中得到广泛应用。关键词:温度传感器;单片机;温度控制;DS1302; LCD 1系统方案设计及组成该方案使用了AT89C51单片机作为控制核心,以智能温度传感器DS18B20为温度测量元件,对各点温度进行检测,设置温度上下限,超过其温度值就报警。以及用DS1302时钟芯片在液晶显示当前时间日期。显示电路采用1602液晶模块显示,使用三极管,电阻和蜂鸣器组成的报警电路,按钮处理模块等。具有温度控制,实时时钟,报警等功能。89C52CPU控制模块按键处理模块温度采集模块报警电路LCD显示模块DS1302时钟采集模块图2-1温度控制系统方案框2系统设计2.1温度传感器的工作原理与单片机的连接温度传感器的单总线(1-Wire)与单片机的P27连接,P27是单片机的高位地址线。P2端口是一个带内部上拉电阻的8位双向IO,其输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对该端口写“1”,可通过内部上拉电阻将其端口拉至高电平,此时可作为输入口使用,这是因为内部存在上拉电阻,某一引脚被外部信号拉低时会输出一个电流。如1所示:DS18B20与单片机的接口电路非常简单。DS18B20只有三个引脚,一个接地,一个接电源,一个数字输入输出引脚接单片机I/O口,电源与数字输入输出脚间需要接一个4.7K的电阻。图1温度传感器与单片机的连接图DS18B20的工作原理DS18B20的工作过程a初始化:DS18B20所有的数据交换都由一个初始化序列开始。由主机发出的复位脉冲和跟在其后的由DS18B20发出的应答脉冲构成。当DS18B20发出响应主机的应答脉冲时,即向主机表明它已处在总线上并且准备工作。b. ROM命令:ROM命令通过每个器件64-bit的ROM码,使主机指定某一特定器件(如果有多个器件挂在总线上)与之进行通信。DS18B20的ROM如表3-6所示,每个ROM命令都是8 bit长。c. 功能命令:主机通过功能命令对DS18B20进行读/写Scratchpad存储器,或者启动温度转换。 DS18B20的信号方式DS18B20采用严格的单总线通信协议,以保证数据的完整性。该协议定义了几种信号类型:复位脉冲、应答脉冲、写0、写1、读0和读1。除了应答脉冲所有这些信号都由主机发出同步信号。总线上传输的所有数据和命令都是以字节的低位在前。a.初始化序列:复位脉冲和应答脉冲b.读和写时序在写时序期间,主机向DS18B20写入指令;而在读时序期间,主机读入来自DS18B20的指令。在每一个时序,总线只能传输一位数据。读/写时序如图3-4所示。写时序存在两种写时序:“写1”和“写0”。主机在写1时序向DS18B20写入逻辑1,而在写0时序向DS18B20写入逻辑0。所有写时序至少需要60s,且在两次写时序之间至少需要1s的恢复时间。两种写时序均以主机拉低总线开始。读时序DS18B20只能在主机发出读时序时才能向主机传送数据。所以主机在发出读数据命令后,必须马上产生读时序,以便DS18B20能够传送数据。所有读时序至少60s,且在两次独立的读时序之间至少需要1s的恢复时间。2.2 DS1302原理及管脚1、DS1302引脚排列:如下图 2、DS1302的控制字节 DS1302 的控制字如下图所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。3、数据输入输出(I/O) 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。 2.3单片机与报警电路系统中的报警电路是由三极管,蜂鸣器,发光二极管和限流电阻组成,并与单片机的P2.3端口连接。当温度超过预设的最高温度或最低温度时,蜂鸣器发出响声。报警电路2.4显示电路采用技术成熟,价格便宜的1602液晶显示器做为输出显示。本次设计使用的1602液晶显示器为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 按键处理模块按键处理可以调整当前准确时间,日期,可以调整所需要监控温度的上下限,达到温度的上下限是,蜂鸣器报警,如图所示就是按键的分布图还有在硬件上安装了两个继电器,当温度报警时,触发继电器控制外围电路3系统软件设计本次软件是采用模块化编程,就是把程序中的函数,定义等代码进行分类,实际上是两个文件.C与.h,它们的文件名通常是相同的,.h文件用于声明与定义;.C文件用于函数的实现。采用模块化编程的好处是:1、 整个工程脉络清晰,代码规划合理。2、 程序模块化,有利于代码的积累,重复使用,快速建立工程3、 可以将程序模块编译未LIB库文件,有利于源代码的保密。3.1主程序及流程图_MAIN_H_#ifndef _MAIN_H_#define _MAIN_H_#include reg52.h#include INTRINS.H#include STRING.H#include Delay.h#include Lcd.h#include DS1302.h#include DS18B20.h#include Key.h#include DispMeau.h#define uchar unsigned char#define uint unsigned intextern char DispFlag;extern uint LTemper;extern uint HTemper;extern uchar Temper10;extern uchar Time10;extern uchar Date10;#endif_MAIN_C_#include Main.hchar DispFlag;/允许显示标志 0:不允许 ,1:允许uchar Temper10=;/保存温度数据uchar Time10= : : ;/保存时分秒数据uchar Date10= / / ;/保存年月日数据uint LTemper=2000;uint HTemper=5000;/uchar TimeStatus=0;sbit bell=P23;sbit led1=P24;sbit led2=P25;sbit led3=P26;void WarnDisp(uint tpTmp)if(tpTmp=HTemper)led1=0;led2=0;led3=1;bell=0;elseled1=0;led2=1;led3=0;bell=1;void main()uint Tmp=0;Init1302();/初始化 DS1302 Int_lcd();/初始化 lcd ET0=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(DispFlag=0)/if(TimeStatus=0)/不在时间调整状态DealTime(Time , Date);/获取需要显示的时间数据DealKey();/按键处理Tmp=readtmp(); /取温度 WarnDisp(Tmp);/警报指示DealTemper(Tmp, Temper); /将温度值转化成显示数据DispFlag=1; /允许显示void t(void) interrupt 1 using 0 TH0=(65536-15530)/256; TL0=(65536-15530)%256; if(DispFlag=1)ScrDisp(0x80,Date); /显示 日期(位置,数据) ScrDisp(0xc0,Time);/显示 时间ScrDisp(0x89,Temper);/显示 温度DispFlag=0;3.2 各子程序及流程图一、DS1302_DS1302_H_#ifndef _DS1302_H_#define _DS1302_H_#include Main.hvoid v_WTInputByte(unsigned char ucDa);unsigned char uc_RTOutputByte(void);void v_W1302(unsigned char ucAddr, unsigned char ucDa);unsigned char uc_R1302(unsigned char ucAddr);void Init1302(void);void DealTime(unsigned char *tpTime , unsigned char *tpDate);void SaveDate(unsigned char *tpDate);void SaveTime(unsigned char *tpTime);#endif_DS1302_C_#include Main.hsbit T_RST = P20; /*实时时钟复位线引脚 */sbit T_IO = P21; /*实时时钟数据线引脚 */sbit T_CLK = P22; /*实时时钟时钟线引脚 */sbit ACC0=ACC0;sbit ACC7=ACC7;/* * 名称: v_RTInputByte* 说明: * 功能: 往DS1302写入1Byte数据* 调用:* 输入: ucDa 写入的数据 * 返回值: 无*/void v_WTInputByte(uchar ucDa) uchar i;ACC= ucDa;for(i=8; i0; i-)T_IO = ACC0; /*相当于汇编中的 RRC T_CLK = 1; T_CLK = 0;ACC =ACC 1; /* * 名称: uchar uc_RTOutputByte* 说明: * 功能: 从DS1302读取1Byte数据* 调用: * 输入: * 返回值: ACC*/uchar uc_RTOutputByte(void) uchar i;for(i=8; i0; i-)ACC = ACC1; /*相当于汇编中的 RRCACC7 = T_IO;T_CLK = 1; T_CLK = 0; return(ACC); /* * 名称: v_W1302* 说明: 先写地址,后写命令/数据* 功能: 往DS1302写入数据* 调用: v_RTInputByte() * 输入: ucAddr: DS1302地址, ucDa: 要写的数据* 返回值: 无*/void v_W1302(uchar ucAddr, uchar ucDa)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_RTInputByte() , uc_RTOutputByte()* 输入: ucAddr: DS1302地址* 返回值: ucDa :读取的数据*/uchar uc_R1302(uchar ucAddr)uchar ucDa;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 * 调用: * 输入: * 返回值: 无 */void Init1302(void) v_W1302(0x8e,0x00); /控制写入WP=0 v_W1302(0x90,0xa5);/+48是为了转换为ACSII 码void DealTime(uchar *tpTime , uchar *tpDate)uchar d; /时间处理 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);/读取 时 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;/处理 日 void SaveDate(uchar *tpDate)uchar y,m,d;y = (tpDate0-48)4)&0xf0)+(tpDate1-48);m = (tpDate3-48)4)&0xf0)+(tpDate4-48);d = (tpDate6-48)4)&0xf0)+(tpDate7-48);v_W1302(0x8e,0x00); /控制写入WP=0 v_W1302(0x90,0xa5);v_W1302(0x86,d); /日v_W1302(0x88,m); /月 v_W1302(0x8c,y); /年 void SaveTime(uchar *tpTime)uchar h,m,s;h = (tpTime0-48)4)&0xf0)+(tpTime1-48);m = (tpTime3-48)4)&0xf0)+(tpTime4-48);s = (tpTime6-48)4)&0xf0)+(tpTime7-48);v_W1302(0x8e,0x00); /控制写入WP=0 v_W1302(0x90,0xa5);v_W1302(0x80,s); /秒v_W1302(0x82,m); /分v_W1302(0x84,h); /时/delay(100);二、DS18B20DS18B20读取温度过程_DS18B20_H_#define _DS18B20_H_void reset(void);unsigned char readbyte(void);void writebyte(unsigned char indata);unsigned int readtmp(void);void DealTemper(unsigned int tpTemper, unsigned char *tpStr);#endif_DS18B20_C#include Main.hsbit DQ=P37;/*复位*/void reset(void) uchar flag=0; DQ=1; delay_10us(1); DQ=0; delay_10us(70); /至少延时22us DQ=1; delay_10us(8); flag=DQ; delay_10us(15);/*读一字节*/uchar readbyte(void) uchar i,outdata=0; for(i=0;i=1; /必须在15us内读取 DQ=1; if(DQ) outdata|=0x80; delay_10us(4); return(outdata);/*写一字节*/void writebyte(uchar indata) uchar i; for(i=0;i=1; delay_10us(4);/*读温度*/uint readtmp(void) uint tmp; uchar tl,th,temp,temp1; reset(); writebyte(0xcc); / 跳过序列号 writebyte(0x44); / 启动温度转换 reset(); writebyte(0xCC); writebyte(0xBE); /读9个寄存器,前两个为温度 tl=readbyte(); /低位 th=readbyte(); /高位 temp=tl&0x0f; /取低四位 temp=temp*6.25; /小数部分 tl=4; th=4; temp1=tl|th; /整数部分 tmp=temp1*100+temp; /四位数,高两位为整数,低两位为小数 delay(200); return (tmp);/*功能: 温度数据处理输入:uint tpTempe: 温度值 高字节为温度整位,低字节为温度小数位uchar *tpStr: 把整形数据转化为显示数据输出:uchar *tpStr: 把整形数据转化为显示数据,并返回返回:无*/void DealTemper(uint tpTemper, uchar *tpStr)tpStr7 = 0x00;/数组结束符 0tpStr6 = C;tpStr5 = 0xdf;/度 符号tpStr4=tpTemper%10+48; /取个位 小数位第二位 tpTemper/=10; tpStr3=tpTemper%10+48; /取十位 小数位第一位 tpStr2=.; /小数点 tpTemper/=10; tpStr1=tpTemper%10+48; /取百位 个位 tpStr0=tpTemper/10+48; /取千位 十位 三、LCD1602_LCD_H_#ifndef _LCD_H_#define _LCD_H_void Int_lcd(void); /初始化unsigned char lcd_r_start(void);void lcd_w_cmd(unsigned char com);void lcd_w_dat(unsigned char dat);#endif_LCD_C_#include Main.hsbit RS=P34;sbit RW=P35;sbit E=P36;void Int_lcd(void)lcd_w_cmd(0x3c);/设置工作方式 lcd_w_cmd(0x0c);/设置光标 lcd_w_cmd(0x01);/设置清屏 lcd_w_cmd(0x06);/设置输入方式 lcd_w_cmd(0x00);/设置初始显示位置 unsigned char lcd_r_start(void)unsigned char s;RW=1;/RW=1,RS=0,读lcd状态 delay1();RS=0;delay1();E=1;/E端时序 从低到高再到低 delay1();s=P1;/从lcd的数据口读状态 E=0;delay1();RW=0;delay1();return(s);/返回读取的lcd状态字 void lcd_w_cmd(unsigned char com)unsigned char i;do/查lcd忙操作 i=lcd_r_start();/调用读状态字函数 i=i&0x80;/与操作屏蔽掉低7位 delay(2);while(i!=0);/lcd忙,继续查询,否则退出循环 RW=0;delay1();RS=0;/RW=1,RS=0,写lcd命令字 delay1();E=1;/E端时序 delay1();P1=com;/将com中的命令字写入lcd数据口 delay1();E=0;delay1();RW=1;delay(255);void lcd_w_dat(unsigned char dat)unsigned char i;do/查忙操作 i=lcd_r_start();/调用读状态字函数 i=i&0x80;/与操作屏蔽掉低7位 delay(2);while(i!=0);RW=0;delay1();RS=1;/RW=1,RS=0,写lcd命令字 delay1();E=1;/E端时序 delay1();P1=dat;/将dat中的命令字写入lcd数据口 delay1();E=0;delay1();RW=1;delay(255);四延时函数_DELAY_H#ifndef _DELAY_H_#define _DELAY_H_void delay_10us(unsigned int time);void delay(unsigned int t);void delay1(void);#endif_DELAY_C#include Main.h/*10us延时*名称: delay_10us功能: 延时10us 1-27us2-37us3-45us4-56us5-66us6-76us7-86us10-115us100-1ms*/void delay_10us(unsigned int time)while(time-);void delay(unsigned int t)unsigned int n;n=0;while(nt) n+;return;void delay1(void)_nop_();_nop_();_nop_();五按键控制_KEY_H_#ifndef _KEY_H_#define _KEY_H_unsigned char DealKey(void);#endif _KEY_C_#include Main.hsbit key1=P27;/调整时间 时 或 年sbit key2=P30;/调整时间 分 或 月sbit key3=P31;/保存时间 秒 或 日sbit key4=P32;/确定保存/或进入菜单选择模式sbit key5=P33;/取消uchar TimeStatus = 0;uchar GetKey(void)if (0=key1)if(TimeStatus = 0) return 0;delay(100);if (0=key1)while(1)if(1=key1)delay(50);if(1=key1) break;return 1;else if (0=key2)if(TimeStatus = 0) return 0;delay(100);if (0=key2)while(1)if(1=key2)delay(50);if(1=key2) break;return 2;else if (0=key3)if(TimeStatus = 0) return 0;delay(100);if (0=key3)while(1)if(1=key3)delay(50);if(1=key3) break;return 3;else if (0=key4)delay(100);if (0=key4)while(1)if(1=key4)delay(50);if(1=key4) break;return 4;else if (0=key5)delay(100);if (0=key5)while(1)if(1=key5)delay(50);if(1=key5) break;return 5;return 0;uchar SetDate(uchar *tpDate)uchar DispFlag=0;ClrScr();DispSetDate(0x80);ScrDisp(0xc0,tpDate);while(1)switch(GetKey()case 0:break;case 1:/调整年if(tpDate0=9)if(tpDate19)tpDate1+;elsetpDate0 = 0;tpDate1 = 0;elseif(tpDate19)tpDate1+;elsetpDate0+;tpDate1 = 0;DispFlag = 1;break;case 2:/调整月 if (tpDate39)tpDate3+;tpDate4=0;else if (tpDate3=1)if(tpDate4=1)tpDate4+;elsetpDate3=0;tpDate4=0;else tpDate3=0;tpDate4=0;DispFlag = 1;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中级财务会计1(山东联盟)知到智慧树答案
- 中级微观经济学知到智慧树答案
- 中兽医学(山东联盟)知到智慧树答案
- 中外民俗知到智慧树答案
- 2025版庆典活动赞助商权益授权监管合同
- 2025年度食品添加剂全国代理销售合作协议
- 2025年度暑期实习生劳务合作协议
- 2025版挖掘机搅拌机租赁及施工质量保证合同
- 2025年度投资与国际贸易咨询及风险管理服务协议
- 2025年环保产业外资股权转让及合作开发协议
- 2025年中级会计职称考试经济法冲刺试题及答案
- 乐器供销合同范本
- 2025年辽宁省中考生物学试卷真题附答案
- 《法律职业伦理(第3版)》全套教学课件
- 2025年青岛市崂山旅游集团招聘考试笔试试题
- 2025年秋季新学期全体中层干部会议校长讲话:在挑战中谋突破于坚实处启新篇
- 2025年幼儿园保育员考试试题(附答案)
- 2025年执业医师考试全真试题及答案
- GA 1808-2022军工单位反恐怖防范要求
- 国学武术操太极拳表演活动流程
- DB14∕T 1131-2015 麦茬复播花生栽培技术规程
评论
0/150
提交评论