单片机电子时钟 论文Word文件下载.docx

上传人:b****3 文档编号:17845738 上传时间:2022-12-11 格式:DOCX 页数:26 大小:315.61KB
下载 相关 举报
单片机电子时钟 论文Word文件下载.docx_第1页
第1页 / 共26页
单片机电子时钟 论文Word文件下载.docx_第2页
第2页 / 共26页
单片机电子时钟 论文Word文件下载.docx_第3页
第3页 / 共26页
单片机电子时钟 论文Word文件下载.docx_第4页
第4页 / 共26页
单片机电子时钟 论文Word文件下载.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

单片机电子时钟 论文Word文件下载.docx

《单片机电子时钟 论文Word文件下载.docx》由会员分享,可在线阅读,更多相关《单片机电子时钟 论文Word文件下载.docx(26页珍藏版)》请在冰豆网上搜索。

单片机电子时钟 论文Word文件下载.docx

运行程序后,按常规的显示方法,从数码管的第一位开始显示,六位数码管一次显示时、分、秒的十位、个位。

设置错误按DEL键即可重新设置,设置完成按ENT键,重新设置按F1键。

2-2硬件连接

利用4*4键盘和6位LED数码管分别与SPCE061A单片机IOA口、IOB口的相关引脚相接,IOA0~IOA7连接和6位数码管的a~g、dp,IOA口的高八位IOA15~IOA8连接4x4键盘的L1~L4、C1~C4,IOB15~IOB12连接数码管的位信号1~4,IOB2~IOB1连接数码管的的位信号5~6,IOB0连接数码管的分隔符信号DD。

几把JP4、JP5的引脚全部用跳线短接起来,用一根排线连接J27和JP7。

时间的设置可以通过4*4键盘的数字键来完成,时间的显示通过6位数码管来完成,以实现计时的功能。

硬件连接图如下:

2.2硬件连接图

2-3软件设计

本系统软件设计程序主要分为主程序(其中包括键盘非法性检测、时钟数据处理、键值转换等子模块)、中断服务子程序、键盘子程序、数码管显示子程序及中断定义子程序。

主程序对程序框架进行设计在调用各个子程序实现系统时钟的设置及重置功能,下面分别详细介绍。

2-3-1主程序流程图及程序设计

YY

2.3主程序流程图

主程序设计程序(main.c)如下:

程序说明:

初始化I/O口,开128HZ中断扫描键盘,进入键值处理循环,如果数字键或删除键按下,先判断设置键是否按下,如果是则进行数字或删除处理。

如果确认键按下,开IRQ5_2HZ中断,设置标志置1,运行标志清0。

如果设置键按下,开IRQ5_2HZ中断,设置标志清0,运行标志置1。

调用时钟处理函数,显示始终时间,清看门狗。

主程序代码:

#include"

Key.h"

Dig.h"

SPCE061A.h"

typedefunsignedcharuchar;

#defineKEY_DEL11

#defineKEY_ENT12

#defineKEY_F113

#defineYESCarryFlag1

#defineClearCarryFlag0

#defineYESIntFlag1

#defineClearIntFlag0

#definetrue1

#definefalse0

unsignedintINTflag;

unsignedintKeyVal;

unsignedintKeyDownTimes;

//保存按键次数

unsignedintKeycodeLED[6];

//保存显示的LED数字

unsignedintEnterFg;

//按确认键标识、有确认键按下无确认键按下

unsignedintF1flag;

//按设置键标识、有确认键按下无确认键按下

unsignedintsecFlag,minFlag,hourFlag;

voidclockPro(void);

//时钟处理函数

unsignedintSetKeyValPro(void);

//设置时钟值的合法性检测函数

unsignedintKeyDataChange(unsignedintKey_Data);

//键值转换子程序,把4X4键盘的键值转换成程序所需要的

unsignedintg_Data[11]={0x003f,0x0006,0x005b,0x004f,0x0066,0x006d,0x007d,0x0007,0x007f,0x006f};

//0,1,2,3,4,5,6,7,8,9

intmain(){

unsignedinti;

KeyDownTimes=0;

INTflag=0;

EnterFg=0;

i=0;

Key_Init();

//键盘扫描初始化,包括IRQ6的TMB2128Hz中断

DIG_Init();

//显示初始化,初始端口以及IRQ4的KHz中断

while

(1)

{

KeyVal=Key_Get();

//获取键值

KeyVal=KeyDataChange(KeyVal);

//转换键值,无键按下或对于本程序无用的键按下时

switch(KeyVal)

{

caseKEY_F1:

INT_IRQ5();

if(KeyDownTimes>

=6)KeyDownTimes=0;

F1flag=true;

EnterFg=false;

caseKEY_DEL:

//删除键处理

if(F1flag=true)

{

if(KeyDownTimes>

0)

KeyDownTimes--;

}

break;

case0xff:

//无效的键值

caseKEY_ENT:

//确认键处理

if(KeyDownTimes==6)

{

SP_INT_IRQ5();

F1flag=false;

EnterFg=true;

}

default:

//数字键处理

if(F1flag==true)

if(KeyDownTimes<

6)

{

KeycodeLED[KeyDownTimes]=KeyVal;

if(SetKeyValPro()==true)

{

KeyDownTimes++;

}

}

}

}

for(i=0;

i<

6;

i++)//显示所有键值即时钟

DIG_Set(i+1,g_Data[KeycodeLED[i]]);

clockPro();

//时钟数据处理

F_ClearWatchdog();

//清看门狗

}

}

2-3-2子模块程序流程图及程序设计

键盘非法性检测子程序:

2.4键盘非法性检测子程序流程图

数字键按下时,“时”的十位不能大于2;

设置“时”的个位,当“时”的十位为“0”或者“1”时,“时”的个位可以是0—9,但是当“时”的十位为“2”时,“时”的个位只能是0—3;

第三次或者第五次按下数字键时,“分”或者“秒”的十位只能是0—5;

“分”或者“秒”的个位可以是0—9,所以需要进行非法性检测。

键盘非法性检测子程序代码:

//语法格式:

voidSetKeyValPro(void)

//实现功能:

设置时钟数据和发行检测函数名称

//返回值:

1-合法;

//0-不合法;

unsignedintSetKeyValPro(void)

{

ucharflag;

switch(KeyDownTimes){

case0:

if(KeycodeLED[KeyDownTimes]<

3)

{flag=true;

//小时高位}

elseflag=false;

break;

case1:

if(KeycodeLED[KeyDownTimes-1]==2)

{

if(KeycodeLED[KeyDownTimes]<

5)//小时低位

flag=true;

else

flag=false;

}

else

flag=true;

break;

case2:

case4:

{//秒和分的高位

flag=true;

elseflag=false;

break;

case3:

case5:

flag=true;

//秒和分的地位

default:

flag=false;

return(flag);

主程序调用的中断程序设计:

文件名称:

system.asm

功能描述:

开中断函数

.INCLUDESPCE061A.inc

.RAM

.CODE

C格式:

voidSP_INT_IRQ5()

实现功能:

初始化中断为2HZ定时中断源

.PUBLIC_SP_INT_IRQ5;

//初始化中断为2HZ定时中断源

_SP_INT_IRQ5:

.PROC

r1=[P_INT_Ctrl_New]

r1|=0x0004;

[P_INT_Ctrl]=r1;

INTIRQ;

//开中断

RETF

.ENDP;

.PUBLIC_INT_IRQ5;

_INT_IRQ5:

r1&

=~0x0004;

//关中断

.PUBLIC_F_ClearWatchdog;

_F_ClearWatchdog:

r1=1;

[P_Watchdog_Clear]=r1;

RETF;

.ENDP

主程序编程说明:

主程序流程图及相关代码如上所示,初始化I/O口后,开128HZ中断扫键盘,进入键值处理循环,如果是F1键按下,关掉2HZ中断,然后对数码管显示数字重新进行设置;

如果是数字键按下,先判断按了几次数字键,如果按数字键次数小于6,先进性键值的非法性检测,比如,当设置“时”的十位时,按键代表的键值不能大于2;

如果是删除键按下,删除最新设置的一个数字,并且让按数字键次数减1;

如果是按下确认键,开IRQ5_2HZ中断,显示时钟时间并对时钟时间进行处理;

没有建按下或者保留键按下时不做任何操作。

2-3-3时钟数据处理子程序:

2.5时钟数据处理子程序流程图

时钟数据处理主要是针对时间“时”、“分”、“秒”进行处理,通过计数方式进行满六十秒进一,满六十分进一,满二十四小时清零,从而达到计时的功能。

时钟数据处理子程序代码:

voidclockPro(void)

{//秒处理

while(INTflag==1)

{

INTflag=ClearIntFlag;

if(KeycodeLED[4]==5&

&

KeycodeLED[5]==9)

{//判断秒是否需回零

KeycodeLED[4]=0;

//如果为回零

KeycodeLED[5]=0;

secFlag=YESCarryFlag;

//设置秒进位标识

{

if(KeycodeLED[5]==9)

KeycodeLED[5]=0;

KeycodeLED[4]++;

}

elseKeycodeLED[5]++;

//否则秒加一

}//分处理

while(secFlag==1)

{

secFlag=ClearCarryFlag;

if(KeycodeLED[2]==5&

KeycodeLED[3]==9)

{//判断分是否需回零

KeycodeLED[2]=0;

KeycodeLED[3]=0;

minFlag=YESCarryFlag;

//设置分进位标识

}

else

if(KeycodeLED[3]==9)

KeycodeLED[3]=0;

KeycodeLED[2]++;

elseKeycodeLED[3]++;

//否则分加一

}//时处理

while(minFlag==1)

minFlag=ClearCarryFlag;

if(KeycodeLED[0]==2&

KeycodeLED[1]==3)

{//判断时是否需回零

KeycodeLED[0]=0;

KeycodeLED[1]=0;

hourFlag=YESCarryFlag;

//设置时进位标识

{//否则时加一

if(KeycodeLED[1]==9)

KeycodeLED[1]=0;

KeycodeLED[0]++;

elseKeycodeLED[1]++;

2-3-4中断服务程序流程图及程序设计

2.6IRQ4中断服务程序流程图

2.7IRQ5中断服务程序流程图

2.8IRQ6中断服务程序流程图

在IRQ5_2HZ中断里定时1s的时间,在IRQ6_TMB2中断里调用键盘程序扫描键盘,而IRQ4的1KHZ中断当中,进行数码管显示的动态扫描。

中断服务程序代码:

isr.asm

.INCLUDESPCE061A.inc

.INCLUDEkey.inc

.INCLUDEDig.inc

.IRAM

.PUBLICsum;

.VARsum=0//进入中断的计数器

.TEXT

.PUBLIC_IRQ5;

.PUBLIC_IRQ6;

//.externalsum;

.external_INTflag;

.externalF_Key_Scan

.PUBLIC_IRQ4

_IRQ4:

pushr1,r5to[sp]

r1=C_IRQ4_1KHz

testr1,[P_INT_Ctrl]

jnz?

L_IRQ4_1KHz

r1=C_IRQ4_2KHz

L_IRQ4_2KHz

?

L_IRQ4_4KHz:

callF_DIG_Drive//数码管显示,F_DIG_Drive函数在Dig.asm中定义

r1=C_IRQ4_4KHz

[P_INT_Clear]=r1

popr1,r5from[sp]

reti

L_IRQ4_2KHz:

L_IRQ4_1KHz:

//////////////////////////////

_IRQ5:

//定时秒的中断程序

pushr1,r4to[sp];

r1=0x0008;

testr1,[P_INT_Ctrl];

jnzL_4Hz;

//TimerAFIQentrence

r1=0x0004;

[P_INT_Clear]=r1;

//清中断

r1=[sum]//取时基信号量

r1+=1;

cmpr1,2;

jeloop0;

[sum]=r1//保存时基信号量

popr1,r4from[sp];

reti;

loop0:

r1=0x0001;

[_INTflag]=r1;

//设置中断标识

r1=0

[sum]=r1

L_4Hz:

r1=0x0008;

//清中断

//////////////////////////////

_IRQ6:

pushr1,r4to[sp];

r1=0x0001;

testr1,[P_INT_Ctrl];

jnz_IRQ6_TMB2;

r1=0x0002;

[P_INT_Clear]=r1;

popr1,r4from[sp];

_IRQ6_TMB2:

callF_Key_Scan;

//扫描键盘

2-3-6键值转换子程序:

2.9键值转换子程序流程图

程序所要处理的数值都是二进制数,所以我们要将我们看到的十进制数转换成二进制数,这样程序才能正常运行。

把“DEL”的键值转换成11,把“ENT”的键值转换成12,把“F1”的键值转换成13,其他键的键值或者其他情况下都认为键值为0xff。

键盘转换子程序代码:

unsignedintKeyDataChange(unsignedintKey_Data)

{

switch(Key_Data)

caseKEY_0:

Key_Data=7;

break;

caseKEY_1:

Key_Data=8;

caseKEY_2:

Key_Data=9;

caseKEY_3:

Key_Data=13;

caseKEY_4:

Key_Data=4;

caseKEY_5:

Key_Data=5;

caseKEY_6:

Key_Data=6;

caseKEY_7:

Key_Data=0xff;

caseKEY_8:

Key_Data=1;

caseKEY_9:

Key_Data=2;

caseKEY_A:

Key_Data=3;

caseKEY_B:

caseKEY_C:

Key_Data=11;

caseKEY_D:

Key_Data=0;

caseKEY_E:

caseKEY_F:

Key_Data=12;

returnKey_Data;

系统函数及头文件说明

3-1一些重要的函数:

1、clockPro(void)时钟处理函数

无参数、无返回值。

2、SetKeyValPro(void)设置时钟值的合法性检测函数

无参数、返回值1合法,0不合法。

3、KeyDataChange(unsignedintKey_Data)键值转换子程序,把X4键盘的键值转换成程序所需要的

参数:

Key_Data--机器码,返回值:

0~13,其中~9为数字键,10、11、12、13为功能键;

0xff,不合法的键输入

4、Key_Get()获取键值函数

入口参数无,出口参数为获取的键值。

5、KeyData

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

当前位置:首页 > 法律文书 > 调解书

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

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