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

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

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

1、单片机课程设计报告基于单片机温控系统职业学院 机械与电子工程学院 基于单片机温控系统课程设计报告 班 级 电信班 学生姓名 学 号 指导老师 时 间 2011 书目 摘 要 I 1系统方案设计及组成 I 2系统设计 1 2.1温度传感器的工作原理与单片机的连接 1 2.2 DS1302原理及管脚 2 2.3单片机与报警电路 3 2.4显示电路 3 2.41基本操作时序 4 3系统软件设计 4 摘 要 本课题主要介绍基于AT89C51单片机和DS18B20数字温度传感器的温度测量系统。该系统利用AT89C51单片机分别采集各个温度点的温度,实现温度显示、报警等功能以及用DS1302时钟芯片在液晶

2、显示当前时间日期。直观,好用。它以AT89C51单片机为主限制芯片,采纳数字温度传感器DS18B20实现温度的检测,测量精度可以达到0.5。该系统采纳了1602显示模块,形象直观的显示测出的温度值。基于AT89C51单片机的单总线温度测控系统具有硬件组成简洁、读数便利、精度高、测温范围广等特点,在实际工程中得到广泛应用。关键词:温度传感器;单片机;温度限制;DS1302; LCD 1系统方案设计及组成 该方案运用了AT89C51单片机作为限制核心,以智能温度传感器DS18B20为温度测量元件,对各点温度进行检测,设置温度上下限,超过其温度值就报警。以及用DS1302时钟芯片在液晶显示当前时间日

3、期。显示电路采纳1602液晶模块显示,运用三极管,电阻和蜂鸣器组成的报警电路,按钮处理模块等。具有温度限制,实时时钟,报警等功能。 89C52CPU 限制模块 按键处理模块 温度采集模块 报警电路 LCD显示模块 DS1302时钟 采集模块 图2-1温度限制系统方案框 2系统设计 2.1温度传感器的工作原理与单片机的连接 温度传感器的单总线(1-Wire)与单片机的P27连接,P27是单片机的高位地址线。P2端口是一个带内部上拉电阻的8位双向IO,其输出缓冲级可驱动(汲取或输出电流)4个TTL逻辑门电路。对该端口写“1”,可通过内部上拉电阻将其端口拉至高电平,此时可作为输入口运用,这是因为内部

4、存在上拉电阻,某一引脚被外部信号拉低时会输出一个电流。 如1所示:DS18B20与单片机的接口电路特别简洁。DS18B20只有三个引脚,一个接地,一个接电源,一个数字输入输出引脚接单片机I/O口,电源与数字输入输出脚间须要接一个4.7K的电阻。 图1温度传感器与单片机的连接图 DS18B20的工作原理 DS18B20的工作过程 a初始化: DS18B20全部的数据交换都由一个初始化序列起先。由主机发出的复位脉冲和跟在其后的由DS18B20发出的应答脉冲构成。当DS18B20发出响应主机的应答脉冲时,即向主机表明它已处在总线上并且打算工作。 b. ROM吩咐: ROM吩咐通过每个器件64-bit

5、的ROM码,使主机指定某一特定器件(假如有多个器件挂在总线上)与之进行通信。DS18B20的ROM如表3-6所示,每个ROM吩咐都是8 bit长。c. 功能吩咐: 主机通过功能吩咐对DS18B20进行读/写Scratchpad存储器,或者启动温度转换。DS18B20的信号方式 DS18B20采纳严格的单总线通信协议,以保证数据的完整性。该协议定义了几种信号类型:复位脉冲、应答脉冲、写0、写1、读0和读1。除了应答脉冲全部这些信号都由主机发出同步信号。总线上传输的全部数据和吩咐都是以字节的低位在前。a.初始化序列:复位脉冲和应答脉冲 b.读和写时序 在写时序期间,主机向DS18B20写入指令;而

6、在读时序期间,主机读入来自DS18B20的指令。在每一个时序,总线只能传输一位数据。读/写时序如图3-4所示。写时序 存在两种写时序:“写1”和“写0”。主机在写1时序向DS18B20写入逻辑1,而在写0时序向DS18B20写入逻辑0。全部写时序至少须要60s,且在两次写时序之间至少须要1s的复原时间。两种写时序均以主机拉低总线起先。读时序 DS18B20只能在主机发出读时序时才能向主机传送数据。所以主机在发出读数据吩咐后,必需立刻产生读时序,以便DS18B20能够传送数据。全部读时序至少60s,且在两次独立的读时序之间至少须要1s的复原时间。2.2 DS1302原理及管脚 1、DS1302引

7、脚排列:如下图 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

8、单片机与报警电路 系统中的报警电路是由三极管,蜂鸣器,发光二极管和限流电阻组成,并与单片机的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,

9、D0D7=指令码,E=高脉冲 输出:D0D7=数据。写数据 输入:RS=H, R/W=L, ,D0D7=数据,E=高脉冲 输出:无 2.5 按键处理模块 按键处理可以调整当前精确时间,日期,可以调整所须要监控温度的上下限,达到温度的上下限是,蜂鸣器报警,如图所示就是按键的分布图 还有在硬件上安装了两个继电器,当温度报警时,触发继电器限制外围电路 3系统软件设计 本次软件是采纳模块化编程,就是把程序中的函数,定义等代码进行分类,事实上是两个文件.C与.h,它们的文件名通常是相同的,.h文件用于声明与定义;.C文件用于函数的实现。采纳模块化编程的好处是: 1、 整个工程脉络清楚,代码规划合理。2、

10、 程序模块化,有利于代码的积累,重复运用,快速建立工程 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 ucha

11、r unsigned char #define uint unsigned int extern char DispFlag; extern uint LTemper; extern uint HTemper; extern uchar Temper10; extern uchar Time10; extern uchar Date10; #endif _MAIN_C_ #include “Main.h“ char DispFlag; /允许显示标记 0:不允许 ,1:允许 uchar Temper10=“; /保存温度数据 uchar Time10=“ : : “; /保存时分秒数据 uch

12、ar 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<=LTemper) led1=1; led2=0; led3=0; bell=0; else if(tpTmp>=HTemper) led1=0; led2=0; led3=1; bell=0; else led1=0; l

13、ed2=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);

14、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-155

15、30)/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.h“ void v_WTInputByte(unsigned char ucDa); unsigned char uc_RTOut

16、putByte(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_ #inclu

17、de “Main.h“ sbit 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; i>0; i

18、-) 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; i>0; i-) ACC = ACC>>1; /*相当于汇编中的 RRC ACC7 = T_IO; T_CLK = 1; T_CLK = 0; return(ACC);

19、/* * * 名称: 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_R

20、1302 * 说明: 先写地址,后读吩咐/数据 * 功能: 读取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 =

21、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; /数组结束符 0 tpDate8 = 0x00; /数组结束符 0 d=uc_R1302(0x81); /读取

22、时间 秒 tpTime6=(d>>40x0f)+48; /处理十秒 tpTime7=(d0x0f)+48; /处理 秒 d=uc_R1302(0x83); /读取时间 秒 tpTime3=(d>>40x0f)+48; /处理非常 tpTime4=(d0x0f)+48; /处理 分 d=uc_R1302(0x85); /读取 时 tpTime0=(d>>40x0f)+48; /处理十时 tpTime1=(d0x0f)+48; /处理 时 d=uc_R1302(0x8D); /读取 年 tpDate0=(d>>40x0f)+48; /处理十年 tpD

23、ate1=(d0x0f)+48; /处理 年 d=uc_R1302(0x89); /读取 月 tpDate3=(d>>40x0f)+48; /处理十月 tpDate4=(d0x0f)+48; /处理 月 d=uc_R1302(0x87); /读取 日 tpDate6=(d>>40x0f)+48; /处理十日 tpDate7=(d0x0f)+48; /处理 日 void SaveDate(uchar *tpDate) uchar y,m,d; y = (tpDate0-48)<<4)0xf0)+(tpDate1-48); m = (tpDate3-48)<

24、;<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)0xf

25、0)+(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); 二、DS18B20 DS18B20读取温度过程 _DS18B20_H_ #define _DS18B20_H_ void reset(void); unsigned char readbyte(void); void write

26、byte(unsigned char indata); unsigned int readtmp(void); void DealTemper(unsigned int tpTemper, unsigned char *tpStr); #endif _DS18B20_C #include “Main.h“ sbit 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(1

27、5); /*读一字节*/ uchar readbyte(void) uchar i,outdata=0; for(i=0;i<8;i+) DQ=1; delay_10us(1); DQ=0; outdata>>=1; /必需在15us内读取 DQ=1; if(DQ) outdata|=0x80; delay_10us(4); return(outdata); /*写一字节*/ void writebyte(uchar indata) uchar i; for(i=0;i<8;i+) DQ=1; delay_10us(1); DQ=0; DQ=indata0x01; /必

28、需在15us内写入 delay_10us(5); DQ=1; indata>>=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=tl0x0f; /取低四位

29、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 *tp

30、Str) tpStr7 = 0x00; /数组结束符 0 tpStr6 = 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(

31、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.h“ sbit 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); /设置输入方式

32、 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

33、_start(); /调用读状态字函数 i=i0x80; /“与“操作屏蔽掉低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()

34、; /调用读状态字函数 i=i0x80; /“与“操作屏蔽掉低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(uns

35、igned int t); void delay1(void); #endif _DELAY_C #include “Main.h“ /*10us延时* 名称: delay_10us 功能: 延时10us 1-27us 2-37us 3-45us 4-56us 5-66us 6-76us 7-86us 10-115us 100-1ms */ void delay_10us(unsigned int time) while(time-); void delay(unsigned int t) unsigned int n; n=0; while(n<t) n+; return; void

36、delay1(void) _nop_(); _nop_(); _nop_(); 五按键限制 _KEY_H_ #ifndef _KEY_H_ #define _KEY_H_ unsigned char DealKey(void); #endif _KEY_C_ #include “Main.h“ sbit key1=P27; /调整时间 时 或 年 sbit key2=P30; /调整时间 分 或 月 sbit key3=P31; /保存时间 秒 或 日 sbit key4=P32; /确定保存/或进入菜单选择模式 sbit key5=P33; /取消 uchar TimeStatus = 0;

37、 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(TimeSta

38、tus = 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(tpDate1<9)

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

当前位置:首页 > 应用文书 > 工作计划

本站为文档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