智能恒温控制系统设计
Prepared on 24 November 2020
无锡工艺职业技术学院
毕业设计(论文)
题 目: 智能恒温控制系统设计
院 系: 电子信息系 专 业: 应用电子技术 学 号:
学生姓名: 方久磊 指导教师: 路红娟 职 称: 高级工程师
2016年 04 月 25 日
目 录
摘要------------------------------------------------------------------------------------------------------3
前言------------------------------------------------------------------------------------------------------4
4
摘 要
本课题设计是一个以AT89C51单片机为主控制模块,从而实现了根据温度设定,自动调节相应的温度,这个设计中包括了感应模块、加热制冷装置、单片机模块、存储模块、驱动模块、时钟模块和键盘输入模块,显示模块共同组成。本课题侧重于时钟模块、输入模块和存储模块进行方案论证,该系统电路结构简单、温控效果好、操作方便、智能化程度高。
关键词:AT89C51单片机 DS1302时钟模块 FM24C256 存储器
前 言
智能恒温控制系统已在很多生产领域中得到广泛应用。目前,国外温度控制系统及仪表正朝着高精度智能化、小型化等方面快速发展。而在国内随着嵌入式系统开发技术的快速发展,作为高新技术之一的单片机以其体积小、价格低、可靠性高、适用范围大以及本身的指令系统等诸多优势,在各个领域、各个行业都得到了广泛应用。传统的恒温控制器多由继电器组成,但是继电器的触点的使用寿命有限、故障率偏高,稳定性差、无法满足现代的温度控制要求。而随着计算机技术的发展,嵌入式微型计算机在工业中得到越来越多的应用。将嵌入式系统应用在温度控制系统中。使得智能恒温控制变得更小型,更
智能化。在温度控制系统在工业生产环节中,存在惯性大、滞后大、非线性、温度变化缓慢等的不利因素,使得控制性能难以提高,有些工艺过程其温度控制的好坏直接影响着产品的质量;由于环境的不同恒温控制系统无法改变,无法做到随环境的变化而改变内部恒定的温度值。因而设计一种较为理想的温度控制系统是非常有价值的。
本文叙述了使用AT89C51型单片机实行对温度控制的设计过程。本设计由键盘电路输入设定温度和温度传感器采集的当前温度进行比较,通过设计电路实现温度的升高和降低从而实现智能恒温控制的目的。
1 系统设计
系统框图
图1 系统框图
系统说明
本系统由温度感应模块、电源模块、单片机主控模块、液晶显示模块、输入模块、时钟模块、存储模块、加热/制冷装置、驱动电路等组成。 系统各部分作用
(1)感应模块
当感应模块感应到到外界环境温度时,通过温度传感器感应被测温度,温度传感器可以将被测温度的数据做出相应的处理,把模拟信号转换成数字信号,并将数字信号传输给单片机处理。
电源模块
整流、滤波、稳压组成了整个电路。整流电路将220V的交流电压转变成脉动直流电压即为正路电路中所需的电压,再把脉动直流电压转变成较小的脉动直流电压,通过集成稳压器得到电路所需的直流电压。
液晶显示模块
显示模块在本次设计中主要承担显示数据参数的作用,用电压的高低控制光的通过量,从而把电信号转换成光像。它可以实时地将测量电路测得的数据经过微处理器处理后直观的显示出来
输入模块
采用4*4键盘输入,每个按键相当于一个开关,输入到单片机中,单片机进行数据处理,主要是利用行列扫描,来检测是否有那个键被按下本系统中,输入模块采用4*4阵势设计,共十六个按键。设计内容为数字键0~9、温度上调按钮、温度下调按钮、停止按钮、清零按钮、复位按钮。
时钟模块
使用DS1302时钟芯片实时时钟可提供秒、分、时、日、星期、月和年,一个月小于31天时可以自动调整,且具有闰年补偿功能。
存储模块
使用FM24C256存储芯片进行存储,当地址信息被发送后,主机和
FM24C256之间的数据传送就会开始,对于读操作,FM24C256将把8位数据放在
总线上,然后等待主机的应答,如果主机答应,FM24C256将开始传送下一个连续字节。由时钟芯片的时钟脉冲控制的模块,将设定好的数据存储起来,再在一定的需求之后,将数据读出。
(7)单片机主控模块
当被测信号经过整形放大输入到单片机,单片机主要将输入的被测信号进行处理,完成对存储数据的读取,对检测到的数据进行处理,并根据相应的数据关系把数据信号输送到显示电路中显示实时时间和温度。
(8)驱动模块
驱动电路主要是将单片机输出的脉冲进行功率放大,送入加热制冷驱动电路时,光电耦合器对来自单片机信号做出处理使单片机信号能够被H桥电路所执行,当信号指示加热时,半导体加热制冷片加热;反之,半导体加热制冷片制冷。
如图1所示,首先由感应模块感应到外界环境的温度,作用到单片机上,将环境的温度信号与输入模块设置的环境温度参数进行比较,根据比较结果,单片机发出相应的控制指令,通过驱动电路进行加热或者制冷。将结果通过存储器存储,并在液晶显示器上显示当时的温度与时间参数。
2 单元电路设计
方案论证 时钟模块
方案一:由PCF8563芯片构成的时钟模块
图2 PCF8563芯片构成的时钟模块
如上图所示,该电路由PCF8563芯片构成的时钟模块,PCF8563内部有16个可寻址的8位并行寄存器,前两个寄存器用作控制寄存器和状态寄存器,02H~08H用于时钟计数器(秒到年计数器),09H~0CH用于报警寄存器(定义报警条件),0DH用于控制CLKOUT管脚的输出频率,0EH和0FH分别用作定时器控制寄存器和定时器寄存器。秒、分钟、小时、日、月、年、分钟报警、小时报警、日报警寄存器的编码格式为BCD码,星期和星期报警寄存器不以BCD格式编码。PCF8563采用的是串行I2C总线接口,通过两条线SDA和SCL在不同的芯片和模块间传递信息。SDA为串行数据线,SCL为串行时钟线,两条线都必须用上拉电阻与正电源相连。数据只在总线不忙时才可传送。
方案二:由DS1302构成的时钟模块
图3 DS1302芯片构成的时钟模块
如上图所示,该电路图是由DS1302构成的时钟模块,DS1302的通讯端由3个接口线组成,分别为RST,SCLK,I/O,其中RST从低电平变成高电平启动一次数据传输过程,SCLK是时钟线,I/O是数据线。数据在时钟(SCLK)的上升沿串行输入,前8位指定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输出数据。时钟脉冲的个数在单字节方式下为8+8(8位地址+8位数据),在多字节方式下为8加最多可达248的数据。
实时时钟/日历电路提供秒、分、时、日、日期、月、年的信息,每月的天数和闰月的天数可自动调整,时钟操作可通过AM/PM指示决定采用24或12小时格式DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线:(1)RES复位(2)I/O数据线,(3)SCLK串行时钟/RAM的读写数据以一个字节或多达31个字节的字符组方式通信。DS1302工作时功耗很低,保持数据和时钟信息时功率小于1mW。
方案三:由DS12C887构成的时钟模块
图4 DS12C887芯片构成的时钟模块
如上图所示,该电路主要由DS12C887与电容组成的时钟模块。DS12887采用8位地址/数据复用的总线方式,具有一个锁存引脚,通过读、写、锁存信号实现其内部数据的输入输出,控制内部的控制寄存器、读取内部的时间信息寄存器。DS12887的各种寄存器在其内部空间都有相应的固定地址,因此,单片机通过正确的寻址和寄存器操作就可以获取需要的时间信息。
在使用DS12887时,首先要初始化,主要是打开晶振、对控制寄存器A、B写入控制字以及对日历、时钟各寄存器写入初始值。除校时外,上电时不用再次初始化。第一次初始化时,应禁止操作DS12887内部更新周期,即先将寄存器B的SET位置“1”,然后初始化时标寄存器(00H~09H)和状态寄存器A,再通过读寄存器C清除中断标志,读寄存器D将VRT位置“1”,最后将寄存器B的SET位清零,DS12887开始计时。
设置日历时钟,必须保证时钟芯片DS12887处于设置状态,即SET=1,然后向DS12887的专用寄存器写入时间信息,写入完毕后,DS12887恢复正常数据更新状态,即SET=0。在读取日历时钟芯片DS12887的时钟信息时,必须保证UIP=0,然后读取存储其内部寄存器的时钟信息。
由以上三个论证方案比较得出,三种不同芯片构成的时钟模块在原理、方法,功耗等这些方面相比,由DS1302芯片构成的时钟模块不管硬件电路结构还是运行程序都要简洁得多,功耗也低,而且利用DS1302时钟芯片独立于单片机来计时,在提高计时进度的同时也提高了整个系统的抗干扰能力。所以我选择方案二的DS1302时钟模块。 存储模块
方案一:由FM24C256构成的存储模块
图5 FM24C256芯片构成的存储模块
由上图可知,该电路由FM24C256芯片构成的存储模块,当地址信息被发送后,主机和FM24C256之间的数据传送就会开始,对于读操作,FM24C256将把8位数据放在总线上,然后等待主机的应答,如果主机答应,FM24C256将开始传送下一个连续字节。如果主机没有答应,FM24C256将结束当前的读操作。对于写操作,FM24C256接受主机发送的8位数据后,给出应答。所有数据都以高位在前方式传送。
方案二:由6264构成的外接存储模块
图6 6264芯片构成的外接存储模块
由上图可知,该电路由6264存储芯片构成的存储模块,由于单片机内只有低于128byte数据寄存器可供用户使用,且指令本身也占据了一些字节空间,而每一个汉字符就占据了32kb的空间,因此,当显示字符较多时使用片内寄存器作为接受来自PC机的数据的数据缓冲区是不可取的方法。为了能够存储和显示更多的字符,我们外接了6264作为片外数据储存器,空间大小为8KB,能容纳260多个字符(一个字符占用32byte),同时采用movx dptr类指令作为寻址指针。
方案三:由AT24C1024构成的存储模块
图7 AT24C1024芯片构成的存储模块
由上图可知,该电路由AT24C1024芯片构成的存储模块,该移动式固态存储器是用在水文观测站的遥测终端机上作为雨量和水位数据的存储器。SDA引脚通常被外部设备拉高,SDA引脚仅在SCL低电平时可以改变。SCL在高电平期间,数据变化将引起启动和停止条件。
开始条件:在SCL为高时,SDA从高到底变化时产生启始条件,它必须先于任何其他命令;
停止条件:在SCL为高时,SDA从低至高变化时产生停止条件,读时序后,停止命令将放置在EEPROM的待机电源模式下。应答:所有的地址和数据都是以8位串行方式从EEPROM输入输出。
待机模式:AT24C1024具有低功耗待机模式,启用条件:1)上电2)接受到停止位以后和任何内部操作完成。
记忆恢复:在协议中断后,断电或系统复位后,任何2线部分可以按一下步骤重置:
(1)时钟高达9次;
(2)当SCL为高时,寻找SDA的每个周期的高电平。 (3)产生一个开始条件
由以上三个论证方案比较得出,FRAM(FM24C256)是一种新型存储器,最大特点是可以随总线速度无限次的擦写,而且功耗低,FRAM(FM24C256)性能优越于EEPROM,6264外接存储器。FM24C256的应用逐渐被推广和认可,尤其是大容量存储器,它的优良特性远高于同等容量的EEPROM,在电子式电能表行业中,数据安全保存是最重要的。FM24C256在电能表中的使用,会提高电能表的数据安全存储特性。 输入模块
如图8所示,该电路是由按键和电阻构成的4*4输入模块,矩阵键盘又成为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘,在行线和列线的每一个交叉点上,设置一个按键。这样键盘中按键的个数是4*4个。这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。单片机与该电路连接时,使用4个端口作为输出口,接4条行扫描线;在本接受中,使用AT89C51单片机的~这8个端口作4*4键盘的扫描,~接行扫描线,~.接列扫描线。
图8 4*4输入模块电路图
键盘功能设置
图9 4*4矩阵键盘结构设计图
功能说明
按键 作用 S0 按下按键,显示数字0 S2 按下按键,显示数字2 S4 S6 S8 S10 S12 S14 按下按键,显示数字4 按下按键,显示数字6 按下按键,显示数字8 开始按键 复位按键 上移/下移按键 按键 作用 S1 按下按键,显示数字1 S3 按下按键,显示数字3 S5 S7 S9 S11 S13 S15 按下按键,显示数字5 按下按键,显示数字7 按下按键,显示数字9 停止按键 Delete(删除按键) 左移/右移按键 核心器件介绍 DS1302时钟芯片
(1)器件概述
DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为~。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
(2)内部结构及工作原理
图11 时钟模块内部结构
DS1302工作时为了对任何数据传送进行初始化,需要将复位脚(RST)置为高电平且将8位地址和命令信息装入移位寄存器。数据在时钟(SCLK)的上升沿串行输入,前8位指定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输出数据。时钟脉冲的个数在单字节方式下为8+8(8位地址+8位数据),在多字节方式下为8加最多可达248的数据。
(3)外观与管脚说明
图12 外观实物图 图13 芯片管脚图 芯片管脚说明:
X1、X2:连接晶振管脚,为芯片提供定时脉冲。 GND:接地。
RST:芯片强制复位脚。 I/O:数据输入/输出引脚。
SCLK:串行时钟提供端,在上升沿实现数据读操作,在下降沿实现数据写操作。
VCC1、VCC2:双电源供电管脚。 FM24C256存储芯片
(1)概述
FM24C256是用先进的铁电技术制造的256K位的非易失性存储器。铁电随即存储器(FRAM)具有非易失性,并且可以向RAM一样快速读写,数据在掉电后可以保存10年,相对于EEPROM或其他非易失性存储器,FRAM具有系统可靠性更高,结构更简单等诸多优点。
(2)内部结构及工作原理
图14 存储模块内部结构
上图为FM24C256芯片构成的存储模块内部结构,它是由计数器、地址锁存器、4096*64 FRAM阵列、数据锁存器、串并转换器、控制逻辑构成的。当访问FM24C256时,用户可以用8位数据访问32768个地址单元。这些数据均为串行位移数据。这32768个地址遵循2线通讯协议,包括:从地址和扩展的16位地址。只有低15位用于访问存储器的地址解码。最高位必须设置为0以兼容今后的更高容量的器件。
存储器以2线总线的速度进行读或写。不像EEPROM,它没有必要由于写占据总线而插入准备状态。当写操作完成时一个新的数据传输就开始了。
(1)外观与管脚说明
图15 外观实物图 图16 芯片管脚图 (2)芯片管脚说明: 管脚名称 类型 描述 A0-A2 WP SDA SCL 地址2-0;这些管脚用于对二线制总线上的最多8个相同期间IN 惊醒编址,三个管脚所对应的地址值必须与包含在器件地址值中的相应一致。三个地址管脚在器件内部已接下拉电阻。 写保护;当WP为高电平时,整个内存被写保护;当WP为低电平时,写保护实效。所有地址空间都可以进行写操作。这个管IN 脚已经被内部下拉。 串行地址/数据管脚;这个双向引脚用来传递地址和输入输出数据。这是一个开漏输出,以便与其他器件通过“线或”并接在I/O 双线总线上输入缓冲区集成施密特触发器用以提高抗干扰性能,输出驱动器具有下降沿斜率控制。此端口必须加上拉电阻。 串行时钟;两线制总线的串行时钟输入。数据在时钟的下降沿移出器件,在时钟的上升沿移入器件,时钟端口同样具有施密IN 特触发器用以提高抗干扰性能。 VDD Supply 电源电压:5V VSS Supply 电源地 单元电路设计
单元模块电路
图17 单元电路电路图
单元模块原理说明
由上图可知,单元电路模块是由输入模块、时钟模块和存储模块构成。首先按下4*4键盘输入模块的开始按键,在液晶显示器上会显示出一个不定的时间与温度数值,根据显示的内容判断它是否需要调节时间和温度。如果需要调节,就按下设置按键,增加或减少时间与温度的数值,以达到规定的数值。再传送到单片机的控制模块,经过单片机的内部程序操作,给出一个信号,使之传输到液晶显示器上,显示出当时的时间与温度;接着通过DS1302时钟模块数据在时钟(SCLK)的上升沿串行输入,前8位指定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输出数据。最后用FM24C256存储器存储液晶显示器上显示的时间日历与温度参数。
3 软件设计
时钟模块
时钟模块采用DS1302时钟芯片,根据它的工作原理,数据在时钟(SCLK)的上升沿串行输入,前8位指定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输出数据。主要是在液晶显示器上面显示当时的时间、温度数据,所以流程如下图所示
图18 DS1302时钟芯片流程图
FM24C256存储模块
由FM24C256芯片构成的存储模块,当地址信息被发送后,主机和
FM24C256之间的数据传送就会开始,对于读操作,FM24C256将把8位数据放在总线上,然后等待主机的应答,如果主机答应,FM24C256将开始传送下一个连续字节。如果主机没有答应,FM24C256将结束当前的读操作。对于写操作,FM24C256接受主机发送的8位数据后,给出应答。所有数据都以高位在前方式传送。流程图如下图所示。
图19 FM24C256存储芯片流程图
输入模块
先按下开始按键,在液晶显示器上显示出时间与温度,再根据显示的内容判断是否调节时间与温度。如果需要调节就再按下设置按键,进去设置界面,根据要求设定时间与温度的增加或者减少,修改完成后,在显示器上显示出来;如果不需要调节,再判断显示是否需要调节,根据显示的内容,进行左右上下的移动。流程图如下图所示
图20 4*4键盘软件工作流程图
4 总体电路设计
系统总电路
图21 系统总电路
系统电路如图21所示,首先通过DS18B20传感器感应环境温度通过端口传送到单片机进行处理;再按下4*4键盘输入模块的开始按键,在液晶显示器上会显示出一个不定的时间与温度数值,根据显示的内容判断它是否需要调节时间和温度。如果需要调节,就按下设置按键,增加或减少时间与温度的数值,以达到规定的数值。再传送到单片机的控制模块,温度传感器感知到外界温度过后把温度变换成数字信号发送给单片机。然后单片机会发出指令信号给制冷加热驱动模块,驱动模块驱动制冷片,让制冷片开始工作。如果外界温度低于设定的温度,制冷片将导入反向电流,从而达到加热效果。反之,即导入正向电流,达到制冷的效果。与此同时,从输入模块输入到单片机中的温度信号再传送给显示模块,显示模块将它转换成数字信号,在液晶显示器上显示出来。如果感应模块一开始就与外界温度一致时,整个操作系统将立即停止,等到下一次出现温差时,系统又会自动重新工作,在此时,时钟模块会将相应的时间等信息送回单片机内,由单片机传输到液晶显示器上,并储存下来。
5 小结
设计的优缺点 优点:
液晶显示,直观,很方便的显示出温度等参数,让人一目了然。
设计中采用到的DS18B20温度传感器,操作简便,功耗较低,环境适应能力强,并且测温范围较宽、此数字温度计可靠性高,非常精确能够让总体设计更加精确,质量较好,内部结构非常精密。
半导体加热/制冷片是新型的半导体材料,既能提供热源,也能提供冷源;无需其他的设备进行传热。
本设计可应用于多种场合、环境,功能完善,十分人性化; 缺点:
加热/制冷效率较低;功率也较低,不能应用于较大的设备中。 没有相应的报警装置。
本设计属于半自动化的,实现功能比较麻烦。
结语
本次的毕业设计算是我大学学业生涯的一个完结,经过几个月的奋战,我的终于完成了。想想当初还没有做以前,觉得只是对这三年来所学知识的一个单纯总结,但是通过这次做毕业设计发现自己的看法有点太片面了。毕业设计不仅仅是对大学三年所学知识的一种检验,而且也是对自己能力的一种提高。通过这次毕业设计使我明白了自己原来知识还比较欠缺。自己要学习的东西还太多,以前老是觉得自己什么东西都会,什么东西都懂一些,甚至有点。但通过这次的毕业设计,我才明白,学习是一个长期积累的过程,在以后的工作、生活中我都应该不断的学习,努力提高自己的知识和综合素质。
在此要十分感谢我的指导老师,路老师对我悉心的指导,感谢老师在这几个月中给我的帮助。在设计过程中,我通过查阅大量有关资料,与同学交流经验和自学,并向老师请教等方式,使自己学到了不少知识,也经历了不少困难,但收获同
样巨大。在整个设计中我懂得了许多东西,也培养了我独立工作的能力,树立了对自己工作能力的信心,我相信这会对今后的学习、工作、生活有着非常重要的影响。而且大大提高了动手的能力,使我充分体会到了在创造过程中探索的艰难和成功时的喜悦。虽然这个设计做的也不太好,但是在设计过程中所学到的东西是这次毕业设计的最大收获和财富,使我终身受益。
6 参考文献
【1】曹才开等 《电路分析基础》 北京清华大学出版社
【2】胡汉才《单片机原理及其接口技术》北京清华大学出版社 1996 【3】刘守义《单片机应用技术第二版》西安电子科技大学出版社
【4】黄惠媛,李润国主编《单片机原理与接口技术[M]》 北京 海洋出版社 2006
【5】郭天祥.《51单片机C语言教程》.北京:电子工业出版社.2008 【6】韩春光等 《模拟电子技术与实践》 北京电子工业出版社 【7】张克明.MCS-51单片机实用教程.北京:科学出版社,2010
【8】周灵彬,任开杰.基于Proteus的电路与PCB设计.北京:电子工业出版社,2010
【9】赵娜,赵刚,于珍珠等.基于51 单片机的温度测量系统[J]. 微计算机信息,2007
【10】蔡震. 基于半导体制冷技术的高精密温度控制系统研究: [硕士学位论文]. 合肥:合肥工业大学, 2007
【11】樊尚春.传感器技术及应用[M].北京航空航天大学出版社,
【12】赵茂泰 智能仪器原理及应用(第2版).北京:电子工业出版社,2004 【13】张培仁.基于C语言编程MCS—51单片机原理与应用.清华大学出版社,
【14】清源科技 《电路原理图与PCB设计及仿真. [M]》 北京机械工业出版社 2008
【15】 赖寿涛 微型计算机控制技术.北京:机械工业出版社,2000 【16】 李广弟 单片机基础 .北京:北京航空航天大学出版社,2001
附录:
(1)PCB图
图22 单元电路PCB图
(2)时钟模块程序
#include \"\" #include \"\" #include \"\"
sbit CLK=P3^2; //与硬件相关的连线 clk为DS1302的时钟信号线 sbit DAT=P3^1; //DAT/为DS1302的I/O数据线 sbit RST=P3^0; //RST/为DS1302的RST信号线
UCHAR code time_set[7]={0x00,0x50,0x14,0x18,0x11,0x47,0x08}; //设置时间初始值数组 // 秒 分 时 号 月份 星期 年
UCHAR data timercur[7]; //用于存放从DS1302读回的时间数据
UCHAR data timerint[14]; //用于存放将BCD码型数据转换成INT型后的数据 UCHAR data *pTimerInt; //指向存放转换后时间数据的指针
/******************************************************************/ //sbit CLK=P1^0; //与硬件相关的连线 clk为DS1302的时钟信号线 //sbit DAT=P1^1; //DAT/为DS1302的I/O数据线 //sbit RST=P1^2; //RST/为DS1302的RST信号线 sbit ACC0=ACC^0; sbit ACC1=ACC^1; sbit ACC2=ACC^2; sbit ACC3=ACC^3; sbit ACC4=ACC^4; sbit ACC5=ACC^5; sbit ACC6=ACC^6; sbit ACC7=ACC^7;
/**************************函数定义**************************************/
/******************************************************************/ /* 函数名:write(address); /* 参 数:地址/数据字节
/* 功 能:用于向DS1302输入地址或数据信息
/******************************************************************/ void write(UCHAR address) {
ACC=address; CLK=0; DAT=ACC0; CLK=1;CLK=0; DAT=ACC1; CLK=1;CLK=0;
DAT=ACC2; CLK=1;CLK=0; DAT=ACC3; CLK=1;CLK=0; DAT=ACC4; CLK=1;CLK=0; DAT=ACC5; CLK=1;CLK=0; DAT=ACC6; CLK=1;CLK=0; DAT=ACC7; CLK=1; }
/******************************************************************/ /* 函数名:read(); /* 参 数:无
/* 功 能:用于从DS1302读出时间数据信息
/******************************************************************/ UCHAR read(void) {
//ACC=address;
// DAT=1; /*注意在进行读操作之前DAT应置1*/ CLK=0; ACC0=DAT; CLK=1;CLK=0; ACC1=DAT; CLK=1;CLK=0; ACC2=DAT;
CLK=1;CLK=0; ACC3=DAT; CLK=1;CLK=0; ACC4=DAT; CLK=1;CLK=0; ACC5=DAT; CLK=1;CLK=0; ACC6=DAT; CLK=1;CLK=0; ACC7=DAT; CLK=1; return(ACC); }
/******************************************************************/ /* 函数名:W_Byte(address, byte); /* 参 数:地址,数据
/* 功 能:用于向DS1302指定的地址address输入数据byte
/******************************************************************/ void W_Byte(UCHAR address,UCHAR byte) { RST=0; CLK=0; RST=1;
write(address); write(byte); RST=0; }
/******************************************************************/
/* 函数名:R_Byte(address); /* 参 数:地址
/* 功 能:用于从DS1302指定地址address处读出数据,并将数据存放到ACC中 /******************************************************************/ UCHAR R_Byte(UCHAR address) { RST=0; CLK=0; RST=1;
write(address); DAT=1; read(); RST=0; return(ACC); }
/******************************************************************/ /* 函数名:timeset() ; /* 参 数:无
/* 功 能:用于设置DS1302的时间,具体时间值存放在time_set[7]数组中 /******************************************************************/ /*void timeset() { UCHAR i;
W_Byte(0x8e,0x00); for(i=0;i<7;i++)
W_Byte(0x80+i+i,time_set[i]); } */
/******************************************************************/
/* 函数名:readtime() ; /* 参 数:无
/* 功 能:用于读取DS1302的当前时间,具体时间值存放在timecur[7]数组中 /******************************************************************/ void readtime() { UCHAR i;
for(i=0;i<7;i++)
timercur[i]=R_Byte(0x81+i+i); }
/******************************************************************/ /* 函数名:unsigned char * bcd_int(unsigned char i) /* 参 数:BCD型数据
/* 功 能:因为从DS1302读回的数据是BCD码,所以要将其转换为十进制整形数据
/******************************************************************/ /*unsigned char * bcd_int(unsigned char i) {
UCHAR j;
*(pTimerInt++)=(i&0x0f); j=i>>4;
*(pTimerInt++)= j&0x0f; return(*pTimerInt); }*/
/******************************************************************/ /* 函数名:BCD_to_INT(); /* 参 数:无
/* 功 能:用于将时间BCD码转换为十进制码
/******************************************************************/ /*void BCD_to_INT() { UCHAR i;
for(i=0;i<7;i++) bcd_int(timercur[i]); }*/
void BCD_to_INT() {
UCHAR i;//,j,k; for(i=0;i<7;i++) }
{ }
timerint[i*2]=timercur[i]&0x0f; timerint[i*2+1]=(timercur[i]>>4)&0x0f;
存储模块程序
#include<> #include<> #include<>
Typedef struct stu{ char*name,gander; int score; }STU;
Void f(char*p) }
Main() {
STU a={NULL,‘m’,290},b; =(char*)malloc(10); strcpy,”zhao”); b=a; f;
=‘f’;=350;
Print(“%s,%c,%d,”,,a,gender,; Print(“%s,%c,%d/n”,,,; }
输入模块程序
`#include<>
#define uchar unsigned char #define uint unsigned int sbit lcd_RS=P2^0; sbit lcd_RW=P2^1; sbit lcd_en=P2^2; void delay(uint z) {
uint i,j;
for(i=0;i<200;i++) for(j=0;j lcd_RS=0; lcd_RW=0; P0=com; delay(5); lcd_en=1; delay(5); lcd_en=0; } void lcd_init() { /*LCD初始化*/ write_command(0X38); write_command(0X0e); write_command(0X06); write_command(0X01); } void write_data(number) { lcd_RS=1; lcd_RW=0; P0=number; delay(5); lcd_en=1; delay(5); lcd_en=0; } uchar Keyscan() { uchar i,j,temp,buffer[4]={0xfe,0xfd,0xfb,0xf7}; for(j=0;j<4;j++) { P1=buffer[j]; /*以下三个_nop_();作用为让 P1 口的状态稳定*/ _nop_(); _nop_(); _nop_(); temp=0x10; for(i=0;i<4;i++) { if(!(P1&temp)) /*扫描子程序*/ /*LCD写数据操作*/ } { return (i+j*4); } temp<<=1; } } void L1602_char(uchar hang,uchar lie,uchar sign) { } void L1602_string(uchar hang,uchar lie,uchar *p) { } uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; write_command(a); while(1) { } if(*p == '\\0') break; write_data(*p); p++; uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; write_command(a); write_data(sign); void main() { uchar key_data; lcd_init(); L1602_string(1,1,\" 4*4 KeyBoard \"); L1602_string(2,1,\"You Press The \"); while(1) { P1 = 0xf0; if(P1 != 0xf0) { } delay(5); if(P1 != 0xf0) { } key_data = Keyscan(); L1602_char(2,15,key_data /10+48); L1602_char(2,16,key_data %10+48); } } 致 谢 历时几个月的时间终于将毕业设计做完了,在毕业设计的创作过程中,我也遇到了很多的困难和障碍,但每次都能在同学和老师的帮助下度过。尤其是要强烈感谢我的指导老师——路老师,她对我进行了无私的指导和帮助,的帮助进行毕业设计的修改和改进。另外,我在学校图书馆查找资料的时候,图书馆的管理员也给我提供了很多方面的支持与帮助。在此向帮助和指导过我的各位老师表示最衷心的感谢! 我也很感谢这篇论文所涉及到的各位学者以及他们的着作。如果没有各位学者的研究成果的帮助和启发,我将很难完成本次毕业设计的创作。 由于我的学术水平有限,所写论文难免有不足之处,恳请老师能够批评和指正! 因篇幅问题不能全部显示,请点此查看更多更全内容