基于单片机的温度控制系统2015毕业论文

更新时间:2023-11-22 20:38:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

毕 业 论 文

基于单片机的温度控制系统

Temperature control system based on SCM

2015年 5月 May 2015

I

指导教师对毕业论文(设计)的评语

Advisor’s Comments on Graduation Thesis (Design)

评语:

指导教师(签章)

Signature of Advisor

日期

Date

II

评阅人意见

评阅人姓名: 职称: 选项标准: A很同意 B同意 C基本同意 D不同意 评价项目 A 选题符合专业培养目标,体现综 合训练基本要求 题目难易适度 题目工作量适当 有理论意义或实际价值 查阅文献资料能力强 综合运用知识能力强 研究方案的设计能力强 研究方法和手段的运用能力强 外文应用能力强 文题相符 写作水平高 写作规范 篇幅适度 成果有理论或实际价值 B C D 选 题 质 量 1 2 3 4 5 分 项 评 价 能 力 水 平 6 7 8 9 10 成 果 质 量 11 12 13 14 总体评价: 优 □ 良 □ 中 □ 及格 □ 不及格 □ 评阅人评语 评阅人签字: 年 月 日

III

答辩(评审)委员会意见

Appraisal of Defence Commission

答辩(评审)成绩

Mark of Defence

鉴定意见

Appraisal & Comments

主任(签章)

Signature of Dean 日期

Date

IV

山东工商学院2015届毕业论文

第二章 系统的方案设计与论证

2.1单片机芯片设计与论证

在热门的电气自动化行业, MCS-51系列单片机独树一帜。我们选择使用AT89C51这种芯片。此款单片机是一种具有可靠性高,便与扩展,控制功能强,低电压、低功耗的微型控制器。此外,它还是8位高档单片机,拥有功能强大的CPU处理能力。AT89C51芯片是MCS-51系列中的典型,具有优越的逻辑处理和控制能力。

2.2温度采集模块设计与论证

方案一:采用普遍款温度传感器。最常用的一种温度检测器就是热电阻,这样的温度传感器经A/D转换得到的数字信号精度高、性能稳定,但是价格较为昂贵,而且电路也较为复杂。热电阻缺点较多,耐冲击性较差且热影响速度低。尤其是在测量高温区时,不应使用。除此之外,还有热敏电阻等,也有其不足之处。

方案二:采用最新款单总线式的DS18B20。数据总线提供温度变换功率, 无需额外电源总线本身就可以为DS18B20供电。DS18B20 测温范围为-55℃~+125℃,但其精度较差为±2℃。利用DS18B20可以进行9~12位温度转换的能力编程实现温度控制,还可直接读出温度值。设计使用DS18B20,减少了信号干扰,是温度测量更精确。

经过上述分析比较,采用方案二。方案二比方案一测量更精确,花费更低,使用更方便。

2.3显示模块设计与论证

方案一:采用静态显示。其优点是不占用端口。但静态显示模块的执行用到多个移位寄存器,且硬件电路制作比较复杂。

方案二:采用动态显示。其缺点是占用单片机14个端口。

方案三:采用LCD1602液晶显示。优点是显示内容多;其缺点是不能完美显示图形。 经过以上三种方案比较,采用方案三。因为方案一硬件电路不仅复杂难设计而且功耗大;方案二硬件电路较方案一简单且功耗较小;方案三硬件电路设计不仅简单,而且显示内容多、体积小、微功耗、成本低。经多方面考虑,方案三较为合适。

2

山东工商学院2015届毕业论文

第三章 系统硬件设计

3.1单片机控制电路

主控单元选择AT89C51芯片,下面列出了其外形及各引脚排列。

AT89C51具有许多优良特性。如:8位CPU;一个全双工UART(异步串行通信口);单一+5V电压等。

下面将对上述芯片管脚详细描述: (1) GND:接地线。 (2) VCC:接正5V。

(3) P0口:可用作通用I/O口

(4) P1口:1~8脚为P1.0~P1.7输入/输出引脚。每个引脚可驱动4个TTL负载。 (5) P2口: P2口可作准双向口,当它输入低八位地址时,说明它在进行Flash编程和验证程序。

(6) P3口:常用第二功能。见表3.1

表3.1 P3口的第二功能 Table 3.1 Second function of P3 port P3口 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 (7) RST:复位信号。 第二功能 RXD TXD INT0 INT1 信号名称 串行数据接收口 串行数据发送口 外部中断0请求输入 外部中断1请求输入 定时器/计数器0的外部输入 定时器/计数器1的外部输入 外部RAM写选通信号 外部RAM读选通信号 T0 T1 WR RD (8) 时钟电路,如图3.1所示:

3

山东工商学院2015届毕业论文

图3.1时钟电路 Fig3.1 Clock circuit

(9)复位电路:如图3.2所示:

图3.2复位电路 Fig3.2 Reset circuit

3.2温度信号采集电路

本次设计用的是DS18B20。测温范围为-55℃~+125℃。 DSl8B20内部构成如图3.3所示:

4

山东工商学院2015届毕业论文

图3.3 内部结构框图 Fig3.3 Internal structure diagram

介绍SOIC封装形式、TO-9封装形式,具体形式3.4图所示:

图3.4 DS18B20管脚图 Fig3.4 DS18B20 pin map

DS18B20的引脚说明如下: GND :地 DQ :数据I/O VDD :可选电源电压 NC :无连接

5

山东工商学院2015届毕业论文

详细的引脚说明如表3.2

表3.2 DS18B20的引脚 Table 3.2 The pin of DS18B20 8引脚SOIC封装 5 4 TO-9封装 1 2 符号 GND DQ 说明 接地 数据接收和发送引脚。 3

3 VDD 选择性VDD引脚。 DS18B20内部存储器。注意当报警功能不使用时,TH和TL寄存器可以被当作普通寄存器使用。如图3.5所示:

图3.5 DS18B20内部存储器

Fig3.5 The internal memory of DS18B20

6

山东工商学院2015届毕业论文

部分温度转换如表3.3所示:

表3.3部分温度转换

Table 3.3 Temperature conversion 温度 +125℃ +85℃ +25.0625℃ +10.125℃ +0.5℃ 0℃ -0.5℃ -10.125℃ -25.0625℃ -55℃ 参数特性:

输入(B) 0000 0111 1101 0000 0000 0101 0101 0000 0000 0001 1001 0001 0000 0000 1010 0010 0000 0000 0000 1000 0000 0000 0000 0000 1111 1111 1111 1000 1111 1111 0101 1110 1111 1111 0101 1110 1110 1110 0110 1111 输出(H) 07D0H 0550H 0191H 00A2H 0008H 0000H FFF8H FF5EH EE6FH FE90H (1)独特的单线接口只需一个端口引脚 (2)简单的多点分布式测温应用 (3)不需要外部元件 (4)使用3.0V到5.5V电压 (5)温度测量精度为+5℃ (6)-55~+125℃温测 (7)9~12位温度转换精度

单片机控制DS18B20并与其相连的的接口电路如图3.6所示:

图3.6 单片机控制DS18B20电路 Fig3.6 DS18B20 microcontroller control circuit

7

4.7K 单 P1.0 片 机 VccDS18B20 DQ GND 山东工商学院2015届毕业论文

采集模块硬件设计图如图3.7所示:

图3.7温度采集单元

Fig3.7 Temperature acquisition unit

系统中只用了一DS18B20,没有过多的温度采集器,这一个DS18B20就构成了温度采集模块并对外界温度进行采集,将采集到的信号以数字信号的形式经P1.0口传给单片机。单片机内部系统再做出处理,执行后续工作。图上的开关按钮,是来控制温度信号的采集和传送。

3.3显示输出电路设计

显示输出电路没有使用通常所学的7段数码管显示,而是选择了与时俱进的占据绝对优势的液晶显示器显示。利用液晶的物理特性所研制成的液晶显示器可显示更多的数据和符号,使用液晶显示器可以读到更多的信息,人们可以根据需要显示想显示的信息,而且只要给液晶显示器通电,那么液晶显示器就会显示,方便又实用。在摄像机、手提电脑等科技领域较为普遍。

3.3.1 LCD1602的参数介绍和引脚描述

详述带背光和不带背光的LCD尺寸区别,如图3.8所示:

8

山东工商学院2015届毕业论文

图3.8 LCD1602尺寸图 Fig3.8 LCD1602 size map LCD1602主要技术参数: 显示容量:16×2个字符 芯片工作电压:4.5—5.5V 工作电流:在工作电压为+5V情况下是2mA 模块最佳工作电压:5.0V 引脚功能说明 无背光这款为14引脚,带背光这款为16引脚,引脚接口如表3.4: 表3.4 引脚接口说明表 Table3.4 Pin interface specification table 编号 符号 1 2 3 4 5 6 7 8

含义 电源地 电源正极 液晶显示偏压 数据/命令选择 读/写选择 使能信号 数据 数据 编号 9 10 11 12 13 14 15 16 符号 D2 D3 D4 D5 D6 D7 BLA BLK 含义 数据 数据 数据 数据 数据 数据 背光源正极 背光源负极 VSS VDD VL RS R/W E D0 D1 9

山东工商学院2015届毕业论文

第1脚:VSS为地电源。 第2脚:VDD接5V正电源。 第3脚:VL用作调整对比度端。 第4脚:RS用作选择寄存器端。 第5脚:R/W用作读写控制。 第6脚:E端用作信号选择端。 第7~14脚:双向口。 第15脚:背光源正极。 第16脚:背光源负极。

3.3.2 LCD1602的指令说明及时序介绍 1602液晶模块包含11条控制指令,由表3.5做详细介绍: 表3.5 控制命令表 Table3.5 Control command list 序号 1 2 3 4 5 6 7 8 9 10 指令 清显示 光标返回 置输入模式 显示开/关控制 光标或字符移位 置功能 存放字符 置数据存贮器地址 读忙标志或地址 存数 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 * 1 I/D S D C B * * 1 S/C R/L * F * 1 DL N 存放字符地址 显示数据存贮器地址 计数器地址 存放数据信息 读出的数据内容 1 BF 0 1 11 从CGRAM或DDRAM读数 1 指令编程完成所需操作。注意:高电平为1,低电平为0。 指令1:清显示并将光标复位到地址00H位置。 10 山东工商学院2015届毕业论文

指令2:复位光标并返回00H地址。 指令3:显示光标模式。I/D:光标控制。S:文字移动控制。有效为1,无效为0。 指令4:开关信号选择。 D:整体开关选择。C:光标控制B:光标闪烁选择。 指令5:选择S/C信号。 指令6:功能控制。DL:4位总线时为高, 8位总线时为低。 N:。单行显示为低,双行显示为高。 F:点阵字符显示为低,点阵字符显示为高。 指令7: RAM设置。 指令8:DDRAM地址设置。 指令9:忙信号读取。BF:忙标志位。 指令10:写数据。 指令11:读数据。 芯片时序如3.6表所示: 表3.6基本操作时序表 Table3.6 Basic operation timing table 读状态 写指令 读数据 写数据 输入 输入 输入 输入 RS=L,R/W=H,E=H RS=L,R/W=L, D0-D7=指令码,E=高脉冲 RS=H, R/W=H,E=H RS=H,R/W=L, D0-D7=数据,E=高脉冲 输出 输出 输出 输出 D0-D7=状态字 无 D0-D7=数据 无

11

山东工商学院2015届毕业论文

delay(3); for(i=0;i<3;i++)

{lcd_writedate(table2[i]); delay(3);}

if(flag_dis)lcd_writedate('-'); //结果为负数显示 lcd_writedate(table1[temp1/100]); // 百位为0不显示 delay(3);

lcd_writedate(table1[temp10/10]); delay(3);

lcd_writedate(table1[temp10]); delay(3);

lcd_writedate('.'); //小数点 delay(3);

lcd_writedate(table1[temp2]); lcd_writecom(0x88); lcd_writedate('0'); }

void error_ds(flag) { uchar i; if(flag==1)

{lcd_writecom(0x80); //等待的显示

37

山东工商学院2015届毕业论文

delay(3); for(i=0;i<16;i++)

{ lcd_writedate(table[i]); delay(3); } } }

/****************************************************** 函数名称:main(void); *

*******************************************************/ void main(void) {

init_1602(); //LCD 初始化 error_ds(flag);

while(init_DS18B20()); //18b20初始化

lcd_writecom(0x01); //清屏 while(1) {

tempchange_get(); //温度转换

38

山东工商学院2015届毕业论文

deal(temp1); //温度处理 display(temp1,temp2); // delay(5); //扫描周期 } }

39

山东工商学院2015届毕业论文

读写操作时序的描述如下:

图3.9读操作时序 Fig3.9 Read operation timing

图3.10 写操作时序 Fig3.10 Write timing

12

山东工商学院2015届毕业论文

3.3.3 LCD1602的RAM地址映射和标准字库表

通过输入显示字符的地址就可以显示字符,这是由于字符与地址相对应的原因。下面介绍LCD1602内部地址与所对应的字符,如图3.11所示:

图3.11 LCD1602内部显示地址 Fig3.11 The internal display address

3.4 蜂鸣器报警电路与温度处理装置

单片机使用一个P2^2引脚接报警电路装置,单片机在接收了温度传感器传来的温度信号后作出处理,此时的处理就是向报警系统发送高电平或低电平。若单片机向P2.2口传送的是高电平,说明此时测得的温度是在控制范围内;若单片机向P2.2口传送的是低电平,则说明此时测得的温度不在控制范围内,那么此刻蜂鸣器就要报警,红灯点亮。具体描述如图3.12所示:

图3.12 报警电路 Fig3.12 Alarm circuit

温度处理装置分为升温处理与降温处理,升温装置主要由继电器和加热炉组成,与单

13

山东工商学院2015届毕业论文

片机的P2.0口相连接。降温装置主要由继电器和电机组成,与单片机的P2.1口相连。

单片机与升温装置接口图如图3.13所示:

图3.13 单片机与升温装置接口图

Fig3.13 SCM and heating device interface diagram

单片机与降温装置接口图如图3.14所示:

图3.14 单片机与降温装置接口图

Fig3.14 SCM and cooling device interface diagram

14

山东工商学院2015届毕业论文

第四章 温度控制系统的软件设计

4.1软件总流程设计

主程序作为主线,所有设计好的子程序模块合并,完成的要设计的功能,在液晶显示器上显示出来当前的温度。函数主流程图如图4.1所示:

Y

图4.1主函数流程图

Fig4.1 The flow chart of main function

显示温度 温度控制响应 启动温度转换 1602初始化 开始 N 18b20初始化是否成功 4.2温度采集子程序设计

温度采集子程序主要实现温度的采集和反馈给单片机并在显示器上显示温度数据。该系统采用DS18B20温度传感器检测温度,在进行读数据之前需要对DS18B20温度传感器初始化和写指令。下面着重介绍温度传感器DS18B20的各种子程序。DS18B20的初始化如图

15

山东工商学院2015届毕业论文

4.2所示:

图4.2 初始化时序图

Fig4.2 Initialization timing diagram

总线若为高电平需在480-960us之后。在480微秒的检测时间里,如果温度传感器读到的是低电平,此时总控制有响应。如果没有低电平而总是出现高电平,则总线设备没有响应。

DS18B20一开始工作就检测总线有否480—960微秒的低脉冲。如果检测到低脉冲,总线由低电平变为高电平经15 – 60微秒后拉低总线。之后,用60到240微秒的做出响应,回应主设备。否则,一直等待检测。具体写操作如图4.3所示:

图4.3. 写操作过程 Fig4.3 The writing process

16

山东工商学院2015届毕业论文

DS18B20的读操作如图4.4所示:

图4.4 读操作过程 Fig4.4 Reading process

数据的读操作时序包括读0时序和读1时序。在主机上读时隙将单总线拉低后经1微秒拉高单总线,DS18B20是单一总线传输数据。如果总线被拉低直到读周期结束此时传送0,如果总线被拉高直到读周期结束此时传送1。在采样周期内,低电平为0,高电平为1。整个读时序消耗要60us。

17

山东工商学院2015届毕业论文

4.3数据处理子程序设计

数据处理是将DS18B20采集到的温度值,DS18B20转换成为一个十进制数,成为真实值经过变换显示在LCD上。以下介绍中temp作存储温度值使用。处理温度值流程图如图4.5所示:

读取低、高位单字节温 度 将高、低位温度值合并成一个整型值 Temp>0x0fff 根据说明书temp=temp*0.625得到温度真实值 开始 temp对100取余再除以10得到温度各位数值 负数标志置1 将temp中的值取反加以得到其负数绝对值放入 temp对10取余得到温度个位值 负数标志置0

图4.5数据处理子程序流程图

Fig4.5 Data processing subroutine flow chart

结束 temp除以100得到温度百位数值 低位单字节温度值对of取余,再乘以10再除以16得到温度值小数

18

山东工商学院2015届毕业论文

4.4显示子程序设计

本系统是采用LCD液晶显示,液晶显示LCD写入指令需要进行初始化、写指令、写数据。本系统LCD只写不读,因此没有额外的读操作时序图,R/W引脚直接接地就行。图4.6详细描述了LCD的以上各准备:

图4.6 LCD三种准备流程图 Fig4.6 LCD three to prepare flow chart

19

山东工商学院2015届毕业论文

4.5温度处理及蜂鸣器报警子程序设计

蜂鸣器报警系统是否工作由单片机经P2.2口的高低电平状态控制。当P2.2引脚为低电平时,蜂鸣器报警并且红灯点亮;否则蜂鸣器不报警,红灯熄灭状态。系统在设计编程时内部就已经设好了温测范围。该系统设置的是上限温度值是40℃,下限温度值是10℃,当温度高于30℃时继电器驱动电机风扇,执行降温措施,当温度低于20℃时继电器驱动大功率的加热炉,进行升温措施。因此,当P2.0为低电平时,系统做升温处理;当P2.1为低电平时,系统做降温处理。温度处理和报警系统子程序如图4.7所示:

送入温度值T T>60||T<1 YNY蜂鸣器开启 T<10 N启动升温 T>30 Y启动降温 N返回

图 4.7 温度处理和报警系统子程序

Fig4.7 The temperature alarm system and processing subroutine

20

山东工商学院2015届毕业论文

第五章 温度控制系统的总体电路设计及主要功能

5.1 系统的总设计

每一个系统设计都要有一个核心元件作为主力来保证整个系统的有效运行,而AT89C51单片机就是这个系统的主力军。DS18B20温度传感器检测温度,液晶显示器显示温度。本系统还用到两个继电器,这两个继电器主要功能分别是来管控加热炉是否加热和电机是否降温,温度太高或太低,蜂鸣器报警,温度太低进行热处理温,电机冷却处理温度过高。系统总体框架如图5.1所示:

温度传感器 升温处理及降温处理 AT89C51单片机 液晶显示 蜂鸣器报警 图5.1系统总体控制框图

Fig5.1 The overall system control diagram

5.2 功能实现

本设计的各个模块运行都要统一听从单片机调遣。除此之外,还有液晶显示、温度处理、温度采集以及液晶显示四个模块。此系统以单片机为核心,主要是通过对4个并行I/O端口的读写操作完成其他模块的控制ROM程序存储器的实现。温度信号采集模块的运作是由温度信号采集器来采集外界的环境温度,并将采集到的温度值数据送达单片机。AT89C51单片机对温度传感器所传送到的温度值做出处理后,将数据发送到LCD,然后由LCD显示处理后的温度值。继电器控制温度处理模块,它和电机分别连接对温度进行加热或冷却处理。液晶温度显示模块显示温度的当前值。当测得的温度值高于或低于编程时设置好的温度值时报警系统就会报警,此时蜂鸣器响且红灯点亮。

本系统所设置的正常温度范围为20℃~30℃,在此温度范围内,系统正常工作,报警系统、加热装置和降温装置都不工作。在10℃~20℃范围内,只有加热装置工作;在30℃~

21

山东工商学院2015届毕业论文

40℃范围内,只有降温装置工作。当低于10℃时,加热装置与报警系统都工作,当高于40℃时,降温装置和报警系统都工作。20℃~30℃正常温度范围内,仿真结果如图5.2所示:

图5.2 正常温控图

Fig5.2 Normal temperature chart

当温度采集模块所检测到的温度值低于20℃且高于10℃时,此时仿真结果如图5.3所示:

图5.3 升温图 Fig5.3 Heat map

当温度采集模块所检测到的温度值低于10℃时,此时仿真结果如图5.4所示:

22

山东工商学院2015届毕业论文

图5.4 升温并报警图 Fig5.4 Heating and alarm map

当温度采集模块所检测到的温度值在30℃~40℃范围内时,此时降温过程仿真结果如图5.5所示:

23

山东工商学院2015届毕业论文

24

山东工商学院2015届毕业论文

图5.5 降温过程 Fig5.5 The cooling process

当温度采集模块所检测到的温度值在在40℃以上时,此时仿真结果如图5.6所示:

图5.6 降温并报警图 Fig5.6 Cool and alarm map

25

山东工商学院2015届毕业论文

结 论

我此次的毕业设计力求接近实际生产生活需要,以更经济、更简单易行的电路设计来呈现在读者眼前。当选完要设计的题目,我果断放弃了使用面包板来做这个设计,而是利用单片机这个新时代的宠儿。用单片机作为指挥主力军,高效快捷,而且不论是硬件和软件做起来都很方便。

单片机接收DS18B20温度传感器采集的温度值然后执行一系列命令,最后将处理的结果放到液晶显示屏上显示。应用分布式温度测量系统的DSl8B20温度测量系统,可实现远程测量和控制温度。在电力行业,煤矿,森林,火灾及高层建筑等场所广泛应用。本设计软件编程舍弃了繁杂难懂的汇编语言,用当今广泛使用的C语言进行编程。C语言简单易懂,在做设计的过程中,我又深入学习了C语言,并根据不同功能模块的需要编写程序,然后将各模块程序组合在一起经过多次调试和修改成功写出了整体程序。

通过这次毕业设计,我了解如何查阅文献和使用开发工具,掌握了使用C语言对单片机编程和Proteus仿真软件的使用技能。经过这次毕业设计,我学会了用C语言对单片机进行编程,对于一些常见的电子元器件和产品有了一定的了解。同时,我也深深地体会到只有书和具体实践相结合,才学有所获。为了巩固自己的知识,认识自己的不足,我们要以积极的学习态度,不断学习创新,用知识和行动来证明自我价值。

26

山东工商学院2015届毕业论文

致谢语

一个月的脑力拼搏与汗水挥洒,我终于顺利完成了这次毕业设计。说实话,取得这样的成果,有一部分是我的辛勤努力,还有一部分就是我的指导老师给予我的无私帮助。在这里,我要特别感谢我的老师,我想没有她的指导与帮助我是很难完美的完成任务的。在这次毕业设计的完成中,作为我指导老师的裴老师,是一位非常和蔼可亲的老师,同时又是一位严以律己、严格要求、一丝不苟的老师,她在不断鼓舞要求我们做事要有速度与效率并存的同时又为我们创造优越的学术氛围与学习环境。每当我遇到困难时裴老师都对我耐心讲解,认真辅导,对我的论文也是反复审查并指导我修改。我被裴老师的这种工作作风深深打动,被裴老师的这种教学精神深深感染。面对困难我学会了迎面出击,不再退缩我深知只要肯努力肯思考就可以将困难各个击破,只要功夫深铁杵磨成针,没错,困难只是暂时的,成功才是永恒的。最后,我还要感谢一直以来不断给予我鼓励和支持的同学们,是你们让我看到成功的希望和胜利的彼岸。

金无足赤,人无完人。再美的白玉也会有瑕疵,因此我的这篇论文有些地方尚有缺点也是在所难免的,如有不当之处请多多谅解,望今后有读到我论文的朋友能给予我宝贵的意见和指导。

于学院信电学院 2015年05月

27

山东工商学院2015届毕业论文

参考文献

[1] 胡汉才.单片机原理及接口技术 [M].北京:清华大学出版社,1996. [2] 张鑫.单片机原理及应用[M].北京:电子工业出版社,2010.10.

[3] 沈红卫.单片机应用系统设计实例与分析 [M].北京:北京航空航天大学出版社,2003. [4] 张永枫.单片机应用实训教程[M].西安:西安电子科技大学出版社,2005. [5] 齐向东 刘立群.单片机控制技术实践 [M].北京:中国电力出版社,2009.

[6] 张萌 和湘 姜斌.单片机应用系统开发综合实力[M].北京:清华大学出版社,2007.7.

附录 : C语言程序

#include // 51 系类单片机头文件 #include #define uint unsigned int #define uchar unsigned char sbit sw=P2^0; //定义升温 sbit jw=P2^1; //定义降温 sbit beep = P2^2; //定义扬声器 sbit rs=P2^5; //lcd的控制 sbit rw=P2^6; sbit e=P2^7; sbit DQ=P1^0; bit flag=1;

uchar T=0,temp1=0,temp2=0,flag_dis=0; uchar table[]={\

uchar table1[]={'0','1','2','3','4','5','6','7','8','9'}; uchar table2[]={\

28

山东工商学院2015届毕业论文

/****************************************************** * 函数:1602 模块

*******************************************************/ void delay(uint z) //延时 { uchar x,y; for(x=20;x>1;x--) for(y=z;y>1;y--); }

void lcd_writecom(uchar com) //写地址函数 { rs=0; rw=0; P0=com; delay(10); e=1; delay(10); e=0; }

void lcd_writedate(uchar dat) //写数据函数 { rs=1;

29

山东工商学院2015届毕业论文

rw=0; P0=dat; delay(1); e=1; delay(1); e=0; }

void init_1602(void) //1602{ delay(10);

lcd_writecom(0x38); delay(5);

lcd_writecom(0x38); delay(5);

lcd_writecom(0x38); delay(5);

lcd_writecom(0x01); delay(5);

lcd_writecom(0x08); delay(5);

lcd_writecom(0x06); delay(5);

初始话 30

山东工商学院2015届毕业论文

lcd_writecom(0x0C); }

/****************************************************** * 函数:18B20 模块*

*******************************************************/

bit init_DS18B20(void) //18b20初始化程序 { bit flag; uchar time; DQ=1; _nop_();

DQ=0; //再将数据线从高拉低,要求保持480~960us for(time=0;time<200;time++) ; //略微延时约600微秒//以向DS18B20发出 //一持续480~960us的低电平复位脉冲

DQ=1; //释放数据线(将数据线拉高)

for(time=0;time<20;time++); //延时约60us(释放总线后需等待15~60us让DS18B20

//输出存在脉冲)

flag=DQ; //让单片机检测是否输出了存在脉冲(DQ=0表示存在)

for(time=0;time<200;time++); //延时足够长时间,等待存在脉冲输出完毕

31

山东工商学院2015届毕业论文

return (flag); //返回检测成功标志 }

void WriteOneChar ( uchar dat) //18B20 写 数据 { uchar i,time; for (i=0; i<8; i++) { DQ=1; _nop_();

DQ=0; //将数据线从高拉低时即启动写时序 for(time=0;time<1;time++);

DQ=dat&0x01; //利用与运算取出要写的某位二进制数据,并将其送到数据线上等待DS18B20采样

for(time=0;time<10;time++);//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样

DQ=1; //释放数据线

for(time=0;time<1;time++) ; //延时3us,两个写时序间至少需要1us的恢复期

dat>>=1; //将dat中的各二进制位数据右移1位 } }

uchar ReadOneChar(void) //18B20 读数据

32

山东工商学院2015届毕业论文

{ uchar time,i,date=0; //储存读出的一个字节数据 for (i=0;i<8;i++) { DQ=1; _nop_();

DQ = 0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序 for(time=0;time<1;time++); //等待一个机器周期

DQ = 1; //将数据线\人为\拉高,为单片机检测DS18B20的输出电平作准备 for(time=0;time<2;time++); //延时约6us,使主机在15us内采样 date>>=1; if(DQ==1)

date|=0x80; //如果读到的数据是1,则将1存入dat else

date|=0x00; //如果读到的数据是0,则将0存入dat

for(time=0;time<15;time++); //延时3us,两个读时序之间必须有大于1us的恢复期

}

return(date); //返回读出的十六进制数据 }

void tempchange_get(void) //启动18B20温度转换+ 读取数据

33

山东工商学院2015届毕业论文

{

uchar a,b[3],p,time,tempL,tempH; init_DS18B20(); //18B20 复位 WriteOneChar(0xcc); //跳过读ROM 指令 WriteOneChar(0x44); //写温度转换指令 delay(10);

init_DS18B20(); //准备读数据的初始化 for(time=0;time<2;time++);

WriteOneChar(0xcc); //跳过ROM WriteOneChar(0xbe); //读暂存器 tempL = ReadOneChar(); //读低8 位 tempH = ReadOneChar(); //读高8 位 a=tempH&0x80;

if(a) //为一则是负温度,补码修正,为零则是正温度,不处理

{ if(tempL==0){tempH--;tempL=255;} tempL-=1; tempL=~tempL; tempH=~tempH; flag_dis=1; }

34

山东工商学院2015届毕业论文

else flag_dis=0; //对取出的数据处理

temp1=tempL&0x0F; //取第一字节低四位 b[0]=temp1&0x08; b[1]=temp1&0x04; b[2]=temp1&0x02; b[3]=temp1&0x01;

b[0]>>=3; b[1]>>=2; b[2]>>=1;

p=b[0]*5000+b[1]*2500+b[2]*1250+b[3]*625; temp2=p/1000; //第一个小数位

tempL&=0xF0; //取第一字节高四位 tempL>>=4;

temp1=tempH&0x0F; //取第二字节低四位 temp1<<=4;

temp1=temp1&0x7F; //只取7位 temp1=temp1|tempL; //合并为整数位 数据

35

小数位化整数 // 山东工商学院2015届毕业论文

}

/****************************************************** * 函数:对18B20 获取的温度进行处理*

*******************************************************/ void deal(uint t) {if(flag_dis==1)t=0;

if((t<10)||(t>40))beep=0; else beep=1; if(t<20)sw=0;else sw=1; if(t>30)jw=0;else jw=1; }

/****************************************************** 函数功能:显示模块*

*******************************************************/ void display(uchar temp1,uchar temp2 ) { uchar i;

lcd_writecom(0x80);

36

本文来源:https://www.bwwdw.com/article/pqgv.html

Top