查看: 2918|回复: 53
|
【讨论】我写的Aasembly有问题,但我抓不到虫。。。
[复制链接]
|
|
发表于 6-12-2004 08:19 AM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 6-12-2004 09:09 PM
|
显示全部楼层
simonloo 于 6-12-2004 08:19 AM 说 :
放上來看看吧?
那就献丑了。。。。 |
|
|
|
|
|
|
|
发表于 6-12-2004 09:12 PM
|
显示全部楼层
pkl0001 于 6-12-2004 21:09 说 :
那就献丑了。。。。
要就快囉, 因為明天一早就要出差,所以.....不過應該還有很多大俠會幫你的。 |
|
|
|
|
|
|
|
楼主 |
发表于 6-12-2004 09:14 PM
|
显示全部楼层
;==============================================
; 89C2051 RS232 VIA PC <9600 N 8 1 >
;==============================================
SENSOR_1_BIT EQU 20H.0
SENSOR_2_BIT EQU 20H.1
SENSOR_3_BIT EQU 20H.2
SENSOR_4_BIT EQU 20H.3
SENSOR_5_BIT EQU 20H.4
; Input
SENSOR_1 EQU P3.7 ; MOTOR_1 Home Sensor
SENSOR_2 EQU P3.4 ; Sensor_2
SENSOR_3 EQU P3.5 ; Sensor_3
SENSOR_4 EQU P3.3 ; Sensor_4
SENSOR_5 EQU P3.2 ; Sensor_5
SENSOR_6 EQU P1.7 ; Sensor_6
; Output
LAMP_1 EQU P1.0 ; LAMP_1 Relay Card
LAMP_2 EQU P1.2 ; LAMP_2 Relay Card
LAMP_3 EQU P1.3 ; LAMP_3 Light Relay Card
MOTOR_1 EQU P1.1 ; MOTOR_1 Relay Card
MOTOR_2 EQU P1.4 ; MOTOR_2 Relay Card
LED EQU P1.5 ; Power LED
;===============START PROGRAM===================
ORG 0H
CLR LED ; On LED
CALL CLEAR_SENSOR_ALL_BIT ; Clear Sensor All Bit
CALL RS232 ; Open ComPort 9600 N 8 1
;-----------------------------------------------
START:
; Scan RS232 Comport
JNB RI,$ ; Wait Until RI=1
CLR RI ; Clear RI=0, Then Receive Next Byte
MOV A,SBUF ; Read Data Form PC
CJNE A,#'A',CHECK_B ; If PC Data = "A"
CALL A_TABLE ; Then Jump To A_TABLE - LAMP_1
JMP CHECK_B
CHECK_B: CJNE A,#'B',CHECK_C ; If PC Data = "B"
CALL B_TABLE ; Then Jump To B_TABLE - LAMP_2
JMP CHECK_C
CHECK_C: CJNE A,#'C',CHECK_D ; If PC Data = "C"
CALL C_TABLE ; Then Jump To C_TABLE - LAMP_3
JMP CHECK_D
CHECK_D: CJNE A,#'D',CHECK_E ; If PC Data = "D"
CALL D_TABLE ; Then Jump To D_TABLE - SENSOR_1_BIT
JMP CHECK_E
CHECK_E: CJNE A,#'E',CHECK_F ; If PC Data = "E"
CALL E_TABLE ; Then Jump To E_TABLE - SENSOR_2_BIT
JMP CHECK_F
CHECK_F: CJNE A,#'F',CHECK_G ; If PC Data = "F"
CALL F_TABLE ; Then Jump To F_TABLE - SENSOR_3_BIT
JMP CHECK_G
CHECK_G: CJNE A,#'G',CHECK_H ; If PC Data = "G"
CALL G_TABLE ; Then Jump To G_TABLE - SENSOR_4_BIT
JMP CHECK_H
CHECK_H: CJNE A,#'H',CHECK_I ; If PC Data = "H"
CALL H_TABLE ; Then Jump To H_TABLE - SENSOR_5_BIT
JMP CHECK_I
CHECK_I: CJNE A,#'I',CHECK_J ; If PC Data = "I"
CALL I_TABLE ; Then Jump To I_TABLE - MOTOR_2
JMP CHECK_J
CHECK_J: CJNE A,#'J',START ; If PC Data = "K"
CALL J_TABLE ; Then Jump To K_TABLE - MOTOR_1
CALL SHORT_DELAY
JMP START
;==================================================================
A_TABLE:
; LAMP_1
CLR LAMP_1 ; On LAMP_1 Relay Card
RET
;------------------------------------------------------------------
B_TABLE:
; LAMP_2
CLR LAMP_2 ; On LAMP_2 Relay Card
RET
;------------------------------------------------------------------
C_TABLE:
; LAMP_3
CLR LAMP_3 ; On LAMP_3 Relay Card
RET
;-----------------------------------------------------------------
D_TABLE:
; SENSOR_1_BIT
SETB SENSOR_1_BIT ; On SENSOR_1_BIT
RET
;----------------------------------------------------------------
E_TABLE:
; SENSOR_2_BIT
SETB SENSOR_2_BIT ; On SENSOR_2_BIT
RET
;------------------------------------------------------------------
F_TABLE:
; SENSOR_3_BIT
SETB SENSOR_3_BIT ; On SENSOR_3_BIT
RET
;------------------------------------------------------------------------
G_TABLE:
; SENSOR_4_BIT
SETB SENSOR_4_BIT ; On SENSOR_4_BIT
RET
;------------------------------------------------------------------------
H_TABLE:
; SENSOR_5_BIT
SETB SENSOR_5_BIT ; On SENSOR_5_BIT
RET
;-------------------------------------------------------------------------
I_TABLE:
; MOTOR_2
CLR MOTOR_2 ; On MOTOR_2 Relay Card
RET
;--------------------------------------------------------------------------------
J_TABLE:
; MOTOR_1
JNB T1,$ ; Wait Until TI=1
CLR TI ; Clear TI=0
JNB SENSOR_1_BIT,GO_2 ; If SENSOR_1_BIT on, Then Jump To GO_2
GO_1: CALL MOTOR_1_MOVING ; MOTOR_1 Moving
JB SENSOR_2,GO_1 ; Scan Sensor_2
CALL MOTOR_1_STOP ; Stop MOTOR_1
JNB SENSOR_2_BIT,GO_3
GO_2: CALL MOTOR_1_MOVING ; MOTOR_1 Moving
JB SENSOR_3,GO_2 ; Scan Sensor_3
CALL MOTOR_1_STOP ; Stop MOTOR_1
JNB SENSOR_3_BIT,GO_4
GO_3: CALL MOTOR_1_MOVING ; MOTOR_1 Moving
JB SENSOR_4,GO_3 ; Scan Sensor_4
CALL MOTOR_1_STOP ; Stop MOTOR_1
JNB SENSOR_4_BIT,GO_5
GO_4: CALL MOTOR_1_MOVING ; MOTOR_1 Moving
JB SENSOR_5,GO_4 ; Scan Sensor_5
CALL MOTOR_1_STOP ; Stop MOTOR_1
JNB SENSOR_5_BIT,GO_6
GO_5: CALL MOTOR_1_MOVING ; MOTOR_1 Moving
JB SENSOR_6,GO_5 ; Scan Sensor_6
CALL MOTOR_1_STOP ; Stop MOTOR_1
GO_6: CALL MOTOR_1_MOVING ; MOTOR_1 Moving
JB SENSOR_1,GO_6 ; Scan MOTOR_1 Home Sensor
CLR LAMP_1 ; Off LAMP_1 Relay Card
CLR LAMP_2 ; Off LAMP_2 Relay Card
CLR LAMP_3 ; Off LAMP_3 Relay Card
CLR MOTOR_2 ; Off MOTOR_2 Relay Card
CLR MOTOR_1 ; Off MOTOR_1 Relay Card
CALL CLEAR_SENSOR_ALL_BIT ; Clear Sensor Bit
RET
;==================================================================
RS232:
; 9600 N 8 1
MOV SCON,#50H ; <8 Bit, 1 Stop, Enable Receive>
MOV TMOD,#20H ; Use The Timer 1, Mode 2
MOV TH1,#0FDH ; 9600 Baud Rate
SETB TR1 ; Start The Timer 1
SETB TI
RET
;--------------------------------------------------------------
PROG: DB " CARI "
;--------------------------------------------------------------
SHORT_DELAY:
MOV R6,#25
A1: MOV R7,#25
DJNZ R7,$
DJNZ R6,A1
DJNZ R5,SHORT_DELAY
RET
;-----------------------------------------------------------------
LONG_DELAY:
MOV R6,#100
B1: MOV R7,#100
DJNZ R7,$
DJNZ R6,B1
DJNZ R5,LONG_DELAY
RET
;------------------------------------------------------------------
MOTOR_1_MOVING:
CLR MOTOR_1 ; On MOTOR_1 Relay Card
CALL SHORT_DELAY
SETB MOTOR_1 ; Off MOTOR_1 Relay Card
CALL SHORT_DELAY
RET
;---------------------------------------------------------------
MOTOR_1_STOP:
CLR MOTOR_1 ; Off MOTOR_1 Relay Card
CALL LONG_DELAY
RET
;---------------------------------------------------------------
ON_SENSOR_ALL_BIT:
SETB SENSOR_1_BIT ; On SENSOR_1_BIT
SETB SENSOR_2_BIT ; On SENSOR_2_BIT
SETB SENSOR_3_BIT ; On SENSOR_3_BIT
SETB SENSOR_4_BIT ; On SENSOR_4_BIT
SETB SENSOR_5_BIT ; On SENSOR_5_BIT
RET
;---------------------------------------------------------------
CLEAR_SENSOR_ALL_BIT:
CLR SENSOR_1_BIT ; Clear SENSOR_1_BIT
CLR SENSOR_2_BIT ; Clear SENSOR_2_BIT
CLR SENSOR_3_BIT ; Clear SENSOR_3_BIT
CLR SENSOR_4_BIT ; Clear SENSOR_4_BIT
CLR SENSOR_5_BIT ; Clear SENSOR_5_BIT
RET
;----------------------------------------------------------------
END
[ Last edited by pkl0001 on 6-12-2004 at 10:06 PM ] |
|
|
|
|
|
|
|
发表于 6-12-2004 09:34 PM
|
显示全部楼层
pkl0001 于 6-12-2004 21:14 说 :
;==============================================
; 89C2051 RS232 VIA PC <9600 N 8 1 >
;==============================================
SENSOR_1_BIT EQU 20H.0
SENSOR_2_BIT EQU ...
加一行 MOV SP,#70h 應該就可以了,因為你有用到R7,而你沒有宣告堆疊位址, 在沒有宣告堆疊時會自動拿07h為堆疊位址, 所以常你執行delay時就會堆疊的資料洗掉, 而使你的單晶片重置, 試試看吧!祝好運 |
|
|
|
|
|
|
|
发表于 6-12-2004 09:46 PM
|
显示全部楼层
simonloo 于 6-12-2004 21:34 说 :
加一行 MOV SP,#70h 應該就可以了,因為你有用到R7,而你沒有宣告堆疊位址, 在沒有宣告堆疊時會自動拿07h為堆疊位址, 所以常你執行delay時就會堆疊的資料洗掉, 而使你的單晶片重置, 試試看吧!祝好運
是J_Table有問題嗎? 因為你一開始有 SETB TI, 可是一旦執行了J_Table後 TI 就被 CLR 了再也沒有再SETB 過, 而J_Table 有一行 JNB TI,$, 很有可能就在這一直沒有出去。再檢查看看吧。 |
|
|
|
|
|
|
|
楼主 |
发表于 6-12-2004 10:11 PM
|
显示全部楼层
simonloo 于 6-12-2004 09:34 PM 说 :
加一行 MOV SP,#70h 應該就可以了,因為你有用到R7,而你沒有宣告堆疊位址, 在沒有宣告堆疊時會自動拿07h為堆疊位址, 所以常你執行delay時就會堆疊的資料洗掉, 而使你的單晶片重置, 試試看吧!祝好運
其实在书上我经常看到这样的指令MOV SP,#70h,可是我都不是很明白。可能是我不明白8051内部记忆体的原因吧!!
我会试试这招,看看可不可以抓到虫
谢谢!! |
|
|
|
|
|
|
|
楼主 |
发表于 6-12-2004 10:23 PM
|
显示全部楼层
simonloo 于 6-12-2004 09:46 PM 说 :
是J_Table有問題嗎? 因為你一開始有 SETB TI, 可是一旦執行了J_Table後 TI 就被 CLR 了再也沒有再SETB 過, 而J_Table 有一行 JNB TI,$, 很有可能就在這一直沒有出去。再檢查看看吧。
有时候我会把TI和RI搞乱,会不知道什么时候SETB什么时候CLR。
我会试试把J_Table的JNB T1,$和CLR TI拿掉。。
请问TI是不是只要SETB TI之后,就可以不再里会它。。。。。 |
|
|
|
|
|
|
|
楼主 |
发表于 6-12-2004 10:55 PM
|
显示全部楼层
其实经过我反覆在反覆的研究,我觉得问题有可能是出在SENSOR_BIT的身上。。。
因为我记得在我有试过把所有和SENSOR_BIT有关的指令全都拿掉,再测试就没遇到
奇怪的事情。。。。。。。。
不过有可能是J_Table出现了问题。。。 |
|
|
|
|
|
|
|
楼主 |
发表于 6-12-2004 11:00 PM
|
显示全部楼层
请问有没有什么指令可以把INPUT脚DISABLE。
不管INPUT脚有多少次的INPUT,此INPUT脚都不理会直到ENABLE此INPUT脚。。。。。。。 |
|
|
|
|
|
|
|
楼主 |
发表于 7-12-2004 01:18 AM
|
显示全部楼层
simonloo 于 6-12-2004 09:12 PM 说 :
要就快囉, 因為明天一早就要出差,所以.....不過應該還有很多大俠會幫你的。
要出差。。祝你一切顺利噢。。。 |
|
|
|
|
|
|
|
楼主 |
发表于 8-12-2004 06:50 PM
|
显示全部楼层
不行啊!不行啊!
我加了MOV SP,#70h,还是不行。。。。
ORG OH
MOV SP,#70h
CLR LED ; On LED
CALL CLEAR_SENSOR_ALL_BIT ; Clear Sensor All Bit
CALL RS232 ; Open ComPort 9600 N 8 1
我再把JNB T1,$和CLR TI那掉,还是不行。。。。
J_TABLE:
; MOTOR_1
JNB SENSOR_1_BIT,GO_2 ; If SENSOR_1_BIT on, Then Jump To GO_2
GO_1: CALL MOTOR_1_MOVING ; MOTOR_1 Moving
JB SENSOR_2,GO_1 ; Scan Sensor_2
CALL MOTOR_1_STOP ; Stop MOTOR_1 |
|
|
|
|
|
|
|
发表于 9-12-2004 09:17 PM
|
显示全部楼层
pkl0001 于 8-12-2004 18:50 说 :
不行啊!不行啊!
我加了MOV SP,#70h,还是不行。。。。
ORG OH
MOV SP,#70h
CLR LED ; On LED
CALL CLEAR_SENSOR_ALL_BIT ; Clear Sensor ...
改成這樣看,我大概看了一下, 應該改成這樣就可以了。
;===============START PROGRAM===================
Org 0000h
Jmp lblInitial ; Initial
Org 0003h
Reti ; Int 0
Org 000Bh
Reti ; Timer0
Org 0013h
Reti ; Int 1
Org 001Bh
Reti ; Timer1
Org 0023h
Reti ; Uart
Org 0030h ; Program Initial Pointer
lblInitial:
Mov Sp,#70h
Clr LED ; On LED
Call CLEAR_SENSOR_ALL_BIT ; Clear Sensor All Bit
Call RS232 ; Open ComPort 9600 N 8 1
; 這行以下照你本身的寫法:
;-----------------------------------------------
START:
; Scan RS232 Comport
Jnb Ri,$ ; Wait Until RI=1
Clr Ri ; Clear RI=0, Then Receive Next Byte
MOV A,Sbuf ; Read Data Form PC |
|
|
|
|
|
|
|
楼主 |
发表于 10-12-2004 01:06 AM
|
显示全部楼层
simonloo 于 9-12-2004 09:17 PM 说 :
改成這樣看,我大概看了一下, 應該改成這樣就可以了。 ...
出差回来啦!一切顺利吧!!
好!让我试试看再回复你!先谢了!! |
|
|
|
|
|
|
|
发表于 10-12-2004 02:03 AM
|
显示全部楼层
pkl0001 于 10-12-2004 01:06 说 :
出差回来啦!一切顺利吧!!
好!让我试试看再回复你!先谢了!!
沒有, 還在工地, 不過網路好了, 可以上網就先回你而已。 |
|
|
|
|
|
|
|
楼主 |
发表于 11-12-2004 11:10 AM
|
显示全部楼层
Simon大大,我已经试过你的方法了。。。。。不行啊。。。。。。
我已经投降了!我想是应该从新写过。
等我写好了,再让你过目。谢谢你的一路来的帮忙。。。。 |
|
|
|
|
|
|
|
发表于 11-12-2004 07:54 PM
|
显示全部楼层
呵呵!老大!这次又是什么问题了?
可以帮得上忙的,我就试试看吧…… |
|
|
|
|
|
|
|
楼主 |
发表于 12-12-2004 10:55 PM
|
显示全部楼层
faiko 于 11-12-2004 07:54 PM 说 :
呵呵!老大!这次又是什么问题了?
可以帮得上忙的,我就试试看吧……
嗨!你好!你愿意帮忙我真的又高兴,又可以互相讨论和研究。。。真的谢谢你。。。
说来话长。。。。。。。总之是很难搞啦!!
五楼是我原有的程式,问题还不知道出在哪里。。。
但初步估计是SENSOR_*_BIT的问题。
因为在我没加SENSOR_*_BIT之前是没有问题的。。。。
你看得懂程式的动作吗?不然等我画好流程图,再放上来让你过目。。。。。。
需要.hex档案吗?我迟些SEND给你。。。。 |
|
|
|
|
|
|
|
发表于 14-12-2004 10:26 PM
|
显示全部楼层
pkl0001 于 12-12-2004 10:55 PM 说 :
嗨!你好!你愿意帮忙我真的又高兴,又可以互相讨论和研究。。。真的谢谢你。。。
说来话长。。。。。。。总之是很难搞啦!!
五楼是我原有的程式,问题还不知道出在哪里。。。
但初步估计是SENSO ...
没有问题~~~!!大家都是交流交流罢了。我也是闲着在家没事做……刚刚才连线上网。
已经收到你的HEX了。慢慢参悟你的原码。迟些答复你! |
|
|
|
|
|
|
| |
本周最热论坛帖子
|