07汽电一08年上学期学生成绩! 07运八08年上学期学生成绩!
发新话题
打印

单片机课程设计_秒表的设计程序

单片机课程设计_秒表的设计程序

;开机初始化
      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

TOP

发新话题
本社区内所有文章为会员所发布,会员拥有该内容的所有权力及责任,转载时请注明出处! ! 管理员 冷雨 QQ:414195205
拒绝任何人以任何形式在本社区发表与中华人民共和国法律相抵触的言论!
同一个世界 同一个梦想 One World One Dream