⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 计时.txt

📁 基于C51的多用计时器
💻 TXT
📖 第 1 页 / 共 2 页
字号:
************初始化**************
ORG  0000H
LJMP  MAIN
ORG  000BH
LJMP  INTT0
KEYB  EQU 08H               ;键盘值存储
NAOB  EQU 09H               ;闹钟单元标识
MENUB EQU 0AH               ;菜单显示存储标识
First EQU 0BH               ;显示缓冲单元
Second EQU 0CH
Third EQU 0DH
Fourth EQU 0EH
Fifth EQU 0FH
HOUR EQU 10H                ;时钟单元
MIN EQU 11H
SEC EQU 12H
MSEC EQU 13H 
ANJIANB EQU 14H             ;存储按键位
QUEDB EQU 15H               ;菜单级存储

BI bit 00                   ;去抖动标识 
KAIJIB bit 01               ;开机标识
MB bit 02                   ;菜单标识
NB bit 03                   ;闹钟启动标识
SI bit 04                   ;“-”闪烁标识
SB bit 05                   ;调分标识
HB bit 06                   ;调时间闪烁标识
PB bit 07                   ;秒表标识
UI bit 08                   ;查询闹钟标识
************主程序MAIN***************
MAIN:
MOV  SP,#70H                ;初始化
MOV  KEYB,#0FFH
MOV  QUEDB,#00H
CLR  BI
CLR  KAIJIB
CLR  SI
CLR  MB
CLR  HB
CLR  PB
 CLR  UI
       MOV  R1,#0BH                ;显示缓存单元清空
XX1:
 MOV  @R1,#11H
       INC  R1
       CJNE  R1,#10H,XX1
MOV  R1,#10H                ;时钟单元初始化,设为“00-00”
XX2:     
MOV  @R1,#00H          
 INC  R1
CJNE R1,#14H,XX2
        MOV  16H,#11H               ;调时闪烁转换单元初始化
        MOV  17H,#11H
MOV  30H,#02H               ;预置菜单显示,调时菜单为“ZHONG”
MOV  31H,#12H
MOV  32H,#00H
MOV  33H,#14H           
MOV  34H,#09H
MOV  35H,#11H               ;设置闹钟菜单为“ NAO ”
MOV  36H,#14H
         MOV  37H,#0AH
MOV  38H,#00H            
MOV  39H,#11H
MOV  3AH,#11H               ;取消闹钟菜单为“ DEL ”
        MOV  3BH,#0DH
         MOV  3CH,#0EH
MOV  3DH,#13H              
MOV  3EH,#11H
MOV  3FH,#11H               ;秒表菜单为“ SEC ”
MOV  40H,#05H           
MOV  41H,#0EH
MOV  42H,#0CH
MOV  43H,#11H
MOV  R0,#50H                ;闹钟存储单元初始化
MOV  R1,#14H
GG:    
MOV  @R0,#0FFH
INC  R0
DJNZ  R1,GG
MOV  P1,#0FFH               ;P1口初始化
MOV  TMOD,#01H              ;定时器初始化
MOV  TL0,#0F0H
MOV  TH0,#0D8H
       MOV  R6,#02H                ;0.5秒计时两次
KAI:    
LCALL  START                ;等待第一次开机
JNB  KAIJIB,KAI
SETB  EA                    ;启动定时器,开启中断
SETB  ET0
SETB  TR0
BEGIN:
JB  KAIJIB,BEGIN1           ;选择显示类型,关机态为黑屏
BEGIN0:
LCALL  PLAY
SJMP  CAIJIAN
BEGIN1:
JNB  MB,BEGIN2              ;菜单态为相应的菜单显示
SJMP  BEGIN0
BEGIN2:
LCALL  DISPLAY              ;否则显示时钟 
CAIJIAN:
JB  BI,PANNAO               ;判断KEYB有无按键值
       MOV  A,KEYB 
       SUBB  A,#0FFH
       JZ  PANNAO                  ;没有跳到闹钟判断
       LCALL  KEY                  ;有调键盘处理子程序
PANNAO: 
       JNB  UI,BACK1               ;到一分,进行闹钟检测,看有无
       MOV  R0,#50H                ;闹钟到时
TT0:   
           MOV  R1,#14H
       MOV  A,@R0
       CJNE  A,HOUR,TT1
       INC  R0
       MOV  A,@R0
       CJNE  A,MIN,TT2
       SETB  NB
       MOV  NAOB,R0 
       CLR  UI
       LCALL  NAOZHONG             ;有,清UI调闹钟提示音
       LJMP  BACK1                 
TT1:
       INC  R0
TT2:      
INC  R0
       DJNZ  R1,TT0               
       CLR  UI                     ;没有,清UI返回显示
BACK1:
     SJMP  BEGIN
**************TO中断INTT0****************
INTT0:    
       PUSH  PSW                   ;保护现场
       PUSH  ACC 
       CLR  TR0                    ;关定时器
       MOV  A,#0F0H                ;定时器重新赋值,并加中断后又计
       ADD  A,TL0                  ;的值
       MOV  TL0,A
       MOV  A,#0D8H
       ADD  A,TH0
       MOV  TH0,A
       SETB  TR0
       MOV  A,P1                   ;查询有无键输入
       ANL  A,#0FFH
       JB  BI,YBI                  ;判断是否为去抖动
       MOV  KEYB,A                
       SUBB  A,#0FFH               ;判断是否有键输入
       JZ  JIAYI                   ;没键,转JIAYI
       SETB  BI                    ;有键,不是去抖,设BI下次去抖动
       SJMP  JIAYI
YBI: 
       CJNE  A,KEYB,WKEYB          ;有键,是去抖,去抖动,有按键就  
       CLR  BI                     ;存入KEYB
       SJMP  JIAYI
WKEYB:
       MOV  KEYB,#0FFH              
       CLR  BI
JIAYI:
       INC  MSEC                   ;毫秒位加一
       MOV  A,MSEC
       CJNE  A,#32H,BACK2          ;是否到0.5s,没到中断返回
       MOV  MSEC,#00H              ;毫秒单元清零,
       MOV  A,QUEDB                ;是否为调时菜单
       CJNE  A,#01H,JJ
       CPL  HB
       LCALL  HUANWEI              ;是,闪烁调整位
JJ:      
DJNZ  R6,BACK2              ;是否到一秒,没到中断退出
       MOV  R6,#02H                    
       JNB  PB,TT                  ;到1秒,判断秒表是否开启
       INC  0FH                    ;开启就加1计时
       MOV  A,0FH
       CJNE  A,#0AH,TT
       MOV  0FH,#00H
       INC  0EH
       MOV  A,0EH
       CJNE  A,#06H,TT
       MOV  0EH,#00H
       INC  0CH
       MOV  A,0CH
       CJNE  A,#0AH,TT
       MOV  0CH,#00H
       INC  0BH
       MOV  A,0BH
       CJNE  A,#06H,TT             ;秒表加满,显示“ FULL”,退出秒表
       MOV  0BH,#11H              
       MOV  0CH,#0FH
       MOV  0DH,#15H
       MOV  0EH,#13H
       MOV  0FH,#13H
       LCALL  DL2S
       CLR  PB
       CLR  MB
TT:      
       MOV  MSEC,#00H                   
       CPL  SI                     ;闪烁标识取反
       INC  SEC                    ;秒单元加1
       MOV  A,SEC                  ;是否到60秒,否中断返回
       CJNE  A,#3CH,BACK2
       MOV  SEC,#00H               ;是,秒单元清1
       SETB  UI                    ;设闹钟查询标识 
       INC  MIN                    ;分单元加1
       MOV  A,MIN                  ;是否到60分,否中断返回
       CJNE  A,#3CH,BACK2
       MOV   MIN,#00H              ;是,分单元清0
       INC   HOUR                  ;小时单元加1
       MOV   A,HOUR                ;是否到24小时,否中断返回
       CJNE   A,#18H,BACK2
       MOV   HOUR,#00H             ;是,小时单元清0BACK2:
       POP   ACC                   ;恢复现场
       POP   PSW
       RETI
*************开机START************
START:
       JB  P1.3,BACK0              ;是否是开机键,否返回
       LCALL  DL2S                 ;是,延时2秒
       JB  P1.3,BACK0              ;是否还按着开机键,否返回
PD1:      
       LCALL  PLAY                 ;是,松开按键调开机画面
       JNB  P1.3,PD1                 
       SETB  KAIJIB                ;设开机位为1
       MOV  0BH,#12H               ;开机画面“HELLO”显示两秒
       MOV  0CH,#0EH
       MOV  0DH,#13H
       MOV  0EH,#13H
       MOV  0FH,#00H
       LCALL  DL2S
BACK0:  
RET
*************关机CLOSE**************
CLOSE:
       JB  P1.3,BACK4              ;是否为关机键,否返回
       LCALL  DL2S                 ;是,延时两秒
       JB  P1.3,BACK4              ;是否还按着关机键,否返回
PD2:        
LCALL  DISPLAY              ;是,松开按键调关机显示
       JNB  P1.3,PD2
       CLR  KAIJIB                 ;清开机标识
       MOV  0BH,#11H               ;关机显示“ BYE ”显示两秒
       MOV  0CH,#0BH
       MOV  0DH,#04H
       MOV  0EH,#0EH
       MOV  0FH,#11H
       LCALL  DL2S
       MOV  R1,#0BH                ;显示缓存置黑屏值
HEIPING:
       MOV  @R1,#11H
       INC  R1
       MOV  A,R1
       CJNE  A,#10H,HEIPING
BACK4:  
RET
****************时钟显示DISPLAY*****************
DISPLAY:
       MOV  R0,#HOUR               ;时钟单元地址放R0
DISPLAY1:
       MOV  R1,#0BH                ;显示缓存单元地址放R1
DIS:
       MOV  A,@R0                  ;时钟数值转为BCD码放显示缓存单元
       MOV  B,#0AH
       DIV  AB
       MOV  @R1,A
       MOV  A,B
       INC  R1
       MOV  @R1,A
       INC  R1     
       INC  R1
       INC  R0
       CJNE  R1,#11H,DIS
       JNB  SI,SS                  ;闪烁标识是否为1
       MOV  0DH,#11H               ;是,不显示
       SJMP  PLAY                           
SS:           
MOV  0DH,#10H               ;否,显示“-”
PLAY:
       MOV  R1,#0BH                ;把显示缓存单元动态显示
       MOV  R2,#0FDH
       MOV  A,R2
PLAY1:
       MOV  P2,A
       MOV  A,@R1
       MOV  DPTR,#TAB
       MOVC A,@A+DPTR
       MOV  P0,A
       LCALL  DL1MS
       INC  R1
       MOV  A,R2
       JNB  ACC.5,ENDOUT
       RL  A
       MOV  R2,A
       AJMP  PLAY1
ENDOUT:
       RET
TAB:
DB  88H,0EEH,94H,0C4H0E2H,0C1H,81H,0ECH,80H,0C0H,0A0H, 83H,
99H,86H,91H,0B1H, 0F7H,0FFH,0A2H,09BH,0A8H,08AH
;字段码表
;“0”,“1”,“2”,“3”,“4”,“5”,“6”,“7”,“8”,“9”,“A”,“B”,“C”,“D”,
;“E”,“F”,“-”,“ ”,“H”,“L”,“N”,“U”
***************延时DL1M***************
DL1MS:
       MOV  R4,#14H                ;延时1ms
DL11:                                  ;20*25=500us
MOV  R5,#19H                ;500*2=1ms
DL12:      
DJNZ  R5,DL12
       DJNZ  R4,DL11
       RET
****************延时DL2S*****************
DL2S:      
MOV  R3,#0FAH               ;延时2s
DL21:      LCALL PLAY                  ;显示一次大约4ms
DJNZ  R3,DL21               ;250*4=1s,1000*2=2 s
RET
*************键盘处理KEY************
KEY:
       MOV  ANJIANB,#00H           ;存储按键位初始化
       MOV  R2,#05H                ;判断按键值,看是否只有1个
       MOV  R4,#00H                ;键按下
       CLR  C
       MOV  A,KEYB
KEYTEST:
       RRC  A
       JNC  TEST0
       INC  R4
       SJMP  TEST1
TEST0:
       MOV  ANJIANB,R4             ;判断按的是哪个键
TEST1:
       DJNZ  R2,KEYTEST
       CJNE  R4,#04H,BACK3         ;不是1个,返回
       JB  NB,KK                   ;是1个,判断闹钟是否启动
       JB  KAIJIB,ANJIAN           ;判断是否为开机态,是转ANJIAN
       LCALL  START                ;没开机,判断是否为开机操作
       SJMP   BACK3                ;是开机操作,开机返回,不是也返回
KK:                                    
       LCALL  PLAY                 ;闹钟启动,任意键关闭,返回
       MOV  A,P1
       CJNE  A,#0FFH,KK
       CLR  NB
       SETB  P1.7
       MOV  R0,NAOB
       MOV  @R0,#0FFH
       DEC  R0
       MOV  @R0,#0FFH 
       SJMP  BACK3
ANJIAN:
       JB   MB,ANJIAN0             ;是否为菜单态,否转ANJIAN0
       LCALL  CLOSE                ;否,是否为关机操作
       JNB  KAIJIB,BACK3           ;是关机操作,关机
ANJIAN0:
       MOV  A,ANJIANB               
       CJNE  A,#01H,ANJIAN1        ;是否是功能键,否转ANJIAN1
       LCALL  GONGNENG             ;是,调功能子程序
       LJMP  BACK3
ANJIAN1:
       CJNE  A,#02H,ANJIAN2        ;是否是加一键,否转ANJIAN2
       LCALL  JIAJIAN              ;是,调加一子程序
       LJMP  BACK3
ANJIAN2:
       CJNE  A,#03H,ANJIAN3        ;是否是确定键,否转ANJIAN3
       LCALL  QUEDING              ;是,调确定子程序
       LJMP  BACK3

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -