万年历课程设计论文.docx
《万年历课程设计论文.docx》由会员分享,可在线阅读,更多相关《万年历课程设计论文.docx(33页珍藏版)》请在冰豆网上搜索。
![万年历课程设计论文.docx](https://file1.bdocx.com/fileroot1/2022-12/30/3a16cea7-535d-44c8-a56d-747c81d7033b/3a16cea7-535d-44c8-a56d-747c81d7033b1.gif)
万年历课程设计论文
单片机课程设计
题目名称:
电子万年历
姓名:
学号:
201130095031
系别:
电子信息工程系
班级:
电子信息工程
(1)班
指导老师:
完成时间:
2013年1月2日
目录
一、摘要****************************************************************3
二、设计要求和目的**************************************************3
三、课程设计任务*****************************************************3
四、DS1302模块******************************************************3-7
五、51单片机最小系统模块*****************************************7-9
六、显示器12864模块************************************9-14
七、电子万年历的电路图和PCB图********************************15
八、电子万年历的功能介绍*****************************************15-16
九、系统软件设计****************************************************16-21
十、个人感想**********************************************************21
一、摘要
随着社会、科技的发展,人类得知时间,从观太阳、摆钟到现在电子钟,不断研究、创新。
为了在观测时间的同时,能够了解其它与人类密切相关的信息,比如温度、星期、日期等,电子万年历诞生了,它集时间、日期、星期和温度功能于一身,具有读取方便、显示直观、功能多样、电路简洁等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。
该电子万年历主要采用AT89C51单片机作为主控核心,由DS1302时钟芯片提供时钟、LED动态扫描显示屏显示。
AT89C51单片机是由Atmel公司推出的,功耗小,电压可选用4~6V电压供电;DS1302时钟芯片是美国DALLAS公司推出的具有涓细电流充电功能的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小;数字显示是采用的LED液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒和温度等信息。
此外,该电子万年历还具有时间校准等功能。
关键词:
时钟电路;时钟芯片DS1302;LED动态扫描;单片机AT89C51;MAX7219;
二、设计要求和目的
要求:
利用51单片机芯片和DS1302芯片设计电子万年历
目的:
1.注重培养综合运用所学知识、独立分析和解决实际问题的能力,培养创新意识和创新能力,并获得科学研究的基础训练。
2.了解所选择的51单片机芯片各个引脚功能,按键识别的相关原理,并巩固学习单片机的相关内容知识。
3.通过软硬件设计实现利用51单片机芯片完成电子万年历的显示
三、课程设计任务
1.查阅相关文献资料,熟悉所选51单片机芯片;
2.总体设计方案规划,通过按键输入调整,在LCD液晶模块上能显示期、时、分、秒和阴历月、日,在显示农历时间时,能标明是否为闰年。
3.系统硬件设计,熟悉单片机最小系统构建,DS1302时钟芯片工作原理。
4.系统软件设计,用C语言编程实现年、月、日、星期、时、分、秒显示功能。
5.设计心得体会及总结。
四、DS1302模块
DS1302是DALLAS公司推出的涓流充电时钟芯片,内含一个实时时钟/日历和31字节静态RAM,可以通过串行接口与单片机进行通信。
实时时钟/日历电路提供秒、分、时、日、星期、月、年的信息,每个月的天数和闰年的天数可以自动调制,时钟操作可通过AM/PM标志位决定采用24或12小时时间格式。
DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需三根I/O线:
复位(RST)、I/O数据线、串行时钟(SCLK)。
时钟/RAM的读/写数据以一字节或多达31字节的字符组方式通信。
DS1302工作时功耗很低,保持数据和时钟信息时,功耗小于1mW。
2、DS1302引脚分布及含义
图10-1DS1302引脚图
X1,X2:
32.768KHz晶振引脚。
GND:
共地端。
RST:
复位。
I/O:
数据输入/输出。
SCLK:
串行时钟。
VCC1:
电池引脚。
VCC2:
主电源引脚。
DS1302的内部结构如图所示,主要组成部分为:
移位寄存器、控制逻辑、振荡器、实时时钟以及RAM。
虽然数据分为两种,但是对单片机的程序而言,其实是一样的,就是对特定的地址进行读写操作。
图10-2DS1302内部结构图
DS1302含充电电路,可以对作为后备电源的可充电电池充电,并可选择充电使能和串入的二极管数目,以调节电池充电电压。
不过对我们目前而言,最需要熟悉的是和时钟相关的部分功能,对于其他参数请参阅数据手册。
3、DS1302工作原理
DS1302工作时为了对任何数据传送进行初始化,需要将复位脚(RST)置为高电平且将8位地址和命令信息装入移位寄存器。
数据在时钟(SCLK)的上升沿串行输入,前8位指定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输入数据。
时钟脉冲的个数在单字节方式下为8+8(8位地址+8位数据),在多字节方式下为8加最多可达248的数据。
4、DS1302的寄存器和控制命令
对DS1302的操作就是对其内部寄存器的操作,DS1302内部共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。
此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。
时钟突发寄存器可一次性顺序读写除充电寄存器以外的寄存器。
日历、时间寄存器及控制字如表所示。
表10-1日历、时钟寄存器与控制字对照表
寄存器名称
bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
1
RAM/CK*
A4
A3
A2
A1
A0
RD/WR*
秒寄存器
1
0
0
0
0
0
0
X
分寄存器
1
0
0
0
0
0
1
X
小时寄存器
1
0
0
0
0
1
0
X
日寄存器
1
0
0
0
0
1
1
X
月寄存器
1
0
0
0
1
0
0
X
星期寄存器
1
0
0
0
1
0
1
X
年寄存器
1
0
0
0
1
1
0
X
写保护寄存器
1
0
0
0
1
1
1
X
慢充电寄存器
1
0
0
1
0
0
0
X
时钟突发寄存器
1
0
1
1
1
1
1
X
表10-2内部主要寄存器分布表
最后一位RD/WR*为“0”时表示进行写操作,为“1”时表示读操作。
DS1302内部寄存器列表如下表所示。
DS1302内部的RAM分为两类:
一类是单个RAM单元,共31个,每个单元为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)和FFH(读)。
接下来讨论如何通过外部接口来访问控制寄存器和RAM。
单片机是通过简单的同步串行通讯与DS1302通讯的,每次通讯都必须由单片机发起,无论是读还是写操作,单片机都必须先向DS1302写入一个命令帧,这个帧的格式如表10-1所示,最高位Bit7固定为1,Bit6决定操作是针对RAM还是时钟寄存器,接着的5个Bit是RAM或时钟寄存器在DS1302的内部地址,最后一个Bit表示这次操作是读操作或是写操作。
物理上,DS1302的通讯接口由3个口线组成,即RST,SCLK,I/O。
其中RST从低电平变成高电平启动一次数据传输过程,SCLK是时钟线,I/O口是数据线。
具体的读写时序参考图10-3,注意的是,无论是哪种同步通讯类型的串行接口,都是对时钟信号敏感的,而且一般输入写入有效是在上升沿,读出有效是在下降沿(DS1302也是如此),如果不是特别确定,则把程序设计成如下:
平时SCLK保持低电平,在时钟变动前设置数据,在时钟变动后读取数据,即数据操作总是在SCLK保持为低电平的时候,相邻的操作之间间隔有一个上升沿和一个下降沿。
图10-3单个字节的读写时序图
DS1302的连接电路图如下图
五、51单片机最小系统模块
电路图如下图
下面着重介绍时钟电路和复位电路。
1)时钟电路
单片机工作时,从取指令到译码再进行微操作,必须在时钟信号控制下才能有序地
进行,时钟电路就是为单片机工作提供基本时钟的。
单片机的时钟信号通常有两种产生方式:
内部时钟方式和外部时钟方式。
在单片机XTAL1和XTAL2引脚上跨接上一个晶振和两个
稳频电容,可以与单片机片内的电路构成一个稳定的自激振荡器。
晶振的取值范围一般为
0~24MHz,常用的晶振频率有6MHz、12MHz、11.0592MHz、24MHz等。
一些新型的
单片机还可以选择更高的频率。
外接电容的作用是对振荡器进行频率微调,使振荡信号频率
与晶振频率一致,同时起到稳定频率的作用,一般选用20~30pF的瓷片电容。
外部时钟方式则是在单片机XTAL1引脚上外接一个稳定的时钟信号源,它一般适
用于多片单片机同时工作的情况,使用同一时钟信号可以保证单片机的工作同步。
时序是单片机在执行指令时CPU发出的控制信号在时间上的先后顺序。
AT89C51单片机的时序概念有4个,可用定时单位来说明,包括振荡周期、时钟周期、机器周期和指令周期。
振荡周期:
是片内振荡电路或片外为单片机提供的脉冲信号的周期。
时序中1个振荡周期定义为1个节拍,用P表示。
时钟周期:
振荡脉冲送入内部时钟电路,由时钟电路对其二分频后输出的时钟脉冲周期称为时钟周期。
时钟周期为振荡周期的2倍。
时序中1个时钟周期定义为1个状态,用S表示。
每个状态包括2个节拍,用P1、P2表示。
机器周期:
机器周期是单片机完成一个基本操作所需要的时间。
一条指令的执行需要一个或几个机器周期。
一个机器周期固定的由6个状态S1~S6组成。
指令周期:
执行一条指令所需要的时间称为指令周期。
一般用指令执行所需机器周期数表示。
AT89C51单片机多数指令的执行需要1个或2个机器周期,只有乘除两条指令的执行需要4个机器周期。
了解了以上几个时序的概念后,我们就可以很快的计算出执行一条指令所需要的时间。
例如:
若单片机使用12MHz的晶振频率,则振荡周期=1/(12MHz)=1/12us,时钟周期=1/6us,机器周期=1us,执行一条单周期指令只需要1us,执行一条双周期指令则需要2us。
2)复位电路
无论是在单片机刚开始接上电源时,还是运行过程中发生故障都需要复位。
复位电
路用于将单片机内部各电路的状态恢复到一个确定的初始值,并从这个状态开始工作。
单片机的复位条件:
必须使其RST引脚上持续出现两个(或以上)机器周期的高电平。
上
电复位电路中,利用电容充电来实现复位。
在电源接通瞬间,RST引脚上的电位是高电平
(Vcc),电源接通后对电容进行快速充电,随着充电的进行,RST引脚上的电位也会逐渐
下降为低电平。
只要保证RST引脚上高电平出现的时间大于两个机器周期,便可以实现正
常复位。
按键复位电路中,当按键没有按下时,电路同上电复位电路。
如在单片机运行过程中,按下
RESET键,已经充好电的电容会快速通过1KΩ电阻的回路放电,从而使得RST引脚上的
电位快速变为高电平,此高电平会维持到按键释放,从而满足单片机复位的条件实现按键复
位。
单片机复位后各特殊功能寄存器的复位值见下表
单片机特殊功能寄存器复位值
寄存器复位值寄存器复位值寄存器复位值
PC0000HSBUF不确定TMOD00H
B00HSCON00HTCON00H
ACC00HTH100HPCON0***0000B
PSW00HTH000HDPTR0000H
IP***00000BTL100HSP07H
IE0**00000BTL000HP0~P3FFH
注:
*表示无关位。
六、显示器12864模块
管脚号
管脚名称
电平
管脚功能描述
1
GND
0V
电源地
2
VCC
3.0+5V
电源正
3
V0
-
对比度(亮度)调整
4
RS(CS)
H/L
RS=“H”,表示DB7——DB0为显示数据
RS=“L”,表示DB7——DB0为显示指令数据
5
R/W(SID)
H/L
R/W=“H”,E=“H”,数据被读到DB7——DB0
R/W=“L”,E=“H→L”,DB7——DB0的数据被写到IR或DR
6
E(SCLK)
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
PSB
H/L
H:
8位或4位并口方式,L:
串口方式(见注释1)
16
NC
-
空脚
17
/RESET
H/L
复位端,低电平有效(见注释2)
18
VOUT
-
LCD驱动电压输出端
19
BLA
VDD
背光源正端(+5V)(见注释3)
20
BLKK
VSS
背光源负端(见注释3)
*注释1:
如在实际应用中仅使用并口通讯模式,可将PSB接固定高电平,也可以将模块上的J8和“VCC”用焊锡短接。
*注释2:
模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。
*注释3:
如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。
指令说明:
模块控制芯片提供两套控制命令,基本指令和扩充指令如下:
指令表1:
(RE=0:
基本指令)
指
指令码
功能
令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
清除
显示
0
0
0
0
0
0
0
0
0
1
将DDRAM填满"20H",并且设定DDRAM的地址计数器(AC)到"00H"
地址
归位
0
0
0
0
0
0
0
0
1
X
设定DDRAM的地址计数器(AC)到"00H",并且将游标移到开头原点位置;这个指令不改变DDRAM的内容
显示状态开/关
0
0
0
0
0
0
1
D
C
B
D=1:
整体显示ON
C=1:
游标ON
B=1:
游标位置反白允许
进入点
设定
0
0
0
0
0
0
0
1
I/D
S
指定在数据的读取与写入时,设定游标的移动方向及指定显示的移位
游标或显示移位控制
0
0
0
0
0
1
S/C
R/L
X
X
设定游标的移动与显示的移位控制位;这个指令不改变DDRAM的内容
功能
设定
0
0
0
0
1
DL
X
RE
X
X
DL=0/1:
4/8位数据
RE=1:
扩充指令操作
RE=0:
基本指令操作
设定CGRAM
地址
0
0
0
1
AC5
AC4
AC3
AC2
AC1
AC0
设定CGRAM地址
设定DDRAM
地址
0
0
1
0
AC5
AC4
AC3
AC2
AC1
AC0
设定DDRAM地址(显示位址)
第一行:
80H-87H
第二行:
90H-97H
读取忙标志和地址
0
1
BF
AC6
AC5
AC4
AC3
AC2
AC1
AC0
读取忙标志(BF)可以确认内部动作是否完成,同时可以读出地址计数器(AC)的值
写数据到RAM
1
0
数据
将数据D7——D0写入到内部的RAM(DDRAM/CGRAM/IRAM/GRAM)
读出RAM的值
1
1
数据
从内部RAM读取数据D7——D0
(DDRAM/CGRAM/IRAM/GRAM)
指令表2:
(RE=1:
扩充指令)
指
指令码
功能
令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
待命
模式
0
0
0
0
0
0
0
0
0
1
进入待命模式,执行其他指令都棵终止
待命模式
卷动地址开关开启
0
0
0
0
0
0
0
0
1
SR
SR=1:
允许输入垂直卷动地址
SR=0:
允许输入IRAM和CGRAM地址
反白
选择
0
0
0
0
0
0
0
1
R1
R0
选择2行中的任一行作反白显示,并可决定反白与否。
初始值R1R0=00,第一次设定为反白显示,再次设定变回正常
睡眠
模式
0
0
0
0
0
0
1
SL
X
X
SL=0:
进入睡眠模式
SL=1:
脱离睡眠模式
扩充
功能
设定
0
0
0
0
1
CL
X
RE
G
0
CL=0/1:
4/8位数据
RE=1:
扩充指令操作
RE=0:
基本指令操作
G=1/0:
绘图开关
设定绘图RAM
地址
0
0
1
0
AC6
0
AC5
0
AC4
AC3
AC3
AC2
AC2
AC1
AC1
AC0
AC0
设定绘图RAM
先设定垂直(列)地址AC6AC5…AC0
再设定水平(行)地址AC3AC2AC1AC0
将以上16位地址连续写入即可
备注;当IC1在接受指令前,微处理器必须先确认其内部处于非忙碌状态,即读取BF标志时,BF需为零,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延长一段较长的时间,即是等待前一个指令确实执行完成。
读写时序图
数据传输过程
8位和4位数据线的传输过程
串口数据线模式数据传输过程
时序图
MPU写资料到ST7920(8位数据线模式)
MPU从ST7920读资料(8位数据线模式)
串口读写时序:
七、电子万年历的电路图和PCB图
电路图如下图:
PCB图如下图
八、电子万年历的功能介绍
电子万年历的功能主要是由51单片机和DS1302芯片实现的,并且在显示屏12864上显示。
同时,万年历的年、月、日、星期、时、分、秒还有农历,而且,还具有闹钟提醒、整点报时的功能,同时,它还能通过按键调整年、月、日、星期、时、分、秒,起到调整的作用,给我们带来了极大地方便。
如上图
K1键:
是设置按键,主要是用来选择需要调节的年、月、日、星期、时、分、秒
K2键:
是确认和返回键。
K3键:
是加键,用来调节年、月、日、星期、时、分、秒
K4键:
是减键,用来调整年、月、日、星期、时、分、秒
K5键:
是闹钟的开启和关闭键。
九、系统软件设计
时间控制流程图
主要的部分代码介绍:
#include
#include
#include"LCD12864.h"
#include"DS1302.h"
#include"nongli.h"
#include"displaytime.h"
#include"bell.h"
#include"delay.h"
#defineuintunsignedint
#defineucharunsignedchar
/*--------------------定义按键-----------------------------------------------*/
sbitK1=P1^0;//K1-设置
sbitK2=P1^1;//K2-确认、返回
sbitK3=P1^2;//K3-加
sbitK4=P1^3;//K4-减
sbitK5=P1^5;//按键K5-闹钟的打开与关闭
sbitled=P2^0;//led灯
//K5=P1^4,K5-控制闹钟的打开与关闭,在"hw.h"中定义
/*---------------------函数声明------------------------------*/
voidds_w0(void);
voidds_w(void);
voidConver_week(bitc,ucharyear,ucharmonth,ucharday);
/*-----------------------------定义全局变量------------------------------*/
bitw=0;//调时标志位
unsignedcharyy,mo,dd,xq,hh,mm,ss,month_moon,day_moon,week,tiangan,dizhi,moontemp1,moontemp2;//定义时间映射全局变量(专用寄存器)
signedcharaddress,item,item0,max,mini;
unsignedcharclk_ala[2]={0x00,0x00};//闹钟数据存放初,始值为00:
00
unsignedcharhour,minute,time;//用于闹铃的设置
/*-----------------------------日期、时间设置函数-----------------------------*/
voidtiaozheng(void){
yy=read_clock(0x8d);//调用1302时钟数据中的年数据,从地址0x8d中
mo=read_clock(0x89);//调用1302时钟数据中的月数据,从地址0x89中
dd=read_clock(0x87);//从1302芯片中读取日数据,从地址0x87中
week=read_clock(0x8b);//从1302芯片中读取星期数据,从地址0x8b中
//----------------------------------
lcm_w_test(0,0x80);
lcm_w_word("20");//显示内容字符20
lcm_w_test(1,(yy/16)+0x30);//函数参数1,代表本行写数据,YY/16+0X30得出年十位数字的显示码地址,送显示
lcm_w_test(1,