P1.2連方向線,P1.1連脈沖線,200步為1周,定時中斷為5ms,電機轉1周1秒
11.0592MHz晶震,5ms中斷初值為EE00H
RUNEN BIT 20H;電機動作開關
RUND BIT 21H;方向標誌位,1為正傳
PUCON DATA 40H;脈沖計數器
SECON DATA 41H;秒鐘計數器
STCON DATA 42H;電機停時中斷計數器
ORG 0000H
LJMP MAIN
ORG 002BH
LJMP CTC2
ORG 100H
MAIN:
MOV SP,#7FH
MOV PUCON,#200;脈沖數200
MOV SECON,#3;秒數3秒。即3圈
MOV STCON,#100;停時中斷次數100
MOV TH2,#0EEH;送初值
MOV TL2,#0
MOV RCAP2H,#0EEH
MOV RCAP2L,#0
SETB P1.2;設定正傳
SETB RUNEN;開電機動作開關
SETB RUND;設定正傳
SETB ET2
SETB EA
LOOP1:
JB P1.0 ,LOOP2;查詢輸入
MOV TH2,#0EEH
MOV TL2,#0
MOV T2CON,#00000100B;開始計數,等中斷
LOOP2:
SJMP LOOP1
CTC2:
JNB RUNEN,NEXT1;電機動作開關為1,送脈沖,為0,進入0.5秒計時程序
CPL P1.1
DJNZ PUCON,EXIT;脈沖計數
MOV PUCON,#200
JNB RUND,NEXT3;為1,正傳,運行下步,為0,反轉,到next3
DJNZ SECON,EXIT;計數圈數
MOV SECON,#3
CLR RUNEN;先關電機動作開關,等待0.5秒
SJMP EXIT
NEXT1:
DJNZ STCON,EXIT;計時0.5秒
MOV STCON,#100;完了,下步
CPL RUND;開始反轉
SETB RUNEN;開始送脈沖
CPL P1.2;外部設定為反轉
SJMP EXIT
NEXT3:
CPL RUND
MOV T2CON,#0;關掉T2,等待P1.0輸入0
EXIT:
RETI
PS:我把反轉那1圈的脈沖用正傳的計數器來算