单片机课程设计-电子日历

湖南科技大学 信息与电气工程学院
《课程设计报告》

题 专 班 姓 学

目:电子日历 业:通信工程 级:3 班 名:黄夏妮 号:1304040322

指导教师:陈君

2016 年

6 月 16 日

单片机原理与应用课程设计评阅书
题目 姓名 电子日历 黄夏妮 专业班级 通信 3 班 学号 1304040322

指导教师评语:

成绩评定为: 指导教师(签字): 年 月 日

信息与电气工程学院 课程设计任务书
2015—2016 学年第二学期
专业:通信工程班级:3 班学号:1304040322 姓名: 黄夏妮 课程设计名称: 设计题目:电子日历 完成期限:自 2016 年 6 月 6 日至 2016 年 6 月 17 日共 2 周 设计依据、要求及主要内容(可另加附页): 设计依据: 本方案以 STC15F2K60S2 单片机作为主控核心,与时钟芯片、LED 显示、按 键等模块组成硬件系统,通过《单片机原理与应用》这门课的课程设计,学生应 能对 STC15 系列单片机有一个全面的认识, 掌握以 STC15 系列单片机为核心的电 子电路的设计方法和应用技术。 设计要求: (1)利用 STC15F2K60S2 单片机作为主控器组成一个电子日历和电子钟。 (2)利用 LED 分别显示当前时间和日历。 (3)利用尽可能少的开关实现:校正日历和时间 (4)定制闹钟(时、分、表) 设计内容: 该课程设计是利用 STC15F2K60S2 单片机内容的定时/计数器、中断系统、以 及行列键盘和 LED 显示器等部件,设计一个单片机电子时钟。设计的电子时钟通 过数码管显示,并通过按键实现时间和暂停、启动控制等。我们选择的方法是单 片机开发设计使用的传统方法, 通过本次设计, 可以了解整个单片机开发的流程。 文章首先介绍了单片机的基本知识,然后同时给出了框图,流程图等。论文涵盖 了从系统设计,编程,原理图等产品开发的基本过程。 单电片机原理与应用

指导教师(签字): 批准日期: 年 月 日





本设计是根据我们所学的单片机课程, 按照大纲要求利用 STC15F2K60S2 单片机作为主 控器组成一个电子日历和电子钟。随着科技的快速发展,时间的流逝,从观太阳、摆钟到现 在电子钟, 人类对时钟进行不断研究, 不断创新纪录。 而本设计以数字集成电路技术为基础, 单片机技术为核心,软件设计采用模块化结构,C 语言编程,系统通过数码管显示数据,设 置了可以显示公历日期(年、月、日、时、分、秒)、闹钟响应以及便携设置时间的电子日 历和电子钟。 在内容安排上首先描述系统硬件工作原理, 着重介绍了各硬件接口技术和各个 接口模块;其次,详细的阐述了程序的各个模块和实现过程。

关键词:电子日历

单片机

STC15F2K60S2





一、前言…………………………………………………………………………1 二、设计目的……………………………………………………………………1 三、设计要求……………………………………………………………………1 四、设计总体方案 1、基本框架………………………………………………………………1 2、设计总原理图…………………………………………………………2 五、单位模块设计 1、STC15F2K60S2 单片机 ………………………………………………3 2、数码管显示电路………………………………………………………3 3、矩阵键盘接口电路……………………………………………………4 六、程序设计 …………………………………………………………………4 七、个人总结 …………………………………………………………………13 八、参考资料 …………………………………………………………………13

一、前



随着社会的不断发展及人们生活水平的不断提高,单片机控制已经越来越普及,它已经成为人们生活 中必不可少的工具之一,它已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术, 其中电子日历就是一个典型的例子。 本设计采用 STC15F2K60S2 单片机作为电子日历的控制模块。单片机可把由 74LH594 中的数据利用软件来 进行处理,从而把数据传输到显示模块,实现日历和闹铃的显示。以数码管为显示模块,把单片机传来的 的数据显示出来,并且显示多样化,在显示电路中,主要靠键盘来实现各种显示要求的选择与切换。 二、设计目的 (1)掌握数字电子钟的设计方法和制作过程。 (2)掌握常用数字集成电路的功能和使用。 (3)了解各芯片的逻辑功能、引脚安排和使用方法。 (4)熟悉了解通过软件控制试验箱来实现所需的功能。 三、设计要求 (1)利用 STC15F2K60S2 单片机作为主控器组成一个电子日历和电子钟。 (2)利用 LED 分别显示当前时间和日历。 (3)利用尽可能少的开关实现:校正日历和时间 (4)定制闹钟(时、分、表) 四、设计总体方案 1、基本框架

- 1 -

2、设计总原理图

本系统采用 PCF8563 时钟芯片进行计时,STC15F2K60S2 单片机通过 IIC 总线进行数据读写,并采用 IO 方式控制两片 74HC595 芯片驱动 8 位数码管,数码管可以实时显示秒,分,小时,日期,月份和年等信 息,并且实现闹铃功能时,数码管闪烁显示。阵列式键盘采用行列扫描方式,可以实现秒,分,小时,日 期,月份和年信息的校准,以及时钟显示与日历显示的切换功能。

- 2 -

五、单位模块设计 1、STC15F2K60S2 单片机

STC 系列单片机是深圳宏晶科技公司研发的增强型 8051 内核单片机, 相对于传统的 8051 内核单片机, 在片内资源、性能以及工作速度上都有很大的改进,尤其采用了基于 Flash 的在线系统(ISP)技术,使 得单片机应用系统的开发变得简单了,无须仿真器或专用编程器就可进行单片机应用系统的开发。 本 STC15 系列单片机采用 STC-Y5 超告诉 CPU 内核,在相同频率下,速度比早期 1T 系列单片机(如 STC12、 STC11、STC10 系列)的速度快 20%。 2、数码管显示电路

这是由两个 74HC595 芯片控制数码管显示电路。 74HC595 是具有 8 位移位寄存器和一个存储器,三态输出功能,串行输入并行输出的芯片。移位寄存 器和存储器分别具有独立的时钟信号。数据在 SHcp 的上升沿输入,在 STcp 的上升沿进入的存储寄存器中
- 3 -

去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。移位寄存器有一个串行移位输 入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行 8 位的,具备三 态的总线输出,当使能 OE 时(为低电平),存储寄存器的数据输出到总线。用两个 75HC595 芯片分别控 制数码管的位选和段选,实现数码管对时间的显现。 3、矩阵键盘接口电路

矩阵键盘又称为行列式键盘,它是用 4 条 I/O 线作为行线,4 条 I/O 线作为列线组成的键盘。在行线 和列线的每一个交叉点上,设置一个按键。这样键盘中按键的个数是 4×4 个。这种行列式键盘结构能够 有效地提高单片机系统中 I/O 口的利用率。由于各位数码管的段线并联,段码的输出对各位数码管来说都 是相同的。因此,同一时刻如果各位数码管的位选线都处于选通状态的话,8 位数码管将显示相同的字符。 若要各位数码管能够显示出与本位相应的字符,就必须采用扫描显示方式。即在某一时刻,只让某一位的 位选线处于导通状态, 而其它各位的位选线处于关闭状态。 同时, 段线上输出相应位要显示字符的字型码。 这样同一时刻,只有选通的那一位显示出字符,而其它各位则是熄灭的,如此循环下去,就可以使各位数 码管显示出将要显示的字符。 虽然这些字符是在不同时刻出现的,而且同一时刻,只有一位显示,其它各位熄灭,但由于数码管具 有余辉特性和人眼有视觉暂留现象,只要每位数码管显示间隔足够短,给人眼的视觉印象就会是连续稳定 地显示。 六、程序设计 #define #include MAIN_Fosc "STC15Fxxxx.H" (65536UL -(MAIN_Fosc / 1000)) 0x20 0x10 0x11 2 3 4 5 6 7 8
- 4 -

22118400L

#define Timer0_Reload #define DIS_DOT #define DIS_BLACK #define DIS_ // 0 1

u8 code t_display[]={ 9 A B C D E F 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,

//black -

H

J

K

L

N

o

P

U

t

G

Q

r

M

y

0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50 ,0x37,0x6e,0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; sbit sbit sbit P_HC595_SER = P4^0; //pin 14 //pin 12 //pin 11 SER RCLk SRCLK data input store (latch) clock Shift data clock P_HC595_RCLK = P5^4; P_HC595_SRCLK = P4^3;

u8 LED8[8]; u8 display_index; bit B_1ms; u8 hour,minute,second; u8 hour1,minute1,second1; u16 year,month,day; u16 msecond,delay,flag; u8 KeyCode; u8 cnt10ms; u8 IO_KeyState, IO_KeyState1, IO_KeyHoldCnt; u8 cnt50ms; u8 m; void void { if(m==0) { if(hour >= 10) LED8[0] = hour / 10; else LED8[2] = DIS_; LED8[3] = minute / 10; LED8[4] = minute % 10; LED8[5] = DIS_; LED8[6] = second / 10; LED8[7] = second % 10; } else if(m==1) { LED8[0]=2; LED8[1]=0; LED8[2]=year/10;
- 5 -

IO_KeyScan(void); DisplayRTC(void) //

//50ms call

LED8[0] = DIS_BLACK;

LED8[1] = hour % 10;

//

LED8[3]=year%10; LED8[4]=month/10; LED8[5]=month%10; LED8[6] = day / 10; LED8[7] = day % 10; } else if(m==2)// { if(hour >= 10) LED8[0] = hour1 / 10; else LED8[2] = DIS_; LED8[3] = minute1 / 10; LED8[4] = minute1 % 10; LED8[5] = DIS_; LED8[6] = second1 / 10; LED8[7] = second1 % 10; } if(hour==hour1) // if(minute==minute1) if(second==second1) { P17=0; for(delay=0;delay<=50000;delay++); P17=1; } } void { if(++second >= 60) { second = 0; if(++minute >= 60) { minute = 0; if(++hour >= 24) { hour = 0; day++;
- 6 -

LED8[0] = DIS_BLACK;

LED8[1] = hour1 % 10;

RTC(void)

if(day>30) { day=0; month++; if(month>12) { month=0; year++; } } } } } } void main(void) { u8 i,k; P0M1 = 0; P1M1 = 0; P2M1 = 0; P3M1 = 0; P4M1 = 0; P5M1 = 0; P6M1 = 0; P7M1 = 0; AUXR = 0x80; P0M0 = 0; P1M0 = 0; P2M0 = 0; P3M0 = 0; P4M0 = 0; P5M0 = 0; P6M0 = 0; P7M0 = 0; //Timer0 set as 1T, 16 bits timer auto-reload,

TH0 = (u8)(Timer0_Reload / 256); TL0 = (u8)(Timer0_Reload % 256); ET0 = 1; TR0 = 1; EA = 1; display_index = 0; hour = 11; minute = 59; second = 58; hour1 = 12; minute1 = 01; second1 = 00; year month = = 16; 6;
- 7 -

//Timer0 interrupt enable //Tiner0 run

day = m=0; RTC();

13;

DisplayRTC(); // for(i=0; i<8; i++) LED8[i] = DIS_BLACK; for(i=0; i<8; i++) LED8[i] = i; k = 0; KeyCode = 0; cnt10ms = 0; IO_KeyState = 0; IO_KeyState1 = 0; IO_KeyHoldCnt = 0; cnt50ms = 0; while(1) { if(B_1ms) { B_1ms = 0; if(++msecond >= 1000) { msecond = 0; RTC(); DisplayRTC(); } if(++cnt50ms >= 50) { cnt50ms = 0; IO_KeyScan(); } if(KeyCode > 0) { if(KeyCode == 17) { if(m==0) { if(++hour >= 24) } else if(m==1)
- 8 -

//hour +1

hour = 0;

{ if(++year>=100)year=0; } else if(m==2) { if(++hour1 >= 24) } DisplayRTC(); } if(KeyCode == 18) { if(m==0) { if(--hour >= 24) } else if(m==1) { if(--year>=100)year=99; } else if(m==2) { if(--hour1 >= 24) } DisplayRTC(); } if(KeyCode == 19) { if(m==0) { second = 0; if(++minute >= 60) minute = 0; } else if(m==1) { month++; if(month>=30)month=0; } else if(m==2) { if(++minute1 >= 60) minute1 = 0;
- 9 -

hour1 = 0;

//hour -1

hour = 23;

hour1 = 23;

//minute +1

} DisplayRTC(); } if(KeyCode == 20) { if(m==0) { second = 0; if(--minute >= 60) minute = 59; } else if(m==1) { month--; if(month>30)month=29; } else if(m==2) { if(--minute1 >= 60) minute1 = 59; } DisplayRTC(); } if(KeyCode == 21) { if(m==0) { if(++second >= 60) hour = 0; } else if(m==1) { if(++day>=30)day=0; } else if(m==2) { if(++second1 >= 60) second1 = 0; } DisplayRTC(); } if(KeyCode == 22) { if(m==0)
- 10 -

//minute -1

//second +1

//second -1

{ if(--second >= 60) second = 59; } else if(m==1) { if(--day>=30)day=29; } else if(m==2) { if(--second1 >= 60) hour1 = 59; } DisplayRTC(); } if(KeyCode ==32) { m++; if(m>2)m=0; } KeyCode = 0; } } } } /**********************************************/ u8 code T_KeyTable[16] = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0}; void IO_KeyDelay(void) { u8 i; i = 60; while(--i) ; } void { u8 j; j = IO_KeyState1; P0 = 0xf0; IO_KeyDelay(); IO_KeyState1 = P0 & 0xf0;
- 11 -

IO_KeyScan(void)

//50ms call

P0 = 0x0f; IO_KeyDelay(); IO_KeyState1 |= (P0 & 0x0f); IO_KeyState1 ^= 0xff; if(j == IO_KeyState1) { j = IO_KeyState; IO_KeyState = IO_KeyState1; if(IO_KeyState != 0) { F0 = 0; if(j == 0) F0 = 1; else if(j == IO_KeyState) { if(++IO_KeyHoldCnt >= 20) { IO_KeyHoldCnt = 18; F0 = 1; } } if(F0) { j = T_KeyTable[IO_KeyState >> 4]; if((j != 0) && (T_KeyTable[IO_KeyState& 0x0f] != 0)) KeyCode = (j - 1) * 4 + T_KeyTable[IO_KeyState & 0x0f] + 16; } } else } P0 = 0xff; } void Send_595(u8 dat) { u8 i; for(i=0; i<8; i++) { dat <<= 1; P_HC595_SER = CY; P_HC595_SRCLK = 1; P_HC595_SRCLK = 0;
- 12 -

IO_KeyHoldCnt = 0;

} } void DisplayScan(void) { Send_595(~T_COM[display_index]); Send_595(t_display[LED8[display_index]]); P_HC595_RCLK = 1; P_HC595_RCLK = 0; if(++display_index >= 8) } void timer0 (void) interrupt TIMER0_VECTOR { DisplayScan(); B_1ms = 1; } 七、个人总结 本项目已经经过调试运行最终实现了功能要求,通过多次测试表明,电子日历的各项性能完全达到设 计要求。对电子日历的发展具有实际推广价值。在未来的几年中电子日历装置一定会被广泛的应用各种场 所,人们对这种电子日历系统一定会倍加青睐。 电子日历制造成本低,环保,方便,省电,安全。总控制单元的硬件电路中多采用简易芯片,简化了电路 设计,系统开发容易,在日常生活中都具有很强的适用性,具有实际推广价值;采用模块化设计,易于维 护。 在论文工作中,遇到了不少困难,一直得到老师和同学们的亲切关怀和悉心指导,使我学到了许多平 时学不到的知识,让我明白了理论联系实际,不能好高骛远。回顾这两周以来的学习经历,面对现在的收 获,我感到无限欣慰。为此,我向热心帮助过我的所有老师和同学表示由衷的感谢!我会再接再厉,在以 后的学生生活中,谦虚上进,不让各位老师和同学们失望! 八、参考资料: 丁向荣.单片机微机原理与接口技术[M].电子工业出版社 ,2012,159-178 display_index = 0;

- 13 -


相关文档

电子日历单片机课程设计
电子日历单片机课程设计报告
单片机课程设计电子日历
单片机课程设计报告电子日历时钟
单片机课程设计电子日历时钟显示器设计
单片机课程设计(可调式中文电子日历)
单片机课程设计:智能电子日历
单片机课程设计报告-日历
51单片机电子日历课程设计
单片机课程设计 电子日历时钟显示器设计
电脑版