基于SPCE061A单片机的数字钟设计Word文档下载推荐.docx
《基于SPCE061A单片机的数字钟设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于SPCE061A单片机的数字钟设计Word文档下载推荐.docx(16页珍藏版)》请在冰点文库上搜索。
(2)控制按扭,时钟以秒为单位开始计时。
(3)按键调整时间。
图1实现时钟计时功能图
2.2系统设计
根据设计题目的要求分析,并考虑到题目的可扩展性,系统分成两大部分:
(1)时间的产生和显示。
(2)按键调整时间。
根据系统的功能现选择61板作为单片机控制处理部分,利用一片4位LED和一片2位LED作为显示部分,如图2所示。
图261板实现系统功能图
按键调整时间部分,单片机外扩六个直接式按键分别接到SPCE061A的IOA0~IOA5,各个按键的控制功能分配见下表。
表1各按键控制功能分配表
按键
功能描述
Key1
时间加1
Key4
分钟减1
Key2
时间减1
Key5
秒钟加1
Key3
分钟加1
Key6
秒钟减1
3硬件原理
3.1LED显示原理:
半导体数码管是由七个条状发光二极管按图4排列而成,可实现0-9的显示。
比较常见的为“条形七段式”和“单片集成多位数字式”。
图3半导体数码管图
用单片机驱动LED数码管有很多方法,按显示方式可分静态显示和动态(扫描)显示;
按译码方式可分硬件译码和软件译码。
静态显示就是显示驱动电路具有输出锁存功能单片机将所要显示的数据送出后就不再管,直到下一次显示数据更新时才会显示新的数据。
静态显示数据稳定,占用很少的CPU时间。
动态显示需要CPU时刻对显示器件进行数据刷新,显示数据有闪烁感,占用的CPU时间多。
这两种显示方式各有利弊,静态显示虽然数据稳定,占用很少的CPU时间,但每个显示单元都需要单独的显示驱动电路,使用的硬件较多;
动态显示虽然有闪烁感,占用的CPU时间多,但使用的硬件少,能节省线路板空间。
LED数码管的外围电路一般需要一个限流电阻和加大驱动电流的晶体管。
常用的连接方式如图5所示。
图4数码管外围电路连接方式图
LED数码管是由发光二级管显示字段组成的显示器,有“8”字段和“米”字段之分,这种显示器有共阳极和共阴极两种。
所谓共阳方式是指笔画显示器各段发光管的阳极(即P区)是公共的,而阴极互相隔离。
所谓共阴方式是笔画显示器各段发光管的阴极(即N区)是公共的,而阳极是互相隔离的。
图5共阳极与共阴极图
LED显示器中每个发光二极管要通过5mA—20mA电流才能达到正常亮度,SPCE061A的输入电流可达到12mA,输出可达5mA,实际上不用驱动电路即可达到正常亮度,为了可靠性设计可采用晶体管构成驱动电路。
整个显示过程中采用动态显示,即4位显示器逐一轮流显示,每位持续1ms,10ms或20ms之内循环一遍,当然可以适当进行更改,但刷新速度不要小于每秒三十桢。
这样,由于视觉暂留现象,我们看到的便是4只显示器同时在显示。
3.2LED数码管连接方式
时、分、秒的显示采用的是一个4位共阴极LED数码管(LG5641AH)和一个2位LED数码管(LG5621AH),连接方法是SPCE061A的IOB8-IOB14接LED焊接板的A-G,小数点显示部分可以省略不要;
IOB0-IOB5分别接LED焊接板的位选COM1、COM2~COM6,电路原理图如图;
下表为LED与SPCE061A的引脚连接表。
图6LED与SPCE061A的引脚连接图
表2LED与SPCE061A的引脚连接表
SPCE061A
Led模块
IOB8
A
COM1
B
COM2
C
COM3
D
COM4
E
COM5
F
COM6
G
4软件流程图
4.1主程序流程图
当程序运行时,时、分、秒的初始值为0,开2Hz中断,作为秒的计数。
计数到2次的时候,就是1S,120次中断就是1分钟,依此类推。
显示部分放到主程序中动态扫描完成。
为了没有闪烁的视觉,所以主程序整个循环不超过2ms。
图7主程序流程图
4.22Hz中断服务程序
如下图所示,在中断中完成秒的计数和分的自加,每进两次2Hz中断,秒自动加1,实现时钟计数。
图82Hz中断服务程序图
5系统连接
采用凌阳大学计划的LED键盘模组和61板搭配可以很容易的完成这个课程设计的题目。
它的连结图如下图所示,IOB的低八位输出段码(待显示数字对应的段信息),高八位输出片选信号(控制点亮哪一个数码管)。
按键状态跳线选最右边的两根跳线短接,选中1*8按键,按键通过IOA读入。
图9LED键盘模组和61板搭配连接图
6总结
通过本次设计,系统的了解了数字时钟的设计流程,尤其是硬、软件的设计方法,掌握了显示电路的基本功能及编程方法,掌握了数字电路和显示电路的一般原理,也进一步掌握了LED显示和中断处理器程序的编程方法。
开拓了思路,提高了分析问题、解决问题的能力,达到了本次设计的目的
参考文献
[1].李建忠编著,《单片机原理及应用》[M],西安电子科技大学出版,2002
[2].张俊谟编著,《单片机中级教程》[M],北京航空航天大学出版,2000
[3].张培仁,孙占辉,张欣著,《基于C语言编程MCS单片机原理及应用》[M],清华大学出版社,2006
[4].李光飞,楼然庙,胡佳文著《单片机课程设计---实例指导》[M],北京北京航空航天大学出版社,2007
[5].苏家健,曹柏荣,汪志锋等编著,《单片机原理及应用技术》[M],北京高等教育出版社,2004
[6].赵亮,侯国锐等编著,《单片机C语言编程与实例》[M],北京人民邮电出版社,2002
[7].何文才,杜鹏,基于VB.NET的PC机和MCS51单片机之间的串行通信[J],北京电子科技学院学报,2006.5
[8].郭增欣,张武坤,LCM2004B液晶显示器在单片机系统中的应用[J],石家庄职业技术学院学报,2006.6
[9].张春峰,邹新杰,余张国.基于ATMEGA16的智能控制器的开发研制[J].微计算机信息,2007,23
[10].张震宇,王华.基于凌阳单片机的语音识别技术及应用[J].微计算机信息,2007,8
TheDesignofDigitalClockBasedSPCE061AMCU
CHENQing-hai
Abstract:
ThesystemdesigncircuittoSunplusMCUSPCE061Aasthecontroller.Mainlybythedisplaycircuit,controlcircuit,sensorcircuit,thevoltageconversioncircuit,controlcircuitoffiveparts.Absorbedtheideasofhardwareandsoftware,mostofthefunctionalitythroughsoftwaretoachieve,tomakethecircuitsimple,significantlyimprovingsystemstability.Thesystemnotonlyachievedthesuccessofthebasicfunctionsrequiredtoplaypartsarefullyrealized,butalsosomeinnovativefeatures.
Keywords:
SPCE061ASCM;
LCD;
digitalclock
附录:
主程序:
#defineClearWDog(*((volatileunsignedchar*)0x7012))=1
unsignedintuiSecond=0,uiMinute=0,uiHour=0,uiShow[6];
main()
{
inti=0,j=0,k=0,iBit=2,iNum,iKey=0;
F_IrqInti();
while
(1)
{
k++;
ClearWDog;
if(uiMinute==60){uiMinute=0;
uiHour++;
}//确定分、时
if(uiHour==24)uiHour=0;
uiShow[0]=uiHour/10;
//计算要显示的值
uiShow[1]=uiHour%10;
uiShow[2]=uiMinute/10;
uiShow[3]=uiMinute%10;
uiShow[4]=uiSecond/10;
uiShow[5]=uiSecond%10;
for(i=0;
i<
0x10;
i++);
//等待一段时间,确保led的亮度
iBit++;
if(iBit==6)iBit=0;
//动态显示时间
iNum=uiShow[iBit];
F_numLED_Ctrl(iBit,iNum);
if(k>
=100)//满足条件进入时间调整
k=0;
iKey=F_Key_Ctrl();
//取得键值
switch(iKey)
{
case0x00ef:
//按键5秒加
uiSecond++;
if(uiSecond==60)uiSecond=0;
break;
case0x00df:
//按键6秒减
uiSecond--;
if(uiSecond==0)uiSecond=60;
case0x00fb:
//按键3分加
uiMinute++;
if(uiMinute==60)uiMinute=0;
case0x00f7:
//按键4分减
uiMinute--;
if(uiMinute==0)uiMinute=60;
case0x00fe:
//按键1时加
uiHour++;
case0x00fd:
//按键2时减
uiHour--;
if(uiHour==0)uiHour=24;
default:
}
}
ISR.c
//描述:
建立中断服务程序
#defineP_INT_Clear(volatileunsignedint*)0x7011
#defineP_INT_Ctrl(volatileunsignedint*)0x7010
//__asm("
.externalF_FIQ_Service_SACM_S480"
);
.externalF_FIQ_Service_SACM_A2000"
//#include"
s480.h"
A2000.h"
externuiSecond,uiMinute;
#include"
hardware.h"
unsignedintsecondflag=0;
//externPlayFlag;
voidBREAK(void)__attribute__((ISR));
voidBREAK(void)
voidFIQ(void)__attribute__((ISR));
voidFIQ(void)
voidIRQ0(void)__attribute__((ISR));
voidIRQ0(void)
voidIRQ1(void)__attribute__((ISR));
voidIRQ1(void)
voidIRQ2(void)__attribute__((ISR));
voidIRQ2(void)
voidIRQ3(void)__attribute__((ISR));
voidIRQ3(void)
voidIRQ4(void)__attribute__((ISR));
voidIRQ4(void)
voidIRQ5(void)__attribute__((ISR));
voidIRQ5(void)
if(secondflag==1)
secondflag=0;
elsesecondflag++;
if(uiSecond==60)
uiSecond=0,uiMinute++;
*P_INT_Clear=0x0004;
voidIRQ6(void)__attribute__((ISR));
voidIRQ6(void)
voidIRQ7(void)__attribute__((ISR));
voidIRQ7(void)
//文件名称:
key.c
建立数码管显示模块
intF_Key_Ctrl()
inti=0,j=0,k[3],key;
//for(i=0;
200;
k[0]=*P_IOA_Dir;
k[1]=*P_IOA_Attrib;
k[2]=*P_IOA_Buffer;
*P_IOA_Dir=0x00ff|*P_IOA_Dir;
*P_IOA_Attrib=0x00ff|*P_IOA_Attrib;
*P_IOA_Data=0x00FF|*P_IOA_Buffer;
10;
key=*P_IOA_Data&
0x00ff;
*P_IOA_Dir=k[0];
*P_IOA_Attrib=k[1];
*P_IOA_Data=k[2];
returnkey;
numLED.c
#defineP_IOA_Data(volatileunsignedint*)0x7000
#defineP_IOA_Buffer(volatileunsignedint*)0x7001
#defineP_IOA_Dir(volatileunsignedint*)0x7002
#defineP_IOA_Attrib(volatileunsignedint*)0x7003
#defineP_IOA_Latch(volatileunsignedint*)0x7004
#defineP_IOB_Data(volatileunsignedint*)0x7005
#defineP_IOB_Buffer(volatileunsignedint*)0x7006
#defineP_IOB_Dir(volatileunsignedint*)0x7007
#defineP_IOB_Attrib(volatileunsignedint*)0x7008
#definebitset(var,bitno)((var)|=(1<
<
(bitno)))
#definebitclr(var,bitno)((var)&
=((1<
bitno)^0xffff))
constintciNum[10]={0x3f00,0x0600,0x5b00,0x4f00,0x6600,0x6d00,0x7c00,0x0700,0x7f00,0x6f00};
//constintciNum[10]={0x003f,0x0086,0x00db,0x00cf,0x00e6,0x00ed,0x00fc,0x0087,0x00ff,0x00ef};
//函数名称:
F_numLED_Ctrl(intiBit,intiNum)
//描述:
控制数码管显示
voidF_numLED_Ctrl(intiBit,intiNum)
inti,j,k=0;
*P_IOB_Dir=0x00ff|*P_IOB_Dir;
*P_IOB_Attrib=0x00ff|*P_IOB_Attrib;
*P_IOB_Data=0xFF00&
*P_IOB_Data;
*P_IOB_Data=0;
*P_IOB_Data=(0x1<
iBit);
*P_IOB_Dir=0xff00|*P_IOB_Dir;
*P_IOB_Attrib=0xff00|*P_IOB_Attrib;
*P_IOB_Data=0x00ff&
*P_IOB_Data=ciNum[iNum]|*P_IOB_Buffer;