单片机电子表设计.docx
《单片机电子表设计.docx》由会员分享,可在线阅读,更多相关《单片机电子表设计.docx(18页珍藏版)》请在冰豆网上搜索。
![单片机电子表设计.docx](https://file1.bdocx.com/fileroot1/2022-11/23/aa9657cb-6efc-4856-9331-e21c116fa798/aa9657cb-6efc-4856-9331-e21c116fa7981.gif)
单片机电子表设计
目录
第1章设计内容与要求1
1.1系统结构框图与工作原理设计内容1
1.2设计要求1
第2章系统总体方案选择说明2
2.1总体思路2
2.2系统方案选择2
2.3系统总体方案说明2
第3章系统结构框图与工作原理3
3.1系统结构框图3
3.2系统工作原理3
第4章模块电路设计4
4.1调节时钟部分电路4
4.2显示部分电路4
4.3单片机部分电路5
第5章软件设计说明6
5.1主程序流程图6
5.2显示程序流程图7
5.3定时计数器T0中断服务流程图8
第6章电路的调试9
第7章设计总结10
附录1参考文献11
附录2总体设计图12
附录3程序清单13
第1章设计内容与要求
1.1系统结构框图与工作原理设计内容
(1)设计时钟包括:
时钟、跑表;
(2)使用6位LED进行显示。
(3)能通过键盘对时钟进行调整;
(4)做时钟时在6位LED显示器上显示时、分、秒,
(5)做跑表时具有跑表启动和跑表清零和暂停功能键。
1.2设计要求
(1)确定系统设计方案;
(2)进行系统的硬件设计;
(3)完成必要的参数计算与元器件的选择;
(4)完成应用程序设计;
(5)进行软硬件调试;
第2章系统总体方案选择说明
2.1总体思路
利用8051的P2口作为控制单片机跑表开始,暂停,清零,返回的输入端。
P3作为控制LED的显示时钟的调节时间控制信号输入端。
P0,P1控制LED动态显示选择控制端控制六个LED的显示时间和显示顺序。
定时器T0定时50ms。
T1定时10ms,37H-39H保存时钟的变化量。
41H-43H保存秒表的变化量。
其中为了方便显示,每个变量对应两个单元,以便将变量拆开成两个十进制的数方便显示。
2.2系统方案选择
本系统采用AT89C51单片机、6位数码管显示(不带译码器)和7个键盘键盘操作(分别为功能键,加一键,减一键,返回键,开始键,暂停键,清零键)作为调节时间的按钮构成一个单片机多功能时钟的硬件。
此外包括一些必须的晶振电路和复位电路。
2.3系统总体方案说明
本系统是一个多功能时钟,具有时间显示功能和跑表功能,数码管显示时间,通过三个按钮对时间进行调整,按键1为时分秒控制按钮,2、3为加减调节按钮。
(1)计数单元由单片机内部定时器/计数器T0来实现。
(2)时间显示功能通过LED数码管动态扫描来实现,其中P0口控制数码管的断选信号,P1口的低六位控制数码管的六个片选信号。
(3)时间调整通过接入键盘来实现。
第3章系统结构框图与工作原理
3.1系统结构框图
3.2系统工作原理
对定时器T0一个50ms的定时时间,软件计数功能的单元地址R2为20,当R2减到0是秒加一。
当秒、分值为60时改位清零,且高位加一。
当时的值达到24时,显示全部为0,然后进入新的一天。
该系统是通过P2控制时分秒位的选择,通过P0口实现时分秒的显示。
时分秒的调节由外接键盘的上三个按钮控制,按一下调秒、两下调分、三下调时、按四下返回。
对于定时器T1设定一个10ms的定时时间,当进入一次中断时,秒表最后一位的数字加一。
在秒表的子程序中加入按键检测程序,保证在跑表运行的过程中能随时的响应外部按键的信号进行相关的操作。
跑表变量储存在41H-43H的单元中,变化后,经过数据处理,经显示程序显示。
第4章模块电路设计
4.1调节时钟部分电路
图1调节时钟部分电路
4.2显示部分电路
图2显示部分电路(时钟电路)
图3显示部分电路(跑表电路)
4.3单片机部分电路
图4单片机部分电路
第5章软件设计说明
使用单片机中的定时器中断,定时50ms,设定一计数单元R0为20,当R2减为0时(50×20=1000)时秒值加一,当秒值为60时,分值加一秒值清零。
分值为60时时值加一分值清零时值为24时时分秒全部清零。
秒表时,采用和时钟基本一致的设计方法,只不过奖定时器T1的时间设定为10ms,然后进位的问题和时钟基本一致,不过秒表的进位应该是100个0.01S进一位。
由于存在两个不同的工作状态,因此,每一个状态的后面都要加一段检测按键的程序,方便在有外部按键信号的时候及时的响应,防止进入死循环。
5.1主程序流程图
图5主程序流程图
5.2显示程序流程图
图6显示程序流程
5.3定时计数器T0中断服务流程图
图7定时器/计数器中断流程图
第6章电路的调试
把编好的程序输入到新建的WAVE6000中,保存编译得到一个*hex的文件,导入单片机中运行,时钟开始显示时间。
等到秒钟为59时下一秒分钟加一,秒钟清零,等分秒都为59时下一秒时钟加一分秒清零,当时为23分秒为59时下一秒时分秒全部清零。
显示部分电路调时通过。
按下键盘1键进入调秒状态每按下2键秒钟加一,每按下3键秒钟减一;按两下键盘1键进入调分状态,每按下2键分钟加一,每按下3键分钟减一;按三下键盘1键进入调时状态,每按下2键时钟加一,每按下3键时钟减一;按四下键盘1键返回计数状态。
控制部分调时通过。
再调试秒表的过程中,由于精确到0.01S的过程,因此必须慎重考虑DELAY程序的应用以及循环次数的确定,否侧回造成显示出问题,过快或过慢都会对试验结果造成不良的影响。
为此,在秒表的调试过程中,必须谨慎。
在调时电路过程中要认真观测合记录,一发下问题就及时调节,当实际结果合理论预想一致时我们就是幸运的了,当不一致是我们就尽量想办法让他们一致,调试时一个验证成果的过程,对整个设计过程来说是相当重要的。
第7章设计总结
课程设计是对课程的实践与总结,只要做了就会有收获。
在这次设计中我加深了程序的阅读能力、程序的灵活调用、单片机的设计制作调试方法。
为了能顺利的完成这次的课程设计我找了很多资料也因此知道了不少课本上没深入介绍的东西,提高了我的思维空间,拓宽了我的知识面,加深了对单片机课程的兴趣。
最主要的是加强了动手的能力,当遇到难懂的问题是老师和同学们的耐心讲解更是让我在这阴雨连绵的季节多了几分暖意。
遇到问题是先思考,解决不了再查资料,实在弄不出来就问老师和同学们,毕竟不耻下问是中华名族的优良美德。
只有如此才能不断进步。
通过这次课程设计我了解到学好一门汇编语言,最根本的应该是了解所能接触到的程序中最关键的是哪些,实际的应用编写更是非常重要,所以我们一定要自己动手试一下,尝试编写程序。
因为做一个旁观者事不能够学到东西的。
此外在此次设计中我对此次设计的内容有一下感触,第一,由于此次设计的过程中设计秒表和时钟的显示,即在一个数码管上显示两种变量,必须确定以下几点:
1、时钟在切换的过程中不能停,秒表在切换的过程中可以停,为了简化设计,我设计的是在切换的过程中秒表停止。
2、必须仔细的核对每一个变量的名字,我曾经在核对变量的名字上面花了很大的力气,由于变量的名字错了,软件编译时很少能检查出,因此仿真时往往不容易发现。
3、要每个子程序的调试,这样才能确认某一个部分是正确的,这样才有继续往下做的信心和勇气。
十分感谢学校安排这次课程设计,他使我们对前面的知识进行了积累,也十分感谢周老师以及同学们在设计过程中对我的帮助。
附录1参考文献
1、《单片机C语言轻松入门》周坚编北京航空航天大学出版社
2、单片机人机接口实例公茂法编著,北京航空航天大学出版社
附录2总体设计图
附录3程序清单
MIAOLEQU30H;存放时间的变量分别为秒钟秒钟个位,十位
MIAOHEQU31H
FENLEQU32H
FENHEQU33H
SHILEQU34H
SHIHEQU35H
SHIEQU39H;存放10进制的时钟信息
FENEQU38H
MIAOEQU37H
FUCEQU36H;功能键按键计数器,记录功能键按下的次数
FANHUI1BITP2.0
STARTBITP2.1;跑表计时开始
STOPBITP2.2;跑表计时停止
CLEARBITP2.3;跑表清零
SECOND1EQU41H;保存跑表变量
SECOND2EQU42H
FENGEQU43H
SECOND1LEQU44H
FENGLEQU48H
SECOND2LEQU46H
SECOND1HEQU45H
FENGHEQU49H
SECOND2HEQU47H
ORG0000H
SJMPMAIN
ORG000BH
LJMPTIME0
ORG001BH
LJMPTIME1
ORG0030H
INIT:
MOVTMOD,#11H;选定时器0方式1
MOVTH0,#3CH;置初值
MOVTL0,#0B0H;
MOVTH1,#0D8H;置初值(10MS)0.01S
MOVTL1,#0F0H;
MOVR2,#20;1秒时间50msX20
SETBET0;开定时器0中断
SETBET1
SETBEA;开中中断
SETBTR0;启动定时器0
MOVP3,#0ffh;读键值,初始化
MOVP2,#0ffh
RET
MAIN:
ACALLINIT;调用初始化函数
A1:
MOVDPTR,#TAB;查表初值
ACALLKEYSCAN
MOVA,P2
JNBFANHUI1,FANHUI
JNBSTART,SEC_WATCH;判断是否是跑表计时开始
JNBSTOP,STOP_WATCH
JNBCLEAR,CLEAR_WATCH
SJMPA1;判断设置时钟时
LJMPA1
FANHUI:
ACALLKEYSCAN
ACALLDISP
ACALLCHULI
CLRTR1
JNBSTART,SEC_WATCH;判断是否是跑表计时开始
JNBSTOP,STOP_WATCH
JNBCLEAR,CLEAR_WATCH
SJMPFANHUI
SEC_WATCH:
MOVDPTR,#TAB
ACALLDELAY
ACALLDISP1
ACALLCHULI1
SETBTR1
MOVSECOND1,#00
MOVSECOND2,#00
A3:
LCALLDISP1
LCALLCHULI1
JNBCLEAR,CLEAR_WATCH
JNBSTOP,STOP_WATCH
JNBFANHUI1,FANHUI
JNBSTART,SEC_WATCH
AJMPA3
CLEAR_WATCH:
MOVSECOND1,#00
MOVSECOND2,#00
LCALLCHULI1
ACALLDISP1
LCALLDELAY
AJMPA3
STOP_WATCH:
CLRTR1
LCALLCHULI1
ACALLDISP1
SJMPA3
KEYSCAN:
MOVA,P3;读取按键
ANLA,#07H;
CJNEA,#07H,K0;判断是否按键
RET
K0:
ACALLDELAY;有按键延时去抖动
MOVA,P3
ANLA,#07H
CJNEA,#07H,K1;
RET;是抖动返回
K1:
MOVR3,A;不是抖动,存按键
K2:
MOVA,P3;
ANLA,#07H;
CJNEA,#07H,K2;等待松开按键
MOVA,R3;
CJNEA,#06H,K3;键值读取看是否是P3.1被按下,加1按键
SJMPKEY1;
K3:
CJNEA,#05H,KEY3;看是否是P3.2被按下,减1按键
SJMPKEY2;
KEY3:
INCFUC;不是加1也不是减1就是功能键P3.0,被按下,功能键按下次数加1
CLRTR0;按下功能见后进入调整时间模式,关闭定时器
MOVA,FUC;读取功能键按下次数
CJNEA,#4,RETT;如果按下四次了,就恢复时间模式
SETBTR0;打开定时器
MOVTH0,#3CH;
MOVTL0,#0B0H;
MOVFUC,#0;计数器清0
SJMPRETT;
KEY1:
ACALLADD1;如果是加1按键,调用加1函数
SJMPRETT;
KEY2:
ACALLSUB1;如果是减1按键,调用减1函数
RETT:
RET
、
CHULI1:
MOVR1,#44H;将十进制的时间个十位分开
MOVR0,#41H;
MOVR3,#3;
K4:
MOVA,@R0;取时间
MOVB,#10;分离个十为
DIVAB;
MOV@R1,B;个位保存在以L(SHILFENLMIAOL)结尾的时间变量中
INCR1;
MOV@R1,A;
INCR1;
INCR0;
DJNZR3,K4;
MOVA,FENG;时信息更新,保证不大于23
CJNEA,#60,RET5;
MOVFENG,#0;
RET5:
RET;
CHULI:
MOVR1,#30H;
MOVR0,#37H;
MOVR3,#3;
K5:
MOVA,@R0;
MOVB,#10;
DIVAB;
MOV@R1,B;
INCR1;
MOV@R1,A;
INCR1;
INCR0;
DJNZR3,K4;
MOVA,SHI;
CJNEA,#24,RET4;
MOVSHI,#0;
RET4:
RET
ADD1:
MOVA,FUC;
CJNEA,#3,AD0;
MOVR0,#39H;时存放的地址
MOVA,@R0;取时,看是否满23
CJNEA,#23,AD1;
MOV@R0,#0;如果满了23,就清0
SJMPRET0
AD0:
MOVA,#36H;不是给时加1
ADDA,FUC;
MOVR0,A;取出要加数的地址
MOVA,@R0;
CJNEA,#59,AD1;是否加到59了
MOV@R0,#0;加到了59就清0
SJMPRET0
AD1:
INC@R0;时没有加到23,其他的没有加到59时,加1
RET0:
RET
SUB1:
MOVA,FUC
CJNEA,#3,SU0
MOVR0,#39H
MOVA,@R0
CJNEA,#0,SU1
MOV@R0,#23
SJMPRET1
SU0:
MOVA,#36H
ADDA,FUC
MOVR0,A
MOVA,@R0
CJNEA,#0,SU1
MOV@R0,#59
SJMPRET1
SU1:
DEC@R0
RET1:
RET
DISP:
MOVR3,#20
DI0:
MOVR0,#35H
MOVR4,#6
MOVR5,#01H
DI1:
MOVA,@R0
MOVCA,@A+DPTR
MOVP0,A
MOVA,R5
MOVP1,A
RLA
MOVR5,A
DECR0
ACALLDELAY
MOVP1,#00H
DJNZR4,DI1
DJNZR3,DI0
RET
DISP1:
MOVR3,#5
DI01:
MOVR0,#49H
MOVR4,#6
MOVR5,#01H
DI11:
MOVA,@R0
MOVCA,@A+DPTR
MOVP0,A
MOVA,R5
MOVP1,A
RLA
MOVR5,A
DECR0
ACALLDELAY
MOVP1,#00H
DJNZR4,DI11
DJNZR3,DI01
RET
TIME1:
MOVTH1,#0D8H;置初值(10MS)0.01S
MOVTL1,#0F0H
INCSECOND1;
MOVA,SECOND1;
CJNEA,#100,RET2;看是否满100个10ms
MOVSECOND1,#0;满100个秒,秒清0
INCSECOND2;秒加1
MOVA,SECOND2;是否满60秒
CJNEA,#60,RET2;
MOVSECOND2,#0
INCFENG
MOVA,FENG;分钟加1
RET2:
RETI
TIME0:
MOVTH0,#3CH
MOVTL0,#0B0H;重置初值
DJNZR2,RET3;是否满1秒
MOVR2,#20;秒钟加1
INCMIAO;
MOVA,MIAO;
CJNEA,#60,RET3;看是否满60秒
MOVMIAO,#0;满60秒,秒清0
INCFEN;分钟加1
MOVA,FEN;是否满60分
CJNEA,#60,RET3;
MOVFEN,#0;满60分
INCSHI;时钟加1
MOVA,SHI;
CJNEA,#24,RET3;时钟是否满24
MOVSHI,#0;满24,时钟清0
RET3:
RETI
DELAY:
MOVR6,#5
D0:
MOVR7,#245
DJNZR7,$
DJNZR6,D0
RET
TAB:
DB0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H
DB90H,88H,83H,0c6H,0a1H,86H,8eH,0ffH;共阳编码表