单片机课程设计电子日历Word格式文档下载.docx

上传人:b****7 文档编号:22962804 上传时间:2023-02-06 格式:DOCX 页数:22 大小:122.40KB
下载 相关 举报
单片机课程设计电子日历Word格式文档下载.docx_第1页
第1页 / 共22页
单片机课程设计电子日历Word格式文档下载.docx_第2页
第2页 / 共22页
单片机课程设计电子日历Word格式文档下载.docx_第3页
第3页 / 共22页
单片机课程设计电子日历Word格式文档下载.docx_第4页
第4页 / 共22页
单片机课程设计电子日历Word格式文档下载.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

单片机课程设计电子日历Word格式文档下载.docx

《单片机课程设计电子日历Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机课程设计电子日历Word格式文档下载.docx(22页珍藏版)》请在冰豆网上搜索。

单片机课程设计电子日历Word格式文档下载.docx

自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、基本框架

2、设计总原理图

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

阵列式键盘采用行列扫描方式,可以实现秒,分,小时,日期,月份和年信息的校准,以及时钟显示与日历显示的切换功能。

1、STC15F2K60S2单片机

STC系列单片机是深圳宏晶科技公司研发的增强型8051内核单片机,相对于传统的8051内核单片机,在片内资源、性能以及工作速度上都有很大的改进,尤其采用了基于Flash的在线系统(ISP)技术,使得单片机应用系统的开发变得简单了,无须仿真器或专用编程器就可进行单片机应用系统的开发。

本STC15系列单片机采用STC-Y5超告诉CPU内核,在相同频率下,速度比早期1T系列单片机(如STC12、STC11、STC10系列)的速度快20%。

2、数码管显示电路

这是由两个74HC595芯片控制数码管显示电路。

74HC595是具有8位移位寄存器和一个存储器,三态输出功能,串行输入并行输出的芯片。

移位寄存器和存储器分别具有独立的时钟信号。

数据在SHcp的上升沿输入,在STcp的上升沿进入的存储寄存器中去。

如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。

移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。

用两个75HC595芯片分别控制数码管的位选和段选,实现数码管对时间的显现。

3、矩阵键盘接口电路

矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。

在行线和列线的每一个交叉点上,设置一个按键。

这样键盘中按键的个数是4×

4个。

这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。

由于各位数码管的段线并联,段码的输出对各位数码管来说都是相同的。

因此,同一时刻如果各位数码管的位选线都处于选通状态的话,8位数码管将显示相同的字符。

若要各位数码管能够显示出与本位相应的字符,就必须采用扫描显示方式。

即在某一时刻,只让某一位的位选线处于导通状态,而其它各位的位选线处于关闭状态。

同时,段线上输出相应位要显示字符的字型码。

这样同一时刻,只有选通的那一位显示出字符,而其它各位则是熄灭的,如此循环下去,就可以使各位数码管显示出将要显示的字符。

虽然这些字符是在不同时刻出现的,而且同一时刻,只有一位显示,其它各位熄灭,但由于数码管具有余辉特性和人眼有视觉暂留现象,只要每位数码管显示间隔足够短,给人眼的视觉印象就会是连续稳定地显示。

六、程序设计

#defineMAIN_Fosc22118400L

#include"

STC15Fxxxx.H"

#defineTimer0_Reload(65536UL-(MAIN_Fosc/1000))

#defineDIS_DOT0x20

#defineDIS_BLACK0x10

#defineDIS_0x11

u8codet_display[]={

//0123456789ABCDEF

0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,

//black-HJKLNoPUtGQrMy

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};

u8codeT_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

sbitP_HC595_SER=P4^0;

//pin14SERdatainput

sbitP_HC595_RCLK=P5^4;

//pin12RCLkstore(latch)clock

sbitP_HC595_SRCLK=P4^3;

//pin11SRCLKShiftdataclock

u8LED8[8];

u8display_index;

bitB_1ms;

u8hour,minute,second;

u8hour1,minute1,second1;

u16year,month,day;

u16msecond,delay,flag;

u8KeyCode;

u8cnt10ms;

u8IO_KeyState,IO_KeyState1,IO_KeyHoldCnt;

u8cnt50ms;

u8m;

voidIO_KeyScan(void);

//50mscall

voidDisplayRTC(void)

{

if(m==0)//

{

if(hour>

=10)LED8[0]=hour/10;

elseLED8[0]=DIS_BLACK;

LED8[1]=hour%10;

LED8[2]=DIS_;

LED8[3]=minute/10;

LED8[4]=minute%10;

LED8[5]=DIS_;

LED8[6]=second/10;

LED8[7]=second%10;

}

elseif(m==1)//

LED8[0]=2;

LED8[1]=0;

LED8[2]=year/10;

LED8[3]=year%10;

LED8[4]=month/10;

LED8[5]=month%10;

LED8[6]=day/10;

LED8[7]=day%10;

elseif(m==2)//

if(hour>

=10)LED8[0]=hour1/10;

elseLED8[0]=DIS_BLACK;

LED8[1]=hour1%10;

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;

}

voidRTC(void)

{

if(++second>

=60)

second=0;

if(++minute>

{

minute=0;

if(++hour>

=24)

{

hour=0;

day++;

if(day>

30)

{

day=0;

month++;

if(month>

12)

{

month=0;

year++;

}

}

}

}

voidmain(void)

u8i,k;

P0M1=0;

P0M0=0;

P1M1=0;

P1M0=0;

P2M1=0;

P2M0=0;

P3M1=0;

P3M0=0;

P4M1=0;

P4M0=0;

P5M1=0;

P5M0=0;

P6M1=0;

P6M0=0;

P7M1=0;

P7M0=0;

AUXR=0x80;

//Timer0setas1T,16bitstimerauto-reload,

TH0=(u8)(Timer0_Reload/256);

TL0=(u8)(Timer0_Reload%256);

ET0=1;

//Timer0interruptenable

TR0=1;

//Tiner0run

EA=1;

display_index=0;

hour=11;

minute=59;

second=58;

hour1=12;

minute1=01;

second1=00;

year=16;

month=6;

day=13;

m=0;

RTC();

DisplayRTC();

//for(i=0;

i<

8;

i++)LED8[i]=DIS_BLACK;

for(i=0;

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)//hour+1

if(m==0)

if(++hour>

=24)hour=0;

elseif(m==1)

if(++year>

=100)year=0;

elseif(m==2)

if(++hour1>

=24)hour1=0;

DisplayRTC();

if(KeyCode==18)//hour-1

if(--hour>

=24)hour=23;

if(--year>

=100)year=99;

if(--hour1>

=24)hour1=23;

if(KeyCode==19)//minute+1

second=0;

if(++minute>

=60)minute=0;

month++;

if(month>

=30)month=0;

if(++minute1>

=60)minute1=0;

if(KeyCode==20)//minute-1

if(--minute>

=60)minute=59;

month--;

30)month=29;

if(--minute1>

=60)minute1=59;

if(KeyCode==21)//second+1

if(++second>

=60)hour=0;

if(++day>

=30)day=0;

if(++second1>

=60)second1=0;

if(KeyCode==22)//second-1

if(--second>

=60)second=59;

if(--day>

=30)day=29;

if(--second1>

=60)hour1=59;

if(KeyCode==32)

m++;

if(m>

2)m=0;

KeyCode=0;

}

/**********************************************/

u8codeT_KeyTable[16]={0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};

voidIO_KeyDelay(void)

u8i;

i=60;

while(--i);

voidIO_KeyScan(void)//50mscall

u8j;

j=IO_KeyState1;

P0=0xf0;

IO_KeyDelay();

IO_KeyState1=P0&

0xf0;

P0=0x0f;

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;

elseif(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;

elseIO_KeyHoldCnt=0;

P0=0xff;

voidSend_595(u8dat)

{

i++)

dat<

<

=1;

P_HC595_SER=CY;

P_HC595_SRCLK=1;

P_HC595_SRCLK=0;

voidDisplayScan(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)display_index=0;

voidtimer0(void)interruptTIMER0_VECTOR

DisplayScan();

B_1ms=1;

七、个人总结

本项目已经经过调试运行最终实现了功能要求,通过多次测试表明,电子日历的各项性能完全达到设计要求。

对电子日历的发展具有实际推广价值。

在未来的几年中电子日历装置一定会被广泛的应用各种场所,人们对这种电子日历系统一定会倍加青睐。

电子日历制造成本低,环保,方便,省电,安全。

总控制单元的硬件电路中多采用简易芯片,简化了电路设计,系

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1