当前位置:文档之家› 电子日历单片机课程设计报告

电子日历单片机课程设计报告

湖南科技大学信息与电气工程学院《单片机原理与应用课程设计报告》题目:电子日历专业:电子信息工程班级:姓名:学号:指导教师:2016年 07月13日单片机原理与应用课程设计评阅书信息与电气工程学院课程设计任务书2015-2016学年第2学期专业:电子信息工程学号:姓名:课程设计名称:设计题目:完成期限:自 2016 年 7 月 4 日至 2015 年 7 月 15 日共 2 周设计依据、要求及主要内容(可另加附页):设计依据:STC15F2K60S2单片机的定时/计数器,74HC59芯片的串并输出,数码管显示。

实验要求:(1)、利用STC15F2K60S2单片机作为主控器组成一个电子日历和电子钟。

(2)、利用LED分别显示当前时间和日历。

(3)、利用尽可能少的开关实现:校正日历和时间(4)、定制闹钟(时、分、表)。

主要内容:本系统是用STC15F2K60S2单片机的T0定时器的16位自动重装来产生1ms节拍,程序运行于这个节拍下,通过计数1000次从而自动定时于1s,以实现时钟的仿真。

另外通过STC15F2K60S2单片机的IO方式控制74HC595驱动8位数码管。

数码管可以实时显示秒,分,小时,日期,月份和年等信息,并且实现闹铃功能时,数码管闪烁显示。

矩阵式键盘采用编程扫描方式,可以实现秒,分,小时,日期,月份和年信息的校准。

同时通过STC15F2K60S2单片机的外部中断INT0实现年月日与时分秒显示的切换。

指导教师(签字):批准日期:年月日本设计是基于51系列的单片机进行的实时日历和时钟显示设计,可以显示年月日时分秒及周信息,具有可调整日期和时间功能。

在设计的同时对单片机的理论基础和外围扩展知识进行了比较全面准备。

实时日历和时钟显示的设计过程在硬件与软件方面进行同步设计。

硬件部分主要由STC15F2K60S2单片机,LED显示电路,以及调时按键电路等组成,系统通过74HC595驱动8位数码管现实数据,所以具有人性化的操作和直观的显示效果。

软件方面主要包括时钟程序、键盘程序,显示程序等。

本系统以单片机的汇编语言进行软件设计,为了便于扩展和更改,软件的设计采用模块化结构,使程序设计的逻辑关系更加简洁明了,以便更简单地实现调整时间及日期显示功能。

所有程序编写完成后,在wave软件中进行调试,确定没有问题后,在Protel99se 软件中嵌入单片机内进行仿真。

关键词:STC15F2K60S2;Protel99se;74HC595一.设计任务目的和要求 (2)1.1目的 (2)1.2要求 (2)二.总体的方案与论证 (2)2.1计时方案 (2)2.2显示方案 (2)2.3功能键方案 (2)三.系统硬件设计 (3)3.1主控制器 (3)3.2显示驱动 (4)3.3矩阵键盘扫描 (4)四.系统的软件设计 (5)4.1定时实现 (5)4.2实时时钟仿真实现 (6)4.3数码管显示实现 (7)4.4矩阵键盘扫描实现 (7)4.5显示切换和闹钟实现 (9)五.系统调试和测试结果分析 (10)六.结论总结和心得体会 (10)参考文献 (12)一.设计任务目的和要求1.1目的:本系统是用STC15F2K60S2单片机的T0定时器的16位自动重装来产生1ms 节拍,程序运行于这个节拍下,通过计数1000次从而自动定时于1s,以实现时钟的仿真。

另外通过STC15F2K60S2单片机的IO方式控制74HC595驱动8位数码管。

数码管可以实时显示秒,分,小时,日期,月份和年等信息,并且实现闹铃功能时,数码管闪烁显示。

矩阵式键盘采用编程扫描方式,可以实现秒,分,小时,日期,月份和年信息的校准。

同时通过STC15F2K60S2单片机的外部中断INT0实现年月日与时分秒显示的切换。

1.2要求:(1)、利用STC15F2K60S2单片机作为主控器组成一个电子日历和电子钟。

(2)、利用LED分别显示当前时间和日历。

(3)、利用尽可能少的开关实现:校正日历和时间(4)、定制闹钟(时、分、表)。

二.总体的方案和实现2.1计时方案:本次课程设计中可以通过两种方案实现计时,一是通过STC15F2K60S2单片机内部的定时器实现计时计数功能;二是通过PCF8653芯片实现计时功能。

在这里我选择使用STC15F2K60S2单片机内部的定时器来实现电子日历的计时功能。

另外,通过STC15F2K60S2单片机内部的中断系统来实现年月日和时分秒的切换。

2.2显示方案:本次课程设计中提供了8个数码管显示年月日和时分秒信息。

数码管工作原理分为共阳和共阴两种。

其中共阳极数码管的8个发光二极管的公共阳极接高电平,当某段驱动电路的输出段为低电平时,则该端所连接的字段导通点亮;而共阴极数码管的8个发光二极管的公共阴极接低电平,当某段驱动电路的输出段为高电平时,则该端所连接的字段导通点亮。

数码管显示分为静态显示和动态显示两种。

静态显示是指数码管显示某一字符时,相应的发光二极管恒定导通或恒定截止,各数码管相互独立;动态显示是指一位一位通过扫描方式点亮各位数码管。

在这里我选定的是数码管共阴级工作状态,使用动态显示方式。

另外,使用74HC595芯片实现串并转换,从而驱动数码管工作。

2.3功能键方案:本次课程设计要求实现通过按键进行校正日历和时间。

键盘按照工作方式可以分为独立式键盘和矩阵式键盘。

其中独立式键盘是直接用I/O 口线构成单个按键电路,其特点是每个按键单独使用一根I/O 口线,按键间的工作是相互独立的;矩阵式键盘是由行数和列数组成,按键位于行、列数的交叉点上,通过扫描法进行键盘按键的识别。

本次课程设计我选用的是矩阵式键盘,选择50ms 扫描一次。

通过扫描后的键码值来选择按键的作用,以实现按键对日历和时间的校正工作。

三.系统的硬件设计3.1主控制器STC15F2K60S2单片机内部产生时钟周期,并检测外部中断执行指令本次课程设计用的是STC15F2K60S2单片机内部的定时器。

此时就会涉及到三个时钟问题。

分别为晶振时钟osc ƒ,系统时钟sys ƒ,和计数脉冲周期。

晶振时钟osc ƒ是STC15F2K60S2单片机实现定时功能的真正原因,而系统时钟sys ƒ是STC15F2K60S2单片机在现实工作中的工作频率,系统时钟和晶振时钟的关系为:sys osc /=N ƒƒ,由时钟分频器(CLK_DIV )设置。

而计数脉冲周期则是在定时过程中计数时的频率,由辅助寄存器AUXR 的T0x12或T1x12来设置。

硬件连接图如下:3.2显示驱动74HC595芯片来驱动8位数码管来现实数据,本次课程设计中,我们使用的是共阴极数码管,所以可以通过查找资料,提前定义好一个数码管显示状态的数组t_display。

之后就是考虑如何使数码管显示我们所需要的信息。

硬件连接图如下:3.3矩阵键盘扫描:实现在本次课程设计中,我选用的是矩阵式键盘,选用扫描法得到键码值,设定为50ms扫描一次。

原理图如下:四.系统软件设计:4.1定时实现本次课程设计用的是STC15F2K60S2单片机内部的定时器。

此时就会涉及到三个时钟问题。

分别为晶振时钟osc ƒ,系统时钟sys ƒ,和计数脉冲周期。

晶振时钟osc ƒ是STC15F2K60S2单片机实现定时功能的真正原因,而系统时钟sys ƒ是STC15F2K60S2单片机在现实工作中的工作频率,系统时钟和晶振时钟的关系为:sys osc /=N ƒƒ,由时钟分频器(CLK_DIV )设置。

而计数脉冲周期则是在定时过程中计数时的频率,由辅助寄存器AUXR 的T0x12或T1x12来设置。

通过软件检测,可知系统时钟为11.0592MHZ ,另外选择使用定时器T0来定时,因此将AUXR= 0x80,将T0x12置1使得计数脉冲等于系统时钟周期,即无频。

之后就是定时器的工作方式的设定,由工作方式寄存器TMOD 设置。

按照实验的需求,选择TO 定时/计数器,选择工作方式0的自动重装初始值的16位定时,功能选择为定时工作模式,要求是软件控制TRO 置1即可以启动定时器。

综上所述:将TMOD = 0x00;默认情况即可。

而后就是定时的初始值的设定。

这是因为定时器的核心电路是一个加1计数器,计数器在每输入一个脉冲,计数值加1。

当计数到计数器全为1时,再输入一个脉冲使计数值回0同时使计数器计满溢出标志位TF0置1,并向CPU 发出中断请求。

所以在这里需要一个初始值开始计数,从而实现定时。

初始值的的公式为:X=M-设定时间*计数脉冲频率,其中M=65536,定时时间为1ms ,之后就是将初始值赋给THO 和TLO 。

相应的设置程序如下:#define MAIN_Fosc 11059200L //定义系统时钟#define Timer0_Reload (65536UL -(MAIN_Fosc / 1000)) //定义定时1ms 的初始值 AUXR = 0x80; //T0x12=1 ,设置计数脉冲位1TTH0 = (u8)(Timer0_Reload / 256);//将初始值高8位 给TH0 TL0 = (u8)(Timer0_Reload % 256);//将初始值低8位 给TL0ET0 = 1; //定时器T0中断允许TR0 = 1; //启动定时器T0EA = 1; //打开总中断4.2实时时钟仿真实现因为定时器最大是16位的原因,使得最大累加次数为65536,无法做到定时1s,所以在本次课程设计中,我们是定时1ms,通过定时1000次1ms来定时1s。

之后,就是通过软件来实现时钟的仿真。

以1s为基础,实现秒的计数,接着就是完成秒的60进制,实现分的计数;完成分的60进制,实现时的计数……这样一步一步实现时钟仿真。

相应的设置程序如下:while(1){if(B_1ms) //1ms到,通过定时中断改变标志位{B_1ms = 0;if(++msecond >= 1000) //1S到{msecond = 0;RTC();}}//1s到进入时钟仿真函数/********************** Timer0 1ms中断函数 ************************/void timer0 (void) interrupt 1{ B_1ms = 1;}//1ms改变标志位/********************** RTC演示函数************************/void RTC(void)//时钟仿真函数{if(++second >= 60) //秒->分,60进制{second = 0;if(++minute >= 60){minute = 0;if(++hour >= 24)//分->时,60进制{hour = 0, ++day; //时->天,24进制if(mon==1||mon==3||mon==5||mon==7||mon==8||mon == 10||mon==12){if (day >= 31) {day =1;if(++mon >= 12){mon = 1; ++year;}}}//大月if(mon==4||mon==6||mon==9||mon==11){if (day >= 30) {day =1;++mon;}}//小月if(year%4 == 0){if(mon == 2)if(day >= 29){day = 1; ++mon;}}//闰年if(year%4 != 0){if(mon == 2)if(day >= 28){day = 1; ++mon;}}}}}}//平年4.3数码管显示实现在本次课程设计中,我们使用的是共阴极数码管,所以可以通过查找资料,提前定义好一个数码管显示状态的数组t_display。

相关主题