资源描述
计算机控制技术和应用
课
程
设
计
课题: 淋浴热水器节水控制系统
专业: 电气工程和自动化系
学号:
姓名:
指导老师:
日期:5月26日
目录
第1章 序言 1
第2章 总体设计内容 2
2.1设计思绪及原理框图 2
2.2控制回路 2
2.3检测元件 2
2.4计算机机型选择 6
第3章 硬件设计 9
3.1红外采集信号电路图 9
3.2 LCD液晶显示电路设计 9
3.3 报警电路设计 11
3.4电磁阀电路设计 11
3.5独立键盘接口电路 12
3.6温度检测电路 12
第4章 软件设计 13
4.1 主程序设计 13
4.2红外信号采集程序 14
4.3 报警程序 14
4.4液晶显示驱动程序 14
4.5独立按键接口程序 15
4.6温度检测程序 16
附录 17
1.开发板原理图 17
2.程序清单 18
第1章 序言
现在中国国有企业、机关、学校等全部有很多公共浴室,其中大多是传统淋浴设备,这些设备陈旧,造成大量淡水资源浪费,针对中国淡水资源浪费现实状况,本文设计了一个能自动感应人来去红外自动淋浴系统。
在硬件方面系统关键以AT89S51单片机为关键,以RE200B传感器为红外接收模块,DS18B20温度检测、按键电路、蜂鸣器报警模块,LCD显示模块及电磁阀控制模块,并辅有部分外部元件组成。单片机接收到红外信号后打开电磁阀,此时开始淋浴,同时经过LCD液晶显示淋浴时间或定时时间,当定时时间快到时,经过蜂鸣器进行声音报警,并一分钟后关闭电磁阀,从而达成淋浴节水效果。
在软件设计方面采取C语言编程,是因为其易于为单片机所识别,实施速度快。程序轻易读懂、最终对软件调试进行了误差分析。
基于单片机淋浴热水器节水控制设计完善,实现方案简单易行。采取软件设计来控制,能够实现智能检测水位及水温,智能加热,自动判定人来,节省了用水。集成了光学、电子、单片机和机械等技术于一体。系统工作可靠,成本低廉,经济效益显著,而且提升了整机可靠性及正确性。
第2章 总体设计内容
2.1设计思绪及原理框图
在硬件方面系统关键以AT89S51单片机为关键,以RE200B传感器为红外接收模块,DS18B20温度检测、按键电路、蜂鸣器报警模块,LCD显示模块及电磁阀控制模块,并辅有部分外部元件组成。在软件设计方面采取C语言编程,是因为其易于为单片机所识别,实施速度快。人靠近淋浴器时,系统中红外传感器检测模块便检测到对应人体红外信号,系统便被触发;单片机接收到红外信号后打开电磁阀,此时开始淋浴,同时经过LCD液晶显示淋浴时间或定时时间,当定时时间快到时,经过蜂鸣器进行声音报警,并一分钟后关闭电磁阀,从而达成淋浴节水效果。在洗澡时还能够调整温度,其原理框图图2-1所表示。
AT89S51
LCD显示
报警电路
电磁阀电路
RE200B传感器
BISS0001芯片
温度加减键
DS18B20传感器
图2-1 设计原理框图
2.2控制回路
1. 淋浴热水器节水自动控制系统关键包含三个回路:
1).水温检测控制回路:当传感器工作时,先设定温度在一定范围内,通常是40-50度之间,假如水温超出50,将温度传给单片机,蜂鸣器报警,并断电;假如水温低于40热水器开始工作,加热指示灯亮。
2).人体信号检测回路:人靠近淋浴器时,系统中红外传感器检测模块便检测到对应人体红外信号,系统便被触发;单片机接收到红外信号后打开电磁阀
3).按键控制水温检测回路:经过按下加键或减键来给单片机一个信号,经内部转换后,输出另外一个信号来控制水温,使水温在设定值上增加或减小。
2.3检测元件
1.RE200B热释电红外传感器
红外信号采集是指从传感器或其它待测设备等模拟被测单元或数字被测单元中自动采集信息一个过程。信号采集系统是结累计算机测量软硬件相关产品来实现灵活、用户自定义测量系统。一个完备数据采集系统应该包含传感器或变换器、信号调理设备、数据采集和分析硬件、驱动程序和应用软件等等。本系统中被检测信号为模拟量,要经过BISS0001转换成数字量,才能实现单片机控制。数据采集模块是将人体红外传感器信号,经过BISS0001送给单片机进行处理,终端单片机判定处理并作时间数码显示及蜂鸣器报警。在数据采集模块部分,本系统采取AT89S51单片机作为前端警情采集中心控制单元,关键完成对所采集数据处理。
RE200B热释电红外传感器通常由热释电晶体、氧化膜、滤光镜片、结型场效应管FET和电阻等部分组成。红外传感器工作原理和红外线相关,它是利用红外线物理性质来进行测量传感器,热释电红外传感器内部热释电晶体含有极化现象,而且随温度改变而改变。经过滤镜能够限定晶体对特定波长光线产生响应,通常在8um-14um,这么就很靠近人体辐射红外线波长了。当恒定红外辐射照射在探测器上时,热释电晶体温度不变,晶体对外呈电中性,探测器没有电信号输出,所以恒定红外辐射不能被检测到。当交变红外线照射到晶体表面时,晶体温度快速改变,这时才发生电荷改变,从而形成一个显著外电场,这种现象称为热释电效应。因为热释电晶体输出是电荷信号,不能直接使用,需要用电阻将其转换为电压形式,该电阻阻抗高达104兆,故引入N沟道结型场效应管接成共漏形式(即源极跟随器)来完成阻抗变换。热释电红外传感器将两个特征相同热释电晶体逆向串联,用来预防其它红外光引发传感器误动作。另外,当环境温度改变时,两个晶体参数会同时发生改变,这么能够相互抵消,避免出现检测误差。该传感器使用时,D端接电源正极,G端接电源负极,S接地。
RE200B红外热释电处理芯片BISS0001,BISS0001是一款含有较高性能传感信号处理集成电路,它配以热释电红外传感器和少许外接元器件组成被动式热释电红外开关。它能自动快速开启各类白炽灯、荧光灯、蜂鸣器、自动门、电风扇、烘干机和自动洗手池等装置。
1) BISS0001是由运算放大器、电压比较器、状态控制器、延迟时间定时器和封锁时间定时器等组成数模混合专用集成电路。
2) BISS0001有以下特点:
(1).CMOS工艺
(2).数模混合
(3).含有独立高输入阻抗运算放大器
(4).内部双向鉴幅器可有效抑制干扰
(5).内设延迟时间定时器和封锁时间定时器
(6).采取16脚DIP封装,其DIP封装引脚分布图图2-2所表示。
图2-2 BISS0001 DIP封装引脚分布图
3) BISS0001两种工作方法:
(1) 不可反复触发工作方法
首先,依据实际需要,利用运算放大器OP1组成传感信号预处理电路,将信号放大。然后耦合给运算放大器OP2,再进行第二级放大,同时将直流电位抬高为VM(≈0.5VDD)后,将输出信号V2送到由比较器COP1和COP2组成双向鉴幅器,检出有效触发信号Vs。因为VH≈0.7VDD、VL≈0.3VDD,所以,当VDD=5V时,可有效抑制±1V噪声干扰,提升系统可靠性。 COP3是一个条件比较器。当输入电压Vc<VR(≈0.2VDD)时,COP3输出为低电平封住了和门U2,严禁触发信号Vs向下级传输;而当Vc>VR时,COP3输出为高电平,进入延时周期。 当A端接“0”电平时,在Tx时间内任何V2改变全部被忽略,直至Tx时间结束,即所谓不可反复触发工作方法。当Tx时间结束时,Vo下跳回低电平,同时开启封锁时间定时器而进入封锁周期Ti。在Ti时间内,任何V2改变全部不能使Vo跳变为有效状态(高电平),可有效抑制负载切换过程中产生多种干扰。
(2)可反复触发工作方法
可反复触发工作方法下在Vc=“0”、A=“0”期间,信号Vs不能触发Vo为有效状态。在Vc=“1”、A=“1”时,Vs可反复触发Vo为有效状态,并可促进Vo在Tx周期内一直保持有效状态。 在Tx时间内,只要Vs发生上跳变,则Vo将从Vs上跳变时刻起继续延长一个Tx周期;若Vs保持为“1”状态,则Vo一直保持有效状态;若Vs保持为“0”状态,则在Tx周期结束后Vo恢复为无效状态,而且,一样在封锁时间Ti时间内,任何Vs改变全部不能触发Vo为有效状态。
2. DS18B20温度传感器
DS18B20温度传感器是美国DALLAS半导体企业最新推出一个改善型智能温度传感器,和传统热敏电阻等元件相比,它能直接读出被测温度,而且可依据实际要求经过简单编程实现9-12位数字值读数方法。现场温度直接以一线总线数字方法传输,大大提升了系统抗干扰性。适合于恶劣环境现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。和前一代产品不一样,新产品支持3V-5.5V电压范围,使系统设计更灵活、方便。其性能特点可归纳以下:
1) 独特单线接口仅需要一个端口引脚进行通信;
2) 测温范围在-55℃到125℃,分辨率最大可达0.0625℃;
3) 采取了3线制和单片机相连,降低了外部硬件电路;
4) 零待机功耗;
5) 可经过数据线供电,电压范围在3.0V-5.5V;
6) 用户可定义非易失性温度报警设置;
7) 报警搜索命令识别并标志超出程序限定温度(温度报警条件)器件;
8) 负电压特征,电源极性接反时,温度计不会因发烧烧毁,只是不能正常工作。
DS18B20是DALLAS企业生产一线式数字温度传感器,含有3引脚TO-92小体积封装形式;温度测量范围为-55℃至+125℃,可编程为9位到12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展16位数字量方法串行输出,支持3V-5.5V电压范围,使系统设计更灵活、方便;其工作电源既可在远端引入,也可采取寄生电源方法产生;多个DS18B20能够并联到3根或2根线上,CPU只需一根端口线就能和很多DS18B20通信,占用微处理器端口较少,可节省大量引线和逻辑电路。以上特点使DS18B20很适适用于远距离多点温度检测系统。分辨率设定,及用户设定报警温度存放在EEPROM中,掉电后仍然保留。DS18B20使电压、特征有更多选择,让我们能够构建适合自己经济测温系统。图2所表示DS18B202脚DQ为数字信号输入/输出端;1脚GND为电源地;3脚VDD为外接供电电源输入端。
当传感器工作时,先设定温度在一定范围内,通常是40-50度之间,假如水温超出50,将温度传给单片机,蜂鸣器报警,并断电;假如水温低于40热水器开始工作,加热指示灯亮。
2.4计算机机型选择
1.本设计采取AT89S51单片机关键参数以下:
1)和 MCS-51 产品指令系统完全兼容
2)4k字节在线系统编程(ISP)Flash 闪速存放器
3)1000次擦写周期
4)4.0-5.5V 工作电压范围
5)全静态工作模式:0Hz-33MHz
6)三级程序加密锁
7)128×8字节内部RAM
8)32个可编程I/O口线
9)2个16位定时/计数器
10)6个中止源
11)全双工串行UART通道
12)低功耗空闲和掉电模式
13)看门狗(WDT)及双数据指针
14)掉电标识和快速编程特征
15)灵活在线系统编程(ISP字节或页写模式)
2.串行编程指令设置:
串行编程指令设置为一个4字节协议。
3.并行编程接口:
采取控制信号正确组合可对Flash闪速存放阵列中每一代码字节进行写入和存放器整片擦除,写操作周期是本身定时,初始化后,它将自动定时到操作完成。
4.功效特征概述:
AT89S51 提供以下标准功效:4k字节Flash闪速存放器,128字节内部RAM,32个I/O口线,看门狗(WDT),两个数据指针,两个16位定时/计数器,一个5向量两级中止结构,一个全双工串行通信口,片内振荡器立即钟电路。同时,AT89S51可降至0Hz静态逻辑操作,并支持两种软件可选节电工作模式。空闲方法停止CPU工作,但许可RAM,定时/计数器,串行通信口及中止系统继续工作。掉电方法保留RAM中内容,但振荡器停止工作并严禁其它全部部件工作直到下一个硬件复位。
5.AT89S51单片机最小系统
AT89S51单片机最小系统由AT89S51单片机及其外围电路组成,外围电路包含时钟电路和复位电路两部分。
1)时钟电路:时钟电路为单片机产生时序脉冲,单片机全部运算和控制过程全部是在统一时序脉冲驱动下进行,时钟电路就好比人心脏。一样,假如单片机时钟电路停止工作(晶振停振),那么单片机也就停止运行了。当采取内部时钟时,连接方法以下图所表示,在晶振引脚XTAL1(19脚)和XTAL2(18脚)引脚之间接入一个晶振,两个引脚对地分别再接入一个电容即可产生所需时钟信号,电容容量通常在几十皮法,如30PF。
单片机内部有一个高增益反向放大器,输入端为芯片引脚XTAL1,输出端为引脚XTAL2。而在芯片外部XTAL1和 XTAL2之间跨接晶体震荡器和微调电容,从而组成一个稳定自激振荡器。外接晶体(石英或陶瓷,陶瓷精度不高,但价格廉价)振荡器和电容C1和C2组成并联谐振电路,接在放大器反馈回路中, C1和C2大小会对振荡器频率高低、振荡器稳定性、起振快速性和温度特征有一定影响。所以提议在采取石英晶体振荡器时取,陶瓷振荡器时取,经典值为40pF。在设计电路板时,振荡器和电容应尽可能安装得和单片机靠近,以减小寄生电容存在,愈加好保障振荡器稳定、可靠工作。在任何情况下,振荡器一直驱动内部时钟发生器向主机提供时钟信号,因为时钟发生器输入是一个二分频电路,所以对外部振荡信号脉宽无特殊要求,但必需确保高、低电平最小宽度。
2)复位电路:单片机复位电路分上电复位和按键手动复位。它是利用外部复位电路来实现。当Vcc上升时间不超出1ms(RC=τ),振荡器开启时间不超出10ms。在加电情况下,这个电路能够使单片机复位。在加电开机时,RST上电压从Vcc逐步下降,RST引脚电位是Vcc和电容电压差,RST上电压必需确保在斯密特触发器阀值电压以上足够长时间,以满足复位操作要求。按键电平复位是将复位端经过电阻和Vcc相连。在按键电平复位和按键脉冲复位两种简单复位电路中,干扰易串入复位端,在大多数情况下,不会造成单片机错误复位,但会引发内部寄存器错误复位,这里可在复位端引脚上接一个去藕电容。需说明是,如复位电路中R、C值选择不妥,使复位时间过长,单片机将处于循环复位状态。
为了使用方便和设计电路简化及设计要求,我们采取上电复位和按键电平复位相结合方法。复位后,单片机从0000H单元开始实施程序,并初始化部分专用寄存器为复位状态值,受影响专用寄存器如表2.1所表示。
表2.1专用寄存器状态表
寄存器
状态
寄存器
状态
PC
0000H
TCON
00H
ACC
00H
TL0
00H
PSW
00H
TH0
00H
SP
07H
TL1
00H
DPTR
0000H
TH1
00H
P0 -- P3
FFH
SCON
00H
IP
xxx00000H
SBUF
不确定
IE
0xx00000H
PCON
0xxx0000H
TMOD
00H
AT89S51单片机最小系统由AT89S51单片机及其外围电路组成,外围电路包含时钟电路和复位电路组成、为了确保单片机能安全、正确、高效工作,在选择单片机AT89S51时,在其9脚加了复位电路18和19脚加了时钟电路。
第3章 硬件设计
3.1红外采集信号电路图
通常人体全部有恒定体温,通常在37度,所以会发出特定波长10UM左右红外线,红外传感器接收到人体红外信号经BISS0001处理后输出输给单片机P1.0口,TEL0表示接AT89S51是P1.0口,经过对单片机P1.0口高低电平判定来完成红外信号采集,当P1.0口为低电时判定人来然后送给单片机,单片机再给电磁阀电路,电磁阀开始出水,不然继续循环检测,当人来时完成信号采集实现对单片机外围电路控制,如电磁阀控制水阀电路,液晶显示淋浴时间等。红外采集电路图3-1所表示。
图3-1红外采集电路图
3.2 LCD液晶显示电路设计
在本系统中,用LCD液晶屏来组成显示部分,关键在人来时对淋浴计时时间和显示温度及定时时间显示。LCD液晶显示含有功耗低、寿命长、无辐射、不易引发视疲惫等优点,正在被广泛应用于仪表、家用电器、计算机、医疗仪器及交通和通信领域。本系统中,选择JHD162A作为液晶屏显示驱动控制器。
1.1602LCD液晶模块JHD162A 介绍
字符型液晶显示模块是一个专门用于显示字母、数字、符号等点阵式LCD 现在常见16*1 16*2 20*2和40*2行等模块。是一个很常见小型液晶显示模块 在单片机系统、嵌入式系统等人机界面中得到了广泛应用。
2.1602LCD关键技术参数以下:
1)显示容量:16×2个字符
2)芯片工作电压:4.5-5.5V
3)工作电流:2.0mA(5.0V)
4)模块最好工作电压:5.0V
5)字符尺寸:2.95×4.35(W×H)mm
液晶显示器简称LCD,它是利用液晶经过处理后能改变光线传输方向特征实现信息。LCD含有体积小、重量轻、功耗极低、显示丰富等特点,正广泛地被各类电子产品所应用。LCD1602字符型液晶模块是两行16个字5X7点阵图形来显示字符液晶显示器.单片机和1062LCD接口电路设计图3-2所表示。
图3-2 单片机和JHD162接口电路
3.3 报警电路设计
本系统采取蜂鸣器作为报警,淋浴时当设置定时时间还有一分钟时,蜂鸣器响应,单片机进行报警。蜂鸣器报警原理比较简单,单片机对IO口P1.2控制;当定时时间还有一分钟时,单片机给P1.2口输出低电平,蜂鸣器工作,达成报警效果。温度设定好以后 ,温度高于设定值,它会自动报警并断电。报警电路图3-3所表示。
图 3-3 报警电路图
3.4电磁阀电路设计
本系统采取电磁阀控制浴室水阀开关,电磁阀是利用电线圈通电时产生电磁力,使动铁芯克服弹簧力同静铁芯吸合直接开启阀,介质呈通路;当线圈断电时电磁力消失,铁芯在弹簧力作用下复位,直接关闭阀口,介质不通。系统中由单片机AT89S51 P1.1脚输出信号使驱动电路工作于对应工作状态。当P1.1输出高电平时,经过电阻R21使开关三极管8050饱和导通,电流从R21经三极管CE极流向光电耦合器,发光二极管点亮,次极三极管导通,水管电磁阀通电,吸合动铁芯,阀门打开,水开始流出。当P1.1输出低电平时,三极管8050截止,水管电磁阀断电,阀门关闭。电磁阀控制电路图3-4所表示。
图3-4电磁阀控制电路
3.5独立键盘接口电路
本毕业设计按键采取独立式按键,是直接用I/O口线组成单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键工作不会影响其它I/O口线状态。独立式按键经典应用图:按键输入均采取低电平有效,另外,上拉电阻确保了按键断开时,I/O口线有确定高电平。当I/O口线内部有上拉电阻时,外电路不可接上拉电阻。独立式按键软件常采取查询式结构。先逐位查询每根I/O口线输入状态,如某一根I/O口线输入为低电平,则可确定该I/O口线所对应按键已按下,然后,再转向该键功效处理程序,具体编程见程序清单。独立式按键电路图图3-5所表示。
图3-5 独立式按键电路图
3.6温度检测电路
本文采取温度传感器DS18B20采集电热水器实时温度, 提供给AT89S51P3.3口作为数据输入。在此次设计中我们所控对象为水温。温度检测电路原理框图图3-6所表示。
图3-6温度检测电路原理框图
当传感器工作时,先设定温度在一定范围内,通常是40-50度之间,假如水温超出50,将温度传给单片机,蜂鸣器报警,并断电;假如水温低于40热水器开始工作,加热指示灯亮。
第4章 软件设计
分析单片机系统功效可知,它是数据采集模块主控制器,关键完成对人头红外信号采集,然后经过红外传感模块传送给单片机处理。依据系统功效要求,单片机软件设计部分关键包含主程序设计、红外信号采集程序设计和LCD显示程序设计和报警程序设计。
4.1 主程序设计
系统主程序关键是在系统上电后进行一系列初始化工作,包含对I/O口、定时器/计数器、中止系统等特殊功效寄存器赋值,使得数据采集、LCD显示、电磁阀控制、按键电路、报警等模块和单片机数据传输正常。当把采集到红外信号进行对应处理后,经过LCD进行时间显示,同时对电磁阀、蜂鸣器进行对应控制。先是单片机准备,系统初始化,单片机开始扫描判定人来没。假如人来话开始定时经过LCD显示。同时开始计时,洗澡时水温不适宜时经过按键调整温度。判定人走否,时间到话开始报警,还有一分钟时电磁阀关闭其程序运行。系统主程序步骤图图4-1所表示。
图4-1 主程序步骤图
4.2红外信号采集程序
经过对单片机P1.0口高低电平判定来完成红外信号采集,当P1.0口为低电时判定人来然后送给单片机,单片机再给电磁阀电路,电磁阀开始出水,不然继续循环检测,当人来时完成信号采集。红外信号采集程序步骤图图4-2所表示。
图4-2 红外信号采集程序步骤图
4.3 报警程序
当淋浴时定时时间还有一分钟结束时,蜂鸣器报警。报警时,单片机给IO口P1.2给予低电平,此时进行报警,先是系统初始化,判定P1-0是否为0,假如为0话,给P1-2低电平报警电路开始报警。不为0时,继续扫描。报警电路步骤图图4-3所表示。
开始
初始化
P1.0低电平
结束
给p1.2低电平
N
Y
图4-3 报警电路步骤图
4.4液晶显示驱动程序
显示模块采取是LCD1602液晶显示芯片,使用LCD进行显示也有很多成熟技术。单片机将处理完数据传输到LCD显示时候,也用了很多子程序 它们有检验LCD忙状态(程序步骤图图4-4所表示);写指令数据到LCD(程序步骤图图4-5所表示);写显示数据到LCD(程序步骤图图4-6所表示);LCD初始化(程序步骤图图4-7所表示)。经过液晶显示出来,相关人员就能够愈加直接对淋浴房目前情况有一个直观了解了。
Lcd-wcd
操作控制口
写指令
复位控制口
返回
Lcd-busy
控制LCD
返回
读忙操作
N
Y
忙?
图4-4 检验LCD忙步骤图 图4-5 写指令数据步骤图
Lcd-wat
操作控制口
读数倨
复位控制口
返回
Lcd-init
清屏
设置LCD
再清屏
返回
图4-6读数据步骤图图 4-7 LCD初始化步骤图
4.5独立按键接口程序
假如当人洗澡时,感觉温度不适宜,能够经过按键来调整温度,能够增加温度也能够降低温度,达成令人满意水温。程序开始,然后按键扫描,判定有键按下吗,进入调温模式,有键按下是加键话,温度加1,假如是减键就预设温度减1度。按键扫描子程序步骤图图4-8所表示。
按键扫描
温度加1
预设温度减1
有键按下吗?
是温度+键吗?
是温度-键吗?
①
开始
图4-8 按键扫描子程序步骤图
4.6温度检测程序
先设定温度在一定范围内,通常是40-50度之间,假如低于范围会经过加热器加热,假如高于范围会报警断电,程序开始,假如水温低于预设值,报警电路开始报警,同时加热器开始加热,当加热到一定程度,高于预设值,加热器开始断电。温度检测运行程序流狂程图图4-9所表示。
报警断电
水温高于设定值吗?
水温低于设定值吗?
通电加热
Y
N
Y
N
结束
开始
图4-9 温度检测运行程序步骤框图
附录
1.开发板原理图
2.程序清单
#include"24c02.h"
sbit p1.0=P1^0; /定义红外信号采集口
sbit p1.1=P1^1; /定义控制电磁阀口
sbit p1.2=P1^2; /定义蜂鸣器控制口
sbit lcden=P2^2;//定义LCD使能端
sbit rw=P2^1;//定义LCD读写端
sbit rs=P2^0;//定义1602液晶RS端
uchar count,s1num;
char ge,shi,bai;
/*-----------------------------------------------------------*/
//两个延时函数
void delay0()
{;;}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*-----------------------------------------------------------*/
//报警函数
void baojing()
{
P1.2=0;
delay(100);
p1.2=1;
}
/*-----------------------------------------------------------*/
void write_com(uchar com)
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
/*-----------------------------------------------------------*/
void write_date(uchar date)
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
/*-----------------------------------------------------------*/
//时间函数
void write_sfm(uchar add,uchar date)
{
uchar bai,ge;
bai=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+bai);
write_date(0x30+ge);
}
/*-----------------------------------------------------------*/
void write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay0();
sda=CY;
delay0();
scl=1;
delay0();
}
scl=0;
delay0();
sda=1;
delay0();
}
/*-----------------------------------------------------------*/
void write_add(uchar address,uchar date)
{start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
write_byte(date);
respons();
stop();
}
/*-----------------------------------------------------------*/
//指定读一个字节
char read_add(uchar address)
{
uchar date;
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return date;
}
/*-----------------------------------------------------------*/
//初始化
void init()
{
uchar num;
rd=0;
lcden=0;
bai=0; //初始化液晶显示变量值
ge=0;
bai=0;
count=0;
s1num=0;
init_24c02(); //初始化1602液晶
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);//设置初始化坐标 在第一行显示
for(num=0;num<15;num++)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40+6);//写时间显示部分两个冒号
write_date(':');
delay(5);
write_com(0x80+0x40+9);
write_date(':');
delay(5);
ge=read_add(1);//首次上电从AT24C02中读取出存放数据
bai=read_add(2);
bai=read_add(3);
write_sfm(10,ge);//分别送去液晶显示
write_sfm(7,bai);
write_sfm(4,bai);
TMOD=0x01;//设置定时器0工作模式1
TH0=(65536-50000)/256; //定时器装处值
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
/*-----------------------------------------------------------*/
void jishi()
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
ge++;
if(ge==60)
{
ge=0;
bai++;
if(bai==60)
{
bai=0;
bai++;
if(bai==24)
{bai=0; }
write_sfm(4,bai);
write_add(3,bai);
}
write_sfm(7,bai);
write_add(2,bai);
}
write_sfm(10,ge);
write_add(1,ge);
}
}
/*-----------------------------------------------------------*/
void dingshi()
{
ge=0,bai=6;
TMOD=0x01;
TH0=0xD8;
TL0=0xf0;
EA=1;
ET0=1;
TR0=1;
while(1)
{
for(k=0;k<2;k++)
{
P0=b[k];
P2=k;
latetime(3);
i++;
b[0]=a[ge];
b[1]=a[bai];
if(i==100)
{
i=0;
ge--;
}
if(ge==65535)
{
bai--;
ge=9;
}
if(bai==65535)
{bai=6;
ge=0;
}
}
write_sfm(4,bai);
write_add(3,bai);
}
write_sfm(7,bai);
write_add(2,bai);
}
write_sfm(10,ge);
write_add(1,ge);
}
/*-----------------------------------------------------------*/
//主函数
void main()
{
init();
while(1)
{
If(p1.0==0)
{
delay0();
p1.1=0;
jishi();
}
Else{
dingshi();
delay(100);
if(ge==0)
baojing();
}
}
}
展开阅读全文