单片机数码管时钟电路的设计1Word文件下载.docx
《单片机数码管时钟电路的设计1Word文件下载.docx》由会员分享,可在线阅读,更多相关《单片机数码管时钟电路的设计1Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
秒表/时钟计时器电路系统的总体设计框架如图1所示。
图1硬件系统的总体设计框架
二、系统总体方案设计
2.1硬件设计
数码管时钟电路如图图17-10-1所示,其采用动态扫描方式实现,P1口输出段码数据,p3.0~p3.5口作扫描输出,p3。
7接按钮开关。
为了提供LED数码管的驱动电流,用三极管9012作电源驱动输出。
为了提高秒计时器的精度,采用12Mhz晶振。
AT89C2051的功能:
AT89C2051是一个低电压,高性能CMOS8位单片机,片内含2kbytes的可反复擦写的只读Flash程序存储器和128bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大AT89C2051单片机可为您提供许多高性价比的应用场合。
AT89C2051是一个功能强大的单片机,但它只有20个引脚,15个双向输入/输出(I/O)端口,其中P1是一个完整的8位双向I/O口,两个外中断口,两个16位可编程定时计数器,两个全双向串行通信口,一个模拟比较放大器。
同时AT89C2051的时钟频率可以为零,即具备可用软件设置的睡眠省电功能,系统的唤醒方式有RAM、定时/计数器、串行口和外中断口,系统唤醒后即进入继续工作状态。
省电模式中,片内RAM将被冻结,时钟停止振荡,所有功能停止工作,直至系统被硬件复位方可继续运行。
图1数码管时钟电路
2.1软件设计
(1)主程序
设计中的计时采用定时器T0中断完成,其余状态循环调用显示子程序,当P3.7口开关按下时,转入调时子程序。
系统主程序流程图如图17-10-2示。
(2)显示子程序
数码管显示的数据存放在内存单元70H~75H中,其中70H~71H存放秒数据,72H~73H存放分数据,74H~75H存放时数据,每一地址单元内均为十进制BCD码。
由于采用软
件动态扫描实现数据显示功能,显示用十进制BCD码数据的对应段码存放在ROM表中。
显示时,先取出70H~75H某一地址中的数据,然后查得对应的显示用段码从P1口输出。
P3口将对应的数码管选中就能显示该地址单元的数据值。
(3)定时器T0中断服务程序
定时器T0用于时间计时。
定时溢出中断周期设为50ms,中断累计20次(即1s)是对秒单元进行加1操作。
时间计数单元分别在70H~71H(s)、72H~73H(min)、70H~71H(h),7AH单元内存放“熄灭符”数据(#0AH)。
在计数单元采用十进制BCD码计数,满60进位。
T0中断服务程序流程图如图17-10-3示。
(4)T1中断服务程序
T1中断服务程序用于指示调整单元数字的亮闪。
在时间调整状态下,没过0。
3秒,将对应单元的显示数据换成“熄灭符”数据(#0AH)。
这样,在调整时间时,对应调整单元的显示数据就会间隔闪亮。
(5)调时功能程序
调试功能程序的设计方法是:
按下按键,若按下时间小于1秒,进入省电状态(数码管不亮,时钟不停),否则进入调分状态,等待操作,此时计时器停止走动。
当再次按下按钮时,若按下时间小于0.5秒则,则时间加1分钟;
若按下时间大于0.5秒则进入小时调整状态。
在小时调整状态下,当按键按下的时间大于0.5秒退出调整状态,时钟继续走动。
三、系统软件工作流程图
3.1系统软件工作流程图
图2-系统软件工作流程图
LED数码管时钟显示电路的完整源程序
AT89C2051时钟程序
定时器T0、T1溢出周期为50MS,T0为秒计数用,T1为调整时闪烁用,
P3.7为调整按钮,P1口为字符输出口,采用共阳显示管。
3.2系统调试
硬件调试:
主要检查了电路板有无虚焊、短路、连线是否正常,尤其是单片机的各使能端的接线,I/O接口连线是否有误。
由于我们采用了六个数码管并联接入P2口的段选端,因此接线较多,经常容易出现管脚间短路现象。
这是硬件设计不足之处,今后将注意元件的选配使设计更简洁实用。
软件调试:
在LCA51仿真机上,对定时中断程序、显示子程序、按键中断子程序进行了分段调试,结果功能正常。
时钟计时检测:
通过与其它计时器对比观察发现数字时钟走时过快,检查定时中断程序发现T0的初始值设定有误,因此重新设置:
根据T0选择工作模式1,定时时间为50ms,
focs=12MHz,
由
T=(2^16-T0初始值)×
振荡周期×
12
设T0的初始值为X,
则:
(2^16-X)×
1/12×
10^6s×
12=50ms
X=15625,
转化二进制值为:
X=0011110010111010,
即TH=#3CH,TL=#0BAH
四、详细元器件清单
1.单片机仿真器
2.单片机仿真模块
3.Isis软件
4.Keil软件
5.计算机
五、总结:
在一年的单片机学习过程中,面对着如此厚重的一本教材,以及繁杂的记忆内容,不免觉得有点枯燥乏味,离开了实验的乐趣,也最终不知道自己现在所学课程的重要性和他的趣味性。
学习过程中不免将其仅仅作为一种知识的积累,直到最近的实验机会又教会了我许多,打开了我学习的一个视野,前所未有的一个看待学习的一个角度,也许是我接触实践太晚了吧。
加之上海参观实习,在所里的所见所闻,以及最近在实验室里和老板,和师兄聊天,接触了前沿的一些科研内容,总算觉着自己有英雄用武之地了。
在做这门实验的过程中,浏览了许多网络上的电子期刊,访问了很多电子企业的网站,认识了各种各样的电子产品,当然以单片机为主。
还了解了各种电子元件的参数,比方说传感器,三极管等以及他们在实际应用中的一些注意事项,对以前理论的东西有了更深层次的认识。
打开了自己学习方向的另一个广阔天地。
让自己对学习有了更大的兴趣和动力,并有了更明确的方向。
在比较了各种方案以后,我确定了方案:
数码管时钟电路的设计。
主要原因是他相对简单。
由于我是第一次作实践的东西,包括从确定方案到采购到成品都是第一次,另外考虑到这个实验的初衷及要达到的效果,我才选了这个相对简单的课题。
通过这次实践我学到了不少东西。
由于选题简单,在实验过程中未遇到太大的困难。
在实验中由于对三极管的不够熟悉,前期所做的仿真图都不能正确的运行,由于三极管的放大问题,导致数码管不能正常显示,最后在指导老师的提示下,拆除了数码管,从而使得系统能正常运行。
对于程序方面,结合网络上的资料,经过两天的调试,成功的编写出了程序。
通过本次本次实验,我学到了很多,也巩固了以前的单片机知识,在对单片机的理解上更进一步,通过理论与实践的结合,从而更深入的学习到了一些指令的运用,让我对单片机有了一个新的认识!
附录一、参考文献
1.《单片机原理及其接口技术》·
·
清华大学出本社
2.
附录二、程序
;
*****************************************
AT89C2051秒表/时钟程序;
定时器T0、T1溢出周期为MS,T0为秒计数用,T1为调整时闪烁用,
P3.7为调整按钮,P1口为字符输出口,采用共阳显示管。
中断入口程序;
ORG0000H;
程序执行开始地址
LJMPSTART;
跳到标号START执行
ORG0003H;
外中断0中断程序入口
RETI;
外中断0中断返回
ORG000BH;
定时器T0中断程序入口
LJMPINTT0;
跳至INTT0执行
ORG0013H;
外中断1中断程序入口
外中断1中断返回
ORG001BH;
定时器T1中断程序入口
LJMPINTT1;
跳至INTT1执行
ORG0023H;
串行中断程序入口地址
串行中断程序返回
;
主程序;
START:
MOVR0,#70H;
清70H-7AH共11个内存单元
MOVR7,#0BH;
CLEARDISP:
MOV@R0,#00H;
INCR0;
DJNZR7,CLEARDISP;
MOV20H,#00H;
清20H(标志用)
MOV7AH,#0AH;
放入“熄灭符数据”
MOVTMOD,#11H;
设T0、T1为16位定时器
MOVTL0,#0B0H;
50ms定时初值(T0计时用)
MOVTH0,#3CH;
50ms定时初值
MOVTL1,#0B0H;
50ms定时初值(T1闪烁定时用)
MOVTH1,#3CH;
SETBEA;
总中断开放
SETBET0;
允许T0中断
SETBTR0;
开启T0定时器
MOVR4,#14H;
1s定时用初值(50ms*20)
START1:
LCALLDISPLAY;
调用显示子程序
JNBP3.7,SETMM1;
P3.7口为0时转时间调整程序
SJMPSTART1;
P3.7口为1时跳回START1
SETMM1:
LJMPSETMM;
转到时间调整程序SETMM
1秒计时程序;
T0中断服务程序
INTT0:
PUSHACC;
累加器入栈保护
PUSHPSW;
状态字入栈保护
CLRET0;
关T0中断允许
CLRTR0;
关闭定时器T0
MOVA,#0B7H;
中断响应时间同步修行
ADDA,TL0;
低8位初值修正
MOVTL0,A;
重装初值(低8位修正值)
MOVA,#3CH;
高8位初值修正
ADDCA,TH0;
MOVTH0,A;
重装初值(高8位修正值)
开启定时器T0
DJNZR4,OUTT0;
20次中断未到中断退出
ADDSS:
20次中断到(1s)重赋初值
MOVR0,#71H;
指向秒计时单元(71H-72H)
ACALLADD1;
调用加1程序(加1s操作)
MOVA,R3;
秒数据放入A(R3为2位十进制数组合)
CLRC;
清进位标志
CJNEA,#60H,ADDMM;
ADDMM:
JCOUTT0;
小于60s时中断退出
ACALLCLR0;
大于或等于60s时对秒计时时单元清零
MOVR0,#77H;
指向分计时单元(76H-77H)
分计时单元加1min
分数据放入A
CJNEA,#60H,ADDHH;
ADDHH:
小于60s时对秒计时单元清0
大于或等于60min时分计时单元清0
MOVR0,#79H;
指向小时计时单元(78H-79H)
小时计时单元加1h
时数据放入A
CJNEA,#24H,HOUR;
HOUR:
小于24h小时计时单元清0
大于或等于24h小时计时单元清0
OUTT0:
MOV72H,76H;
中断退出时将分、时计时单元数据移入对应显示单元
MOV73H,77H;
MOV74H,78H;
MOV75H,79H;
POPPSW;
恢复状态字(出栈)
POPACC;
恢复累加器
开放T0中断
中断返回
闪动调时程序;
T1中断服务程序,用作时间调整时调整单元闪烁指示
INTT1:
中断现场保护
MOVTL1,#0B0H;
装定时器T1定时初值
MOVTH1,#3CH;
DJNZR2,INTT1OUT;
0.3s未到退出中断(50ms中断6次)
MOVR2,#06H;
重装0.3s定时用初值
CPL02H;
0.3s定时到对闪烁标志取反
JB02H,FLASH1;
02H位为1时显示单元“熄灭”
02H位为0时正常显示
INTT1OUT:
恢复现场
中断退出
FLASH1:
JB01H,FLASH2;
01H位为1时,转小时熄灭控制
MOV72H,7AH;
01H位为0时,“熄灭符”数据放入分
MOV73H,7AH;
显示单元(72H-73H),将不显示分数据
AJMPINTT1OUT;
转中断退出
FLASH2:
01H位为1时,“熄灭符”数据放入小时
显示单元(74H-75H),小时数据将不显示
MOV74H,7AH;
MOV75H,7AH;
加子程序;
ADD1:
MOVA,@R0;
取当前计时单元数据到A
DECR0;
指向前一地址
SWAPA;
A中数据高4位与低4位交换
ORLA,@R0;
前一地址中数据放入A中低4位
ADDA,#01H;
A加1操作
DAA;
十进制调整
MOVR3,A;
移入R3寄存器
ANLA,#0FH;
高4位变0
MOV@R0,A;
放回前一地址单元
取回R3中暂存数据
指向当前地址单元
数据放入当前地址单元中
RET;
子程序返回
清零程序;
对计时单元复零用
CLR0:
CLRA;
清累加器
清当前地址单元
前一地址单元清0
时钟调整程序;
当调时按键按下时进入此程序
SETMM:
关定时器T0中断
LCALLDL1S;
调用1s延时程序
JBP3.7,CLOSEDIS;
键按下时间小于1s,关闭显示(省电)
进入调时状态,赋闪烁定时初值
SETBET1;
允许T1中断
SETBTR1;
开启定时器T1
SET2:
JNBP3.7,SET1;
P3.0口为0(键未释放),等待
SETB00H;
键释放,分调整闪烁标志置1
SET4:
JBP3.7,SET3;
等待键按下
LCALLDL05S;
有键按下,延时0.5s
JNBP3.7,SETHH;
按下时间大于0.5s转调小时状态
按下时间小于0.5s加1min操作
LCALLADD1;
调用加1子程序
取调整单元数据
CJNEA,#60H,HHH;
调整单元数据与60比较
HHH:
JCSET4;
调整单元数据小于60转SET4循环
LCALLCLR0;
调整单元数据大于或等于60时清0
AJMPSET4;
跳转到SET4循环
CLOSEDIS:
省电(LED不显示)状态,开T0中断
开启T0定时器(开时钟)
CLOSE:
JBP3.7,CLOSE;
无按键按下,等待
有键按下,调显示子程序延时消抖
是干扰返回CLOSE等待
WAITH:
JNBP3.7,WAITH;
等待键释放
LJMPSTART1;
返回主程序(LED数据显示亮)
SETHH:
CLR00H;
分闪烁标志清除(进入调小时状态)
SETHH1:
JNBP3.7,SET5;
SETB01H;
小时调整标志置1
SET6:
JBP3.7,SET7;
等待按键按下
有键按下延时0.5s
JNBP3.7,SETOUT;
按下时间大于0.5s退出时间调整
按下时间小于0.5s加1h操作
调加1子程序
CJNEA,#24H,HOUU;
计时单元数据与24比较
HOUU:
JCSET6;
小于24转SET6循环
大于或等于24时清0操作
AJMPSET6;
跳转到SET6循环
SETOUT:
JNBP3.7,SETOUT1;
调时退出的程序,等待键释放
延时消抖
是抖动,返回SETOUT再等待
CLR01H;
清调小时标志
清调分标志
CLR02H;
清闪烁标志
CLRTR1;
关闭定时器T1
CLRET1;
关定时器T1中断
开定时器T0中断(计时开始)
跳回主程序
SET1:
键释放等待时调用显示程序(调分)
AJMPSET2;
防止键按下时无时钟显示
SET3:
等待调