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

📄 实验六(2).asm

📁 单片机只是别人的东西
💻 ASM
字号:

;功能:利用串行口方式0,在“串入并出”芯片配合下扩展输出引脚
;把存放在44H-47H发送缓冲区内的笔段码送通过串行口方式0送LED显示。
RXDP     DATA    43H     ;发送指针
RXDBUF   DATA    44H     ;发送缓冲区
DISPBUF  DATA    48H     ;笔段码显示缓冲区:
                         ;48H单元记录千位,49H单元记录百位
                         ;4AH单元记录十位,4BH单元记录个位
BTIME    DATA    40H     ;10ms计数单元
SECOND   DATA    4CH     ;秒计数单元
MINUTE   DATA    4DH     ;分计数单元
DISPB    BIT     00H     ;1秒定时时间到标志
PCLK     BIT     P3.5    ;并行锁存脉冲输出

ORG 0000H
LJMP MAIN

ORG 0023H
LJMP UART               ;串行中断服务子程序入口地址

ORG 002BH
LJMP CTC2               ;定时/计数器T2中断服务程序入口地址

ORG 0050H
;-----主程序开始-----
PROC MAIN
MAIN:
     MOV SP, #5FH       ;对于只有前128字节内部RAM芯片来说,
                        ;将60H-7FH,共计32字节作为堆栈区
;     MOV SP, #0DFH     ;对于具有256字节内部RAM芯片来说,
                        ;将0E0H-0FFH,共计32字节作为堆栈区
     MOV DPTR, #8000H   ;关闭蜂鸣器
     MOV A, #0FFH
     MOVX @DPTR, A

     ;---复位后,将08H-0FF内部RAM单元清0。
     MOV R7, #248
     MOV R0, #08H
LOOP1:
     MOV @R0, #0
     INC R0
     DJNZ R7, LOOP1


     ;----初始化定时器T2
     MOV TH2, #0DCH
     MOV TL2, #00H          ;初值0DC00送定时器T2
     MOV RCAP2H, #0DCH
     MOV RCAP2L, #00H       ;初始化重装初值
     MOV T2CON, #00000100B  ;初始化T2工作方式(自动重装初值、定时)
                            ;并启动了T2

     ANL PCON, #10111111B   ;将PCON的b6位清0,使SCON的b7位含义为SM0
     ;串行口初始化
     MOV SCON, #00H         ;串行口工作在方式0,扩展I/O口
                            ;(SM2位必须为0)

     ;-----初始化中断控制器
     ORL IE, #10110000B
     ;SETB ET2                ;允许定时器T2中断
     ;SETB ES                 ;允许串行口中断
     ;SETB EA                 ;开中断
     MOV BTIME, #100          ;T2每10ms中断一次,则BTIME回零时间为100*10ms

WAIT:
     JNB DISPB, WAIT
     CLR DISPB                ;清除1秒时间到标志
     LCALL TIMEPROC           ;执行分秒处理及显示子程序
     SJMP WAIT                ;等待

END



;定时/计数器T2中断服务程序
PROC CTC2
CTC2:

     DJNZ  BTIME, EXIT ;溢出次数减1,不为0跳转
     ;溢出次数已经回到0,重新初始化溢出次数
     MOV BTIME, #100
     SETB DISPB         ;置位1秒时间到标志
EXIT:

     CLR TF2             ;清除定时器T2溢出标志
     RETI
END

PROC TIMEPROC            ;分秒处理及显示子程序
TIMEPROC:
     ;时间计数单元加+1处理
     INC SECOND          ;秒计数单元+1
     MOV A, SECOND
     CJNE A, #60, NEXT1
NEXT1:
     JC NEXT2
     ;秒大于60,从0开始计数,且分计数单元加1
     MOV SECOND, #0
     INC MINUTE
     MOV A, MINUTE
     CJNE A, #60, NEXT21
NEXT21:
     JC NEXT2          ;分小于60
     MOV SECOND, #0
NEXT2:
     ;秒单元计数器笔段码送显示缓冲区
     MOV A, SECOND
     MOV B, #10
     DIV AB             ;转换为BCD码
                        ;十位在A中,个位在B中
     MOV DPTR, #LEDTAB  ;0-F字模表首地址送DPTR
     MOV R0, #DISPBUF+2
     MOVC A, @A+DPTR    ;查表取笔段码
     MOV @R0, A         ;秒高位笔段码送显示缓冲区

     INC R0             ;指向缓冲区最低位
     MOV A, B           ;取个位码
     MOVC A, @A+DPTR    ;查表取笔段码
     MOV @R0, A         ;秒低位笔段码送显示缓冲区

     ;分单元计数器笔段码送显示缓冲区
     MOV A, MINUTE
     MOV B, #10
     DIV AB             ;转换为BCD码
                        ;十位在A中,个位在B中
     MOV DPTR, #LEDTAB  ;0-F字模表首地址送DPTR
     MOV R0, #DISPBUF
     MOVC A, @A+DPTR    ;查表取笔段码
     MOV @R0, A         ;分高位笔段码送显示缓冲区

     INC R0             ;指向缓冲区最低位
     MOV A, B           ;取个位码
     MOVC A, @A+DPTR    ;查表取笔段码
     CLR ACC.7          ;显示LED202数码管的小数点dp
     MOV @R0, A         ;分低位笔段码送显示缓冲区

     ;笔段码送串行口发送缓冲区
     MOV R0, #DISPBUF
     MOV R1, #RXDBUF
     MOV R7, #4
LOOP1:
     MOV A, @R0         ;由于串行口发送时,先输出b0位,而
                        ;对于串入并出芯片来说,要求输入b7,
                        ;需要调整字节顺序
     MOV C, ACC.7
     MOV B.0, C
     MOV C, ACC.0
     MOV B.7, C         ;b7与b0对调

     MOV C, ACC.6
     MOV B.1, C
     MOV C, ACC.1
     MOV B.6, C         ;b6与b1对调

     MOV C, ACC.5
     MOV B.2, C
     MOV C, ACC.2
     MOV B.5, C         ;b5与b2对调

     MOV C, ACC.4
     MOV B.3, C
     MOV C, ACC.3
     MOV B.4, C         ;b4与b3对调
     
     MOV @R1, B         ;写入发送缓冲区
     INC R0
     INC R1
     DJNZ R7, LOOP1
               
     MOV RXDP, #0      ;初始化串行发送指针
     CLR TI
     MOV R1, #RXDBUF
     MOV A, @R1         ;取显示缓冲区笔段码
     MOV SBUF, A        ;写串行发送缓冲寄存器,启动串行发送。
     RET
END


PROC UART               ;串行发送中断服务程序
UART:
   PUSH PSW
   PUSH ACC
   SETB RS0
   SETB RS1             ;切换工作寄存器区

   CLR TI               ;清除串行发送结束标志
   MOV A, RXDP
   CJNE A, #3, NEXT1    ;发送
   ;已经发送了最后一个字节
   CLR P3.5
   SETB P3.5            ;将串行数据并行送LED数码管
   SJMP EXIT
NEXT1:
   ;串行发送下位
   INC RXDP             ;串行发送指针加+1
   MOV A, RXDP
   ADD A, #RXDBUF       ;加发送缓冲区首地址
   MOV R1, A
   MOV A, @R1           ;取数据
   MOV SBUF, A          ;写串行发送缓冲寄存器,启动串行发送。
EXIT:

   POP ACC
   POP PSW
   RETI
END

LEDTAB:                 ;八段LED共阳数码管字模
;数码  0     1     2     3     4     5    6    7
DB     0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H

;数码  8     9     A     B     C     D     E     F
DB     80H,  90H,  88H, 83H,  0C6H, 0A1H, 86H, 8EH

⌨️ 快捷键说明

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