湖南科技大学 信息与电气工程学院
《单片机原理与应用课程设计报告》
题 目: 电子日历 专 业: 电子信息工程 班 级: 姓 名: 学 号: 指导教师:
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.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功能键方案:
2
本次课程设计要求实现通过按键进行校正日历和时间。
键盘按照工作方式可以分为独立式键盘和矩阵式键盘。其中独立式键盘是直接用I/O
口线构成单个按键电路,其特点是每个按键单独使用一根I/O口线,按键间的工作是相互独立的;矩阵式键盘是由行数和列数组成,按键位于行、列数的交叉点上,通过扫描法进行键盘按键的识别。
本次课程设计我选用的是矩阵式键盘,选择50ms扫描一次。通过扫描后的键码值来选
择按键的作用,以实现按键对日历和时间的校正工作。
三.系统的硬件设计
3.1主控制器STC15F2K60S2单片机内部产生时钟周期,并检测外部中断执行指令本次课
程设计用的是STC15F2K60S2单片机内部的定时器。此时就会涉及到三个时钟问题。分别为晶振时钟
osc,系统时钟sys,和计数脉冲周期。
晶振时钟
osc是STC15F2K60S2单片机实现定时功能的真正原因,而系统时钟sys是
STC15F2K60S2单片机在现实工作中的工作频率,系统时钟和晶振时钟的关系为:
sys=osc/N,由时钟分频器(CLK_DIV)设置。而计数脉冲周期则是在定时过程中计数
时的频率,由辅助寄存器AUXR的T0x12或T1x12来设置。硬件连接图如下:
3
3.2显示驱动74HC595芯片来驱动8位数码管来现实数据,本次课程设计中,我们使用的
是共阴极数码管,所以可以通过查找资料,提前定义好一个数码管显示状态的数组t_display。之后就是考虑如何使数码管显示我们所需要的信息。硬件连接图如下:
3.3矩阵键盘扫描:实现在本次课程设计中,我选用的是矩阵式键盘,选用扫描法得到键
码值,设定为50ms扫描一次。原理图如下:
4
四.系统软件设计:
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 ,设置计数脉冲位1T TH0 = (u8)(Timer0_Reload / 256); TL0 = (u8)(Timer0_Reload % 256); ET0 = 1; //定时器T0中断允许 TR0 = 1; //启动定时器T0
5
//将初始值高8位 给TH0 //将初始值低8位 给TL0
EA = 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进制
6
{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。之后就是考虑如何使数码管显示我们所需要的信息。
在这里我们选用74HC595芯片来驱动8位数码管。这是因为数据在STC15F2K60S2单片
机中是以串行数据传输的,而数码管显示却是要求输进的为8位并行数据,这样才能使数码管显示一个信息。而74HC595芯片的作用就是实现串并转换的功能。
STC15F2K60S2单片机将数据以串行形式输进74HC595芯片的SER引脚,而后又通过输
送高低电平,依次给74HC595芯片的SRCLK,RCLK上升沿,实现串行数据转变为并行数据输进数码管。
另外,因为本次实验中用到了8个数码管,要实现点亮的顺序,还要定义一个数码管位
码的数组T_COM,在这个数组中,通过位索引变量display_index,确定亮的数码管位数。 相应的设置程序如下:
/**************** 向HC595发送一个字节函数******************/ 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;} //串行数据输入SER,接着移位到Q0-Q7,上升沿有效 }
/********************** 显示扫描函数 ************************/ 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) display_index = 0; //8位结束回0 }
4.4矩阵键盘扫描实现
在本次课程设计中,我选用的是矩阵式键盘,选用扫描法得到键码值,设定为50ms扫
描一次。
通过查看实验原理图,可知由P0口控制一个4*4的矩阵键盘,其中,P0.0-P0.3控制
行的读入,P0.4-P0.7控制列的读入。另外,因为这里设定了P0口是准双向口工作模式(P0M1
7
= 0; P0M0 = 0),因此需要将P0的8个端口置1时候,才能从端口引脚读入数据。所以要允许读入列时,要使P0 = 0xf0,同理,要允许读入行时,要使P0 = 0x0f。之后,就是得到键盘行列的状态。此时要注意,在键盘扫描中,读行是输出列的状态,读列是输出行的状态。所以通过IO_KeyState1 =P0&0xf0;IO_KeyState1 |= (P0 & 0x0f);将矩阵的行列状态赋给IO_KeyState1,且高4位是行状态,低4位是列状态。
而后,就是通过右移四位,得到行数;通过与0x0f相与,得到列数,最后通过计算得
到键码值,而后在主函数中,用if语句判断键码值来确定其按键的功能。
另外,因为当按键按下或释放释放,由于机械弹性作用的影响,通常伴随有一定时间的
触点机械抖动,然后其触点才稳点下来。为了减少在触点抖动期间检测按键的通与断状态的出错,要设置一个延时程序。
相应的设置程序如下:
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 IO_KeyScan(void) //50ms call {u8 j;
j = IO_KeyState1; //保存上一次状态 P0 = 0xf0; //将P04~P07置高电平X低,读Y IO_KeyDelay();
IO_KeyState1 = P0 & 0xf0; //使 IO_KeyState1 = 0xf0
P0 = 0x0f; //将P00~P03置高电平 Y低,读X IO_KeyDelay();
IO_KeyState1 |= (P0 & 0x0f); //使 IO_KeyState1 = 0xff 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; lse if(j == IO_KeyState) {if(++IO_KeyHoldCnt >= 20) //1S 重键 {IO_KeyHoldCnt = 18;F0 = 1;}}
8
if(F0)
{j = T_KeyTable[IO_KeyState >> 4]; //得到 j=X
if((j != 0) && (T_KeyTable[IO_KeyState& 0x0f] != 0))
KeyCode=(j-1)*4+T_KeyTable[IO_KeyState & 0x0f]+16; /得到键码值/ }} else IO_KeyHoldCnt = 0;}
P0 = 0xff;}
4.5显示切换和闹钟实现
本次课程设计,我选用外部中断INT0来实现显示切换,而闹钟功能,则是选了if语句
实现,表示现象为小数点闪烁。
所谓中断是指程序执行过程中,允许外部或内部事件通过硬件打断程序的执行,使其转向为处理外部或内部事件的中断服务程序中去,完成中断服务程序后,CPU返回继续执行被打断的程序。
我就是通过外部中断INT0程序,改变标志位intflag0,而后在显示时钟函数中,用if语句判断标志位intflag0来选择使用的程序语句。
同时也是在显示时钟函数中设置闹钟的naoH,naoM,用if语句来判断时间是否到了设置的闹钟时间,到了时,就执行小数点闪烁语句。 相应的设置程序如下:
/********************** 外部中断函数************************/ void int0() interrupt 0
{intflag0 =!intflag0; //标注位取反 IE0 = 0;/外部中断0中断请求标志清0/}
/********************** 显示时钟函数 ************************/ void DisplayRTC(void) {naoH = 17;naoM = 30;
if(intflag0==1) //外部中断0,切换
{LED8[0] = year / 1000; LED8[1] = year / 100% 10; LED8[2] = year / 10% 10; LED8[3] = year % 10;
if(mon >= 10) LED8[4] = mon /10;else LED8[4] = DIS_BLACK;
9
LED8[5] = mon % 10;if(day >= 10) LED8[6] = day /10;
else LED8[6] = DIS_BLACK;LED8[7] = day % 10;} else
{if(hour >= 10) LED8[0] = hour /10;else LED8[0] = DIS_BLACK; LED8[1] = hour % 10;LED8[2] = 17;
if(minute >= 10) LED8[3] = minute /10;else LED8[3] = DIS_BLACK; LED8[4] = minute % 10;LED8[5] = 17;
if(second >= 10) LED8[6] = second /10;else LED8[6] = DIS_BLACK; LED8[7] = second % 10;
if(naoH==hour && naoM==minute)
{if(msecond >= 500)
{LED8[0] |= DIS_DOT;LED8[1] |= DIS_DOT; LED8[3] |= DIS_DOT;LED8[4] |= DIS_DOT;}}}}
五.系统调试和测试结果分析
根据系统设计方案,本系统的调试共分为三大部分:硬件调试,软件调试和软硬件联调。由于在系统设计中采用模块设计法,所以方便对各电路模块功能进行逐级测试:LED驱动模块的调试,数据存储模块的调试,PC机通信模块的调试等,最后将各模块组合后进行整体测试。
硬件调试:对各个模块的功能进行调试,主要调试各模块能否实现指定的功能。 软件调试:软件调试采用单片机仿真器WAVE6000L及微机,将编好的程序进行调试,主要
是检查语法错误。
硬件软件联调:将调试好的硬件和软件进行联调,主要调试系统的实现功能。
测试结果:此次系统设计结果较好,LED显示屏能很好的显示信息。LED显示屏由八块8*8
的LED小模块组成,整个显示屏可以显示正确的时间日期,也可以对时间进行校正,显示亮度也正好
六.总结和心得体会
制作这次课程设计一切都是从零开始,从最简单的画流程图起步,这次毕业设计可以圆满完成,跟单片机课程里面的课外作业是离不开的。这次毕业设计从开始到制作成功前后超过了一个星期。当电子万年历可以成功实现时,那种激动和喜悦只有自己可以体会。
10
在整个设计过程中,充分发挥人的主观能动性,自主学习,学到了许多没学到的知识。较好的完成了设计,达到了预期的目的,完了最初的设想。对电路的设计、布局要先有一个好的构思,才显得电路板美观、大方。程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考,和同学讨论,理清了思路,反而得心应手。在此次设计中,知道了做凡事要有一颗平常的心,不要想着走捷径,一步一脚印。也练就了我的耐心,做什么事都在有耐心。此次课程设计中学到了很多很多东西,这是最重要的。总之,此次课设使我的能力得到了全方位的提高,使得我的操作能力和专业技能都有了很大的提高。在做课程设计的日子里得到了老师的悉心指导和同学的帮助,在此向他们致以诚挚的谢意。感谢提供相关技术帮助的老师和同学,你们的支持和鼓励使我对这次的设计完成有了信心和动力,我在此深表谢意。
11
参考文献
[1] 张帆,史彩成.单片机应用[M].北京:电子工业出版社,2009. [2] 苏荣,胡莲. 数码管应用[J] .电脑知识与技术,2014,(14):51-53.
[3]黄勋,季彦呈.基于PCF8563的电子时钟设计[J] .信息化研究,2012,(04):12. [4] 徐东阳,徐东怀.基于STC89C52的电子时钟[J].电子世界, 2014,(21):2-8. [5] 陈启美,丁传锁. 单片微型计算机及其应用[M].南京:南京大学出版社,2003.
[6] 纪宗南.单片机外围器件使用手册[M].北京:北京航空航天大学出版社,
622-655. [6] 周雪.模拟电子技术[M]西安: 西安电子科技大学出版社,2005:81-95. [7] 左金生.电子与模拟电子技术[M].北京:电子工业出版社,2004:105-131.
[7] 尹勇.单片机开发环境μVision2的开发指南[M]. 北京:北京航空航天大学出版社,2004:173-199.
[8] 张斌武.单片机系统Proteus设计与仿真[M]. 北京:电子工业出版社,2005:52-89.
12
因篇幅问题不能全部显示,请点此查看更多更全内容