MSC单片机毕设课题电子时钟毕设论文Word文档下载推荐.docx
- 文档编号:17325766
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:26
- 大小:315.65KB
MSC单片机毕设课题电子时钟毕设论文Word文档下载推荐.docx
《MSC单片机毕设课题电子时钟毕设论文Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《MSC单片机毕设课题电子时钟毕设论文Word文档下载推荐.docx(26页珍藏版)》请在冰豆网上搜索。
本实验中,定义每个键的功能,包括数字键、功能键和一些保留键,其中标“0-9”为数字键,标“F2-F4”为保留键,标“F1”为重新设置时间键,标“ENT”为确认键,标“DEL”为删除键。
运行程序后,按常规的显示方法,从数码管的第一位开始显示,六位数码管一次显示时、分、秒的十位、个位。
设置错误按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()获取键值函数
入口参数无,出口参数为获取的键值。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MSC单片机毕设课题 电子时钟毕设论文 MSC 单片机 课题 电子 时钟 论文