jakey0225 发布于 2007-10-24 15:26:00 我用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:00 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:36:07 修改者:5880527 沈老 发布于 2007-10-25 19:42:00 ;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
|