593638906接口技术课程设计报告基于单片机的空调温度控制器设计

上传人:仙*** 文档编号:36023494 上传时间:2021-10-29 格式:DOC 页数:43 大小:600.50KB
返回 下载 相关 举报
593638906接口技术课程设计报告基于单片机的空调温度控制器设计_第1页
第1页 / 共43页
593638906接口技术课程设计报告基于单片机的空调温度控制器设计_第2页
第2页 / 共43页
593638906接口技术课程设计报告基于单片机的空调温度控制器设计_第3页
第3页 / 共43页
点击查看更多>>
资源描述
接口 技术课程设计报告 基于单片机的空调温度控制器设计基于单片机的空调温度控制器设计 学 院: 年级专业: 学 号: 姓 名: 指导教师: 完成时间: 成 绩: 摘 要设计了基于 AT89C52 的高精度家用空调温度控制系统,系统硬件主要由电源电路、温度采集电路(DS18B20) 、键盘、显示电路、输出控制电路及其他辅助电路组成;软件采用 8051C 语言编程;该系统可以完成温度的显示、温度的设定、空调的控制等多项功能。关键词:单片机;DS18B20;温度检测;显示目录目录1 设计目的及要求.11.1 设计目的和意义.11.2 设计任务与要求.12 硬件电路设计.22.1 总体方案设计.22.2 功能模块电路设计.32.2.1 单片机的选型.32.2.2 振荡电路设计.52.2.3 复位电路设计.52.2.4 键盘接口电路设计.62.2.5 温度测量电路设计.62.2.6 系统显示电路设计.72.2.7 输出控制电路设计.82.3 总电路设计.82.4 系统所用元器件.93 软件系统设计.103.1 软件系统总体方案设计.103.2 软件流程图设计.104 系统调试.125 总结.135.1 本系统存在的问题及改进措施 .13参考文献.14附录 1:系统的源程序清单.15附录 2:系统的 PCB 图.391 设计目的及要求1.1 设计目的和意义21 世纪的人们生活质量不断提高,同时也对高科技电子产业提出了更高的要求,为了使人们生活更人性化、智能化。我设计了这一基于单片机的空调温度控制系统,人们只有生活在一定的温度环境内才能长期感觉舒服,才能保证不中暑不受冻,所以对室内温度要求要高。对于不同地区空调要求不同,有的需要升温,有的需要降温。一般都要维持在 2126C。目前,虽然我国大量生产空调制冷产品,但由于我国人口众多,需求量过盛,在我国的北方地区,还有好多家庭还没有安装有效地室内温控系统。温度不能很好的控制在一定的范围内,夏天室内温度过高,冬天温度过低,这些均对人们正常生活带来不利的影响,温度、湿度均达不到人们的要求。以前温度控制主要利用机械通风设备进行室内、外空气的交换来达到降低室内温度,实现室内温度适宜人们生活。以前通风设备的开启和关停,均是由人手动控制的,即由人们定时查看室内外的温度、湿度情况,按要求开关通风设备,这样人们的劳动强度大,可靠性差,而且消耗人们体力,劳累成本过高。为此,需要有一种符合机械温控要求的低成本的控制器,在温差和湿度超过用户设定值范围时,启动制冷通风设备,否则自动关闭制冷通风设备。鉴于目前大多数制冷设备现在状况,我设计了一款基于 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 口工作在第二功能时从该端口可复用工作,某时刻该端口可以送出地址信号 A0A7,而另外的时刻该端口传送的是数据信号D0D7。利用 ALE 可以将地址信号 A0A7 锁存到地址锁存器。/VPP:该控制信号线也具有双重功能,是允许访问片外 ROM/编程高电压引线。EA:程序存储器允许输出控制端,常用作片外 ROM 的读控制信号,低电平有PSEN效。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 个按键,故选择的矩阵键盘。键盘接口电路如图 5 所示。44图图 5 键盘接口电路键盘接口电路2.2.5 温度测量电路设计 本系统的温度测量电路采用 DS18B20 来实现。DS18B20 是美国 DALLAS 半导体公司推出的第一片采用“一线总线”接口的温度传感器,它具有微型化、低功耗、高性能、抗干扰、能力强、易配微处理器等优点,可直接将温度转化成串行数字信号供处理器处理。DS18B20 的性能及特点2:适应电压范围宽,电压范围在,在寄生电源方式下可由数据线供电。V5 . 50 . 3独特的单线接口方式,它与微处理器连接时仅需一条口线即可实现微处理器与DS18B20 的双向通信。支持多点组网功能,多个 DS18B20 可以并联在唯一的三线上,实现组网多点测温。在使用中不需要任何外接元件,全部传感元件及转换电路集成在形如一只三极管的集成电路里。测温范围-55+125,在-10+85时精度为0.5。可编程分辨率为 912 位,对应的可分辨温度分别为 0.5,0.25,0.125和 0.0625,可实现高精度测温。在 9 位分辨率时,最多在 93.75ms 内把温度转换为数字;12 位分辨率时,最多在 750ms 内把温度值转换为数字。测量结果直接输出数字温度信号,以“一线总线”串行传送给 CPU,同时可传送CRC 校验码,具有极强的抗干扰纠错能力。负压特性。电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。系统温度测量电路如图 6 所示。图图 6 温度测量电路温度测量电路2.2.6 系统显示电路设计本系统采用 LCD1602 作为系统的显示器件,1602 字符型液晶是一种专门用来显示字母、数字、符号等的点阵型液晶模块,能分两行显示,它有若干个或者等75115点阵字符位组成,每个点阵字符位都可以显示一个字符。1602 型液晶接口信号如下:1 脚 VSS:电源地。2 脚 VDD:电源正极。3 脚 VO:液晶显示对比度调节端。4 脚 RS:数据/命令选择端(H/L)。5 脚 R/:读写选择端(H/L) 。W6 脚 E:使能信号。脚:数据口。147D7D015 脚 BL1:背光电源正极。16 脚 BL2:背光电源负极。系统显示电路如图 7 所示。图图 7 系统显示电路系统显示电路2.2.7 输出控制电路设计系统要求在当前室温低于设定温度时,能够自动驱动加热系统工作 ;在当前室温高于设定温度时能够自动驱动制冷系统工作。本系统在复位后即置 P26 脚和 P27 脚为低电平,在当前室温低于设定温度时,通过置 P27 脚为高电平来驱动后级加热系统,本系统采用红色 LED 来代替加热系统;在当前室温高于设定温度时,通过置 P26 脚高电平来驱动后级制冷系统,本系统采用蓝色 LED 来代替制冷系统。输出控制电路如图 8 所示。图图 8 输出控制电路输出控制电路2.3 总电路设计系统总电路图如图 9 所示。图图 9 系统总电路图系统总电路图2.4 系统所用元器件本系统所用的元器件清单如表 1 所示。 表表 1 系统所用元器件系统所用元器件元器件名称元器件名称数量数量点触式开关1630pF 瓷片电容210uF 电解电容1蓝色 LED1红色 RED15V 电源插座1自锁开关1LCD160211/4W10K 电阻310K 可调电阻1AT89C521DS18B20112MHz 晶振13 软件系统设计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 总结总结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#define uchar unsigned char/宏定义#define uint unsigned int#defineK_UP 0X20/定义键值#defineK_DOWN 0X21#defineK_CLEAR 0X24#defineK_OK 0X25#defineK_ONE 0X30#defineK_FOUR 0X31#defineK_SEVEN 0X32#defineK_POINT 0X33#defineK_TWO 0X34#defineK_FIVE 0X43#defineK_EIGHT0X36#defineK_ZERO0X37#defineK_THREE0X38#defineK_SIX 0X40#defineK_NINE0X41#defineK_SET 0X42extern 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=P21;/液晶使能sbit lcdrs=P20;/液晶数据/命令选择端sbit DQ =P22;/DS18B20 数据端sbit XX =P25;/读写选择端sbit cold =P26;/输出信号sbit warm =P27;/输出信号#endifmain.c:#include#includeglobal.h#includekey.h#include18B20.h#includeLCD.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 =0 x00 ; /设置定时器 0 的工作方式TH0 = (8192-5000)/32;/单片机晶振为 12MHz,机器周期为 1us,t=5ms, /N=5000/1=5000TL0 = (8192-5000)%32;IE =0 x82;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_NOWTEMP_SET)cold=1;warm=0;if(TEMP_NOW=TEMP_SET)cold=0;warm=0;18B20.h:#ifndef _18B20_H#define _18B20_H#includeglobal.hextern uchar Init_DS18B20(); extern void Read_Temperature();extern void Display_Temperature();#endif18B20.c:#includeglobal.h#include intrins.h#define delayNOP() _nop_();_nop_();_nop_();_nop_();uchar code Temperature_Char8 = 0 x0c,0 x12,0 x12,0 x0c,0 x00,0 x00,0 x00,0 x00;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=0 x00,0 x00;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= 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= 1;void Read_Temperature() if(Init_DS18B20()=1)DS18B20_IS_OK=0;elseWriteOneByte(0 xcc);WriteOneByte(0 x44);Init_DS18B20();WriteOneByte(0 xcc);WriteOneByte(0 xbe);Temp_Value0 = ReadOneByte(); Temp_Value1 = ReadOneByte();DS18B20_IS_OK=1;void Display_Temperature()uchar t = 150, ng = 0;if(Temp_Value1&0 xf8)=0 xf8) Temp_Value1 = Temp_Value1;Temp_Value0 = Temp_Value0+1;if(Temp_Value0=0 x00)Temp_Value1+;ng = 1;Display_Digit0 = df_TableTemp_Value0&0 x0f;CurrentT = (Temp_Value0&0 xf0)4) | (Temp_Value1&0 x07)4);Display_Digit3 = CurrentT/100;Display_Digit2 = CurrentT%100/10;Display_Digit1 = CurrentT%10;Current_Temp_Display_Buffer11 = Display_Digit0 + 0;Current_Temp_Display_Buffer10 = .;Current_Temp_Display_Buffer9 = Display_Digit1 + 0;Current_Temp_Display_Buffer8 = Display_Digit2 + 0;Current_Temp_Display_Buffer7 = Display_Digit3 + 0;TEMP_NOW=Display_Digit2*10+Display_Digit1+Display_Digit0*0.1 ;if(Display_Digit3 = 0)Current_Temp_Display_Buffer7 = ;if(Display_Digit2 = 0&Display_Digit3=0)Current_Temp_Display_Buffer8 = ;if(ng)TEMP_NOW=-(Display_Digit2*10+Display_Digit1+Display_Digit0*0.1); if(Current_Temp_Display_Buffer8 = )Current_Temp_Display_Buffer8 = -;else if(Current_Temp_Display_Buffer7 = )Current_Temp_Display_Buffer7 = -;else Current_Temp_Display_Buffer6 = -; KEY.h:#ifndef _KEY_H#define _KEY_H#includeextern unsigned char Keys_Scan();extern void set_num();extern void set();#endifKEY.c:#include #include #include #include18B20.huchar code KeyCodeTable= 0 x11,0 x12,0 x14,0 x18,0 x21,0 x22,0 x24,0 x28,0 x41,0 x42,0 x44,0 x48,0 x81,0 x82,0 x84,0 x88;void Delay_key() uchar i;for(i=0;i200;i+);uchar Keys_Scan() uchar sCode,kCode,k;P3 = 0 xf0;if(P3&0 xf0)!=0 xf0) Delay_key();if(P3&0 xf0)!=0 xf0) sCode = 0 xfe;for(k=0;k47)&(set_Temp_Display_Buffer1147)&(set_Temp_Display_Buffer947)&(set_Temp_Display_Buffer848)&(set_Temp_Display_Buffer1148)&(set_Temp_Display_Buffer948)&(set_Temp_Display_Buffer858) set_Temp_Display_Buffer8-=1;else if(set_Temp_Display_Buffer8=48) set_Temp_Display_Buffer8=57; if(K_ONE = key)while(Keys_Scan() = K_ONE);set_Temp_Display_Buffer11=1;sel+;if(K_TWO = key)while(Keys_Scan() = K_TWO);set_Temp_Display_Buffer11=2;sel+;if(K_THREE = key)while(Keys_Scan() = K_THREE);set_Temp_Display_Buffer11=3;sel+;if(K_FOUR = key)while(Keys_Scan() = K_FOUR);set_Temp_Display_Buffer11=4;sel+;if(K_FIVE = key)while(Keys_Scan() = K_FIVE);set_Temp_Display_Buffer11=5;sel+;if(K_SIX = key)while(Keys_Scan() = K_SIX);set_Temp_Display_Buffer11=6;sel+;if(K_SEVEN = key)while(Keys_Scan() = K_SEVEN);set_Temp_Display_Buffer11=7;sel+;if(K_EIGHT = key)while(Keys_Scan() = K_EIGHT);set_Temp_Display_Buffer11=8;sel+;if(K_NINE = key)while(Keys_Scan() = K_NINE);set_Temp_Display_Buffer11=9;sel+;if(K_ZERO = key)while(Keys_Scan() = K_ZERO);set_Temp_Display_Buffer11=0;sel+;if(K_OK = key)while(Keys_Scan() = K_OK);TEMP_SET=(set_Temp_Display_Buffer8-48)*10+(set_Temp_Display_Buffer9-48)+(set_Temp_Display_Buffer11-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_Buffer8 = ;set_Temp_Display_Buffer9 = ;set_Temp_Display_Buffer10= ;set_Temp_Display_Buffer11= ; M_Count=0;cold=0;warm=0;sel=0; if(K_ONE = key)while(Keys_Scan() = K_ONE);set_Temp_Display_Buffer10=set_Temp_Display_Buffer11 ;set_Temp_Display_Buffer11=1;sel+;if(K_TWO = key)while(Keys_Scan() = K_TWO);set_Temp_Display_Buffer10=set_Temp_Display_Buffer11 ;set_Temp_Display_Buffer11=2;sel+;if(K_THREE = key)while(Keys_Scan() = K_THREE);set_Temp_Display_Buffer10=set_Temp_Display_Buffer11 ;set_Temp_Display_Buffer11=3;sel+;if(K_FOUR = key)while(Keys_Scan() = K_FOUR);set_Temp_Display_Buffer10=set_Temp_Display_Buffer11 ;set_Temp_Display_Buffer11=4;sel+;if(K_FIVE = key)while(Keys_Scan() = K_FIVE);set_Temp_Display_Buffer10=set_Temp_Display_Buffer11 ;set_Temp_Display_Buffer11=5;sel+;if(K_SIX = key)while(Keys_Scan() = K_SIX);set_Temp_Display_Buffer10=set_Temp_Display_Buffer11 ;set_Temp_Display_Buffer11=6;sel+;if(K_SEVEN = key)while(Keys_Scan() = K_SEVEN);set_Temp_Display_Buffer10=set_Temp_Display_Buffer11 ;set_Temp_Display_Buffer11=7;sel+;if(K_EIGHT = key)while(Keys_Scan() = K_EIGHT);set_Temp_Display_Buffer10=set_Temp_Display_Buffer11 ;set_Temp_Display_Buffer11=8;sel+;if(K_NINE = key)while(Keys_Scan() = K_NINE);set_Temp_Display_Buffer10=set_Temp_Display_Buffer11 ;set_Temp_Display_Buffer11=9;sel+;if(K_ZERO = key)while(Keys_Scan() = K_ZERO);set_Temp_Display_Buffer10=set_Temp_Display_Buffer11 ;set_Temp_Display_Buffer11=0;sel+;if(sel=2)key = Keys_Scan(); if(K_CLEAR = key)while(Keys_Scan() = K_CLEAR);set_Temp_Display_Buffer8 = ;set_Temp_Display_Buffer9 = ;set_Temp_Display_Buffer10= ;set_Temp_Display_Buffer11= ; M_Count=0;cold=0;warm=0;sel=0; if(K_POINT = key)while(Keys_Scan() = K_POINT);set_Temp_Display_Buffer9=set_Temp_Display_Buffer10 ;set_Temp_Display_Buffer10=set_Temp_Display_Buffer11 ;set_Temp_Display_Buffer11=.;sel+;if(sel=3)key = Keys_Scan(); if(K_CLEAR = key)while(Keys_Scan() = K_CLEAR);set_Temp_Display_Buffer8 = ;set_Temp_Display_Buffer9 = ;set_Temp_Display_Buffer10= ;set_Temp_Display_Buffer11= ; M_Count=0;cold=0;warm=0;sel=0; if(K_ONE = key)while(Keys_Scan() = K_ONE);set_Temp_Display_Buffer8=set_Temp_Display_Buffer9 ;set_Temp_Display_Buffer9=set_Temp_Display_Buffer10 ;set_Temp_Display_Buffer10=set_Temp_Display_Buffer11 ;set_Temp_Display_Buffer11=1;sel+;if(K_TWO = key)while(Keys_Scan() = K_TWO);set_Temp_Display_Buffer8=set_Temp_Display_Buffer9 ;set_Temp_Display_Buffer9=set_Temp_Display_Buffer10 ;set_Temp_Display_Buffer10=set_Temp_Display_Buffer11 ;set_Temp_Display_Buffer11=2;sel+;if(K_THREE = key)while(Keys_Scan() = K_THREE);set_Temp_Display_Buffer8=set_Temp_Display_Buffer9 ;set_Temp_Display_Buffer9=set_Temp_Display_Buffer10 ;set_Temp_Display_Buffer10=set_Temp_Display_Buffer11 ;set_Temp_Display_Buffer11=3;sel+;if(K_FOUR = key)while(Keys_Scan() = K_FOUR);set_Temp_Display_Buffer8=set_Temp_Display_Buffer9 ;set_Temp_Display_Buffer9=set_Temp_Display_Buffer10 ;set_Temp_Display_Buffer10=set_Temp_Display_Buffer11 ;set_Temp_Display_Buffer11=4;sel+;if(K_FIVE = key)while(Keys_Scan() = K_FIVE);set_Temp_Display_Buffer8=set_Temp_Display_Buffer9 ;set_Temp_Display_Buffer9=set_Temp_Display_Buffer10 ;set_Temp_Display_Buffer10=set_Temp_Display_Buffer11 ;set_Temp_Display_Buffer11=5;sel+;if(K_SIX = key)while(Keys_Scan() = K_SIX);set_Temp_Display_Buffer8=set_Temp_Display_Buffer9 ;set_Temp_Display_Buffer9=set_Temp_Display_Buffer10 ;set_Temp_Display_Buffer10=set_Temp_Display_Buffer11 ;set_Temp_Display_Buffer11=6;sel+;if(K_SEVEN = key)while(Keys_Scan() = K_SEVEN);set_Temp_Display_Buffer8=set_Temp_Display_Buffer9 ;set_Temp_Display_Buffer9=set_Temp_Display_Buffer10 ;set_Temp_Display_Buffer10=set_Temp_Display_Buffer11 ;set_Temp_Display_Buffer11=7;sel+;if(K_EIGHT = key)while(Keys_Scan() = K_EIGHT);set_Temp_Display_Buffer8=set_Temp_Display_Buffer9 ;set_Temp_Display_Buffer9=set_Temp_Display_Buffer10 ;set_Temp_Display_Buffer10=set_Temp_Display_Buffer11 ;set_Temp_Display_Buffer11=8;sel+;if(K_NINE = key)while(Keys_Scan() = K_NINE);set_Temp_Display_Buffer8=set_Temp_Display_Buffer9 ;set_Temp_Display_Buffer9=set_Temp_Display_Buffer10 ;set_Temp_Display_Buffer10=set_Temp_Display_Buffer11 ;set_Temp_Display_Buffer11=9;sel+;if(K_ZERO = key)while(Keys_Scan() = K_ZERO);set_Temp_Display_Buffer8=set_Temp_Display_Buffer9 ;set_Temp_Display_Buffer9=set_Temp_Display_Buffer10 ;set_Temp_Display_Buffer10=set_Temp_Display_Buffer11 ;set_Temp_Display_Buffer11=0;sel+;if(sel=4)key = Keys_Scan(); if(K_CLEAR = key)while(Keys_Scan() = K_CLEAR);set_Temp_Display_Buffer8 = ;set_Temp_Display_Buffer9 = ;set_Temp_Display_Buffer10= ;set_Temp_Display_Buffer11= ; M_Count=0;cold=0;warm=0;sel=0; if(K_OK = key)while(Keys_Scan() = K_OK);TEMP_SET=(set_Temp_Display_Buffer8-48)*10+(set_Temp_Display_Buffer9-48)+(set_Temp_Display_Buffer11-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_Buffer8 = ;set_Temp_Display_Buffer9 = ;set_Temp_Display_Buffer10= ;set_Temp_Display_Buffer11= ;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#includeextern void write_com(uchar com) ;extern void write_date(uchar date);extern void init_lcd();extern void Print();#endifLCD.c:#includeglobal.hvoid delay1(uint z) /延时函数uint x,y;for(x=z;x0;x-)for(y=110;y0;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(0 x38); /设置 16*2 显示,5*7 点阵,8 位数据接口write_com(0 x0c); /设置开显示,不显示光标write_com(0 x06); /写一个字符后地址指针加 1write_com(0 x01); /显示清 0,数据指针清 0void Print()uchar num;write_com(0 x80);for(num=0;num15;num+)write_date(Current_Temp_Display_Buffernum);write_com(0 x80+0 x40);for(num=0;num13;num+) write_date(set_Temp_Display_Buffernum);附录 2:系统的 PCB 图
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!