基于单片机的空调温度控制器设计课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
接口技术课程设计报告
基于单片机的空调温度控制器设计
设计了基于AT89C52的高精度家用空调温度控制系统,系统硬件主要由电源电路、温度采集电路(DS18B20)、键盘、显示电路、输出控制电路及其他辅助电路组成;软件采用8051C语言编程;该系统可以完成温度的显示、温度的设定、空调的控制等多项功能。
关键词:单片机;DS18B20;温度检测;显示
1 设计目的及要求 (1)
1.1 设计目的和意义 (1)
1.2 设计任务与要求 (1)
2 硬件电路设计 (2)
2.1 总体方案设计 (2)
2.2 功能模块电路设计 (3)
2.2.1 单片机的选型 (3)
2.2.2 振荡电路设计 (5)
2.2.3 复位电路设计 (5)
2.2.4 键盘接口电路设计 (6)
2.2.5 温度测量电路设计 (6)
2.2.6 系统显示电路设计 (7)
2.2.7 输出控制电路设计 (8)
2.3 总电路设计 (9)
2.4 系统所用元器件 (9)
3 软件系统设计 (10)
3.1 软件系统总体方案设计 (10)
3.2 软件流程图设计 (10)
4 系统调试 (11)
5 总结 (14)
5.1 本系统存在的问题及改进措施 (14)
参考文献 (15)
附录1:系统的源程序清单 (16)
附录2:系统的PCB图 (41)
1设计目的及要求
1.1 设计目的和意义
21世纪的人们生活质量不断提高,同时也对高科技电子产业提出了更高的要求,为了使人们生活更人性化、智能化。
我设计了这一基于单片机的空调温度控制系统,人们只有生活在一定的温度环境内才能长期感觉舒服,才能保证不中暑不受冻,所以对室内温度要求要高。
对于不同地区空调要求不同,有的需要升温,有的需要降温。
一般都要维持在21~26°C。
目前,虽然我国大量生产空调制冷产品,但由于我国人口众多,需求量过盛,在我国的北方地区,还有好多家庭还没有安装有效地室内温控系统。
温度不能很好的控制在一定的范围内,夏天室内温度过高,冬天温度过低,这些均对人们正常生活带来不利的影响,温度、湿度均达不到人们的要求。
以前温度控制主要利用机械通风设备进行室内、外空气的交换来达到降低室内温度,实现室内温度适宜人们生活。
以前通风设备的开启和关停,均是由人手动控制的,即由人们定时查看室内外的温度、湿度情况,按要求开关通风设备,这样人们的劳动强度大,可靠性差,而且消耗人们体力,劳累成本过高。
为此,需要有一种符合机械温控要求的低成本的控制器,在温差和湿度超过用户设定值范围时,启动制冷通风设备,否则自动关闭制冷通风设备。
鉴于目前大多数制冷设备现在状况,我设计了一款基于MCS51单片机的空调温度控制系统。
1.2 设计任务与要求
系统要求利用单片机设计一空调温度控制器,能够实时检测并显示室温,能够利用键盘设定温度,并且和室温进行比较,当室温低于设定温度时,系统能够驱动加热系统工作,当室温高于设定温度时,系统能够驱动制冷系统工作,当两者温度相等时,不做动作。
2 硬件电路设计
2.1 总体方案设计
空调温度控制系统,主要要完成对温度的采集、显示以及设定等工作,从而实现对空调的控制。
传统采用铂电阻充当测温器件的方案,虽然其中段测量线性度好,精度较高,但是测量电路的设计难度高,且测量电路系统庞大,难于调试,而且成本相对较高。
鉴于上述原因,本系统采用DS18B20充当测温器件。
外部温度信号经DS18B20将输入的模拟信号转换成8位的数字信号,通过并口传送到单片机系统( AT89C52) 。
单片机系统将接收的数字信号译码处理,通过LCD1602将温度显示出来,同时单片机系统还将完成键盘扫描、按键温度设定、超温报警等程序的处理,将处理的温度信号与系统设定温度值比较,形成可以控制空调制冷、制热与停止工作三种工作状态,从而实现空调的智能化。
另外,键盘输入方面,采用了软件来修正误操作输入,即输入的温度范围必须在系统硬件所确定的范围内,直接降低由于误操作带来的风险,提高了系统的可靠性,体现了人性化的系统设计原则。
系统的整体框图如图1所示:
图1 系统整体框图
2.2 功能模块电路设计
2.2.1 单片机的选型
由于本系统只需要单片机完成矩阵键盘检测以及处理DS18B20送来的温度数据并送LCD1602进行显示对于I/O资源以及处理速度无特殊要求,故选择ATMEL公司生产的AT89C52单片机,AT89C52增加了在线调试功能,即程序可以通过JTAG接口下载,调试和固化,因而该芯片的开发不再需要昂贵的硬件仿真器,可实现实时仿真,所有的资源都可以为用户所使用,可以在线编程或在系统编程,更进一步地说,在线编程或在系统编程是开发的系统具有了通过网络进行升级、维护的潜在功能。
AT89C52的性能及特点[1]:
●与MCS-51系列单片机兼容。
●片内有8K可在线重复编程的快速内
存可擦写存储器(Flash Memory)。
●存储器可循环写入/擦写10000次以上。
●存储器数据保存时间为10年以上。
●宽工作电压范围:Vcc可为2.7V-6.5V。
●全静态工作:可从0Hz-24MHz。
●程序存储器具有三级加密保护。
●256字节的内部RAM。
●32条可编程I/O口线。
●三个16位定时器/计数器。
●中断结构具有5级(6级)中断源和两个优下级。
●可编程全双工串行通讯。
●空闲维持低功耗和掉电状态保护存储数据。
AT89C52引脚图如图2所示。
图2 AT89C52引脚图
VCC: +5V电源输入
GND:接地
P0口是一个双向8位三态I/O口,每个口可独立控制。
使用时需外接上拉电阻。
P1口是一个准双向8位I/O口,它的功能是单一的,只能用作数据的输入或者输出。
P2口是一个准双向8位I/O口,输出时,从P2.x端口可输出CPU写到锁存器上的信号。
当该接口用做数据输入接口是,应先向该位写1,然后,读该位即可读入输入数据。
P3口是具有第二功能的准双向8位I/O口。
ALE/PROG:地址所存/编程信号线。
当P0口工作在第二功能时从该端口可复用工作,某时刻该端口可以送出地址信号A0~A7,而另外的时刻该端口传送的是数据信号D0~D7。
利用ALE可以将地址信号A0~A7锁存到地址锁存器。
EA/VPP:该控制信号线也具有双重功能,是允许访问片外ROM/编程高电压引线。
PSEN:程序存储器允许输出控制端,常用作片外ROM的读控制信号,低电平有效。
RESET:复位引脚,当该端加上超过24个时钟周期的高电平时,可是8051复位。
系统复位电路如图2.3所示。
X1、X2:外接时钟引脚。
X1为片内振荡电路的输入端,X2为片内振荡电路的输出端。
2.2.2 振荡电路设计
AT89C52内部有一个用于构成片内振荡器的高增益反相放大器, 振荡器产生的信号送到CPU, 作为CPU的时钟信号,驱动CPU产生执行指令功能的机器周期。
引脚XTAL1和XTAL2是此放大器的输人端和输出端。
这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起可构成一个自激振荡器, 振荡电路的连接如图所示图8所示,外接石英晶体或陶瓷谐振器以及电容C1和C2构成并联谐振电路, 接在放大器的反馈回路中。
对外接电容C1和C2的值虽然没有严格的要求, 但电容的大小多少会影响振荡器频率的高低、振荡器的稳定性、起振圈内部振荡的接法的快速性和温度稳定性。
外接石英晶体时, C1和C2一般取(40pF-10pF),外接的是石英晶体, 所以,C1、C2选择标称值30pF。
系统振荡电路如图3所示。
图3 振荡电路
2.2.3 复位电路设计
单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态, 并从这个状态开始工作。
无论是在单片机刚开始接上电源时, 还是断电后或者发生故障后都要复位。
89系列单片机的复位信号是从RST引脚输人到芯片的施密特触发器中的。
当系统处于正常工作状态时, 且振荡器稳定后, 如果RST引脚有
一个高电平并维持2个机器周期(24个振荡周期), 则CPU就可响应并且将系统复位。
复位分为手动复位和上电复位。
本设计系统采用的是上电自动复位。
系统复位电路如图4所示。
图4 复位电路
2.2.4 键盘接口电路设计
独立键盘与单片机连接时,每个按键都需要单片机的一个I/O口,若单片机系统需要较多按键,如果用独立按键会占用过多的I/O口资源。
单片机系统中I/O 口资源往往比较宝贵,当用到多个按键时,为了节省I/O口线,一般需使用矩阵键盘。
本系统共需使用16个按键,故选择4
4 的矩阵键盘。
键盘接口电路如图5所示。
图5 键盘接口电路
2.2.5 温度测量电路设计
本系统的温度测量电路采用DS18B20来实现。
DS18B20是美国DALLAS 半导体公司推出的第一片采用“一线总线”接口的温度传感器,它具有微型
化、低功耗、高性能、抗干扰、能力强、易配微处理器等优点,可直接将温度转化成串行数字信号供处理器处理。
DS18B20的性能及特点[2]:
●适应电压范围宽,电压范围在V
0.3,在寄生电源方式下可由数据线
~
5.5
供电。
●独特的单线接口方式,它与微处理器连接时仅需一条口线即可实现微处
理器与DS18B20的双向通信。
●支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网
多点测温。
●在使用中不需要任何外接元件,全部传感元件及转换电路集成在形如一
只三极管的集成电路里。
●测温范围-55℃~+125℃,在-10℃~+85℃时精度为±0.5℃。
●可编程分辨率为9~12位,对应的可分辨温度分别为0.5℃,0.25℃,
0.125℃和0.0625℃,可实现高精度测温。
●在9位分辨率时,最多在93.75ms内把温度转换为数字;12位分辨率时,
最多在750ms内把温度值转换为数字。
●测量结果直接输出数字温度信号,以“一线总线”串行传送给CPU,同时
可传送CRC校验码,具有极强的抗干扰纠错能力。
●负压特性。
电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
系统温度测量电路如图6所示。
图6 温度测量电路
2.2.6 系统显示电路设计
本系统采用LCD1602作为系统的显示器件,1602字符型液晶是一种专门用来显示字母、数字、符号等的点阵型液晶模块,能分两行显示,它有若干个7
5⨯
或者11
5⨯等点阵字符位组成,每个点阵字符位都可以显示一个字符。
1602型液晶接口信号如下:
●1脚V SS:电源地。
●2脚V DD:电源正极。
●3脚VO:液晶显示对比度调节端。
●4脚RS:数据/命令选择端(H/L)。
●5脚R/W:读写选择端(H/L)。
●6脚E:使能信号。
●14
~
7脚D7
D0:数据口。
~
●15脚BL1:背光电源正极。
●16脚BL2:背光电源负极。
系统显示电路如图7所示。
图7 系统显示电路
2.2.7 输出控制电路设计
系统要求在当前室温低于设定温度时,能够自动驱动加热系统工作;在当前室温高于设定温度时能够自动驱动制冷系统工作。
本系统在复位后即置P2^6脚和P2^7脚为低电平,在当前室温低于设定温度时,通过置P2^7脚为高电平来驱动后级加热系统,本系统采用红色LED来代替加热系统;在当前室温高于设定温度时,通过置P2^6脚高电平来驱动后级制冷系统,本系统采用蓝色LED来代替制冷系统。
输出控制电路如图8所示。
图8 输出控制电路2.3 总电路设计
系统总电路图如图9所示。
图9 系统总电路图2.4 系统所用元器件
本系统所用的元器件清单如表1所示。
表1 系统所用元器件
元器件名称数量
点触式开关16
30pF瓷片电容 2
10uF电解电容 1
蓝色LED 1
红色RED 1
5V电源插座 1
自锁开关 1
LCD1602 1
1/4W10K电阻 3
10K可调电阻 1
AT89C52 1
DS18B20 1
12MHz晶振 1
3 软件系统设计
3.1 软件系统总体方案设计
系统软件由主程序模块、测温程序模块、键盘扫描程序模块以及液晶驱动程序模块组成。
3.2 软件流程图设计
系统软件流程图如图10所示。
图10 系统软件流程图
4 系统调试
程序在Keil uVision4环境下编写,编译通过后生成.hex文件加载到Protuse 下可正常运行。
程序默认温度为21.0℃,Protuse下设定DS18B20的温度也为21.0℃,故开始运行时两路LED灯都不点亮。
当利用键盘设定的温度高于DS18B20默认的21.0℃时,红色LED灯被点亮;当设定的温度低于DS18B20默认的21.0℃时,蓝色LED灯被点亮。
当设定的温度高于DS18B20默认的21.0℃时,红色LED灯被点亮,如图11所示。
图11 红色LED灯点亮
当设定的温度低于DS18B20默认的21.0℃时,蓝色LED灯被点亮。
如图
12所示。
图12 蓝色LED灯点亮
5.1 本系统存在的问题及改进措施
本系统所设计的空调温度控制器仅对温度部分实现了控制,但对于实际空调中的模式选择以及定时运行等工作过程还无法实现,希望在以后的学习研究中能够解决这些问题。
5.2 心得体会
本次课程设计从获得题目开始便着手准备,首先分析系统要求,在Protuse 里完成硬件原理图的搭建,然后开始在Keil环境下着手编写各部分程序,调试相应的程序,在调试通过后再下载到Protuse里进行仿真,发现问题后再返回Keil 下修改相应程序,直到最后仿真通过,最后在Altium Designer 6中画出电路原理图。
在本次课程设计过程中得到了老师以及许多同学的帮助,感谢那些提供过帮助的老师和同学。
[1] 郭文川主编. 单片机原理与接口技术. 北京:中国农业出版社,2007.
[2] 郭天祥主编. 51单片机C语言教程. 北京:电子工业出版社,2009.
附录1:系统的源程序清单
global.h:
ifndef _global_H
#define _global_H
#include<reg52.h>
#define uchar unsigned char//宏定义
#define uint unsigned int
#define K_UP 0X20//定义键值#define K_DOWN 0X21
#define K_CLEAR 0X24
#define K_OK 0X25
#define K_ONE 0X30
#define K_FOUR 0X31
#define K_SEVEN 0X32
#define K_POINT 0X33
#define K_TWO 0X34
#define K_FIVE 0X43
#define K_EIGHT 0X36
#define K_ZERO 0X37
#define K_THREE 0X38
#define K_SIX 0X40
#define K_NINE 0X41
#define K_SET 0X42
extern float TEMP_NOW;
extern float TEMP_SET;
extern uint T_Count;
extern uint S_Count;
extern uint P_Count;
extern uint N_Count;
extern uint M_Count;
extern uchar Current_Temp_Display_Buffer[];
extern uchar set_Temp_Display_Buffer[];
extern int sel;
sbit lcden=P2^1;//液晶使能
sbit lcdrs=P2^0;//液晶数据/命令选择端
sbit DQ =P2^2;//DS18B20数据端
sbit XX =P2^5;//读写选择端
sbit cold =P2^6;//输出信号
sbit warm =P2^7;//输出信号
#endif
main.c:
#include<reg52.h>
#include"global.h"
#include"key.h"
#include"18B20.h"
#include"LCD.h"
////////////////////全局变量/////////////////////////////
float TEMP_NOW=0.0;
float TEMP_SET=21.0;
uint T_Count=0;
uint S_Count=0;
uint P_Count=0;
uint N_Count=0;
uint M_Count=1;
uchar Current_Temp_Display_Buffer[]={" NOW:-23.5 "};
uchar set_Temp_Display_Buffer[]= {" SET: 21.0 "};
int sel=0;
void Comparison();
//////////////////////定时///////////////////////////////
void timer0_init(void)
{
TMOD = 0x00 ; //设置定时器0的工作方式
TH0 = (8192-5000)/32;//单片机晶振为12MHz,机器周期为1us,t=5ms,
//N=5000/1=5000 TL0 = (8192-5000)%32;
IE = 0x82;
TR0=1;
}
void timer0() interrupt 1
{
TH0 = (8192-5000)/32;
TL0 = (8192-5000)%32;
if(++T_Count == 100) //////100为0.5s {
TR0=0;
Read_Temperature();
Display_Temperature() ;
T_Count=0;
if(++P_Count == 6)
{
N_Count=1;
}
TR0=1;
}
}
////////////////////主程序///////////////////////////////
void main()
{
init_lcd();
Init_DS18B20();
timer0_init();
while(1)
{
Print();
set_num();
Comparison();
}
}
void Comparison()
{
if(N_Count&&M_Count)
{
if(TEMP_NOW<TEMP_SET)
{
warm=1;
cold=0;
}
if(TEMP_NOW>TEMP_SET)
{
cold=1;
warm=0;
}
if(TEMP_NOW==TEMP_SET)
{
cold=0;
warm=0;
}
}
}
18B20.h:
#ifndef _18B20_H
#define _18B20_H
#include"global.h"
extern uchar Init_DS18B20();
extern void Read_Temperature(); extern void Display_Temperature();
#endif
18B20.c:
#include"global.h"
#include "intrins.h"
#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}
uchar code Temperature_Char[8] = {0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00}; uchar code df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
uchar CurrentT = 0;
uchar Temp_Value[]={0x00,0x00};
uchar Display_Digit[]={0,0,0,0};
bit DS18B20_IS_OK = 1;
void Delay_INI(uint x)
{
while(--x);
}
void Delay(unsigned int n)
{
do
{
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();
n--;
}while(n);
}
uchar Init_DS18B20()
{
uchar status;
DQ = 1;
Delay_INI(8);
DQ = 0;
Delay_INI(90);
DQ = 1;
Delay_INI(8);
status=DQ;
Delay_INI(100);
DQ = 1;
return status;
}
uchar ReadOneByte()
{
uchar i,dat=0;
DQ = 1;
_nop_();
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
_nop_();
_nop_();
if(DQ)
dat |= 0X80;
Delay(30);
DQ = 1;
}
return dat;
}
void WriteOneByte(uchar dat) {
uchar i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat& 0x01;
Delay(5);
DQ = 1;
dat >>= 1;
}
}
void Read_Temperature()
{
if(Init_DS18B20()==1)
DS18B20_IS_OK=0;
else
{
WriteOneByte(0xcc);
WriteOneByte(0x44);
Init_DS18B20();
WriteOneByte(0xcc);
WriteOneByte(0xbe);
Temp_Value[0] = ReadOneByte();
Temp_Value[1] = ReadOneByte();
DS18B20_IS_OK=1;
}
}
void Display_Temperature()
{
uchar t = 150, ng = 0;
if((Temp_Value[1]&0xf8)==0xf8)
{
Temp_Value[1] = ~Temp_Value[1];
Temp_Value[0] = ~Temp_Value[0]+1;
if(Temp_Value[0]==0x00)
Temp_Value[1]++;
ng = 1;
}
Display_Digit[0] = df_Table[Temp_Value[0]&0x0f];
CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4);
Display_Digit[3] = CurrentT/100;
Display_Digit[2] = CurrentT%100/10;
Display_Digit[1] = CurrentT%10;
Current_Temp_Display_Buffer[11] = Display_Digit[0] + '0';
Current_Temp_Display_Buffer[10] = '.';
Current_Temp_Display_Buffer[9] = Display_Digit[1] + '0';
Current_Temp_Display_Buffer[8] = Display_Digit[2] + '0';
Current_Temp_Display_Buffer[7] = Display_Digit[3] + '0';
TEMP_NOW=Display_Digit[2]*10+Display_Digit[1]+Display_Digit[0]*0.1 ;
if(Display_Digit[3] == 0)
Current_Temp_Display_Buffer[7] = ' ';
if(Display_Digit[2] == 0&&Display_Digit[3]==0)
Current_Temp_Display_Buffer[8] = ' ';
if(ng)
{
TEMP_NOW=-(Display_Digit[2]*10+Display_Digit[1]+Display_Digit[0]*0.1);
if(Current_Temp_Display_Buffer[8] == ' ')
Current_Temp_Display_Buffer[8] = '-';
else if(Current_Temp_Display_Buffer[7] == ' ')
Current_Temp_Display_Buffer[7] = '-';
else
Current_Temp_Display_Buffer[6] = '-';
}
}
KEY.h:
#ifndef _KEY_H
#define _KEY_H
#include<global.h>
extern unsigned char Keys_Scan();
extern void set_num();
extern void set();
#endif
KEY.c:
#include <reg52.h>
#include <intrins.h>
#include <global.h>
#include"18B20.h"
uchar code KeyCodeTable[]=
{
0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x 84,0x88
};
void Delay_key()
{
uchar i;
for(i=0;i<200;i++);
}
uchar Keys_Scan()
{
uchar sCode,kCode,k;
P3 = 0xf0;
if((P3&0xf0)!=0xf0)
{
Delay_key();
if((P3&0xf0)!=0xf0)
{
sCode = 0xfe;
for(k=0;k<4;k++)
{
P3 = sCode;
if((P3&0xf0)!=0xf0)
{
kCode = ~P3;
if(kCode == KeyCodeTable[0]) return K_ONE;
else if(kCode == KeyCodeTable[1]) return K_TWO;
else if(kCode == KeyCodeTable[2]) return K_THREE;
else if(kCode == KeyCodeTable[3]) return K_FOUR;
else if(kCode == KeyCodeTable[4]) return K_FIVE;
else if(kCode == KeyCodeTable[5]) return K_SIX;
else if(kCode == KeyCodeTable[6]) return K_SEVEN;
else if(kCode == KeyCodeTable[7]) return K_EIGHT;
else if(kCode == KeyCodeTable[8]) return K_NINE;
else if(kCode == KeyCodeTable[9]) return K_UP;
else if(kCode == KeyCodeTable[10]) return K_DOWN;
else if(kCode == KeyCodeTable[11]) return K_CLEAR;
else if(kCode == KeyCodeTable[12]) return K_OK;
else if(kCode == KeyCodeTable[13]) return K_ZERO;
else if(kCode == KeyCodeTable[14]) return K_POINT;
else if(kCode == KeyCodeTable[15]) return K_SET;
}
else
sCode = _crol_(sCode,1);
}
}
}
return -1;
}
void set_num()
{
uchar key;
if(sel==0)
{
key = Keys_Scan();
if(K_CLEAR == key)
{
while(Keys_Scan() == K_CLEAR);
set_Temp_Display_Buffer[8] =' ';
set_Temp_Display_Buffer[9] =' ';
set_Temp_Display_Buffer[10]=' ';
set_Temp_Display_Buffer[11]=' '; //
48(0)49(1)50(2)51(3)52(4)53(5)54(6)55(7)56(8)57(9)
M_Count=0;
cold=0;
warm=0;
}
if(K_UP == key)
{
while(Keys_Scan() == K_UP);
if((set_Temp_Display_Buffer[11]>47)&&(set_Temp_Display_Buffer[11]<57)) {
set_Temp_Display_Buffer[11]+=1;
}
else if(set_Temp_Display_Buffer[11]==57)
{
set_Temp_Display_Buffer[11]=48;
if((set_Temp_Display_Buffer[9]>47)&&(set_Temp_Display_Buffer[9]<57)) {
set_Temp_Display_Buffer[9]+=1;
}
else if(set_Temp_Display_Buffer[9]==57)
{
set_Temp_Display_Buffer[9]=48;
if((set_Temp_Display_Buffer[8]>47)&&(set_Temp_Display_Buffer[8]<57))
{
set_Temp_Display_Buffer[8]+=1;
}
else if(set_Temp_Display_Buffer[8]==57)
{
set_Temp_Display_Buffer[8]=48;
}
}
}
}
if(K_DOWN == key) //
48(0)49(1)50(2)51(3)52(4)53(5)54(6)55(7)56(8)57(9)
{
while(Keys_Scan() == K_DOWN);
if((set_Temp_Display_Buffer[11]>48)&&(set_Temp_Display_Buffer[11]<58)) {
set_Temp_Display_Buffer[11]-=1;
}
else if(set_Temp_Display_Buffer[11]==48)
{
set_Temp_Display_Buffer[11]=57;
if((set_Temp_Display_Buffer[9]>48)&&(set_Temp_Display_Buffer[9]<58)) {
set_Temp_Display_Buffer[9]-=1;
}
else if(set_Temp_Display_Buffer[9]==48)
{
set_Temp_Display_Buffer[9]=57;
if((set_Temp_Display_Buffer[8]>48)&&(set_Temp_Display_Buffer[8]<58)) {
set_Temp_Display_Buffer[8]-=1;
}
else if(set_Temp_Display_Buffer[8]==48)
{
set_Temp_Display_Buffer[8]=57;
}
}
}
}
if(K_ONE == key)
{
while(Keys_Scan() == K_ONE);
set_Temp_Display_Buffer[11]='1';
sel++;
}
if(K_TWO == key)
{
while(Keys_Scan() == K_TWO);
set_Temp_Display_Buffer[11]='2';
sel++;
}
if(K_THREE == key)
{
while(Keys_Scan() == K_THREE);
set_Temp_Display_Buffer[11]='3';
sel++;
}
if(K_FOUR == key)
{
while(Keys_Scan() == K_FOUR);
set_Temp_Display_Buffer[11]='4';
sel++;
}
if(K_FIVE == key)
{
while(Keys_Scan() == K_FIVE);
set_Temp_Display_Buffer[11]='5';
sel++;
}
if(K_SIX == key)
{
while(Keys_Scan() == K_SIX);
set_Temp_Display_Buffer[11]='6';
sel++;
}
if(K_SEVEN == key)
{
while(Keys_Scan() == K_SEVEN);
set_Temp_Display_Buffer[11]='7';
sel++;
}
if(K_EIGHT == key)
{
while(Keys_Scan() == K_EIGHT);
set_Temp_Display_Buffer[11]='8';
sel++;
}
if(K_NINE == key)
{
while(Keys_Scan() == K_NINE);
set_Temp_Display_Buffer[11]='9';
sel++;
}
if(K_ZERO == key)
{
while(Keys_Scan() == K_ZERO);
set_Temp_Display_Buffer[11]='0';
sel++;
}
if(K_OK == key)
{
while(Keys_Scan() == K_OK);
TEMP_SET=(set_Temp_Display_Buffer[8]-48)*10+(set_Temp_Display_Buffer[ 9]-48)+(set_Temp_Display_Buffer[11]-48)*0.1;
sel=0;
M_Count=1;
}
}
if(sel==1)
{
key = Keys_Scan();
if(K_CLEAR == key)
{
while(Keys_Scan() == K_CLEAR);
set_Temp_Display_Buffer[8] =' ';
set_Temp_Display_Buffer[9] =' ';
set_Temp_Display_Buffer[10]=' ';
set_Temp_Display_Buffer[11]=' ';
M_Count=0;
cold=0;
warm=0;
sel=0;
}
if(K_ONE == key)
{
while(Keys_Scan() == K_ONE);
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='1';
sel++;
}
if(K_TWO == key)
{
while(Keys_Scan() == K_TWO);
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='2';
sel++;
}
if(K_THREE == key)
{
while(Keys_Scan() == K_THREE);
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='3';
sel++;
}
if(K_FOUR == key)
{
while(Keys_Scan() == K_FOUR);
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='4';
sel++;
}
if(K_FIVE == key)
{
while(Keys_Scan() == K_FIVE);
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='5';
sel++;
}
if(K_SIX == key)
{
while(Keys_Scan() == K_SIX);
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='6';
sel++;
}
if(K_SEVEN == key)
{
while(Keys_Scan() == K_SEVEN);
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='7';
sel++;
}
if(K_EIGHT == key)
{
while(Keys_Scan() == K_EIGHT);
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='8';
sel++;
}
if(K_NINE == key)
{
while(Keys_Scan() == K_NINE);
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='9';
sel++;
}
if(K_ZERO == key)
{
while(Keys_Scan() == K_ZERO);
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='0';
sel++;
}
}
if(sel==2)
{
key = Keys_Scan();
if(K_CLEAR == key)
{
while(Keys_Scan() == K_CLEAR);
set_Temp_Display_Buffer[8] =' ';
set_Temp_Display_Buffer[9] =' ';
set_Temp_Display_Buffer[10]=' ';
set_Temp_Display_Buffer[11]=' ';
M_Count=0;
cold=0;
warm=0;
sel=0;
}
if(K_POINT == key)
{
while(Keys_Scan() == K_POINT);
set_Temp_Display_Buffer[9]=set_Temp_Display_Buffer[10] ;
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='.';
sel++;
}
}
if(sel==3)
{
key = Keys_Scan();
if(K_CLEAR == key)
{
while(Keys_Scan() == K_CLEAR);
set_Temp_Display_Buffer[8] =' ';
set_Temp_Display_Buffer[9] =' ';
set_Temp_Display_Buffer[10]=' ';
set_Temp_Display_Buffer[11]=' ';
M_Count=0;
cold=0;
warm=0;
sel=0;
}
if(K_ONE == key)
{
while(Keys_Scan() == K_ONE);
set_Temp_Display_Buffer[8]=set_Temp_Display_Buffer[9] ;
set_Temp_Display_Buffer[9]=set_Temp_Display_Buffer[10] ;
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='1';
sel++;
}
if(K_TWO == key)
{
while(Keys_Scan() == K_TWO);
set_Temp_Display_Buffer[8]=set_Temp_Display_Buffer[9] ;
set_Temp_Display_Buffer[9]=set_Temp_Display_Buffer[10] ;
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='2';
sel++;
}
if(K_THREE == key)
{
while(Keys_Scan() == K_THREE);
set_Temp_Display_Buffer[8]=set_Temp_Display_Buffer[9] ;
set_Temp_Display_Buffer[9]=set_Temp_Display_Buffer[10] ;
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='3';
sel++;
}
if(K_FOUR == key)
{
while(Keys_Scan() == K_FOUR);
set_Temp_Display_Buffer[8]=set_Temp_Display_Buffer[9] ;
set_Temp_Display_Buffer[9]=set_Temp_Display_Buffer[10] ;
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='4';
sel++;
}
if(K_FIVE == key)
{
while(Keys_Scan() == K_FIVE);
set_Temp_Display_Buffer[8]=set_Temp_Display_Buffer[9] ;
set_Temp_Display_Buffer[9]=set_Temp_Display_Buffer[10] ;
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='5';
sel++;
}
if(K_SIX == key)
{
while(Keys_Scan() == K_SIX);
set_Temp_Display_Buffer[8]=set_Temp_Display_Buffer[9] ;
set_Temp_Display_Buffer[9]=set_Temp_Display_Buffer[10] ;
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='6';
sel++;
}
if(K_SEVEN == key)
{
while(Keys_Scan() == K_SEVEN);
set_Temp_Display_Buffer[8]=set_Temp_Display_Buffer[9] ;
set_Temp_Display_Buffer[9]=set_Temp_Display_Buffer[10] ;
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='7';
sel++;
}
if(K_EIGHT == key)
{
while(Keys_Scan() == K_EIGHT);
set_Temp_Display_Buffer[8]=set_Temp_Display_Buffer[9] ;
set_Temp_Display_Buffer[9]=set_Temp_Display_Buffer[10] ;
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='8';
sel++;
}
if(K_NINE == key)
{
while(Keys_Scan() == K_NINE);
set_Temp_Display_Buffer[8]=set_Temp_Display_Buffer[9] ;
set_Temp_Display_Buffer[9]=set_Temp_Display_Buffer[10] ;
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='9';
sel++;
}
if(K_ZERO == key)
{
while(Keys_Scan() == K_ZERO);
set_Temp_Display_Buffer[8]=set_Temp_Display_Buffer[9] ;
set_Temp_Display_Buffer[9]=set_Temp_Display_Buffer[10] ;
set_Temp_Display_Buffer[10]=set_Temp_Display_Buffer[11] ;
set_Temp_Display_Buffer[11]='0';
sel++;
}
}
if(sel==4)
{
key = Keys_Scan();
if(K_CLEAR == key)
{
while(Keys_Scan() == K_CLEAR);
set_Temp_Display_Buffer[8] =' ';
set_Temp_Display_Buffer[9] =' ';
set_Temp_Display_Buffer[10]=' ';
set_Temp_Display_Buffer[11]=' ';
M_Count=0;
cold=0;
warm=0;
sel=0;
}
if(K_OK == key)
{
while(Keys_Scan() == K_OK);
TEMP_SET=(set_Temp_Display_Buffer[8]-48)*10+(set_Temp_Display_Buffer[ 9]-48)+(set_Temp_Display_Buffer[11]-48)*0.1;
sel=0;
M_Count=1;
}
}
}
/*
void set()
{
uchar key;
key = Keys_Scan();
if(K_SET == key)
{
while(Keys_Scan() == K_SET);
S_Count=1;
M_Count=0;
cold=0;
warm=0;
set_Temp_Display_Buffer[8] =' ';
set_Temp_Display_Buffer[9] =' ';
set_Temp_Display_Buffer[10]=' ';
set_Temp_Display_Buffer[11]=' ';
}
if(K_UP == key)
{
while(Keys_Scan() == K_UP);
}
if(K_DOWN == key)
{
while(Keys_Scan() == K_DOWN);
}
if(S_Count)
{
set_num();
}
} */
LCD.h:
#ifndef _LCD_H
#define _LCD_H
#include<global.h>
extern void write_com(uchar com) ; extern void write_date(uchar date);
extern void init_lcd();
extern void Print();
#endif
LCD.c:
#include"global.h"
void delay1(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) //写命令函数
{
lcdrs=0; //选择写命令模式
P1=com; //将要写的命令字送到数据总线上
delay1(5); //稍作延时以待数据稳定
lcden=1; //使能端给一高脉冲,因为初始化函数中已经将lcden置零delay1(5); //稍作延时
lcden=0; //将使能端置0完成高脉冲
}
void write_date(uchar date) //写数据函数
{
lcdrs=1; //选择写数据模式
P1=date;
delay1(5);
lcden=1;
delay1(5);
lcden=0;
}
void init_lcd() //初始化函数
{
lcden=0;
write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c); //设置开显示,不显示光标
write_com(0x06); //写一个字符后地址指针加1
write_com(0x01); //显示清0,数据指针清0
}
void Print()
{
uchar num;
write_com(0x80);
for(num=0;num<15;num++)
{
write_date(Current_Temp_Display_Buffer[num]);
}
write_com(0x80+0x40);
for(num=0;num<13;num++)
{
write_date(set_Temp_Display_Buffer[num]);
}
}
附录2:系统的PCB图
毕业设计(论文)原创性声明和使用授权说明
原创性声明
本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作者签名:日期:
指导教师签名:日期:
使用授权说明
本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名:日期:
学位论文原创性声明
本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。
对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。
本人完全意识到本声明的法律后果由本人承担。
作者签名:日期:年月日
学位论文版权使用授权书
本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名:日期:年月日
导师签名:日期:年月日
指导教师评阅书
指导教师评价:
一、撰写(设计)过程
1、学生在论文(设计)过程中的治学态度、工作精神
□优□良□中□及格□不及格
2、学生掌握专业知识、技能的扎实程度
□优□良□中□及格□不及格
3、学生综合运用所学知识和专业技能分析和解决问题的能力□优□良□中□及格□不及格
4、研究方法的科学性;技术线路的可行性;设计方案的合理性□优□良□中□及格□不及格
5、完成毕业论文(设计)期间的出勤情况
□优□良□中□及格□不及格
二、论文(设计)质量
1、论文(设计)的整体结构是否符合撰写规范?
□优□良□中□及格□不及格
2、是否完成指定的论文(设计)任务(包括装订及附件)?□优□良□中□及格□不及格
三、论文(设计)水平
1、论文(设计)的理论意义或对解决实际问题的指导意义
□优□良□中□及格□不及格
2、论文的观念是否有新意?设计是否有创意?
□优□良□中□及格□不及格
3、论文(设计说明书)所体现的整体水平
□优□良□中□及格□不及格
建议成绩:□优□良□中□及格□不及格
(在所选等级前的□内画“√”)
指导教师:(签名)单位:(盖章)
年月日
评阅教师评阅书
评阅教师评价:
一、论文(设计)质量
1、论文(设计)的整体结构是否符合撰写规范?
□优□良□中□及格□不及格
2、是否完成指定的论文(设计)任务(包括装订及附件)?
□优□良□中□及格□不及格
二、论文(设计)水平
1、论文(设计)的理论意义或对解决实际问题的指导意义
□优□良□中□及格□不及格
2、论文的观念是否有新意?设计是否有创意?
□优□良□中□及格□不及格
3、论文(设计说明书)所体现的整体水平
□优□良□中□及格□不及格
建议成绩:□优□良□中□及格□不及格
(在所选等级前的□内画“√”)
评阅教师:(签名)单位:(盖章)
年月日。