当前位置:   article > 正文

基于单片机的智能空调设计_空调从硬件和软件的流程

空调从硬件和软件的流程

目 录

摘 要 I
Abstract II
引 言 1
1 系统整体设计 3
1.1 系统方案设计 3
1.2 系统工作原理 3
2 硬件设计 5
2.1 电源模块设计 5
2.1.1 电源模块选择 5
2.1.2 电源模块电路设计 5
2.2 单片机模块设计 5
2.2.1 单片机型号选择 5
2.2.2 单片机模块电路设计 6
2.3 按键模块设计 7
2.3.1 按键模块选择 7
2.3.2 按键模块电路设计 7
2.4 显示模块设计 7
2.4.1 显示模块选择 7
2.4.2 显示模块电路设计 7
2.5 温度传感器模块设计 8
2.5.1 温度传感器选择 8
2.5.2 温度传感器模块电路设计 8
2.6 红外传感器模块设计 9
2.7 继电器模块设计 9
3 软件设计 11
3.1 系统主程序设计 11
3.2 LCD液晶显示子程序设计 11
3.3 温度控制子程序流程 12
4 系统调试 13
4.1 软件调试 13
4.2 实物调试 13
结 论 15
参考文献 16
附录1 原理图 18
附录2 源程序代码 19
致 谢 31

摘 要

为了研究智能空调更简便的智能控制与管理操作,实现空调节能环保效果,对空调温度控制、感知人数等各个方面技术进行完善,利用数字[1]和模拟电路控制技术[2]以及微处理器控制技术实现了硬件和软件的集成。以STC89C52单片机为核心,温度传感器、红外传感器、继电器加以辅助进行设计,使设计运行稳定。温度控制系统的设计是为了处理社会上存在的某些浪费现象,从而节省能源。空调设置为手动和自动两种模式,其中自动模式是利用红外传感器检测人体信号,实时显示室内人数,根据室内人数控制空调的开关;手动模式是设置温度的上、下限值,根据当前室内温度,空调自动制冷或者制热,风扇转动或者加热片发热。结果表明,微机控制技术的应用,使硬件与软件相结合,大大提高了室内空调的使用功能,大大简化了温度控制及其日常运行;不仅不同区域的用户完全满足了房间内环境温度调节的不同要求,而且空调能够完全智能自动调节室内的环境温度,使得室内空调系统具有环保节能、操作更简单、无任何机械控制装置、安全防护性能更强等五大特点,采用单片机控制技术降低了系统成本,方便了实际的控制操作,提高了室内空调所用能源的综合利用率。

关键词:智能空调;单片机控制;传感器;继电器

Abstract

In order to study the more convenient intelligent control and management of intelligent air conditioning, and realize the energy saving and environmental protection effect of air conditioning, the air conditioning temperature control, the number of people perceived and other aspects of the technology to improve, the use of digital and analog circuit control technology and microprocessor control technology to achieve the integration of hardware and software. STC89C52 microcontroller as the core, temperature sensor, infrared sensor, relay to assist the design, so that the design operation stability. The temperature control system is designed to save energy by dealing with some waste in society. The air conditioning is set in two modes: manual and automatic. The automatic mode USES infrared sensors to detect the human body signal, displays the number of people in the room in real time, and controls the switch of the air conditioning according to the number of people in the room. The manual mode is to set the upper and lower limits of temperature. According to the current indoor temperature, the air conditioner will be cooled or heated automatically, and the fan will rotate or the heater will generate heat. The results show that the application of microcomputer control technology can combine the hardware and software, greatly improve the function of indoor air conditioning, and greatly simplify the temperature control and its daily operation. Different parts of the user not only fully meet the different requirements of the room temperature adjustment, and air conditioning can fully intelligent automatic adjust indoor temperature, make indoor air conditioning system has the environmental protection and energy saving, simple operation, without any mechanical control device, safety performance is stronger and so on five big characteristics, controlled by single chip microcomputer technology to reduce the system cost, convenient operation, the actual control can improve the indoor air conditioning comprehensive utilization of the energy used.

Keywords: Intelligent air conditioning; Single chip control; sensor; relay

引 言

二十一世纪是人类科学信息技术迅速进步发展的黄金时代,电子技术和微控制器技术[3] 的广泛应用涉及规模空前广泛。随着信息科技和工业生产的不断进步发展,需要用来测量不同的物体温度,因此,温度一词在人们生产和生活之中已经出现并且其使用量和频率也在不断地增多。相应地,温度控制和测量也已经成为了人们生活中和生产中频繁地被使用的两个词语,与此同时,它们一直在所有部门发挥重要的指导作用。在日益发达的现代工业中,为了保证正常的工业生产,必须实时测量和自动控制空气温度的变化。在现代农业中,用于大棚蔬菜养殖大棚的长期恒温储水保产。温度控制不仅给我们提供了一个舒适的工作环境,在工业节能环保方面也已经取得了一些重大成果。
本设计以STC89C52单片机为核心,温度传感器测试温度、红外传感器感知人数、继电器加以辅助进行设计,使设计运行稳定。智能温度管理系统已被重新设计和安装,以处理目前在社区中发生的一些不良现象,即大量使用能源的浪费。利用红外温度传感器自动检测整个房间的人数,然后温度传感器自动确定空调温度下的整个房间的温度,最后通过继电器自动控制空调制冷、制热。微处理器控制技术降低了系统成本,简化了设计操作,提高了空调的整体能源效率。现代智能空调不仅利用数字和模拟电路技术,而且利用微处理器技术实现软硬件的结合。它改进了空调并简化了空调的操作,满足了用户对环境温度的不同要求,并完全适应了空调所处的环境。因此,空调的特点是节能、操作简单、安全。随着电子产品的快速发展,低价和温度控制系统越来越受到消费者的青睐。中国的空调行业继续快速发展。随着改革开放,国民经济迅速发展,空调产品从“奢侈生活”逐步过渡到日常生活。对国内空调行业的发展具有重要的激励作用。中国空调市场正在成熟,广大用户认准实用性好、性价比高的空调。空调行业正在稳步发展,支持政策实施的空调制造商和分销商增加了第三和第四阶段的扩张。国内空调市场逐步发展,新型空调得到了研究和开发。
空调行业不断发展,空调企业也在不断发展。在技术方面,从引进到不断创新。空调的绿色化、智能化、网络化和信息化等发展使空调市场发展前景十分乐观。
本设计以采用单片机为设计核心,设置手动和自动两种模式。其中自动模式主要是通过利用红外传感器[4]自动检测室内人体体温信号,实时自动显示室内人数,根据室内人数自动控制室内空调的开关;手动模式主要是通过设置温度的上、下限值,根据当前温度,空调自动制冷或者制热。当室内温度下降且低于系统设置的温度下限值时,继电器[5]自动控制空调制热,加热片发热;当室内温度高于系统设置的温度控制上限值时,继电器控制空调制冷,风扇转动降温。空调自动制冷或者制热的主要前提条件是室内有人,当室内没有人时,空调自动关闭,达到节能的主要效果。
设计思路为:
(1)系统的硬件设计,主要从元器件的选择和其电路原理图进行设计;
(2)设计绘制单片机主控模块电路原理图;
(3)设计各功能模块电路并绘制原理图;
(4)设计程序流程图,编写程序;
(5)进行调试,修改完善。
设计将重点解决的问题有:
(1)选择单片机作为主控模块控制器;
(2)选择符合系统需要的温度传感器用来检测温度;
(3)选择符合系统需要的红外传感器用来感知人数;
(4)继电器控制模块控制空调制冷、制热,根据设计绘制原理图;
(5)选择合适的LCD显示当前温度值、人数、温度上下限值。

1 系统整体设计

1.1 系统方案设计
本设计主要通过对温度测量来进行制冷或制热,从而降低或升高室内温度。所以主要通过两种方案对测温电路的选择来设计系统方案。
方案一:采用PT100进行温度测量。PT100传感器[6]用于测量随温度变化的铂电阻和某些功能的特性。它具有抗振特性,稳定性好,精度高,抗高压等特点。但更复杂的是,测量到的温度变化将取决于采集的电压或电流,单片机将通过A/D转换[7]后的电压或电流用于数据处理,然后显示测量的温度。需要使用A/D转换电路设计,这也意味着电阻的值和热电路的计算更加困难,空调机内部中高密度的集成电路以及电子器件更容易出现较大的误差从而影响空调性能。
方案二:采用DS18B20进行温度测量。DS18B20传感器简化了采用微处理器的数据处理和测量控制,避免了由于传统采用温度自动测量方法的许多外围集成电路。该系列芯片产品可广泛作为各种工业电磁温度计的测量重要元件,具有良好的双向线性温度形状。温度自动测量管理系统的整体结构相对简单,体积适中。由于软件采用单片机控制,可以对各种软件过程进行自动编程,实现各种复杂算法和各种逻辑控制,并且软件体积小、安装方便。
结合上述两种方案,采用方案二,通过DS18B20温度传感器测量实时温度可以符合我们的实际应用需求。
因此,选择方案二作为总体方案设计。
1.2 系统工作原理
本设计以STC89C52单片机为核心控制设计,应用了测温技术、红外感知技术、LCD显示设计技术、继电器控制设计技术和按键功能设计技术。单片机连接各类传感器和控制电路设备,进而实现各种功能运行。总体设计框图如图1.1所示。

在这里插入图片描述

图1.1 系统总体设计框图
DS18B20温度传感器实时检测室内温度,传送数字信号给STC89C52单片机,红外计数传感器自动检测室内人体活动信号,实时显示室内使用人数,根据室内人数自动控制空调开关。室内有人时,温度传感器实时检测室内温度达到低于系统设置的室内温度下限值时,继电器控制空调制热,加热片自动发热;温度传感器实时检测室内温度达到高于系统设置的室内温度上限值时,继电器控制空调制冷,风扇转动降温。当室内无人时,空调自动关闭,达到节能的主要效果。按键模块可以手动设置温度的上限值和下限值,过程中检测到的实时温度和人数都在LCD液晶显示器上显示出来。

2 硬件设计

2.1 电源模块设计
2.1.1 电源模块选择
方案一:采用5V蓄电池做电源。蓄电池产品具有稳定的工作电压、便宜的使用价格,可靠性高。由于其产品体积过大、使用寿命时间短、需要长时间保养维护,故必须舍弃。
方案二:采用3节南孚电池共4.5V做电源。不仅可以满足所有单片机、传感器的工作电压,而且使用干电池安装更换方便。
因此,选择方案二,采用3节南孚电池共4.5V做电源。
2.1.2 电源模块电路设计
电源输入模块使用4.5V电源进行供电,电路简单、稳定。电源模块由二极管、电阻、自锁开关和直流电源构成。二极管灯亮显示电源是否正常通电,电阻起到自动限流、二极管保护器的作用,自锁电源开关按下后,二极管亮,输出电源,系统正常运行;自锁开关再次按下后,二极管灭,停止电源输出。电源电路原理图如2.1所示。
在这里插入图片描述

图2.1 电源电路原理图
2.2 单片机模块设计
2.2.1 单片机型号选择
方案一:采用MSP430作为主控制器,MSP430[8]是一种16位的混合信号处理器[5],具有非常小的输出功率和低消耗的巨大优点,同时集成了许多控制电路,提供“单一”混合数字信号处理解决办法。MSP430F149是一个16位、超低功耗的混合型单片机,并且可靠性高,易于使用的优点。但价格太高,故舍弃。
方案二:采用STC89C52作为主控制器,STC89C52[9] 是8051单片机增强型,可以满足设计要求。
因此,选择方案二,采用STC89C52作为主控制器。
2.2.2 单片机模块电路设计
STC89C52单片机可以真正做到它的指令集和代码与传统的8051完全相互兼容。工作电压在3.2V-5.6V的最大适用范围,实际使用工作频率最高可直接达到48MHz,含有40个引脚、32个通用I/O口。单片机引脚图如图2.1所示。
在这里插入图片描述

图2.2 单片机引脚图
单片机最小系统原理图如图2.3所示。
在这里插入图片描述

图2.3 单片机最小系统原理图
时钟晶振电路:由于单片机在运行中处理任何复杂的事件都可能需要一定的时序,时钟晶振电路为单片机系统稳定的运行时序提供了保障。时钟晶振电路主要组成部分是由一个晶振以及两个晶振电容共同构成,其中晶振12MHz,电容30pF,电容起到了帮助晶振进行起振的作用。
复位电路:在单片机最小系统中,复位电路连接单片机的RST引脚。RST引脚作为系统复位端,当按下复位按键时,系统无论进行到哪里都需要停止当前运行状态,重新开始运行 。
2.3 按键模块设计
2.3.1 按键模块选择
方案—:采用矩阵式键盘[10],它由行和列组成,按钮位于行和列的交点处。电路复杂,编程难,故舍弃。
方案二:采用独立式按键电路,独立式按键采用机械弹性复位,具有体积小的优点,电路设计较为容易。
因此,选择方案二,独立式按键电路。
2.3.2 按键模块电路设计
按键可以通过按下按钮来激活开关并释放按键来释放开关,其原理是通过点击按钮上的金属弹簧来连接。三个按键分别是功能键,可以选择所需设置;加键,增加温度的数值;减键,降低温度的数值。按键电路原理图如图2.4所示。
在这里插入图片描述

图2.4 按键电路原理图
2.4 显示模块设计
2.4.1 显示模块选择
方案一:采用数码管显示作为显示模块,数码管只适用于显示数字,故舍弃。
方案二:采用LCD液晶显示作为显示模块,LCD1602液晶显示器[11] 具有强大的数字显示功能,可以同时显示16*2个字符,功耗低,抗干扰能力强。
因此,选择方案二,LCD液晶显示作为显示模块。
2.4.2 显示模块电路设计
本设计采用LCD1602液晶显示器,该显示器由单片机进行驱动,其数字显示功能强大,可以同时显示多量的英文数字和各种文字、图形等,显示清晰且美观,价格也十分便宜,最佳的工作电压大约为5V。显示器的命令操作插脚和数据插脚分别与单片机的不同引脚相连接。显示模块电路原理图如图2.5所示。
在这里插入图片描述

图2.5 显示模块电路原理图
2.5 温度传感器模块设计
2.5.1 温度传感器选择
方案一:采用PT100作为测温电路的温度传感器。PT100传感器主要适用于嵌入式测量电路中随环境温度变化的嵌入式铂电阻和某些特殊功能的铂电阻特性。它在设计上具有良好的抗振特性、稳定性好、精度高、抗高压等诸多特点。但使用起来比较复杂,故舍弃。
方案二:采用DS18B20作为测温电路的温度传感器。DS18B20温度传感器化了采用微处理器的数据处理和测量控制,避免了由于传统采用温度自动测量方法的许多外围集成电路。可以对各种软件过程进行自动编程,实现各种复杂算法和各种逻辑控制,并且软件体积小、安装方便。
因此,选择方案二,DS18B20温度传感器。
2.5.2 温度传感器模块电路设计
本设计采用DS18B20温度传感器测量实时温度,传递数字信号给单片机,再由单片机输出给显示器显示。 DS18B20温度传感器的DATA脚与单片机P13引脚相连接。温度传感器模块电路原理图如图2.6所示。
在这里插入图片描述

图2.6 温度传感器模块电路原理图
2.6 红外传感器模块设计
本设计采用的红外计数传感器,感知室内人体信号,传递给单片机,显示器实时显示室内人数,根据室内人数控制空调的开关。hongwai1和hongwai2两个传感器分别与单片机P32和P33引脚相连接。红外传感器模块电路原理图如图2.7所示。
在这里插入图片描述

图2.7 红外传感器模块电路原理图
2.7 继电器模块设计
继电器模块采用PNP型S8550三极管[12]进行驱动。
继电器制冷:制冷模块采用风扇进行制冷,当红外传感器感知到人体信号时,温度传感器自动确定整个房间的温度,当检测到的温度高于设置温度上限值时,单片机输出电流,三极管作为开关饱和导通,继电器得电导通,空调开始制冷,风扇高速转动,同时D1亮起。继电器制冷电路原理图如图2.8所示。

图2在这里插入图片描述
.8 继电器制冷电路原理图
继电器制热:制冷模块采用加热片进行制热,当红外传感器感知到人体信号时,温度传感器自动确定整个房间的温度,当检测到的温度低于设置温度下限值时,单片机输出电流,三极管作为开关饱和导通,继电器得电导通,空调开始制热,加热片快速升温加热,同时D2亮起。继电器制热电路原理图如图2.9所示。
在这里插入图片描述

图2.9 继电器制热电路原理图

3 软件设计

3.1 系统主程序设计
主程序流程图如图3.1所示,开机后液晶初始化,定时器[13]初始化,红外计数传感器统计人数,温度传感器采集并读取温度,显示器显示人数、温度,继电器制冷制热,按键设置温度上限值和下限值。
在这里插入图片描述

图3.1 主程序流程图
3.2 LCD液晶显示子程序设计
LCD显示当前温度、温度上限值、温度下限值、人数。上电初始化,读取人数和温度,将实时采集的数据显示在显示器上。LCD液晶显示程序流程图如图3.2所示。

在这里插入图片描述

图3.2 LCD液晶显示程序流程图
3.3 温度控制子程序流程
主要功能是在读取当前温度数据并判别温度的上下限数值后,用继电器制冷制热进行环境温度控制。系统完成初始化后由单片机判断当前温度在与设定的温度值相对比,如果温度过高进行制冷,反之如果温度过低进行制热。温度控制程序流程图如图3.3所示。
在这里插入图片描述

图3.3 温度控制程序流程图

4 系统调试
4.1 软件调试
本设计基于单片机控制,使用的单片机型号为STC89C52单片机,编译的语言以C语言[14]为主,编译软件为Keil 4。Keil 4[15]使用的基本方法,首先需要建立一个新的项目,选择使用的单片机类型,编写一个新的单片机程序,编写完程序后进行编译,编译就是检测程序是否有错误和警告[16],警告不会影响程序的运行。在编译程序之后,生成.hex文件。Keil 4编译环境图如图4.1所示。
在这里插入图片描述

图4.1 Keil 4编译环境图
调试时遇到的问题及解决方法:
(1)程序汇编时出现丢失符号的情况,需要仔细查找对应的“{ }”,确保前后均在;
(2)程序汇编时含有中文标点符号,需要将中文标点符号改成英文;
(3)程序汇编[17]时出现字母“O”和数字 “0”混杂。汇编时一定要注意细节。
4.2 实物调试
根据本设计要求,对实物设计功能进行整体测试。
(1)观察是否有缺焊、漏焊现象,焊点是否饱满;
(2)使用万用表[18]调试。首先查看电源管脚电路是否短路,然后测量管脚[19]是否连接正确,有没有接线错误;
(3)进电后查看每个元器件是否正常工作,然后测试各元器件功能。DS18B20温度传感器正常采集温度[20],红外计数传感器正常采集人数,显示屏显示数值,按键功能可以实现,继电器制冷风扇转动,继电器制热电热片发热。
经过测试后系统运行正常,没有出现问题。实物展示图如图4.2所示。
在这里插入图片描述

图4.2 实物展示图

结 论

通过以上分析,采用STC89C52单片机作为主控制器完全符合本设计的控制需求。STC89C52单片机可以真正做到它的指令集和代码与传统的8051完全相互兼容,它不但展现了应用单片机最小系统的灵活性,而且还具有多功能性。采用单片机作为本次项目核心设计,运用DS18B20温度传感器采集实时温度,根据系统设置的温度上限值和温度下限值,继电器进行实时制冷或制热;通过红外计数传感器采集人数,根据室内人数控制空调的开关,当室内人数为零时,空调自动关闭,大大节约了能源。
本设计应用了测温技术、红外感知技术、LCD显示设计技术、继电器控制设计技术和按键功能设计技术。本设计以采用单片机为设计核心,设置手动和自动两种模式。其中自动模式主要是通过利用红外传感器自动检测室内人体体温信号,实时自动显示室内人数,根据室内人数自动控制室内空调的开关;手动模式主要是通过设置温度的上、下限值,根据当前温度,空调自动制冷或者制热。当室内温度下降且低于系统设置的温度下限值时,继电器自动控制空调制热,加热片发热;当空调室内温度高于系统设置的温度控制上限值时,继电器控制空调制冷,风扇转动降温。空调自动制冷或者制热的主要前提条件是室内有人,当室内没有人时,空调自动关闭,达到节能的主要效果。采用单片机控制技术降低了系统成本,方便了实际的控制操作,提高了室内空调所用能源的综合利用率。

参考文献

[1] 卢重庆, 蒋崇瀚. 探析计算机高速数字电路设计技术及优化措施[J]. 电子世界, 2020(05) :164-165
[2] 杨皓翔. 模拟电子技术与数字电子技术的比较分析[J]. 数字技术与应用, 2019,37(08) :200+202
[3] 蔡金苹. 单片机技术在智能电子产品中的应用探讨[J]. 科技创新导报, 2019,16(28) :97-98
[4] 易金桥, 黄勇, 廖红华, 谭建军, 姜胜林. 热释电红外传感器及其在人员计数系统中的应用[J]. 红外与激光工程, 2015,44(04) :1186-1192
[5] Berger Martin, Knittl Frank Christian, Bauer Sophie, Winter Georg, Maulide Nuno. Application of Relay C−H Oxidation Logic to Polyhydroxy lated Oleanane Triterpenoids[J]. Chem, 2020
[6] 王青. 基于PT100的温度测控系统的设计与仿真[J]. 计算机测量与控制, 2019,27(09) :47-50+56
[7] 吕小凤, 杜丹, 张万玉. 一种A/D转换电路的设计与应用[J]. 无线电工程, 2019,49(11) :1004-1008
[8] 陈博行, 马俊, 方卫强. 基于MSP430F149的智能温度采集系统设计[J]. 自动化与仪器仪表, 2020(04) :93-96
[9] 袁晓文. STC89C52单片机在智能窗控制系统的应用[J]. 计算机产品与流通, 2020(01) :116
[10] 陶有军. 矩阵键盘的一种简捷高效识别算法[J]. 单片机与嵌入式系统应用, 2019,19(09) :43-45+49
[11] 史静, 李煜. 一种基于单片机和LCD1602的多行文本显示方法[J]. 科技视界, 2017(20) :61-62
[12] 魏秀芳, 张国恒. PNP型三极管内部载流子的传输过程及电流放大原理[J]. 甘肃高师学报, 1999(02) :13-15
[13] 柯小路, 杨东华, 王继生, 李洋. 一种软件化雷达定时器设计方法[J].现代雷达, 2020,42(03) :45-48
[14] 刘雯. C语言程序设计[J]. 通讯世界, 2020,27(04) :114-115
[15] 臧胜超. 基于EPA的工业控制器的设计[D]. 大连交通大学, 2013
[16] 杨都, 张光旭, 赖东锋, 叶铁英, 黄佳星. 基于ARM-Linux的空调智能语音控制系统设计与实现[J]. 日用电器, 2019(09) :20-23
[17] 王代君, 马钰杰. 汇编语言程序设计实验平台的设计[J]. 信息通信, 2019(11) :146-147
[18] 黄承喜, 欧俊延. 一种万用表防误测量装置设计与实现[J]. 电工技术, 2020(07) :109-111
[19] 左建中, 张新荣, 王刚, 张钢. 集成电路芯片管脚尺寸自动检测的研究与实现[J]. 制造业自动化, 2000(09) :28-29+40
[20] 郑三婷. 温度传感器DS18B20在温度计设计中的应用[J]. 电子制作, 2019(12) :92-93

附录1 原理图
在这里插入图片描述

附录2 源程序代码

#include <reg52.h>
#include “lcd1602.h”
#include “eepom52.h”
#define uchar unsigned char
#define uint unsigned int
sbit Relay = P3^7; //制热IO口的定义
sbit zhileng = P3^6; //制冷IO口的定义
sbit dq = P1^3; //18b20 IO口的定义
uchar a_a;

uint temperature ;
bit flag_300ms ;
uchar key_can; //按键值的变量
uchar menu_1; //菜单设计的变量
uint t_high = 500,t_low = 400;
bit flag_lj_en; //按键连加使能
bit flag_lj_3_en; //按键连3次连加后使能 加的数就越大了
uchar key_time,flag_value; //用做连加的中间变量
bit key_500ms ;
uchar flag_clock; //温度报警变量
uchar zd_break_en,zd_break_value; //自动退出设置界面
uchar menu_shudu = 20; //用来控制连加的速度

sbit jin_1 = P3^2; //进来传感器1
sbit chu_1 = P3^3; //出去传感器1

uint zong_rs; //总人数
uint tongd1_jl; //通道1进来的人数
uint tongd1_cq; //通道1出去的人数
uchar t1_value; //通道1用做判断是进来还是出去的变量
uchar t1_zk; //通道1人走开
uchar t1_j_xd; //通道1进消抖
uchar t1_c_xd; //通道1出消抖
uchar t1_qans_qx; //通道1延时取消
uint t1_qans_value; //通道1延时取消

/1ms延时函数******/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<110;j++);
}

/把数据保存到单片机内部eepom中/
void write_eepom()
{
SectorErase(0x2000);
byte_write(0x2000, t_high % 256);
byte_write(0x2001, t_high / 256);
byte_write(0x2002, t_low % 256);
byte_write(0x2003, t_low / 256);
byte_write(0x2055, a_a);
}

/*把数据从单片机内部eepom中读出来/
void read_eepom()
{
t_high = byte_read(0x2001);
t_high <<= 8;
t_high |= byte_read(0x2000);
t_low = byte_read(0x2003);
t_low <<= 8;
t_low |= byte_read(0x2002);
a_a = byte_read(0x2055);
}

/18b20初始化函数******/
void init_18b20()
{
bit q;
dq = 1; //把总线拿高
delay_uint(1); //15us
dq = 0; //给复位脉冲
delay_uint(80); //750us
dq = 1; //把总线拿高 等待
delay_uint(10); //110us
q = dq; //读取18b20初始化信号
delay_uint(20); //200us
dq = 1; //把总线拿高 释放总线
}

/写18b20内的数据**/
void write_18b20(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{ //写数据是低位开始
dq = 0; //把总线拿低写时间隙开始
dq = dat & 0x01; //向18b20总线写数据了
delay_uint(5); // 60us
dq = 1; //释放总线
dat >>= 1;
}
}

/读取18b20内的数据**/
uchar read_18b20()
{
uchar i,value;
for(i=0;i<8;i++)
{
dq = 0; //把总线拿低读时间隙开始
value >>= 1; //读数据是低位开始
dq = 1; //释放总线
if(dq == 1) //开始读写数据
value |= 0x80;
delay_uint(5); //60us 读一个时间隙最少要保持60us的时间
}
return value; //返回数据
}

/读取温度的值 读出来的是小数**/
uint read_temp()
{
uint value;
uchar low; //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序
init_18b20(); //初始化18b20
write_18b20(0xcc); //跳过64位ROM
write_18b20(0x44); //启动一次温度转换命令
delay_uint(50); //500us

init_18b20();		   //初始化18b20
EA = 0;
write_18b20(0xcc);	   //跳过64位ROM
write_18b20(0xbe);	   //发出读取暂存器命令
EA = 1;

low = read_18b20();	   //读温度低字节
value = read_18b20();  //读温度高字节

value <<= 8;		   //把温度的高位左移8位
value |= low;		   //把读出的温度低位放到value的低八位中
value *= 0.625;	       //转换到温度值 小数
return value;		   //返回读出的温度 带小数
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

}
void tongd1_display()
{
/通道1处理*/
if(t1_value == 0)
{
if(jin_1 == 0)
{
t1_j_xd ++;
if(t1_j_xd >= 3)
{
t1_j_xd = 0;
t1_value = 1;
t1_zk = 0;
t1_qans_qx = 1;
t1_qans_value = 0;
}
}
else
t1_j_xd = 0;

	if(chu_1 == 0)
	{
		t1_c_xd ++;
		if(t1_c_xd >= 3)
		{
			t1_c_xd = 0;
			t1_value = 2;	
			t1_zk = 0;		
			t1_qans_qx = 1;
			t1_qans_value = 0;
		}
	}
	else 
		t1_c_xd = 0;	
}
else 
{
	if(t1_qans_qx == 1)
	{
		t1_qans_value ++;	     //5ms
		if(t1_qans_value > 400)	 //2s
			t1_value = 0;	
	}
	if(t1_value == 1)
	{
		if((chu_1 == 0) && (t1_zk == 0))
		{
			tongd1_jl ++;              //通道1进来的人数加1	
			zong_rs = tongd1_jl - tongd1_cq; 
			t1_zk = 1;   
			t1_qans_value = 0; 
			t1_qans_qx = 0;
		}
		if(t1_zk == 1)		 //人走开
		{
			if(chu_1 == 1)		 
			{
				t1_value = 0;
				t1_zk = 0;		 		
			}			
		}
	}
	if(t1_value == 2)
	{
		if((jin_1 == 0) && (t1_zk == 0))
		{
			if(tongd1_jl  > tongd1_cq )
				tongd1_cq ++;              //通道1出去的人数加1	
			zong_rs = tongd1_jl - tongd1_cq; 	  //计算总人数
			t1_zk = 1;  
			t1_qans_value = 0; 
			t1_qans_qx = 0;		
		}
		if(t1_zk == 1)		 //人走开
		{
			if(jin_1 == 1)
			{
				t1_value = 0;
				t1_zk = 0;		 		
			}			
		}
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

}
/定时器0初始化程序**/
void time_init()
{
EA = 1; //开总中断
TMOD = 0X01; //定时器0、定时器1工作方式1
ET0 = 1; //开定时器0中断
TR0 = 1; //允许定时器0定时
}

/独立按键处理函数********/
void key()
{
static uchar key_new = 0,key_old = 0,key_value = 0;
if(key_new == 0)
{ //按键松开的时候做松手检测
if((P1 & 0xf0) == 0xf0)
key_value ++;
else
key_value = 0;
if(key_value >= 10)
{
write_eepom();
key_value = 0;
key_new = 1;
flag_lj_en = 0; //关闭连加使能
flag_lj_3_en = 0; //关闭3秒后使能
flag_value = 0; //清零
}
}
else
{
if((P1 & 0xf0) != 0xf0)
key_value ++; //按键按下的时候
else
key_value = 0;
if(key_value >= 7)
{
key_value = 0;
key_new = 0;
flag_lj_en = 1; //连加使能
zd_break_en = 1; //自动退出设置界使能
zd_break_value = 0; //自动退出设置界变量清零
key_time = 0;
}
}
key_can = 20;
if(key_500ms == 1)
{
key_500ms = 0;
key_new = 0;
key_old = 1;
}
if((key_new == 0) && (key_old == 1))
{
switch(P1 & 0xf0)
{
case 0xe0: key_can = 4; break; //得到k1键值
case 0xd0: key_can = 3; break; //得到k2键值
case 0xb0: key_can = 2; break; //得到k3键值
case 0x70: key_can = 1; break; //得到k4键值

	}
}			 
key_old = key_new;	 
  • 1
  • 2
  • 3

}

/*按键处理数码管显示函数/
void key_with()
{
if(key_can == 4)
{
menu_1 ++;
if(menu_1 >= 3)
{
menu_1 = 0;
}
if(menu_1 == 0)
{
write_com(0x0c); //关闭光标
}
if(menu_1 == 1)
{
write_sfm3_18B20(2,2,t_high);
write_com(0x80+0x40+5); //将光标移动到秒个位
write_com(0x0f); //显示光标并且闪烁

	}
	if(menu_1 == 2)
	{
		write_sfm3_18B20(2,10,t_low);
		write_com(0x80+0x40+13);            //将光标移动到秒个位
		write_com(0x0f);                    //显示光标并且闪烁	
	}
	menu_shudu = 20;
}
if(menu_1 == 1)			//设置高温报警
{
	if(key_can == 3)
	{
		if(flag_lj_3_en == 0)
			t_high ++ ;		//按键按下未松开自动加三次	
		else 
			t_high += 10;	//按键按下未松开自动加三次之后每次自动加10
		if(t_high > 990)
			t_high = 990;
		write_sfm3_18B20(2,2,t_high);
		write_com(0x80+0x40+5);             //将光标移动到秒个位
		write_com(0x0f);                    //显示光标并且闪烁	
	}
	if(key_can == 2)
	{
		if(flag_lj_3_en == 0)
			t_high -- ;		//按键按下未松开自动加三次	
		else 
			t_high -= 10;	//按键按下未松开自动减三次之后每次自动减10
		if(t_high <= t_low)
			t_high = t_low + 1;
		write_sfm3_18B20(2,2,t_high);
		write_com(0x80+0x40+5);             //将光标移动到秒个位
		write_com(0x0f);                    //显示光标并且闪烁	
	}
	write_eepom();
}	
if(menu_1 == 2)			//设置低温报警
{
	if(key_can == 3)
	{
		if(flag_lj_3_en == 0)
			t_low ++ ;			
		else 
			t_low += 10;
		if(t_low >= t_high)
			t_low = t_high - 1;
		write_sfm3_18B20(2,10,t_low);
		write_com(0x80+0x40+13);            //将光标移动到秒个位
		write_com(0x0f);                    //显示光标并且闪烁	
	}
	if(key_can == 2)
	{
		if(flag_lj_3_en == 0)
			t_low -- ;			
		else 
			t_low -= 10;
		if(t_low <= 10)
			t_low = 10;
		write_sfm3_18B20(2,10,t_low);
		write_com(0x80+0x40+13);            //将光标移动到秒个位
		write_com(0x0f);                    //显示光标并且闪烁	
	}
	write_eepom();
}	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65

}

/菜单对应的处理函数***/
void menu_dispaly()
{
if((menu_1 == 1)) //对光标不处理,要不然光标不会显示在正确的位置
{
write_com(0x80+0x45); //将光标移动到
write_com(0x0f); //显示光标并且闪烁
}else if((menu_1 == 2))
{
write_com(0x80+0x4d); //将光标移动到
write_com(0x0f); //显示光标并且闪烁
}
}

/*控制函数/
void clock_h_l()
{
if(zong_rs>=1)
{
if(temperature <= t_low)
{
Relay = 0;zhileng = 1;//关闭制冷装置 打开加热装置
}
else if(temperature >= t_high)
{
Relay = 1; //停止加热装置
zhileng = 0;//打开制冷装置
}
}
else
{
Relay = 1; //停止加热装置
zhileng = 1;//停止制冷装置
}
}
void main()
{
init_1602();
init_1602_dis_csf();
temperature = read_temp(); //先读出温度的值
time_init(); //初始化定时器
read_eepom();
write_sfm3_18B20(2,2,t_high);
write_sfm3_18B20(2,10,t_low);
if(a_a == 0xff) //新的单片机初始单片机内问EEPOM
{
t_high = 500;
t_low = 400;
a_a = 1;
write_eepom();
}
Relay = 1; //停止加热装置
zhileng = 1;//停止制冷装置
delay_1ms(650);
temperature = read_temp(); //先读出温度的值
write_sfm3_18B20(1,2,temperature);
while(1)
{
tongd1_display();
if(flag_300ms == 1) //300ms 处理一次温度程序
{
temperature = read_temp(); //先读出温度的值
clock_h_l(); //报警函数
flag_300ms = 0;
write_sfm3_18B20(1,2,temperature);
write_renshu(1,10,zong_rs);
if(zd_break_en == 1) //自动退出设置界面程序
{
zd_break_value ++; //每300ms加一次
if(zd_break_value > 80) //20秒后自动退出设置界面
{
menu_1 = 0;
zd_break_en = 0;
zd_break_value = 0;
write_com(0x0c); //关闭光标
}
}

	menu_dispaly();   //不同级的菜单对应显示1602对应显示不同
	}
	key();					//按键程序
	if(key_can < 10)
	{
		key_with();			    //设置控制温度	
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

}

/定时器0中断服务程序**/
void time0_int() interrupt 1
{
static uchar value;
TH0 = 0x3c;
TL0 = 0xb0; // 50ms
value ++;
if(value % 6 == 0)
{
flag_300ms = 1; //300ms
value = 0;
}
if(flag_lj_en == 1) //按下按键使能
{
key_time ++;
if(key_time > 5) //250ms
{
key_time = 0;
key_500ms = 1; //500ms
flag_value ++;
if(flag_value > 3)
{

flag_value = 10;
flag_lj_3_en = 1; //3次后1.5秒后连加大些
}
}
}
}

致 谢

在这次毕业设计中,李作纪老师和陈乃周老师对论文从选题、构思到最后定稿的各个环节给予细心指引与教导,使我得以最终完成毕业论文设计。在学习中,老师严谨的治学态度、丰富渊博的知识、敏锐的学术思维、精益求精的工作态度以及侮人不倦的师者风范是我终生学习的楷模,导师们的高深精湛的造诣与严谨求实的治学精神,将永远激励着我。
经过了两个多月的努力,我完成了论文的写作。从开始接到论文题目到系统的实现,再到论文文章的完成,每走一步对我来说都是新的尝试与挑战,这也是我在大学期间独立完成的最大的项目。在这段时间里,我学到了很多知识也有很多感受,从一无所知,开始了独立的学习和试验,查看相关的资料和书籍,让自己头脑中模糊的概念逐渐清晰,使自己十分稚嫩的作品慢慢完善起来,每一次改善都是我学习的收获,每一次试验的成功都会让我兴奋好一段时间。
在这里,我还要感谢大学四年里在学业上帮助我的所有老师们,是你们四年里孜孜不倦,传道受业解惑,成就了我今天取得的成绩。感谢陪伴我一路走来的同学们,是你们的帮助与包容,让我倍感温暖。在此,谨向老师们致以衷心的感谢和崇高的敬意!最后,我要向百忙之中抽时间对本文进行审阅,评议和参与本人论文答辩的各位老师表示感谢。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/891029
推荐阅读
相关标签
  

闽ICP备14008679号