单片机电子时钟 论文.doc_第1页
单片机电子时钟 论文.doc_第2页
单片机电子时钟 论文.doc_第3页
单片机电子时钟 论文.doc_第4页
单片机电子时钟 论文.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录前 言2第一章 系统功能3第二章 系统设计3第三章:系统函数及头文件说明.16第四章:设计总结.18第五章:参考文献.18前 言近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。数子时钟在日常生活中最常见,应用也最广泛。本次设计以硬件软件化为指导思想,充分发挥单片机功能,大部分功能通过软件编程来实现,电路简单明了,系统稳定性高。同时,该时钟系统还具有功耗小、成本低的特点,具有很强的实用性,而且系统具有一定的可扩展性。第一章 系统功能用16位凌阳单片机SPCE061A作为主控芯片实现电子时钟的计时功能,完成该系统的软硬件设计及调试。电子钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显示直观、无机械传动装置等优点,因而得到广泛应用。电子时钟要求完成时、分、秒的准确计时,并能进行时、分、秒时间的设置和时间的效准功能。时间的设置通过键盘中的数字按键进行设置。设置完成后按确认键时钟开始运行,执行计时操作。当需要重置时间时可以按重置键,这时时钟时间暂停,让后按数字键重置,重置完成后按确认键,时钟从新设置的时间开始运行,这时重置操作完成。第二章 系统设计21 硬件设计2-1-1所需设备装有UNSPTMIDE仿真软件的PC机一台,UNSPTM十六位单片机实验箱一台8pin排线两根、短路块若干。本程序用到的实验箱硬件模块为:SPCE061A核心及实验箱中提供的4*4键盘模块和6位LED数码管显示模块。SPE061A共提供两个16位通用的并行I/O口:IOA0-IOA15 IOB0-IOB15。两个口的每一位都可以通过编程单独定义为输入或输出口,本实验采用IOA15IOA8连接4*4键盘,IOA0IOA7、IOA0IOA15连接数码管。总体接线:2.1 各键功能图这部分的主要接线如下:IOA8-15接液晶显示模块DB0-DB7IOB4接液晶显示模块AOIOB5接液晶显示模块的R/WIOB6接液晶显示模块的EPDB0-DB7为双向数据口,AO为数据/使命控制位,R/w为读/写信号,EP是全能端(低电平有效)要这部分工作时Key接线与IOA低八位相连就可以了。按键电路直接与IOA口连接。其原理图如下:本实验中,定义每个键的功能,包括数字键、功能键和一些保留键,其中标“0-9”为数字键,标“F2-F4”为保留键,标“F1”为重新设置时间键,标“ENT”为确认键,标“DEL”为删除键。运行程序后,按常规的显示方法,从数码管的第一位开始显示,六位数码管一次显示时、分、秒的十位、个位。设置错误按DEL键即可重新设置,设置完成按ENT键,重新设置按F1键 。22 硬件连接利用4*4键盘和6位LED数码管分别与SPCE061A单片机IOA口、IOB口的相关引脚相接,IOA0IOA7连接和6位数码管的ag、dp,IOA口的高八位IOA15IOA8连接4x4键盘的L1L4、C1C4,IOB15IOB12连接数码管的位信号14,IOB2IOB1连接数码管的的位信号56,IOB0连接数码管的分隔符信号DD。几把JP4、JP5的引脚全部用跳线短接起来,用一根排线连接J27和JP7。时间的设置可以通过4*4键盘的数字键来完成,时间的显示通过6位数码管来完成,以实现计时的功能。硬件连接图如下: a b c d e f g DP 1 2 3 4 5 6 DD 6位数码管IOA0IOA1IOA2IOA3 IOA15IOA4 IOA14IOA5 IOA13IOA6 IOA12IOA7 SPCE061AIOB15 IOA11IOB14 IOA10IOB13 IOA910B12 IOA8IOB2IOB1IOB0L1L2L3L4 4X4键盘C1C2C3C42.2 硬件连接图23 软件设计本系统软件设计程序主要分为主程序(其中包括键盘非法性检测、时钟数据处理、键值转换等子模块)、中断服务子程序、键盘子程序、数码管显示子程序及中断定义子程序。主程序对程序框架进行设计在调用各个子程序实现系统时钟的设置及重置功能,下面分别详细介绍。2-3-1 主程序流程图及程序设计开 始初始化键盘初始化显示取键值显示时钟时间调用时钟处理函数清看门狗取键转换设置键按下关2HZ中断设置标志置1运行标志清0运行键按下开2HZ中断设置标志清0运行标志置1键按下?数字键按下数字键处理键按下?删除键按下删除键处理NN Y Y2.3 主程序流程图主程序设计程序(main.c)如下:程序说明:初始化I/O口,开128HZ中断扫描键盘,进入键值处理循环,如果数字键或删除键按下,先判断设置键是否按下,如果是则进行数字或删除处理。如果确认键按下,开IRQ5_2HZ中断,设置标志置1,运行标志清0。如果设置键按下,开IRQ5_2HZ中断,设置标志清0,运行标志置1。调用时钟处理函数,显示始终时间,清看门狗。主程序代码:#include Key.h#include Dig.h#include SPCE061A.htypedef unsigned char uchar;#define KEY_DEL11#define KEY_ENT12#define KEY_F113#define YESCarryFlag 1#define ClearCarryFlag 0#define YESIntFlag 1#define ClearIntFlag 0#define true 1#define false 0unsigned int INTflag; unsigned int KeyVal;unsigned int KeyDownTimes; /保存按键次数unsigned int KeycodeLED6 ; /保存显示的LED数字unsigned int EnterFg ; /按确认键标识、有确认键按下无确认键按下unsigned int F1flag ; /按设置键标识、有确认键按下无确认键按下unsigned int secFlag,minFlag,hourFlag;void clockPro(void); /时钟处理函数unsigned int SetKeyValPro(void); /设置时钟值的合法性检测函数unsigned int KeyDataChange(unsigned int Key_Data);/键值转换子程序,把4X4键盘的键值转换成程序所需要的unsigned int g_Data11 = 0x003f,0x0006,0x005b,0x004f,0x0066,0x006d,0x007d,0x0007,0x007f,0x006f; /0, 1,2, 3, 4, 5, 6, 7,8,9int main()unsigned int i;KeyDownTimes = 0; INTflag = 0;EnterFg = 0;i = 0;Key_Init();/键盘扫描初始化,包括IRQ6的TMB2 128Hz中断DIG_Init();/显示初始化,初始端口以及IRQ4的KHz中断while(1) KeyVal = Key_Get();/获取键值KeyVal = KeyDataChange(KeyVal);/转换键值,无键按下或对于本程序无用的键按下时switch(KeyVal)case KEY_F1: INT_IRQ5(); if(KeyDownTimes=6) KeyDownTimes=0; F1flag = true; EnterFg = false; case KEY_DEL:/删除键处理if(F1flag = true) if ( KeyDownTimes0) KeyDownTimes-; break; case 0xff: /无效的键值 break;case KEY_ENT:/确认键处理if(KeyDownTimes=6) SP_INT_IRQ5();F1flag = false;EnterFg = true; break; default:/数字键处理if(F1flag = true) if(KeyDownTimes6)KeycodeLEDKeyDownTimes = KeyVal; if(SetKeyValPro()= true) KeyDownTimes+; break; for(i=0;i6;i+) /显示所有键值即时钟DIG_Set(i+1,g_DataKeycodeLEDi); clockPro(); /时钟数据处理F_ClearWatchdog(); /清看门狗 2-3-2 子模块程序流程图及程序设计键盘非法性检测子程序:开始判断数字键按下的次数数字键按下次数为6数字键按下次数为5数字键按下次数为4数字键按下次数为3数字键按下次数为2数字键按下次数为1按下数字键小于6时有效按下数字键小于3时有效如果前一次按下数字键2,按下的数字键小于四才有效按下数字键小于6时有效返回检测结果2.4 键盘非法性检测子程序流程图程序说明:数字键按下时,“时”的十位不能大于2;设置“时”的个位,当“时”的十位为“0”或者“1”时,“时”的个位可以是09,但是当“时”的十位为“2”时,“时”的个位只能是03;第三次或者第五次按下数字键时,“分”或者“秒”的十位只能是05;“分”或者“秒”的个位可以是09,所以需要进行非法性检测。键盘非法性检测子程序代码:/语法格式:void SetKeyValPro(void)/实现功能:设置时钟数据和发行检测函数名称/返回值:1-合法;/0-不合法;unsigned int SetKeyValPro(void)uchar flag; switch(KeyDownTimes)case 0 : if(KeycodeLEDKeyDownTimes3) flag = true; /小时高位 else flag = false; break;case 1: if(KeycodeLEDKeyDownTimes-1=2 ) if(KeycodeLEDKeyDownTimes5) /小时低位 flag = true; else flag = false; else flag = true; break; case 2: case 4: if(KeycodeLEDKeyDownTimes6) /秒和分的高位 flag = true; else flag = false; break; case 3: case 5: flag = true; break; /秒和分的地位 default: flag = false; break; return(flag); 主程序调用的中断程序设计:文件名称:system.asm功能描述:开中断函数.INCLUDE SPCE061A.inc.RAM.CODE C格式: void SP_INT_IRQ5()实现功能:初始化中断为2HZ定时中断源.PUBLIC _SP_INT_IRQ5; /初始化中断为2HZ定时中断源_SP_INT_IRQ5: .PROCr1 = P_INT_Ctrl_Newr1 |= 0x0004; P_INT_Ctrl = r1; INT IRQ; /开中断 RETF .ENDP;.PUBLIC _INT_IRQ5; /初始化中断为2HZ定时中断源_INT_IRQ5: .PROCr1 = P_INT_Ctrl_Newr1 &=0x0004; P_INT_Ctrl = r1; INT IRQ; /关中断 RETF .ENDP; .PUBLIC _F_ClearWatchdog;_F_ClearWatchdog: .PROC r1 = 1; P_Watchdog_Clear = r1; RETF; .ENDP主程序编程说明:主程序流程图及相关代码如上所示,初始化I/O口后,开128HZ中断扫键盘,进入键值处理循环,如果是F1键按下,关掉2HZ中断,然后对数码管显示数字重新进行设置;如果是数字键按下,先判断按了几次数字键,如果按数字键次数小于6,先进性键值的非法性检测,比如,当设置“时”的十位时,按键代表的键值不能大于2;如果是删除键按下,删除最新设置的一个数字,并且让按数字键次数减1;如果是按下确认键,开IRQ5_2HZ中断,显示时钟时间并对时钟时间进行处理;没有建按下或者保留键按下时不做任何操作。2-3-3时钟数据处理子程序:Y 返回开始时的个位加1秒回零秒的个位是不是9?秒的十位是不是5?分回零分的个位是不是9?分的十位是不是5?时回零时的十位不为2?时的个位是不是3?秒的个位加1秒的十位加1,个位回零N N 分的个位加1分的十位加1,个位回零N N 时的个位是不是9?分的十位加1,个位回零Y Y Y Y Y N N Y N 2.5 时钟数据处理子程序流程图程序说明:时钟数据处理主要是针对时间“时”、“分”、“秒”进行处理,通过计数方式进行满六十秒进一,满六十分进一,满二十四小时清零,从而达到计时的功能。时钟数据处理子程序代码:void clockPro(void) /秒处理while(INTflag=1)INTflag = ClearIntFlag;if(KeycodeLED4 = 5 & KeycodeLED5 = 9) /判断秒是否需回零 KeycodeLED4 = 0; /如果为回零 KeycodeLED5 = 0; secFlag = YESCarryFlag; /设置秒进位标识else if(KeycodeLED5=9) KeycodeLED5= 0; KeycodeLED4+;else KeycodeLED5+; /否则秒加一 /分处理while(secFlag=1) secFlag = ClearCarryFlag;if(KeycodeLED2 = 5 & KeycodeLED3 =9) /判断分是否需回零 KeycodeLED2 = 0; /如果为回零 KeycodeLED3 = 0; minFlag = YESCarryFlag; /设置分进位标识else if(KeycodeLED3=9) KeycodeLED3= 0; KeycodeLED2+; else KeycodeLED3+; /否则分加一 /时处理while(minFlag=1)minFlag = ClearCarryFlag;if(KeycodeLED0=2 & KeycodeLED1 =3) /判断时是否需回零 KeycodeLED0 = 0; /如果为回零 KeycodeLED1 = 0; hourFlag = YESCarryFlag; /设置时进位标识else /否则时加一if(KeycodeLED1=9) KeycodeLED1= 0; KeycodeLED0+;else KeycodeLED1+; 2-3-4中断服务程序流程图及程序设计寄存器入栈保护是IRQ4_1HZ中断?清IRQ4其它中断寄存器出栈中断返回清IRQ4_1HZ中断调用数码管显示程序NY2.6 IRQ4中断服务程序流程图YY寄存器入栈保护是IRQ5_2HZ中断?清IRQ5_2HZ中断寄存器出栈保存信号sum=0设置中断标志为1中断返回清IRQ5_4HZ中断中断计数器加1中断计数器等于2?NN2.7 IRQ5中断服务程序流程图寄存器入栈保护是IRQ4_1HZ中断?清IRQ4其它中断寄存器出栈中断返回清IRQ4_1HZ中断调用数码管显示程序NY2.8 IRQ6中断服务程序流程图程序说明:在IRQ5_2HZ中断里定时1s的时间,在IRQ6_TMB2中断里调用键盘程序扫描键盘,而IRQ4的1KHZ中断当中,进行数码管显示的动态扫描。中断服务程序代码:isr.asm.INCLUDE SPCE061A.inc.INCLUDE key.inc.INCLUDE Dig.inc.IRAM.PUBLICsum;.VAR sum=0 / 进入中断的计数器.TEXT.PUBLIC _IRQ5;.PUBLIC _IRQ6;/.external sum;.external _INTflag;.external F_Key_Scan .PUBLIC _IRQ4_IRQ4:push r1,r5 to spr1 = C_IRQ4_1KHztest r1,P_INT_Ctrljnz ?L_IRQ4_1KHzr1 = C_IRQ4_2KHztest r1,P_INT_Ctrljnz ?L_IRQ4_2KHz?L_IRQ4_4KHz:call F_DIG_Drive /数码管显示,F_DIG_Drive函数在Dig.asm中定义r1 = C_IRQ4_4KHzP_INT_Clear = r1pop r1,r5 from spreti?L_IRQ4_2KHz:P_INT_Clear = r1pop r1,r5 from spreti?L_IRQ4_1KHz:P_INT_Clear = r1pop r1,r5 from spreti/ _IRQ5: /定时秒的中断程序push r1,r4 to sp;r1 =0x0008;test r1,P_INT_Ctrl;jnzL_4Hz;/ Timer A FIQ entrence r1 = 0x0004; P_INT_Clear = r1; /清中断 r1 = sum /取时基信号量 r1 += 1; cmp r1,2; je loop0; sum=r1 /保存时基信号量 pop r1,r4 from sp; reti; loop0: r1 = 0x0001; _INTflag = r1; /设置中断标识 r1 = 0 sum = r1pop r1,r4 from sp; reti; L_4Hz: r1 = 0x0008; P_INT_Clear = r1; /清中断 pop r1,r4 from sp; reti; /_IRQ6: push r1,r4 to sp;r1=0x0001;test r1,P_INT_Ctrl;jnz _IRQ6_TMB2;r1=0x0002;P_INT_Clear=r1;pop r1,r4 from sp; reti; _IRQ6_TMB2:P_INT_Clear=r1;call F_Key_Scan; /扫描键盘pop r1,r4 from sp; reti; 2-3-6键值转换子程序:开始判断键码数字键对应的键码键值为09键值为11键值为12键值为13键值为0xff返回键码为0X18键码为0X11键码为0X81其他情况2.9 键值转换子程序流程图程序说明:程序所要处理的数值都是二进制数,所以我们要将我们看到的十进制数转换成二进制数,这样程序才能正常运行。把“DEL”的键值转换成11,把“ENT”的键值转换成12,把“F1”的键值转换成13,其他键的键值或者其他情况下都认为键值为0xff。键盘转换子程序代码:unsigned int KeyDataChange(unsigned int Key_Data)switch(Key_Data)case KEY_0: Key_Data = 7;break;case KEY_1: Key_Data = 8;break;case KEY_2: Key_Data = 9;break;case KEY_3: Key_Data = 13;break;case KEY_4: Key_Data = 4;break;case KEY_5: Key_Data = 5;break;case KEY_6: Key_Data = 6;break;case KEY_7: Key_Data = 0xff;break;case KEY_8: Key_Data = 1;break;case KEY_9: Key_Data = 2;break;case KEY_A: Key_Data = 3;break;case KEY_B: Key_Data = 0xff;break;case KEY_C: Key_Data = 11;break;case KEY_D: Key_Data = 0;break;case KEY_E: Key_Data = 0xff;break;case KEY_F: Key_Data = 12;break;default: Key_Data = 0xff;break;return Key_Data;第三章:系统函数及头文件说明31 一些重要的函数:1、clockPro(void) 时钟处理函数无参数、无返回值。2、SetKeyValPro(void) 设置时钟值的合法性检测函数无参数、返回值1合法,0不合法。3、KeyDataChange(unsigned int Key_Data) 键值转换子程序,把X4键盘的键值转换成程序所需要的参数: Key_Data-机器码,返回值: 013,其中9为数字键,10、11、12、13为功能键;0xff,不合法的键输入4、Key_Get() 获取键值函数入口参数无,出口参数为获取的键值。5、KeyDataChange(KeyVal) 转换键值,无键按下或对于本程序无用的键按下时6、Key_Init() 初始化按键扫描程序,该函数将开启IRQ6_TMB2中断无参数7、Key_Scan() 按键扫描,该函数被IRQ6_TMB2中断服务程序调用无参数8、DIG_Init() 数码管显示初始化,该函数将开启IRQ4_4KHz中断无参数9、DIG_Set() 设置数码管某一位的显示内容入口参数:DigPos(r1) - 设置的数码管位(DIG_Count)DigBuffer(r2) - 数码管的显示内容出口参数:无10、DIG_SetAll() 设置所有数码管的显示内容入口参数:DigBuffer(r1) - 数码管显示内容的起始地址出口参数:无11、DIG_Get() 获取所有数码管的显示内容入口参数:DigPos(r1) - 要获取显示内容的位出口参数:该位数码管的显示内容12、DIG_GetAll() 获取所有数码管的显示内容入口参数:DigBuffer(r1) - 保存数码管显示内容的起始地址出口参数:保存数码管显示内容的起始地址13、DIG_Clear() 清空所有数码管显示内容无参数14、DIG_Drive() 数码管显示函数,由IRQ4_4KHz中断服务程序调用无参数15、DIG_Off() 停止数码管显示无参数16、INT_IRQ5 关闭中断为2HZ定时中断源无参数、无返回值17、SP_INT_IRQ5 打开中断为2HZ定时中断源无参数、无返回值32 头文件说明Key.h此文件为时钟键盘头文件此文件的功能是4*4键盘各个数字键及功能键的定义,对键盘初始化函数(Key_Init()、获取键值函数(Key_Scan()、键盘扫描函数(Key_Get()的定义。以便在主程序(main.c)中引用。Dig.h此文件为数码管头文件此文件的功能是对显示初始化函数(DIG_Init()、刷新六位数码管显示值函数(DIG_Set()、设置数码管显示函数(DIG_SetAll()、设置所有数码管显示函数(DIG_Get()等关于数码管设置、获取、显示的函数的定义。以便在主程序(main.c)中引用。SPCE061A.h此文件为实验箱及时钟中断头文件此文件功能是对实验中使用的各接口及时钟中断函数的定义,以便在主程序(main.c)中引用。 key.inc此文件为时钟键盘头文件此文件的功能是4*4键盘各个数字键及功能键的定义,对键盘初始化函数(Key_Init()、获取键值函数(Key_Scan()、键盘扫描函数(Key_Get()的定义。以便在中断服务程序(isr.asm)中引用。 Dig.inc此文件为数码管头文件此文件的功能是对显示初始化函数(DIG_Init()、刷新六位数码管显示值函数(DIG_Set()、设置数码管显示函数(DIG_SetAll()、设置所有数码管显示函数(DIG_Get()等关于数码管设置、获取、显示的函数的定义。以便在中断服务程序(isr.asm)中引用。 SPCE061A.inc 此文件为实验箱及时钟中断头文件此文件功能是对实验中使用的各接口及时钟中断函数的定义,以便在中断服务程序(isr.asm)中引用。一些用到的重要变量的说明:1、INTflag 中断标志设置2、KeyVal 储存键值3、KeyDownTimes 保存按键次数4、KeycodeLED6 保存显示的LED数字5、Enter

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论