单片机数字钟设计说明书.docx
《单片机数字钟设计说明书.docx》由会员分享,可在线阅读,更多相关《单片机数字钟设计说明书.docx(23页珍藏版)》请在冰豆网上搜索。
单片机数字钟设计说明书
目 录
一、单片机数字时钟3
二、课程设计的设计任务及基本要求3
三、课程设计方框图4
四、主程序流程图5
五、部分电路设计及相应的程序7
六、附录及参考文献22
七、心得体会23
一、单片机数字时钟
二、课程设计的设计任务及基本要求
1.设计一个利用C-51单片机编程的数字时钟;
2.要求开机运行显示“23.59.58”;
3.显示部分用6位8八段共阳极数码管;
4.具有显示“时时.分分.秒秒”;
5.具有3个调整按键;
6.按键功能:
秒调整,分调整,时调整;
7.调整到哪位那一位具有闪烁;
三、课程设计方框图
四、主程序流程图
本设计中计时采用定时器T0中断完成,其余状态循环调用显示子程序,当端口开关按下时,转入相应功能程序。
•
定时器T0中断服务程序
•定时器T0用于时间计时。
定时溢出中断周期可设为50ms,中断进入后,时钟计时累计20次(即1s)时,对秒计数单元进行加1操作。
时钟计数单元在定义的6个单元70H~75H中,70H~71H存放秒数据,72H~73H存放分数据,74H~75H存放时数据。
最大计时值为23小时59分59秒。
在计数单元中采用十进制BCD码计数,秒、分、时之间满60进位。
五、部分电路设计及相应的程序
芯片与显示部分电路图:
P0口为八段共阳极数码管段驱动
八段共阳极数码管段驱动接的限流电阻的阻值510
P2口为6为数码管的为驱动
6为数码管的为驱动所接的电阻阻值为5K
位驱动用了6个74HC04来稳定显示效果
显示子程序:
数码管显示的数据放在内存单元70H~75H中,其中70H~71H存放秒数据,72H~73H]存放分数据,74H~75H存放时数据,每一单元内均为十进制BCD码。
由于采用软件动态扫描实现数据显示功能,显示用的十进制BCD码数据的对应段码存放在ROM表中,显示时,先取出70H~75H中的某一地址中的数据,然后查表得对应的显示段码从P0口输出,P2口将对应的数码管位选中供电,就能显示该地址单元的数据值。
ORG0000H;主程序起始地址
LJMPMAIN;跳转至主程序
ORG000BH;TIMERO中断起始地址
LJMPINTT0;跳至中断服务程序
ORG0030H;定位起始地址
MAIN:
MOVSP,#75H;设置堆栈在75H
MOV21H,#0;21H为功能状态标志单元,0为时钟运行态,
1为秒调节,2为分调节,3为时调节
CLR00H;按键消抖标志初始化为0
CLR02H;02H为显示闪烁标志,1为熄灭,0点亮
MOVR5,#100;中断100次
MOVTMOD,#01H;T0为方式1
MOVTH0,#0D8H;T0赋初值(10ms,fosc=12MHz)
MOVTL0,#0F0H;
MOV6DH,#23;“时”寄存器初值为23
MOV6EH,#59;“分”寄存器初值为59
MOV6FH,#58;“秒”寄存器初值为28
SETBEA;CPU开中断
SETBET0;T0开中断
SETBTR0;T0启动运行
HERE:
SJMPHERE;等待中断
DISP:
MOVDPTR,#TAB;置共阳字段码首地址
MOVA,70H;读显示数
MOVCA,@A+DPTR;读十位显示符
MOVP0,A;输出至P0
CLRP2.0;P2.0清零
LCALLD1MS;调用1MS显示子程序
SETBP2.0;P2.0置1
MOVA,71H;读显示数
MOVCA,@A+DPTR;读十位显示符
ANLA,#7FH;点亮DP
MOVP0,A;输出至P0
CLRP2.1;P2.1清零
LCALLD1MS;调用1MS显示子程序
SETBP2.1;P2.0置1
MOVA,72H;读显示数
MOVCA,@A+DPTR;读十位显示符
MOVP0,A;输出至P0
CLRP2.2;P2.2清零
LCALLD1MS;调用1MS显示子程序
SETBP2.2;P2.2置1
MOVA,73H;读显示数
MOVCA,@A+DPTR;读十位显示符
ANLA,#7FH;点亮DP
MOVP0,A;输出至P0
CLRP2.3;P2.3清零
LCALLD1MS;调用1MS显示子程序
SETBP2.3;P2.0置1
MOVA,74H;读显示数
MOVCA,@A+DPTR;读十位显示符
MOVP0,A;输出至P0
CLRP2.4;P2.4清零
LCALLD1MS;调用1MS显示子程序
SETBP2.4;P2.4置1
MOVA,75H;读显示数
MOVCA,@A+DPTR;读十位显示符
MOVP0,A;输出至P0
CLRP2.5;P2.5清零
LCALLD1MS;调用1MS显示子程序
SETBP2.5;P2.5置1
RET;推出循环
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H
DB92H,82H,0F8H,80H,90H;表格
;fosc=12MHz,1T=1us,1ms=1000T;
D1MS:
MOVR7,#249;1T
DIMSLP:
NOP;2TX249=498T
NOP;
DJNZR7,DIMSLP;2TX249=498T
NOP;1T
RET;2T
INTT0:
MOVTH0,#0D8H;T0重赋初值
MOVTL0,#0F0H;T0重赋初值
DJNZR5,INTRET;判断INTRET是不是到了
MOVR5,#100;到100次
CPL02H;取反
MOVA,21H;将21H单元数送入累加器
CJNEA,#0,INTRET;判断中断到1000次吗
INC6FH;6FH单元加1
MOVA,6FH;将6FH数送入累加器A
CJNEA,#60,INTRET;判断累加器A中的数等于60
MOV6FH,#0;6FH清0
INC6EH;6EH单元加1
MOVA,6EH;将6EH数送入累加器A
CJNEA,#60,INTRET;判断累加器A中的数等于60
MOV6EH,#0;6EH清0
INC6DH;6DH单元加1
MOVA,6DH;将6DH数送入累加器A
CJNEA,#24,INTRET;判断累加器A中的数等于23
MOV6DH,#0;6DH清0
INTRET:
LCALLKEYA;调用按键防抖动
LCALLBIN2BCD;调用2位十进制数显示模块
LCALLXS_FL;调用闪烁模块
LCALLDISP;调用显示模块
RETI;结束中断
BIN2BCD:
MOVA,6FH;将秒寄存器的内容存入A
MOVB,#10;设B累加器的值为10
DIVAB;A/B,商存入A,余数,存入B
MOV74H,A;将A的内容送入74H单元
MOV75H,B;将B的内容送入75H单元
MOVA,6EH;将秒寄存器的内容存入A
MOVB,#10;设B累加器的值为10
DIVAB;A/B,商存入A,余数,存入B
MOV72H,A;将A的内容送入72H单元
MOV73H,B;将B的内容送入73H单元
MOVA,6DH;将秒寄存器的内容存入A
MOVB,#10;设B累加器的值为10
DIVAB;A/B,商存入A,余数,存入B
MOV70H,A;将A的内容送入70H单元
MOV71H,B;将B的内容送入71H单元
RET;退出循环
END;结束程序
调时功能程序的设计方法是:
按下P1.0键,进入调分状态,时钟停止走动;按P1.1或P1.2键可进行加1或减1操作;继续按P1.0键可分别进行分十位、时个位和时十位调整;最后按P1.0键将退出调整状态,时钟开始计时运行。
K0键为“秒调整,分调整,时调整”总共有4种状态
“0”为正常运行状态
“1”为正常秒调整状态
“2”为正常分调整状态
“3”为正常时调整状态;
通过判断读键值程序
K1键为加1功能键:
如果当没有键操作则时钟正常运行;
如果当KA0为1秒调整状态秒单元闪烁,按KA1则秒单元加1;
如果当KA0为2分调整状态分单元闪烁,按KA1则分单元加1;
如果当KA0为3时调整状态时单元闪烁,按KA1则时单元加1;
KA2功能键:
通过判断读键值程序
KA2键为减1功能键:
如果当没有键操作则时钟正常运行;
如果当KA0为1秒调整状态秒单元闪烁,按KA1则秒单元减1;
如果当KA0为1分调整状态分单元闪烁,按KA1则分单元减1;
如果当KA0为3时调整状态时单元闪烁,按KA1则时单元减1;
按键功能程序:
====================================================================
KA0:
JB01H,N4;判断标志位等于4
INC21H;21H单元加1
MOVA,21H;将21H单元送入累加器A
CJNEA,#4,N4;判断等于4,不等于4
MOV21H,#0;21H单元清0
N4:
CLR00H;标志位,0为下一次按键操作做好准备
SETB01H;按键功能响应标志
SJMPGRET;退出
;====================================================================
KA1:
JB01H,KA1END;转01H标志响应
MOVA,21H;将21H标志送入累加器A
CJNEA,#0,N0;判断键为0,不等于0
SJMPKA1END;退出响应
N0:
CJNEA,#1,N1;判断等于1,不等于1
INC6FH;6FH单元加1
MOVA,6FH;将6FH单元送入累加器
CJNEA,#60,KA1END;判断等于60,不等于60
MOV6FH,#06FH;6FH清0
SJMPKA1END;退出响应
N1:
CJNEA,#2,N2;判断等于2,不等于2
INC6EH;6EH单元加1
MOVA,6EH;将6FH单元送入累加器A
CJNEA,#60,KA1END;判断等于60,不等于60
MOV6EH,#0;6EH清0
SJMPKA1END;退出响应
N2:
CJNEA,#3,KA1END;判断等于2,不等于2
INC6DH;6EH单元加1
MOVA,6DH;将6FH单元送入累加器A
CJNEA,#24,KA1END;判断等于60,不等于60
MOV6DH,#0;6DH清0
KA1END:
CLR00H;标志位,0为下一次按键操作做好准备
SETB01H;按键功能响应标志
SJMPGRET;时钟运转
;====================================================================
KA2:
JB01H,KA2END;转01H标志响应
MOVA,21H;将21H标志送入累加器A
CJNEA,#0,DN0;判断键为0,不等于0
SJMPKA1END;退出响应
DN0:
CJNEA,#1,DN1;判断等于1,不等于1
DEC6FH;6FH单元减1
MOVA,6FH;将6FH单元送入累加器A
CJNEA,#255,KA2END;判断等于255,不等于255
MOV6FH,#59;6FH减59次
SJMPKA2END;退出响应
DN1:
CJNEA,#2,DN2;判断等于1,不等于1
DEC6EH;6FH单元加1
MOVA,6EH;将6FH单元送入累加器A
CJNEA,#255,KA2END;判断等于255,不等于255
MOV6EH,#59;6FH减59次
SJMPKA2END;退出响应
DN2:
CJNEA,#3,KA2END;判断等于1,不等于1
DEC6DH;6FH单元减1
MOVA,6DH;将6FH单元送入累加器A
CJNEA,#255,KA2END;判断等于255,不等于255
MOV6DH,#23;6FH减23
KA2END:
CLR00H;标志位,0为下一次按键操作做好准备
SETB01H;按键功能响应标志
AJMPGRET;退出循环
闪烁部分程序:
XS_FL:
MOVA,21H;将21H单元送入累加器A
CJNEA,#0,FL;判断A中等于0,跳到FL
SJMPN3FL;跳转到出口
FL:
CJNEA,#1,N1FL;判断A中等于1,跳到N1FL
JB02H,MFL;02H为显示闪烁标志,1为熄灭,0点亮
LCALLBIN2BCD;调用显示模块
SJMPN3FL;退出循环
MFL:
MOV74H,#10;将74H单元表调用中的熄灭码
MOV75H,#10;将75H单元调用表中的熄灭码
SJMPN3FL;退出循环
N1FL:
CJNEA,#2,N2FL;判断A中等于1,跳到N2FL
JB02H,MFL1;02H为显示闪烁标志,1为熄灭,0点亮
LCALLBIN2BCD;调用显示模块
SJMPN3FL;跳转到出口
MFL1:
MOV72H,#10;将73H单元表调用中的熄灭码
MOV73H,#10;将72H单元调用表中的熄灭码
SJMPN3FL;跳转到出口
N2FL:
CJNEA,#3,N3FL;判断A中等于3,跳到N3FL
JB02H,MFL2;02H为显示闪烁标志,1为熄灭,0点亮
LCALLBIN2BCD;调用显示模块
SJMPN3FL;跳转到出口
MFL2:
MOV70H,#10;将70H单元表调用中的熄灭码
MOV71H,#10;将71H单元表调用中的熄灭码
N3FL:
RET;退出循环程序
表格中的第十个位熄灭码:
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H
DB92H,82H,0F8H,80H,90H,0FFH;表格
BIN2BCD:
MOVA,6FH;将秒寄存器的内容存入A
MOVB,#10;设B累加器的值为10
DIVAB;A/B,商存入A,余数,存入B
MOV74H,A;将A的内容送入74H单元
MOV75H,B;将B的内容送入75H单元
MOVA,6EH;将秒寄存器的内容存入A
MOVB,#10;设B累加器的值为10
DIVAB;A/B,商存入A,余数,存入B
MOV72H,A;将A的内容送入72H单元
MOV73H,B;将B的内容送入73H单元
MOVA,6DH;将秒寄存器的内容存入A
MOVB,#10;设B累加器的值为10
DIVAB;A/B,商存入A,余数,存入B
MOV70H,A;将A的内容送入70H单元
MOV71H,B;将B的内容送入71H单元
RET;退出循环
六、附录及参考文献
AT89C51
1片
74HC04
6个
RES
8只510
RES
6只5K
BUTTON
3个
7SEG-MPX6-CA
1片
POWER
1个
GROUND
1个
Proteus软件
《单片机原理与控制技术》第二版张志良主编
…
七、心得体会
通过这次对数字钟的设计,让我了解了设计电路的程序,也让我了解了关于数字钟的原理与设计理念,要设计一个完整的电路总要经过多次的失败才能成功的,在设计中,遇到了许多匪夷所思的问题,一个人就是想破脑子也做不出来,这时候,就需要去询问老师、和同学探讨,共同解决出现的问题,也许就是因为老师的一句提醒、同学的探讨中就会豁然开朗。
。
通过这次设计,不仅使我学到了知识,让我对电路设计有了大概的了解;其次,还体会到了团队精神。
总而言之,这次设计是成功的。