单片机课程设计 马拉松比赛计时器设计.docx
《单片机课程设计 马拉松比赛计时器设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计 马拉松比赛计时器设计.docx(12页珍藏版)》请在冰豆网上搜索。
![单片机课程设计 马拉松比赛计时器设计.docx](https://file1.bdocx.com/fileroot1/2023-2/1/f10cb36e-6035-44ca-8c48-84d38d36c2d6/f10cb36e-6035-44ca-8c48-84d38d36c2d61.gif)
单片机课程设计马拉松比赛计时器设计
马拉松比赛计时器设计
一.设计目的
※掌握单片机定时器/计数器的使用方法
※掌握单片机中断服务程序的应用
※熟悉单片机外围数码管显示电路的设计方法
二.相关知识
1.定时器/计数器
定时器/计数器简称定时器,其作用主要用于产生各种时间间隔,记录外部脉冲与事件的数量等,是微机中最常用的部件之一。
89c51单片机有2个16位的定时器/计数器O(TO)和定时器1(T1)。
TO由2个定时寄存器THO和TLO构成,T1则由TH1和TL1构成,他们都分别映射在特殊功能计数器中,从而可以通过对特殊功能寄存器的读/写来实现对这两个定时器的操作。
作为定时器。
每个机器周期定时寄存器自动加1.,所以定时器也可看成是计量机器周期的计数器。
由于每个机器周帏12个时钟振荡周期,所以定时的分辨率是时钟振荡频率的1/12。
作为计数器,只要在单片机外部引脚TO(TI)有从1到0电平的负跳变,计数器就自动加1。
计数的最高频率一般为振荡频率的1/24,例如,选用12MHz
晶振,则最高技术频率为0.5MHz。
2.中端系统
当中央处理器CPU正在执行某程序时,由于某种原因,外界向CPU发出暂停目前工作去处理更重要事情的请求,程序被打断;CPU响应改请求并转入响应的处理程序,处理程序完成以后,再返回原来程序被打断的位置,继续原来的工作,这一过程成为中断。
实现中断功能的部件称为中断系统,或者称为中断控制逻辑系统。
89c52单片机的中断系统简单实用。
其基本特点是:
有6个固定的可屏蔽中断源,4个在片内,2个在片外,他们在程序存储器中各有固定的中断入口地址,由此进入中断服务程序;6个中断源有两个优先级,可形成中断嵌套;2个特殊功能寄存器用于中断控制和条件设置的编程。
若某个中断源通过编程设置,处于被打开的状态,并满足中断响应的条件,而且满足如下3个条件时,单片机响应此中断:
●当前正在执行的那条指令已被执行完。
●不在操作IE,IP中断控制寄存器或执行RETI中断指令
在正常的情况下,从中断请求信号有效开始,到中断得到响应,通常需要3个机器周期到8个机器中期
终端的到响应后,自动清除中断请求标志(对串行I/O端口的中断标志,要用软件清除),将断点即计数器之值(PC)压入堆栈(已被灰复用);然后把相应的中断入口地址装入PC,使程序转入相应的中断服务程序中去执行。
各个中断源在程序存储器中的中断入口地址如表1-1所示
表1-189c52单片机中断入口地址表
中断源
入口地址
INTO(外部中断0)
0003H
TFO(TO中断)
000BH
INT1(外部中断1)
0013H
TF1(T1中断)
001BH
RI/TI(串行口中断)
0023H
TF2(T2中断)
002BH
各个中断入口地址相隔很近,不便于存放各个较长的中断服务程序,故通常将中断服务程序存放在另外方便存放的地方,而在中断入口地址开始的二三个单元中,安排一条转移类指令,以转入中方端服务程序。
由于6个中断源各有其中断请求标志IEO,TFO,IE1,RI/TI以及TF2,在中断源满足中断请求的条件下,个标志自动加1,向CPU请求中断。
如果某个中断源提出中断请求后,CPU不能立即响应,只要该中断请求标志不被软件人为清除,中断请求的状态就将一直保持,直到CPU响应此中断为止。
对串行口中断而言,这一过程与其他五个中断的不同之处在于,及时CPU响应了中断,其中断标志RI/TI也不会自动清零,必须在中断服务程序中设置清除RI/TI的指令后,才有可能再一次提出中断请求。
CPU的现场保护和恢复必须有由被响应的中断服务程序去执行,当执行RI/TI中断返回指令后,断点值自动从栈顶2字节弹出并装入PC寄存器,使CPU继续执行被打断的程序。
三.设计任务
利用单片机内部定时器TO实现时、分、秒计时且在6个数码管上同时显示时、分、秒计时时间,并能通过按键对时间进行重新设置
四.设计方案
1,.系统硬件电路设计
系统硬件电路设计原理图1-1所示
图1-1计时电路结构框图
图1-1
2系统软件设计
(1)主程序(START)
在主程序中只完成系统的初始化,同时进行时分秒按键的扫描。
如果有按键按下,则做相应时分秒计数数据的加1处理。
主程序执行流程图按图1-2所示
(2)定时器中端服务程序(TIMERO)
定时器TO用于时间计时。
定时计数个数为5000,由于采用12MHz晶体振荡器,所以定时溢出中断周期为5000微秒=5毫秒。
为了保证计时的准确性,进入中断服务程序时应立即重设计数初始值。
在中断程序中还要判断是否计时1s,若是,还应通过调用其他子程序作时分秒值的相应处理。
(3)显示子程序(DISP)
该子程序通过在中断服务程序中被调用而执行。
每一次中断程序调用一次,其作用是根据扫描指针循环驱动各个数码管。
(4)时钟调整子程序(CLK_CHANGE)
当中断程序中判断出计时1s时,该程序即被调用执行。
其作用为将秒的计数初值加1,同时判断是否应对十分作相应的修改。
(5)数据转换子程序(COVERT)
当中断程序中判断出计时1s时,该程序及被调用执行。
由于时分秒的计数值分别保存在一个字节里,而每一个计数值实际是一个2位的十进制数。
在驱动显示时必须将这个2位数拆开以分别去扫描个位和十位,该子程序就是完成这个的,并把拆分结果存储在从20H开始的显示寄存器单元里。
(6)延时子程序(DELAY)
用于键盘的延时去斗
五.程序清单
ORG0000H;复位起始地址
AJMPSTART;跳转至主程序
ORG000BH;TIMERO中断矢量地址
AJMPTIMERO;跳转至TO中断子程序TIMERO
START:
MOVSO,#6FH;设置堆栈从6FH开始
MOV30H,#00H;显示位码寄存器处置为00
MOV2AH,#00H;“时”寄存器初值为00H
MOV2BH,#00H;“分”寄存器初值为00H
MOV2CH,#00H;“秒”寄存器初值为000H
MOVTMOD,#01H;设TO为工作方式1,即16位定时
;器
MOVTHO,#OECH;计时器计时中断时间为5000微秒
MOVTLO,78H
MOVIE,#82H;TO中断使能总的中断使能
MOVR4,#200;5000微秒中断200次,实现计时
;1s功能
SETBTRO;启动定时器TO
;LOOP段为主程序中用于循环地扫描按键以检测外界输入对时分秒的设置和修改
LOOP:
JBP0.0,NEXT2;P0.0(秒值修改键)是否被按下?
;不是,则跳至NEXT2检查po.1
ACALLDELAY;去抖动
JBPO.O,NEXT2;PO.O;PO.O(秒值修改键)不是真正被
;按下则跳转至NEXT2检查PO.1
MAIN:
JNBPO.O,NEXT1;PO.0(秒值修改键)是否放开?
MOVA,2CH;将秒寄存器的值放入A
ADDA#01;A的内容加1
DAA;十进制调整
MOV2CH,A;将A的值放回秒寄存器
CJNEA,#60H,NEXT2;是否等于60秒?
不是,则跳至
;NEXT2
MOV2CH,#00;是则重新设置秒寄存器的值为
;00
NEXT2:
JBPO.1,NEXT4;PO.1(分值修改键)是否被按下?
;不是则跳至NEXT4检查PO.2
ACALLDELAY;去抖动
JBPO.1,NEXT4;PO.1(分值修改键)不是真正被
;按下,则跳转至NEXT4检查
;PO.2
NEXT3:
JNBPO.1,NEXT3;(分值修改键)是否已放开?
MOVA,2BH;将分寄存器的值修改,类同秒
;的处理
ADDA,#01;
DAA
MOV2BH,A
CJNEA,#60H,NEXT4;是否等于60分?
不是,则跳
;转至;NEXT4
MOV2BH,#00;是,则重新设置分寄存器的
;值为00
NEXT4:
JBPO.2,LOOP;PO.2(时值修改键)是否被按
;下?
不是,;则跳转至LOOP
ACALLDELAY;去抖动
JBPO.2,LOOP;PO.2(时值修改键)不是真正
;被按下,则跳转至LOOP重
;复检查
NEXT5:
JNBPO.2,NEXT5;PO.2(时值修改键)是否已放
;开?
MOVA,2AH;将时寄存器的值修改,类同分
;秒的处理
ADDA,#01H
DAA
MOV2AH,A
CJNE,#24H,LOOP;是否等于24时?
不是,则跳
;至LOOP
MOV2AH,#00;是,则重新设置时寄存器的
;值为00
AJMPLOOP
;TO中断子程序。
每5000微秒中断一次,在该子程序中判断是否1秒计时到,并做相应调
;整和处理(CLK_CHANGE子程序和CONVERT子程序),同时实现每5000微秒的显示
;更新
TIMERO:
MOVTHO,#OECH;重设定时器中断计时5000
;微秒
MOVTLO,#78H
PUSHACC;保留现场的值
PUSHPSW
DJNZR4,TIMLP1;计时1s到否?
不到1s,则
;跳转至;TIMLP1
MOVR4,#200
ACALLCLK_CHANGE;调用计时子程序CLK_CHANGE
ACALLCONVERT;调用数码转换及存储CONVERT
;子程序
TIMLP1:
ACALLDISP;调用显示子程序DISP
POPPSW;恢复现场的值
POPACC
RETI
;DISP子程序实现时分秒计时值在数码管上的输出驱动显示。
每一次调用(相隔5000微秒)
;只驱动显示6个数码管中的一个
DISPMOVA,30H;扫描显示位码载入A
ADDA,#20H;扫描显示位码作为偏移量,
;再加上显示缓冲区首地址
;20H,得待显示数据的实际
MOVR1,A;存入扫描显示位指针R1
MOVA,30H;扫描显示位码载入A
SWAPA;A中低四位交换到高四位(P1
;高四位显示位码,低四位显
;示数据值)
ORLA,@R1;得“显示位码-显示段码“
MOVP1,A;输出至P1显示
INC30H;扫面偏移量指针加1
MOVA,30H
CJNEA,#6,DSPEND;扫描显示完否?
不是,则跳
;至DSPEND
MOV30H,#0;是,则扫描显示位偏移量置
;为0
DSPEND:
RET
;CLK_CHANGE子程序为计时1s到各时分秒数据的处理程序
CLK_CHANGE:
MOVA,2CH;2CH单元为秒寄存器
ADDA,#1;加1秒
DAA;十进制调整
MOV2CH,A;存入秒寄存器
CJNEA,#60,CLKEND;是否超过60秒?
不是,
;则跳至CLKEND
MOV2CH,#00;是,则重设为00
MOVA,2BH;2BH单元为分寄存器,
;其处理类同秒处理
ADDA,#1
DAA
MOVBH,A
CJNEA,#60,CLKEND;是否超过60分?
不是,
;则跳至CLKEND
MOV2BH,#00;是,则重设为00
MOVA,2AH;2AH单元为时寄存器,其
;处理类同秒分处理
ADDA,#1
DAA
MOV2AH,A
CJNEA,#24,CLKEND;是否超过24时?
不是,
;则跳至CLKEND
MOV2AH,#00;是,则重设为00
CLKEND:
RET
;CONVERT子程序实现时分秒计时值转换为BCD码并存储在以20H为起始地址的显示
;输出数据存储在单元里,即显示缓冲区20H至25H单元
CONVERT:
MOVR1,#20;送显示缓冲区首地址值
;到R1指针
MOVA,2CH;将秒寄存器的内容存入
;A
ANLA,#OFH;取秒值的个位,并存入
;20H单元
MOV@R1,A
INCR1;目标地址指针修改
MOVA,2CH;将秒寄存器的内容存入A
ANLA,#0F0H;取秒值的十位,并存入
;21H单元
SWAPA
MOV@R1,A
INCR1;目标地址指针修
;改
MOVA,2BH;分值的处理,类似
;于秒的处理ANLA,#0FH
MOV@R1,A
INCR1
MOVA,2BH
ANLA,#0F0H
SWAPA
MOV@R1。
A
INCR1
MOVA,2AH;时值的处理,类似
;于分秒的处理ANLA,#0FH
MOV@R1,A
INCR1
MOVA,2AH
ANLA,#0F0H
SWAPA
MOV@R1,A
RET
DELAY:
MOVR6,#10;延时约5ms(以
;晶振为12MHz计)
D1:
MOVR7,#250
DJNZR7,$
DJNZR6,D1
RET
END
六.心得体会:
通过本次单片机课程设计的锻炼,让我深刻的了解到了单片机技术在日常生活中所扮演的角色以及其在高科技领域所占有的地位,其次是单片机作为我们生活中比较常见的东西他给我们带来了很多方便,学好单片机不仅仅是对自己科学文化知识的提高,更是对这个世界上更多深奥的东西的爱好,激发了我对一些事物的好奇之心,更是提高了我的积极动手能力和实践能力,充实了我的生活,开阔了我的世界,让我领略了科技的无穷。
虽然本次课程设计都是从网上和图书馆的一些资料上积累的,但是我还是非常开心,因为这是我自己从前辈们的身上学到的知识,感谢我身边在这次设计中给我提供帮助的老师和同学,也感谢提供这些设计材料的人士!
我会在此基础上更加努力学习,为将来的道路造一盏指明灯!
七.参考文献
①《片机系统设计与实践》主编:
汪道辉
出版地:
北京
出版社:
电子工业出版社
出版日期:
2006年5月
②《单片机应用系统设计技术》主编:
张齐朱宁西
出版地:
北京
出版社:
电子工业出版社
出版日期:
2009年1月
目录
一.设计目的2
二.相关知识2
1.定时器/计数器2
2.中端系统3
三.设计任务4
四.设计方案4
1,.系统硬件电路设计4
2系统软件设计5
(1)主程序(START)5
(2)定时器中端服务程序(TIMERO)5
(3)显示子程序(DISP)6
(4)时钟调整子程序(CLK_CHANGE)6
(5)数据转换子程序(COVERT)6
(6)延时子程序(DELAY)6
五.程序清单6
六.心得体会:
10
七.参考文献10