用51单片机汇编语言,写一个60s倒计时的程序

题目。写出一个60s倒计时的汇编语言,不要用C语言写,用汇编语言。

再设置一个按键,按一下,停止倒计时,再按一下,恢复倒计时。

;---------------------------------------
;假设系统晶振为 12MHz
;显示电路可见:http://xiangce.baidu.com/picture/detail/b72870d1c3d05f0783143da67f93282ecbab14f6

;按键连接在P3.2

;---------------------------------------
        ORG  0000H
        LJMP MAIN
        ORG  0003H
        LJMP X0_INT
        ORG  000BH
        LJMP T0_INT
;---------------------------------------
        ORG  0100H
MAIN:                            ;初始化
        MOV  TMOD, #01H
        MOV  TL0, #(65536 - 50000) MOD 256
        MOV  TH0, #(55536 - 50000) / 256
        SETB TR0
        SETB ET0
        SETB EX0
        SETB EA
        MOV  DPTR, #TAB          ;表首址送DPTR
        MOV  R1, #0
        MOV  R2, #0
        MOV  R3, #20
;---------------------------------------
M_LOOP:
        CALL DIS
        SJMP M_LOOP
;---------------------------------------
T0_INT:
        MOV  TL0, #(65536 - 50000) MOD 256
        MOV  TH0, #(55536 - 50000) / 256
        DJNZ R3, T0_E
        MOV  R3, #20
        DEC  R1
        CJNE R1, #255, T0_E
        MOV  R1, #9
        DEC  R2
        CJNE R2, #255, T0_E
        MOV  R2, #5
T0_E:
        RETI
;---------------------------------------
X0_INT:
        CALL DIS
        JNB  P3.2, X0_INT
        CPL  TR0
        RETI
;---------------------------------------
DIS:                             ;显示程序.
        MOV  A,  R2              ;显示十位.
        MOVC A,  @A+DPTR
        CLR  P2.1
        MOV  P1, A
        SETB P2.0                ;十位的位选.
        CALL DLY

        MOV  A,  R1              ;个位显示.
        MOVC A,  @A+DPTR
        CLR  P2.0                ;关闭十位的显示.
        MOV  P1, A
        SETB P2.1                ;个位的位选.
        CALL DLY
        RET
;------------------------------
TAB:    DB  0xc0,0xf9,0xa4,0xb0,0x99  ;共阳极段码 0~4
        DB  0x92,0x82,0xf8,0x80,0x90  ;共阳极段码 5~9
;---------------------------------------
DLY:    MOV  R6, #20            ;10ms延时.
D1:     MOV  R7, #248
        DJNZ R7, $
        DJNZ R6, D1
        RET
;---------------------------------------
end

原题网址:http://zhidao.baidu.com/question/282485139.html#here

  • 16
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
下面是一个简单的串行通讯程序,使用AT89C51单片机汇编语言,实现了从计算机发送一个字节到单片机单片机接收并回传该字节: ``` ; 串行通讯程序 ; 使用AT89C51单片机汇编语言 ; 定义串口寄存器地址 sbuf equ 99h scon equ 98h ; 定义波特率 baudrate equ 9600 ; 定义中断向量表 org 0 ljmp main org 23h ljmp serial_interrupt ; 主程序 main: ; 初始化串口 mov scon, #50h ; 8位数据,无校验,1位停止位,允许接收 mov TMOD, #20h ; 定时器1工作在方式2,自动重载 mov TH1, #-3 ; 设定波特率 setb TR1 ; 启动定时器1 ; 无限循环等待接收数据 loop: jnb RI, loop ; 如果接收中断标志位未置位,则继续等待 mov A, SBUF ; 从串口寄存器读取接收到的数据 mov SBUF, A ; 将接收到的数据回串口寄存器,回传给计算机 clr RI ; 清除接收中断标志位 sjmp loop ; 继续等待接收数据 ; 串口中断服务程序 serial_interrupt: push ACC ; 保存现场 push PSW push B clr RI ; 清除接收中断标志位 pop B ; 恢复现场 pop PSW pop ACC reti ; 退出中断 ``` 在上面的程序中,我们首先定义了串口寄存器地址和波特率。然后在主程序中,我们初始化了串口并启动定时器1,然后进入一个无限循环等待接收数据。在每次接收到数据时,我们将其回传给计算机。在串口中断服务程序中,我们清除了接收中断标志位,并返回。 需要注意的是,在AT89C51单片机中,接收到数据时会触发一个中断,因此我们需要定义一个中断向量表,并编相应的中断服务程序来处理接收到的数据。在本例中,我们使用了中断向量表中的第2个向量,即地址为23h。 此外,还需要在计算机上发送数据以测试程序的功能。可以使用超级终端等串行通讯软件来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值