单片机,系统晶振12MHZ,定时器T1产生50ms的定时,每查到10次就改变P3.1口的电平,查到200次,报警1秒

如题所述

第1个回答  2013-10-23

试试看

;fosc=12MHz

CNT0    EQU    20H
CNT1    EQU    21H
CNT2    EQU    22H

    ORG     0000H
    AJMP    MAIN
    ORG     001BH
    DJNZ    CNT0,ENDT0
    MOV     CNT0,#200           ;250us×200=50ms
    DJNZ    CNT1,ENDT0
    MOV     CNT1,#10            ;计数10次=500ms
    CPL     P3.1
    DJNZ    CNT2,ENDT0
    MOV     CNT2,#202           ;1秒等于两次500ms,200次+2次=202次
ENDT0:
    MOV     A,CNT2
    SUBB    A,#2
    MOV     P3.2,C              ;报警,假设P3.2为报警端口,当次数≤2时报警
    RETI

MAIN:
    MOV     CNT0,#200
    MOV     CNT1,#10
    MOV     CNT2,#202
        
    MOV     TMOD,#20H
    MOV     TH1,#06             ;基本定时250us
    MOV     TL1,#06
    SETB    ET1
    SETB    EA
    SETB    TR1
SLEEP:
    MOV    PCON,#01
    NOP
    SJMP    SLEEP
END

 

附问,你的200次是指:

    200次50ms =50ms*200=10s

    200次P3.1翻转 =500ms*200=100s  ,(我是按照这编写的程序)

    200次P3.1完成高低变化 =500ms*2*200=200s

第2个回答  2013-10-24
ORG 0000H
LJMP MAIN
ORG 001BH
LJMP T1ISR
ORG 0030H
MAIN:
MOV TMOD,#10H
MOV TH1,#HIGH(65536-50000)
MOV TL1,#LOW(65536-50000)
SETB TR1
SETB ET1
SETB EA
CLR A
CLR 00H
CLR 01H
MOV R0,#10
SJMP $
T1ISR:
CLR TR1
MOV TH1,#HIGH(65536-50000)
MOV TL1,#LOW(65536-50000)
SETB TR1
INC A
CJNE A,#10,T1E
CLR A
JNB 00H,T11
CLR ALARM
CPL 01H
JB 01H,T1E
CLR 00H
T11:
CPL P3.1
DJNZ R0,T1E
MOV R0,#10
SETB 00H
T1E:
RETI
END本回答被网友采纳
第3个回答  2013-10-26
如下即可:

ORG 0000H
SJMP START
ORG 001BH
SJMP T1_INT
START:
MOV TMOD, #10H
MOV TH1, #HIGH(65536-50000)
MOV TL1, #LOW(65536-50000)
SETB TR1
MOV IE, #88H
MOV R2, #10
MOV R3, #20
SJMP $
T1_INT:
MOV TH1, #HIGH(65536-50000)
MOV TL1, #LOW(65536-50000)
DJNZ R2, T1_END
MOV R2, #10
CPL P3.1
CPL F0
JB F0, NEXT
SETB P3.2 ;关闭报警
NEXT:
DJNZ R3, T1_END
MOV R3, #20
CLR P3.2 ;低电平报警
CLR F0
T1_END:
RETI
END

已经经过测试,符合要求。
相似回答