专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

单片机秒表课程设计

作者:佚名   来源:本站原创   点击数:  更新时间:2007年06月28日   【字体:

一、实验题目
秒表系统设计——用AT89C51设计一个2位LED数码显示“秒表”,显示时间为00~99秒,每秒自动加一。另设计一个“开始”按键和一个“复位”按键。
二、增加功能
增加一个“暂停”按键和一个“快加”按键(每10ms快速加一)
三、实验内容提要
    本实验利用单片机的定时器/计数器定时和记数的原理,结合dvcc实验箱上的集成电路芯片8032、LED数码管以及实验箱上的按键来设计计时器。将软、硬件有机地结合起来,使得系统能够正确地进行计时,数码管能够正确地显示时间。其中本实验设计了四个开关按键:其中一个按键按下去时以1秒加一开始计时,即秒表开始键(本实验中当开关从1变为0时开始计时),另一个按键按下去时暂停计时,使秒表停留在原先的计时(本实验中当相应开关从1变为0时即停止计时),第三个按键按下去时清0(本实验中当相应开关从1变为0时即停止计时),第四按键按下去则是以每10ms秒快速加一计时(本实验中当开关从1变为0时开始计时)。本实验中开始时都要使各按键回到各初始位置,即都处于1状态。
三、实验目的
   1、 通过本次课程设计加深对单片机课程的全面认识复习和掌握,对单片机课程的应用进一步的了解。
   2、 掌握定时器、外部中断的设置和编程原理。
   3、 通过此次课程设计能够将单片机软硬件结合起来,对程序进行编辑,校验。
四、意义
   该实验通过单片机的定时器/计数器定时和计数原理,设计简单的计时器系统,拥有正确的计时、暂停、清零、快加功能,并同时可以用数码管显示,在现实生活中应用广泛,具有现实意义。
五、本人所做工作
根据相关的单片机材料,利用所学的单片机知识,结合DVCC系列单片机微机仿真实验系统中的软件和硬件(集成电路芯片8032,七段数码管,开关电路及时钟信号电路,按键等),编写能够实现该项目的软件程序,最后将软、硬件有机的结合起来,进行有效的调试,达到完成该实验课程设计的目的要求。
六、实验内容
用AT89C51设计一个2位LED数码显示“秒表”,显示时间为00~99秒,每秒自动加一。另设计一个“开始”按键和一个“复位”按键。再增加一个“暂停”按键和一个“快加”按键(每10ms快速加一)。
按键说明:按“开始”按键,开始计数,数码管显示从00开始每秒自动加一;按“复位”按键,系统清零,数码管显示00;按“暂停”按键,系统暂停计数,数码管显示当时的计数;按“快加”按键,系统每10ms快速加一,即数码显示管在原先的计数上快速加一。
七、设计思路及描述
该实验要求进行计时并在数码管上显示时间,则可利用DVCC系列单片机微机仿真实验系统中的芯片8032(芯片的功能类似于芯片AT89C51,其管脚功能也和AT89C51的管脚功能类似)中的P3.2管脚做为外部中断0的入口地址,并实现“开始”按键的功能;将P3.3做为外部中断1的入口地址,并实现“清零”按键的功能;将P3.0做为数据信号DATA输入的入口地址;将P3.1做为时钟信号CLK输入的入口地址。定时器T0作为每秒加一的定时器;定时器T1作为“快加”键的定时器。其中“开始”按键当开关由1拨向0(由上向下拨)时开始计时;“清零”按键当开关由1拨向0(由上向下拨)时数码管清零,此时若再拨“开始”按键则又可重新开始计时。
八、原理图
 

 

 

 

 

十、实验程序
;******************************************************************
; 设计选题:实验五-----秒表系统设计
; 描述:    2位LED数码显示"秒表",显示时间为00~99秒,每秒自动加1,
;         一个"开始"键,一个"复位"键,一个"暂停"键,一个“快加”键。
; 调用子程序:暂停键子程序,计时键子程序,清0键子程序,加一子程序
;            显示子程序,定时子程序
;所用特殊寄存器:寄存器A,寄存器C
;所用中断:外部中断INT0、INT1,定时器T0、T1
; 实验作者:  吴呤--2号,方晓瑛--10号
;***************************************************************************
    org 0000h
    ajmp main          ;主程序入口地址
    org 0003h
    ajmp zhongduan0    ;中断0入口地址
    org 000bh
    ajmp yanshi        ;定时器T0入口地址
    org 0013h
    ajmp zhongduan1    ;中断1入口地址
    org 001bh
   ajmp dingshi1       ;定时器T1入口地址
    org 0030h
;***********************************************************
;   主程序
;***********************************************************
main: mov tcon,#05h     ;主程序开始 外部中断跳变模式
       mov tmod,#11h     ;定时器0,1模式1
       mov ie,#8fh       ;开总中断,中断0,1,定时器0,1
       mov dptr,#tab
       mov r1,#00h
       mov r2,#00h
       mov r3,#40          ;循环次数40
       mov tl0,#2Ch         ;置初值,定时25MS
       mov th0,#0CFh
       mov tl1,#78h         ;置初值,定时10MS
       mov th1,#0ech
       clr tr0              ;关定时器
       clr tr1
;***********************************************************
;    暂停键K3,快加键K4程序
;***********************************************************
here:jb p1.0,here
show:clr tr1
     clr tr0
     acall xianshi
kuaijia:jb p1.2,kuaijia  ;等待P1.2为0 快加
        clr tr0
        setb tr1
here3:jnb p1.2,here3
     ajmp  here
;***********************************************************
;   外部中断INT0子程序-----计时按键K1子程序
;***********************************************************
zhongduan0: setb tr0        ;计时按键
      reti
;***********************************************************
;   外部中断INT1子程序----复位按键K2子程序
;***********************************************************
zhongduan1:clr tr0          ;复位按键
      clr tr1
      mov 12h,#00h
      mov 11h,#00h
      acall xianshi          ;调用显示子程序
      mov r1,#00h
      mov r2,#00h
      reti
;***********************************************************
;   加一子程序
;***********************************************************
jia1: inc  r1                ;加1子程序
      cjne r1,#0ah ,loop     ;判断是否到表尾
      mov  r1,#00h
      inc  r2
      cjne r2,#0ah,loop
      mov  r2,#00h
loop: mov 12h,r1             ;重新赋值
      mov 11h,r2
      ret
;***********************************************************
;   显示子程序
;***********************************************************
xianshi:mov r7,#02h          ;2个数码管显示子程序
     mov r0,#12h
loop5: mov r6,#08h            ;8位2进制数
       mov a,@r0
       movc a,@a+dptr
loop6:rlc a                   ;循环左移
       clr p3.1
      mov p3.0,c
      setb p3.1
      djnz r6,loop6
      dec r0
      djnz r7,loop5
      ret
;***********************************************************
;   定时器T0子程序
;***********************************************************
yanshi: mov tl0,#2Ch           ;定时子程序
       mov th0,#0CFh
       djnz r3,loop7
       acall jia1              ;调用加1子程序
       acall xianshi           ;调用显示子程序
       mov r3,#40
loop7: reti
;***********************************************************
;定时器T1子程序
;***********************************************************
 dingshi1:mov tl1,#78h         ;置初值,定时10MS
     mov th1,#0ech
     clr tr0
     setb tr1
     mov 12h,r1
     mov 11h,r2
     jnb p1.0,show
     acall jia1
     acall xianshi
lop7:reti
;***********************************************************
tab:db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
   end
 
十一、课程设计心得体会
1、 认真审题,看懂题目的要求!选择适当的课题,不益太简单或者太难。做到既能把课题完成又能锻炼自己的能力!
2、 根据课题要求,复习相关的知识,查询相关的资料。
3、 根据实验条件,找到适合的方案,找到需要的元器件及工具,准备实验。
4、 根据课程设计的要求和自己所要增加的功能写好程序流程图,在程序流程图的基础上,根据芯片的功能写出相应的程序。然后再进行程序调试和相应的修改,以达到能够实现所要求的功能的目的。
5、 还要根据实验的实际情况,添加些额外程序来使系统更加的稳定,如开关的消震荡(采用延迟)。
6、 程序要尽量做到由各个子程序组成,在有些程序后面最好加注释,这样在程序出错的检查过程中可以更容易查找的到,也更简洁,更明白易懂。
7、 该实验的程序可以参考DVCC系列单片机微机仿真实验系统实验指导书中的串并转换实验,也可自己根据自己熟悉的方法来编程。
8、 在设计控制开关时,注意2个中断的打开和关闭的先后顺序,否则就会出错。
9、 这次的单片机课程设计重点是理论与实际的相结合。不再只读书了。
10、 该设计从头到尾都要自己参与,熟悉了对整个设计的过程,更系统的锻炼了自己。

此设计完毕!!

-------------------------------------------------------
下面提供一个程序(供参考的)
;开机初始化
      MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入
      MOV P0,#0FFH;使显示时间数码管熄灭
      CLR F0
CLR F1
MOV DPTR,#NUMTAB ;指定查表启始地址
;等待按键输入
;根据按键的输入判断执行什么功能

;按键1按下则执行功能1
MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入
        MOV P0,#0FFH;使显示时间数码管熄灭
START:JB P3.6,START1;循环判断开始按钮K1是否按下?
      ACALL DELAY10;延时10毫秒触点消抖
      JB P3.6,START;如果是干扰就返回
      JNB P3.6,$;等待按键松开
      LJMP GN1     

;按键2按下则执行功能2

START1: JB P3.7,START;循环判断开始按钮K2是否按下? 
        ACALL DELAY10;延时10毫秒触点消抖
        JB P3.7,START1;如果是干扰就返回
        JNB P3.7,$
        LJMP GN2

;数码管显示秒表时间的程序
GN1:    ;先初始化
    S1:MOV A,#0
        MOV TEMP,A 
GOON1:  MOV R2,#2
JS1:     MOV R3,#250
TIME1:  MOV A,TEMP ;将TEMP中的十六进制数转换成10进制
        MOV B,#10 ;10进制/10=10进制
        DIV AB
        MOV B_BIT,A ;十位在A
        MOV A_BIT,B ;个位在B

       LCALL DPLOP1

        ;插入一段判断定时过程中是否有按键输入的程序段
C1:     JB P3.6,B1
        ACALL DELAY10;延时10毫秒消抖
        JB P3.6,C1
        JNB P3.6,$;等待按键松开
        CPL F0
ZT1:   ; MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入
        JB P3.6,$;循环判断开始按钮K1是否按下?
        ACALL DELAY10;延时10毫秒触点消抖
        JB P3.6,ZT1;如果是干扰就返回
        JNB P3.6,$;等待按键松开
        LCALL DPLOP1
             
B1:     JB P3.7,LOOP1
ACALL DELAY10;延时10毫秒消抖
JB P3.7,B1
JNB P3.7,$;等待按键松开
AJMP OVER

LOOP1:   DJNZ R3,TIME1 ;2毫秒循环执行250次,时间约0.5秒
DJNZ R2,JS1       ;循环执行2次,时间为1 秒钟

INC TEMP;满一秒钟对时间加1
MOV A,TEMP
CLR C
SUBB A,#60
JNZ GOON1;判断TEMP的数值是否为60?不为60循环
ACALL OVER
RET


GN2:     MOV A,#14H ; 设定倒计时的时间20S
         MOV TEMP,A

;数码管显示倒计时时间的程序
  ;初始化
        MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入
        MOV P0,#14H;使显示时间为设定的倒计时时间

GOON2:  MOV R2,#2
JS2:      MOV R3,#250
TIME2:   MOV A,TEMP ;将TEMP中的十六进制数转换成10进制
         MOV B,#10 ;10进制/10=10进制
         DIV AB
         MOV B_BIT,A ;十位在A
         MOV A_BIT,B ;个位在B

        MOV DPTR,#NUMTAB ;指定查表启始地址
DPLOP2: MOV A,A_BIT ;取个位数
        MOVC A,@A+DPTR ;查个位数的7段代码
        MOV P0,A ;送出个位的7段代码
        
        CLR P2.5 ;开个位显示
        ACALL   DELY1;显示1毫秒
        SETB P2.5;关闭个位显示,防止鬼影
        MOV A,B_BIT ;取十位数
        MOVC A,@A+DPTR ;查十位数的7段代码                                       
        MOV P0,A ;送出十位的7段代码                                                                                                                                                             
        CLR P2.6 ;开十位显示
        ACALL DELY1;显示1毫秒
        SETB P2.6;关闭十位显示,防止鬼影

        ;插入一段判断定时过程中是否有按键输入的程序段
C2:     JB P3.6,B2
        ACALL DELAY10;延时10毫秒消抖
        JB P3.6,C2
        JNB P3.6,$;等待按键松开
       
ZT2:    MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入
        JB P3.6,$;循环判断开始按钮K1是否按下?
        ACALL DELAY10;延时10毫秒触点消抖
        JB P3.6,ZT2;如果是干扰就返回
        JNB P3.6,$;等待按键松开
             
B2:     JB P3.7,LOOP2
ACALL DELAY10;延时10毫秒消抖
JB P3.7,B1
JNB P3.7,$;等待按键松开
AJMP OVER

LOOP2:   DJNZ R3,TIME2 ;2毫秒循环执行250次,时间约0.5秒
DJNZ R2,JS2      ;循环执行2次,时间为1 秒钟

DEC TEMP;满一秒钟对时间减1
MOV A,TEMP
JNZ GOON2;判断TEMP的数值是否为0?不为0循环
ACALL OVER
RET
       

;结束定时
OVER:  AJMP START;退到开机初始化状态

;1毫秒延时子程序
DELY1:  MOV R4,#2
D1:MOV R5,#248
DJNZ R5,$
DJNZ R4,D1
RET

;10毫秒延时子程序
DELAY10: MOV R4,#20
D2:MOV R5,#248
DJNZ R5,$
DJNZ R4,D2
RET

;实验板上的两位一体的数码管0~9各数字的显示代码
NUMTAB:  DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H
DPLOP1:  MOV A,A_BIT ;取个位数
        MOVC A,@A+DPTR ;查个位数的7段代码
        MOV P0,A ;送出个位的7段代码
       
        CLR P2.5 ;开个位显示
        ACALL   DELY1;显示1毫秒
        SETB P2.5;关闭个位显示,防止鬼影
        MOV A,B_BIT ;取十位数
        MOVC A,@A+DPTR ;查十位数的7段代码
        MOV P0,A ;送出十位的7段代码
        CLR P2.6 ;开十位显示
        ACALL DELY1;显示1毫秒
        SETB P2.6;关闭十位显示,防止鬼影
RET
END

关闭窗口