资源描述
目 录
引言……………………………………………………1
一 总体设计方案
1.设计思路……………………………………………1
2.功能…………………………………………………1
3.工作原理……………………………………………2
二硬件方案
1.电源模块……………………………………………3
(1)基本原理…………………………………………3
(2)电源变压器……………………………………3
(3)整流滤波电路……………………………………3
(4)三端集成稳压器…………………………………3
2.主机模块 …………………………………………3
(1)AT89S52简介……………………………………3
(2)AT89S52引脚功能………………………………4
(3)AT89S52 最小系统………………………………5
3.时钟模块……………………………………………7
(1)时钟芯片…………………………………………7
(2)DS1302的结构及工作原理………………………8
(3) DS1302的应用……………………………………10
4.显示模块…………………………………………13
(1)液晶显示器的结构与特点……………………13
(2)液晶显示器的分类……………………………14
(3)液晶显示器的应用……………………………14
5.总图………………………………………………18
三软件方案
1.流程图……………………………………………19
2.程序………………………………………………19
(1)主程序……………………………………19
(2)液晶显示子程序………………………………22
(3)ds1302子程序…………………………………23
3.仿真图……………………………………………23
四 论文小结……………………………………………24
五 参考文献……………………………………………24
摘要
在广泛的自动控制领域中,需要有类似微型计算机功能的支持,但常常又不可能把微型计算机安装在设备里面。因此微型控制器的一个重要分支(单片机)应运而生。随着单片机技术的发展,有许多新一代的单片机已经在片内集成了多路A/D转换通道,大大简化了连接电路和编程工作。单片机以其稳定可靠、体积小、功耗低、价格低廉的特点广泛应用于多种计算机控制功能的现场控制领域和实时控单片机控制系统。目前企业和学校较多的采用微机控制技术,广泛应用于各种自动控制、检测技术、测量技术等领域。
关键词:单片机、A/D转换、时钟芯片、温度传感器、液晶
引言
在我们生活的世界到处都可以看见各种各样的钟表。而我在学校上课时也做过时钟但是那只能单一的显示时间,至于其他就不能显示了。所以我就萌发了做一个完整的时钟系统。最初我本想只用一个单片机和液晶做一个时钟,但是那样就会出现许多的问题。例如,时间不准确,断电后时钟就停止了运行。于是我想到了时钟集成电路,并最终选择了DS1302时钟集成电路。虽然从来没有用过时钟芯片但是那也是对自己的一种考验吧!至于温度显示我看到了许多钟表上都有所以自己也就尝试做了一个。
一 总体设计方案
1.设计思路
用单片机读取DS1302的时钟数据,并在液晶上显示读出的时钟数据。
通过按键可以调整时间,并把调整的时间数据写入DS1302。在采用LM35温度传感器进行温度的测量。最后用模数装换芯片转换成数字量并在液晶上显示。
2.功能
通过单片机的控制,在液晶显示器上显示日期,星期,时间,以及温度,带有闹钟功能。有闰年补偿的功能。可以通过按键调整日期,星期,时间,并可以设定闹钟时间,按键K1为调整时间的按键按一下选择年份调整 ,两下选择月份调整,三下选择天数调整,四下选择小时调整,五下选择分钟调整,六下选择时钟调整。按键K2是对选择的日期,星期,时间,闹钟进行调整。K3一下打开闹钟同时进行闹钟的小时设定,两下进行分钟设定,三确认设定的时间,四下退出闹钟模式。当闹钟定时时间到蜂鸣器会进行半秒响半秒停,并且持续一分钟如果当中按下退出闹钟模式蜂鸣器将停止。
3.工作原理
本电路由89S52单片机,时钟集成电路DS1302,12864液晶,温度传感器LM35,模/数装换芯片ADC0809,三端稳压集成电路 LM7805及电阻,电容等外围器件组成。
电路用7805三端稳压集成块作为电源输出直流+5V。DS1302时钟集成块为单片机提供当前的日期,时间等信息。温度由温度传感器LM35采集使温度的变化变成电压的变化,然后通过模数装换集成电路adc0804装换成数字量送入单片机处理。最后由单片机把信息通过液晶显示出来。
原理框图:
二硬件方案
1. 电源模块
(1)基本原理
直流稳压电源一般由电源变压器T、整流滤波电路及稳压电路所组成,基本框图如下。各部分的作用:
(2)电源变压器
作用是将电网220V的交流电压变换成整流滤波电路所需要的交流电压。
(3)整流滤波电路:
整流电路将交流电压变换成脉动的直流电压。再经滤波电路滤除较大的纹波成分,输出纹波较小的直流电压。
(4)三端集成稳压器:
常用的集成稳压器有固定式三端稳压器与可调式三端稳压器。常用固定式集成稳压器有LM7805,它们的输出电压+5V。其芯片内有过渡、过热和安全工作区保护,最大输出电流为1.5A。
电路如图
2.主机模块
(1)简介
功能特性描述
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案
(2)引脚功能
MCS单片机都采用40引脚的双列直插封装方式。下图为引脚功能图
AT89S52引脚排列图
VCC : 电源
GND: 地
P0 口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。
P2 口:P2 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能驱动4 个TTL 逻辑电平。对P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
P3 口:P3 口是一个具有内部上拉电阻的8 位双向I/O 口,p2 输出缓冲器能驱动4 个TTL 逻辑电平。对P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P3口亦作为AT89S52特殊功能(第二功能)使用,如下表所示。在flash编程和校验时,P3口也接收一些控制信号。
引脚号第二功能
P3.0 RXD(串行输入)
P3.1 TXD(串行输出)
P3.2 INT0(外部中断0)
P3.3 INT0(外部中断0)
P3.4 T0(定时器0外部输入)
P3.5 T1(定时器1外部输入)
P3.6 WR(外部数据存储器写选通)
P3.7 RD(外部数据存储器写选通)
RST: 复位输入。晶振工作时,RST脚持续2 个机器周期高电平将使单片机复位。看门狗计时完成后,RST 脚输出96 个晶振周期的高电平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。DISRTO默认状态下,复位高电平有效。
ALE/PROG:地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8 位地址的输出脉冲。在flash编程时,此引脚(PROG)也用作编程输入脉冲。在一般情况下,ALE 以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。
PSEN:外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。
XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2:振荡器反相放大器的输出端。
(3)最小系统
①时钟电路
AT89S52 单片机有一个用于构成内部振荡器的反相放大器,XTAL1 和XTAL2 分别是放大器的输入、输出端。石英晶体和陶瓷谐振器都可以用来一起构成自激振荡器。从外部时钟源驱动器件的话,XTAL2 可以不接,而从XTAL1 接入,如图12 所示。由于外部时钟信号经过二分频触发后作为外部时钟电路输入的,所以对外部时钟信号的占空比没有其它要求,最长低电平持续时间和最少高电平持续时间等还是要符合要求的。
图 11 内部振荡电路连接图 图12 外部振荡电路连接图
②复位和复位电路
MCS-51单片机的复位电路如图所示。在RESET(图中表示为RST )输入端出现高电平时实现复位和初始化。
(a) (b)
复位电路
在振荡运行的情况下,要实现复位操作,必须使RES 引脚至少保持两个机器周期(24个振荡器周期)的高电平。CPU在第二个机器周期内执行内部复位操作,以后每一个机器周期重复一次,直至RES端电平变低。复位期间不产生ALE及PSEN信号。内部复位操作使堆栈指示器SP为07H,各端口都为1(P0-P3口的内容均匀0FFH),特殊功能寄存器都复位为0,但不影响RAM的状态。当RES引脚返回低电平以后,CPU从0地址开始执行程序。
复位电路(a)为加电自动复位电路。
复位电路(b)为人工复位电路。
最小系统就是由AT89S52以及时钟电路和复位电路,如图
最小系统
3.时钟模块
(1)时钟芯片
现在流行的串行时钟电路很多,如DS1302、 DS1307、PCF8485等。这些电路的接口简单、价格低廉、使用方便,被广泛地采用。本文介绍的实时时钟电路DS1302是DALLAS公司的一种具有涓细电流充电能力的电路,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振。
该芯片具有以下特点.
时钟计数功能,可以对秒、分钟、小时、月、星期、年的计数。年计数可达到2100 年。
有31*8 位的额外数据暂存寄存器
最少I/O 引脚传输,通过三引脚控制
工作电压:2.0-5.5V
工作电流小于320 纳安(2.0V)
读写时钟寄存器或内部RAM(31*8 位的额外数据暂存寄存)可以采用单字节模式和突发模式
备用电源可采用电池或者超级电容(0.1F以上),可以用老式电脑主板上的3.6V 充电电池。如果断电时间较短(几小时或几天)时,就可以用漏电较小的普通电解电容器代替。100 μF 就可以保证1小时的正常走时。DS1302 在第一次加电后,必须进行初始化操作。初始化后就可以按正常方法调整时间。
(2) DS1302的结构及工作原理
DS1302 包括时钟/日历寄存器和31 字节(8 位)的数据暂存寄存器,数据通信仅通过一条串行输入输出口。实时时钟/日历提供包括秒、分、时、日期、月份和年份信息。闰年可自行调整,可选择12 小时制和24 小时制,可以设置AM、PM。只通过三根线进行数据的控制和传递。通过备用电源可以让芯片在小于1MW 的功率下运作。
①引脚功能
图示出DS1302的引脚排列,其中
Vcc1为后备电源,VCC2为主电源。
X1和X2是振荡源,外接32.768kHz晶振。
RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
I/O为串行数据输入输出端(双向),后面有详细说明。
SCLK始终是输入端。
②工作原理
主要工作原理图如Figure 1 所示:移位寄存器,控制逻辑,晶振,时钟和RAM。在进行任何数据传输时,必须被制高电平(注意虽然将它置为高电平,内部时钟还是在晶振作用下走时的,此时,允许外部读写数据),在每个SCLK 上升沿时数据被输入,下降沿时数据被输出,一次只能读写一位,适度还是写需要通过串行输入控制指令来实现(也是一个字节),通过8 个脉冲便可读取一个字节从而实现串行输入与输出。最初通过8 个时钟周期载入控制字节到移位寄存器。如果控制指令选择的是单字节模式,连续的8 个时钟脉冲可以进行8 位数据的写和8 位数据的读操作,SCLK 时钟的上升沿时,数据被写入DS1302,SCLK 脉冲的下降沿读出DS1302 的数据。8 个脉冲便可读写一个字节。在突发模式,通过连续的脉冲一次性读写完7 个字节的时钟/日历寄存器(注意时钟/日历寄存器要读写完),也可以一次性读写8~328 位RAM 数据(可按实际情况读写一定数量的位,不必全部读写,两者的区别)。
③ DS1302的控制字节
控制指令:
控制指令(8 位)如Figure2 所示:
每个字节的传输是有控制字节指定的,控制字节的最高位Bit7 必须是‘1’,如果是‘0’,写入将被禁止,因此我们如果将这位置一,可以禁止写入。bit6 为‘0’则指定对时钟/日历寄存器控制读写操作,为‘1’则为RAM 区数据的控制读写操作,bir1~bit5 指定相关寄存器待进行输入输出操作,最低位bit0 指定是输入还是输出,为‘0’则为输入,相反则输入有效,输入输出根据脉冲的上升沿和下降沿串行进行(前面已经提到)。
复位以及时钟控制:
所有的数据传输在置一时进行(反复强调), 输入信号有两种功能:首先,RST 接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST 提供终止单字节或多字节数据的传送手段。当RST 为高电平时,所有的数据传送被初始化,允许对DS1302 进行操作。如果在传送过程中RST 置为低电平,则会终止此次数据传送,I/O 引脚变为高阻态。上电运行时,在Vcc≥2.5V 之前,RST 必须保持低电平。只有在SCLK 为低电平时,才能将RST 置为高电平。I/O 为串行数据输入输出端(双向)。SCLK 始终是输入端。
④ DS1302的寄存器
突发模式:
上面已经提到过的突发模式可以指定为任何时钟/日历或RAM 的寄存器,与以前一样,位6 指定时钟或RAM,位0 指定读或写。读取或写入的突发模式开始在位0 地址0 。对于DS1202 来说,在突发模式下写时钟寄存器,起始的8 个寄存器用来写入相关数据,必须写完。然而,在突发模式下写RAM 数据时,没有必要全部写完。每个字节都将被写入而不论31 字节是否写完。
(3) DS1302的应用
如图
4.显示模块
液晶显示器(LCD)是一种低功耗的显示器件,它广泛应用于工业控制消费电子及便携式电子产品中.它不仅省电,而且能够显示大量的信息,如文字、曲线、图形、动画等,其显示功能比数码管强大了许多.
(1)液晶显示器结构与特点
①结构
不同的应用领域中液晶显示器的性能和结构可能会有一些差别,但其基本形状和结构却是大同小异.不同类型的液晶显示器件组成可能会有不同,但是所有液晶显示器件都可以认为是由两片透明导电电极和它们中间所夹的一个液晶层构成.在电极外表面还可能贴装上偏振片.
②特点
● 低压低功耗:工作电压为3V~5V,工作电流只有几个µA/cm².
● 被动显示:液晶本身不发光,而是靠调制外界光进行显示.因此适合人的视觉习惯,不易使人眼睛疲劳.
● 显示信息量大:LDC显示器的像素可以做得很小,相同面积上可容纳更多信息.
● 没有电磁辐射:在显示期间不会产生电磁辐射,对环境无污染,有利于人体健康.
● 寿命长:LCD器件本身无老化问题,寿命很长.
(2)液晶显示器的分类
液晶显示器按显示图案的不同通常可分为笔段型LDC、字符型LCD和点阵图形LCD3种.
①笔段型
笔段型是以长条状作为基本显示单元显示.该类型主要用于数字显示,也可用于显示西文字符或某些字符.
②字符型
字符型液晶显示器模块是专门用来显示英文和其他拉丁文字母、数字、符号等的点阵型液晶显示模块.
③点阵图形型
点阵图形型是在一平板上排列多行多列的矩阵形式的晶格点,点的大小可根据显示的清晰度来设计.它根据要求基本可以显示所有能显示的字母、数字、符号、汉字、图形、甚至是动画.
(3)12864液晶显示器的应用
DM12864J是一种图形点阵液晶显示器。它主要采用动态驱动原理由行驱动—控制器和列驱动器两部分组成了128(列)×64(行)的全点阵液晶显示。
如图所示
此显示器采用了COB的软封装方式,通过导电橡胶和压框连接LCD,使其寿命长,连接可靠。
①特性
工作电压为+5V±10%,可自带驱动LCD所需的负电压。
全屏幕点阵,点阵数为128(列)×64(行),可显示8(/行)×4(行)个(16×16点阵)汉字,也可完成图形,字符的显示。
据读/写等指令。
管脚号
功能
电平
说明
1
VSS
0V
逻辑电源地。
2
VDD
5.0V
逻辑电源正。
3
V0
LCD驱动电压,应用时在VEE与V0之间加2K可调电阻。
4
D/I
H/L
数据\指令选择,高电平:数据将送入显示RAM;
低电平:数据将送入指令寄存器执行。
5
R/W
H/L
读\写选择,高电平:读数据;低电平:写数据。
6
E
H.H/L
读写使能,高电平有效,下降沿锁定数据。
7
DB0
H/L
数据输入输出引脚。
8
DB1
H/L
数据输入输出引脚。
9
DB2
H/L
数据输入输出引脚。
10
DB3
H/L
数据输入输出引脚。
11
DB4
H/L
数据输入输出引脚。
12
DB5
H/L
数据输入输出引脚。
13
DB6
H/L
数据输入输出引脚。
14
DB7
H/L
数据输入输出引脚。
15
CS1
H/L
片选择信号,低电平时选择前64列。
16
CS2
H/L
片选择信号,低电平时选择后64列。
17
RET
L
复位信号,低电平有效。
18
VEE
-10V
LCD驱动电源。
②控制
1) 读状态字
Busy
0
On/off
rst
0
0
0
0
状态字是MPU了解LCM(液晶显示模块)当前状态,或LCM向MPU提供其内部状态的唯一的信息渠道。
2)显示开关设置
0
0
1
1
1
1
1
D
该指令设置显示开/关触发器的状态,由此控制显示数据锁存器的工作方式,从而控制显示屏上的显示状态。
3)显示起始行设置
1
1
L5
L4
L3
L2
L1
L0
该指令设置了显示起始行寄存器的内容。LCM通过CS的选择分别具有64行显示的管理能力,该指令中L5~L0为显示起始行的地址,取值在0~3FH(1~64行)范围内,它规定了显示屏上最顶一行所对应的显示存储器的行地址。
4)页面地址设置
1
0
1
1
1
P2
P1
P0
该指令设置了页面地址—X地址寄存器的内容。LCM将显示存储器分成8页,指令代码中P2~P0就是要确定当前所要选择的页面地址,取值范围为0~7H,代表第1~8页。该指令规定了以后的读/写操作将在哪一个页面上进行
5)列地址设置
0
1
C5
C4
C3
C2
C1
C0
该指令设置了Y地址数计数器的内容,LCM通过CS的选择分别具有64列显示的管理能力,C5~C0=0~3FH(1~64)代表某一页面上的某一单元地址,随后的一次读或写数据将在这个单元上进行。Y地址计数器具有自动加一功能,在每一次读/写数据后它将自动加一,所以在连续进行读/写数据时,Y地址计数器不必每次都设置一次。
6)写显示数据
该操作将8位数据写入先前已确定的显示存储器的单元内。操作完成后列地址计数器自动加一。
页面地址的设置和列地址的设置将显示存储器单元唯一地确定下来,为后来的显示数据的读/写作了地址的选通。
③接口电路
5.总图
(1)原理图
(2)PCB图
三软件方案
1.流程图
2.程序
(1)主程序
#include<at89x52.h>
#include"head.h" // 定义变量和子程序
#include"_12864.h" // 12864显示
#include"ds1302.h" // ds1302时钟
/********************主函数************************/
main()
{
Init1302();
InitLCD();
Inti_main();
while(1)
{
adc();
donetime();
ShowTime();
key();
Showniao();
show();
}
}
/*********************按键处理***********************/
void key()
{
/******************时间调整**************************/
if(k1==0&&(num==0||num==3))
{
k1_time++;
if(k1_time==10||k1_time%80==0)
{
vlu=(vlu+1)%7;
switch (vlu)
{ case 0:flag_WEE=0;break;
case 1:flag_YEA=1;break;
case 2:flag_MON=1;flag_YEA=0;break;
case 3:flag_DAY=1;flag_MON=0;break;
case 4:flag_HOU=1;flag_DAY=0;break;
case 5:flag_MIN=1;flag_HOU=0;break;
case 6:flag_WEE=1;flag_MIN=0;break;
default:break;
}
}
}
else k1_time=0;
/******************时间++**************************/
if(k2==0)
{
k2_time++;
if(k2_time==8||k2_time%10==0)
{ if(vlu!=0)
{
switch (vlu)
{
case 1:year++;if(year>=100)year=0;break;
case 2:month++;if(month>=13)month=0;break;
case 3:day++;if(runnian()==0&&day>=ping_tian[month])day=0;
if(runnian()==1&&day>=run_tian[month])day=0;
break;
case 4:hour++;if(hour>=24)hour=0;break;
case 5:minute++;if(minute>=60)minute=0;break;
case 6:week++;if(week>=8)week=1;break;
default:break;
}
SetTime();
}
if(num!=0&&num!=3)
{
switch(num)
{
case 1:shi++;if(shi>=24)shi=0;break;
case 2:fen++;if(fen>=60)fen=0;break;
}
}
}
}
else k2_time=0;
/*****************时间显示**************************/
void ShowTime()
{
ShowSecond();
ShowMinute();
ShowHour();
Showweek();
ShowDay();
ShowMonth();
ShowYear();
}
/*****************闹钟显示***********************/
void Showniao()
{
if((!flag_SHI||half_s)&&flag_NIAO)
{
ShowASC(6,64,shi/10+0x30);
ShowASC(6,72,shi%10+0x30);
}
else
{
ShowASC(6,64,0x3a);
ShowASC(6,72,0x3a);
}
if((!flag_FEN||half_s)&&flag_NIAO)
{
ShowASC(6,88,fen/10+0x30);
ShowASC(6,96,fen%10+0x30);
}
else
{
ShowASC(6,88,0x3a);
ShowASC(6,96,0x3a);
}
}
/****************判断2000-2099中的闰年*******************/
bit runnian(void)
{
if(year%4==0)
flag_run=1;
else
flag_run=0;
return flag_run;
}
/****************温度显示***************************/
void adc(void)
{
uint adc_data;
adc_data=P1;
adc_data=adc_data*10/51;
ShowASC(0,80,adc_data/10+0x30);
ShowASC(0,88,adc_data%10+0x30);
}
/*****************初始化*************************/
void Inti_main(void)
{
EA=1;
TMOD=0x01;
TH0=-50000/256;
TL0=-50000%256;
ET0=1;
TR0=1;
}
/*****************闹钟铃声*************************/
void show(void)
{
if(hour==shi&&minute==fen&&Ms50==9&&niao_hao)
LING=0;
if(hour==shi&&minute==fen&&niao_hao)
ShowASC(6,120,0x3d);
if(Ms50==10)
{
Ms50=0;
half_s=!half_s;
}
if(Ms50==0)
LING=1; ShowASC(6,120,0x3a);
}
/**************timer0中断处理**************************/
void time0() interrupt 1
{
TH0=-50000/256;
TL0=-50000%256;
Ms50++;
}
(2)液晶显示子程序
#ifndef _LCM12864_2009_4_1_
#define _LCM12864_2009_4_1_
/*********************选择屏幕********************************/
void SelectScreE(uchar screE)
{
switch(screE)
{
case 0:CS1=1;CS2=1;break;//全屏
case 2:CS1=1;CS2=0;break;//左屏
case 1:CS1=0;CS2=1;break;//右屏
default:break;
}
}
/*********************初始化相关*******************************/
void InitLCD(void)
{
SetOnOff(0);
ClearScreE(0);
SetOnOff(1);
}
/***************开关显示******************/
void SetOnOff(uchar onoff)
{
onoff|=0x3e;
WriteCmd(onoff);
}
/*************清屏**********/
void ClearScreE(uchar screE)
{
unsigned char i,j;
SelectScreE(screE);
for(i=0;i<8;i++)
{SetLine(i);
for(j=0;j<64;j++)
{
SetColumn(j);
WriteByte(0x00);
}
}
}
/******************设定列地址**************/
void SetColumn(uchar column)
{
column &= 0x3f; // 0=<column<=63
column |= 0x40;
WriteCmd(column);
}
/**************显示数字8*16*********************/
void ShowASC(uchar lin,uchar column,uchar ASC)
{
unsigned char *address;
address=&nAsciiDot[ASC-0X30][0];
Show8x8(lin,column,address);
Show8x8(lin+1,column,address+8);
}
/********************显示汉字16*16****************************/
void ShowChina(uchar lin,uchar column,uchar num)
{
unsigned char *address;
address = &HZcode[num][0];
Show8x8(lin,column,address);
Show8x8(lin,column+8,address+8);
Show8x8(lin+1,column,address+16);
Show8x8(lin+1,column+8,address+24);
}
#endif
(3)ds1302子程序
#ifndef __ds1302_H__
#define __ds1302_H__
/***************往DS1302写入1Byte数据************************/
void v_WTInputByte(uchar ucDa)
{
uchar i;
ACC= ucDa;
for(i=8; i>0; i--)
{
T_IO = ACC0;
T_CLK = 1;
T_CLK = 0;
ACC =ACC>> 1;
}
}
/**********************从DS1302读取1Byt**********************/
uchar uc_RTOutputByte(void)
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC>>1;
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/**********************往DS1302写入数*************************/
void wr_ds1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_WTInputByte(ucAddr); /* 地址,命令 */
v_WTInputByte(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST =0;
}
#endif
3.仿真图
四论文小结
转眼间论文已近到了尾声了。在这期间我学习到很多的新知识。尤其是对编程的掌握。以往在学校时学习编程时遇到到新的芯片时,都是老师先编好程序我们理解记忆。而这次我独立的完成DS1302的编程对我来说这是一次很大的进步吧。在这次论文中我还把我以前学的很多的知识又用了一边。使我对以前的知识又有了新的理解。在次还要感谢我的指导老师 高老师的帮助。
五参考文献
1. AT89S52数据手册
2. DS1302数据手册
3. LM35数据手册
4. LM358 数据手册
5. ADC0804数据手册
6. FG12864E数据手册
24
展开阅读全文