打印

IO口检测脉冲记数问题

[复制链接]
2924|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jakey0225|  楼主 | 2007-10-24 15:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用IO口检测12路光电开关引起的脉冲信号并记数,脉冲频率不超过1K,12路分别接P0,P2.0-P2.3 (单片机时钟为11.0592M)
程序如下:
CHECK:    MOV A,P0
    XRL A,P0
    JNZ ADD1
CHECK1:    MOV A,P2
    XRL A,P2
    JNZ ADD2
    LJMP CHECK
ADD1,ADD2为判断那一路变化并记数
请指教这样行吗?
MOV和 XRL指令之间还须延时吗?
还是用其他的办法?

相关帖子

沙发
5880527| | 2007-10-25 19:30 | 只看该作者

写一段仅供参考

MOV A,P0    XRL A,P0有漏洞,而且无法判断沿变化,写一段,仅供参考
用的大循环扫描,也可以用定时器扫描,只要扫描频率有个两三K就可以了
X0       EQU    P0.0
X1       EQU    P0.1

X0BIT0   BIT    000H
X1BIT0   BIT    001H

X0BIT    BIT    010H
X1BIT    BIT    011H

X0BITL   BIT    020H
X1BITL   BIT    021H

NUM0H    EQU    030H
NUM0L    EQU    031H
NUM1H    EQU    032H
NUM1L    EQU    033H

         ORG     0000H
         LJMP    MAIN
         ORG     30H
MAIN:    MOV     SP,#080H
         MOV     R0,#030H
WQR:     MOV     @R0,#00H
         INC     R0
         MOV     A,R0
         CJNE    A,#080H,WQR
         NOP
         SETB    X0BIT
         SETB    X1BIT
         SETB    X0BITL
         SETB    X1BITL
         NOP

LOOP:    NOP
         NOP         
         MOV     C,X0
         JC      JR00
         JNB     X0BIT0,JR01
         AJMP    JR02
JR00:    JB      X0BIT0,JR01
         AJMP    JR02
JR01:    MOV     X0BIT,C     ;检测到两次一样则认为信号稳定
JR02:    MOV     X0BIT0,C    ;保存本次扫描到的状态
       
         MOV     C,X1
         JC      JR10
         JNB     X1BIT0,JR11
         AJMP    JR12
JR10:    JB      X1BIT0,JR11
         AJMP    JR12
JR11:    MOV     X1BIT,C     ;检测到两次一样则认为信号稳定
JR12:    MOV     X1BIT0,C    ;保存本次扫描到的状态
         
         JB      X0BIT,LEW1   ;仅下降沿计一次
         JNB     X0BITL,LEW1
         MOV     A,NUM0L
         ADD     A,#001H
         MOV     NUM0L,A
         MOV     A,NUM0H
         ADDC    A,#000H
         MOV     NUM0H,A      ;此处未考虑溢出

LEW1:    JB      X1BIT,LEW2   ;仅下降沿计一次
         JNB     X1BITL,LEW2
         MOV     A,NUM1L
         ADD     A,#001H
         MOV     NUM1L,A
         MOV     A,NUM1H
         ADDC    A,#000H
         MOV     NUM1H,A      ;此处未考虑溢出

LEW2:     
         MOV     C,X0BIT
         MOV     X0BITL,C
         MOV     C,X1BIT
         MOV     X1BITL,C      ;保存本次状态
         
         LJMP    LOOP

END
         

使用特权

评论回复
板凳
沈老| | 2007-10-25 19:42 | 只看该作者

给一个例子

;Main points:
;1.The width of any pluses must be big then the LOOP time !
;2.You can do the countting in main loop,then you have no time do
;any other job in the main loop.
;3.Or you can do it in a timer interrupt service.The time that the
;timer takes is the smallest width of any pluses.
;Assume:
CpuClck        EQU 12000  ;12000Khz=12Mhz
TmrClck        EQU CpuClck/12;1M=1000K
ReferF        EQU 1000;HZ=1khz
ReferT        EQU 1000;us=1ms
;Counters add 1 on both the edges of a pluse
;Results in twice the number of pulses
Counter0 EQU R0
Counter1 EQU R1
Counter2 EQU R2
Counter3 EQU R3
Counter4 EQU R4
Counter5 EQU R5
Counter6 EQU R6
Counter7 EQU R7

LastStatus   DATA   20h

    ORG 0000H
    LJMP START
;;;;;;;;;;;;;;;;;;;;;;;;
#define SIMULATION
;comment above if runs on the target
#ifdef  SIMULATION
    ORG 000BH
;T0 Interrupt
    PUSH  PSW
    PUSH  ACC
    CLR   TR0
;
    MOV   TH0,#High(-ReferT)
    MOV   TL0,#Low(-ReferT)
    MOV   A,P1
    JNZ   SET0;<>0
;=0
    MOV   P1,#0FFh;8 counters
    JMP   Goon
SET0:
    MOV   P1,#0
Goon:
    SETB  TR0
    POP   ACC
    POP   PSW
    RETI
#endif
;;;;;;;;;;;;;;;;;;;;;;;;;;
;main
START:
    MOV   SP,#30h
;Reset counters
    MOV   R0,0
    MOV   R1,0
    MOV   R2,0
    MOV   R3,0
    MOV   R4,0
    MOV   R5,0
    MOV   R6,0
    MOV   R7,0
;
#ifdef SIMULATION
    MOV   TMOD,#0000$0001B;T0=16 bits Timer
         MOV   TH0,#High(-ReferT);1ms=1KHZ
         MOV   TL0,#Low(-ReferT)
    SETB  EA
    SETB  ET0
         SETB  TR0
#endif
;
         MOV   P1,#0FFh;input
    MOV   LastStatus,#0FFh;as P1
LOOP:;Each loop takes 25us or more !
         MOV   A,P1;in order to avoid geeting different P1 value,
    MOV   B,A ;P1 can be read once within every loop.
    XRL   A,LastStatus
    MOV   LastStatus,B
    JZ    LOOP;no any changes
;which counter ?
    JNB   ACC.0,NotC0
    INC   Counter0
NotC0:
    JNB   ACC.1,NotC1
    INC   Counter1
NotC1:
    JNB   ACC.2,NotC2
    INC   Counter2
NotC2:
    JNB   ACC.3,NotC3
    INC   Counter3
NotC3:
    JNB   ACC.4,NotC4
    INC   Counter4
NotC4:
    JNB   ACC.5,NotC5
    INC   Counter5
NotC5:
    JNB   ACC.6,NotC6
    INC   Counter6
NotC6:
    JNB   ACC.7,More
    INC   Counter7
More:
         JMP   LOOP
END

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

45

帖子

0

粉丝