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

📄 sec.asm

📁 Small RTOS51是为51系列单片机而编写的。它是完全免费的、源代码公开的多任务实时操作系统。它可在无任何外部数据存储器的单片80C51系统上运行
💻 ASM
字号:
;**************************************************
;    平凡单片机工作室
;  http://www.mcustudio.com
;   (c) Copyright 2003 Pingfan's McuStudio
;    All rights Reserved
;sec.asm
;作者:周坚   
;秒钟程序,每到1S,显示值加1,有高位0消隐功能
;本例可用ledkey.dll实验仿真板验证
;如用DSB-1A型单片机实验板将提供相应的程序
;**************************************************
    FIRST   EQU P2.7    ;第一位数码管的位控制
    SECOND  EQU P2.6    ;第二位数码管的位控制
    SEC BIT 00H ;1秒到的标记
    VALUE   EQU 21H ;
    COUNT   EQU 22H ;软件计数器
    COUNTER EQU 20  ;软件计数器的计数值,该值乘以定时器的定时值(50ms),即得到1s的定时值
    ;如果用实验仿真板,可以适当调整该数值,以适应你的电脑速度,以免过份影响实验效果    DISPBUF EQU 5EH ;5E,5FH是显示缓冲区
    TMRVAR  EQU 16857   ;(65536-50000)*12/11.0592 定时器初值
    HIDDEN  EQU 10
    ORG     0000H
    JMP     START
    ORG     0*8+3       ;INT0中断入口
    RETI
    ORG     1*8+3       ;TIMER0中断入口
    JMP     INT_T0      ;转去定时器0中断服务程序入口
    ORG     2*8+3       ;INT1中断入口
    RETI
    ORG     3*8+3       ;TIMER1中断入口
    RETI
    ORG     4*8+3       ;串行中断入口
    RETI
START:
    MOV     SP,#5FH     ;设置堆栈指针初值
    MOV     VALUE,#0    ;秒计数器
    MOV     DISPBUF,#0;
    MOV     DISPBUF+1,#0
    CALL    DISP
    CALL    INIT_T0
    CLR     SEC
    SETB    EA          ;开总中断
LOOP:   
    JBC     SEC,NEXT    ;一秒到,清除一秒到的标志
    CALL    DISP        ;调用显示程序
    JMP     LOOP        ;一秒未到,继续循环
NEXT:   
    MOV     A,VALUE     ;获得秒的数值
    MOV     B,#10   
    DIV     AB          ;二进制转化为十进制,十位和个位分送显示缓冲区
    JZ      NEXT1       ;如果A中值是0,高位0消隐
    JMP     NEXT2       ;否则直接送去显示
NEXT1:  
    MOV     A,#HIDDEN
NEXT2:  
    MOV     DISPBUF,A
    MOV     DISPBUF+1,B ;个位送显示缓冲区
    CALL    DISP    
    JMP     LOOP
;主程序到此结束

DISP:   
    PUSH    ACC         ;ACC入栈
    PUSH    PSW         ;PSW入栈
    MOV     A,DISPBUF   ;取第一个待显示数
    MOV     DPTR,#DISPTAB   
    MOVC    A,@A+DPTR   ;取字形码
    MOV     P0,A        ;将字形码送P0位(段口)
    CLR     FIRST       ;开第一位显示器位口
    LCALL   DELAY       ;延时5毫秒
    SETB    FIRST       ;关闭第一位显示器(开始准备第二位的数据)
    MOV     A,DISPBUF+1 ;取显示缓冲区的第二位
    MOV     DPTR,#DISPTAB
    MOVC    A,@A+DPTR
    MOV     P0,A        ;将第二个字形码送P0口
    CLR     SECOND      ;开第二位显示器
    LCALL   DELAY       ;延时
    SETB    SECOND      ;关第二位显示
    POP     PSW
    POP     ACC
    RET

DELAY:  
    PUSH    PSW
    SETB    RS0
    MOV     R7,#50
D1: MOV     R6,#50
D2: DJNZ    R6,$
    DJNZ    R7,D1
    POP     PSW
    RET
DISPTAB:    DB 28H,7EH,0a4H,64H,72H,61H,21H,7CH,20H,60H,0FFH 

INIT_T0:                ;初始化T0为10毫秒的定时器
    MOV     TMOD,#01H
    MOV     TH0,#HIGH(TMRVAR)
    MOV     TL0,#LOW(TMRVAR)
    SETB    ET0         ;开T0中断
    SETB    TR0         ;定时器0开始运行
    RET                 ;返回

INT_T0: 
    PUSH    ACC
    PUSH    PSW         ;中断保护
    MOV     TH0,#HIGH(TMRVAR)
    MOV     TL0,#LOW(TMRVAR)
    INC     COUNT       ;软件计数器加1
    MOV     A,COUNT
    CJNE    A,#COUNTER,INT_RET
    MOV     COUNT,#0    ;计到100,软件计数器清0
    SETB    SEC         ;将秒标志置为1
    INC     VALUE       ;秒的值加1
    MOV     A,VALUE 
    CJNE    A,#60,INT_RET
    MOV     VALUE,#0
INT_RET:
    POP     PSW
    POP     ACC
    RETI
END
                    

⌨️ 快捷键说明

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