佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 3984|回复: 40

很简单的ASM language的问题 (卷门控制 -Garage Door)

  [复制链接]
发表于 9-4-2011 09:31 AM | 显示全部楼层 |阅读模式
本帖最后由 pic 于 15-5-2011 08:25 AM 编辑

你要想做什么? 你的应用是什么? 我要控制我的dc motor
ii. 你想要拿到什么效果

按“走”一次,motor要自动“走”,直到碰到limit switch就停。按下“回”一次,motor要自动“回”,直到碰到limit switch就停,重复。
iii. 你做了什么

写到一半就不懂了。

        ORG 00H


CLR A

START:
MOV A, P0   ; 重P0拿资料,P0.2, P0.3 是我的 “走” 和 “回”


MOV R0, A


CLR A


MOV P1, R0

LOOP0:


MOV C, P2.0 ;重P2.0拿资料, P2.0是第一个limit switch


JC LOOP0


MOV P0.2, C

LOOP1:
CLR C


MOV C, P0.3 ;
重P0.3拿资料, 因为要“回”

JC LOOP1


MOV P1.3, C


CLR C      

iv. 你遇到了什么问题。
1)如何在START的时候,一直loop直到SCAN到P0。用JZ,JNZ?可是如果我只有用P0.2和P0.3
2)我的JC是不是有问题? 我想是一直loop直到 C 有改变,对吗?如果不用C,那我要如何loop?比如用A,要怎样LOOP,直到A有改变(不是所有A变0)
3) 我上面的code,错完吗?
4)limit switch是盖是0,还是开是0,如何define? 我的+ 接COM,- 接NC对吗?
v. 你用什么MCU?
AT89S51
vi. 你用什么语言? ASM /C/PICBasic/Keil?Compiler 版本?
ASM
vii. 有源码吗? 如是抄来的请注明出处, 请放链接。
上面
viii. 有电路图吗?
没有,目前用simulator
ix. 你google 了吗? 你的搜索关键字是什么?
没有
x. 有照片证明你做的东西吗?还是只是概念性的空谈?
xi. 是你自己的问题? 还是你帮人问的? 请说明。
我的问题

2. 如果是学生问功课, 请注明你是什么学校, 几年级生,什么major.
MMU, gamma year 3rd sem, Mechanical engineering


对不起,这么简单都不会。除此之外,想问一个我想问的问题,个人想知道而已,如何调motor的速度?要它时快时慢,不要fixed在一个速度。然后如果我要motor 关的时候,速度从动慢慢跌到不会走,可能吗?
回复

使用道具 举报


ADVERTISEMENT

发表于 9-4-2011 10:27 AM | 显示全部楼层
太深了。。。不明白。。。LZ 可以简单化的解释吗?
回复

使用道具 举报

发表于 9-4-2011 10:54 AM | 显示全部楼层
试试看
用 interrupt  來 detect 你的 limit switch

不要问我Details 怎样写,N 就没碰 asm 了
只是 印象中记得 可以这么做
回复

使用道具 举报

 楼主| 发表于 9-4-2011 01:50 PM | 显示全部楼层
太深了。。。不明白。。。LZ 可以简单化的解释吗?
cyris8399 发表于 9-4-2011 10:27 AM


ok.没问题
其实我的asm的概念是:
1)8051从我的P0 detect 我的keypad,如果没有按,就一直loop, 直到我按keypad.
2) 按我 “走” 键一次,motor就要一直走,直到limit switch按下,就停。(limit switch 要一直按着)
3)然后按 ”回“ 键 一次,motor就要回来, 直到limit switch 按下,就停。
4)重复。

就是这样咯。
回复

使用道具 举报

 楼主| 发表于 9-4-2011 01:51 PM | 显示全部楼层
试试看
用 interrupt  來 detect 你的 limit switch

不要问我Details 怎样写,N 就没碰 asm 了
只是 印 ...
你抽的烟 发表于 9-4-2011 10:54 AM



   interrupt,好。等下去读读看。
回复

使用道具 举报

发表于 9-4-2011 03:09 PM | 显示全部楼层
ok.没问题
其实我的asm的概念是:
1)8051从我的P0 detect 我的keypad,如果没有按,就一直loop, 直到 ...
shaddow 发表于 9-4-2011 01:50 PM

谢谢按版规发帖。
建议用C 来写。
还是指定一定要ASM?
回复

使用道具 举报

Follow Us
 楼主| 发表于 9-4-2011 03:12 PM | 显示全部楼层
谢谢按版规发帖。
建议用C 来写。
还是指定一定要ASM?
pic 发表于 9-4-2011 03:09 PM



对,就是要用ASM写。
回复

使用道具 举报

发表于 9-4-2011 04:25 PM | 显示全部楼层
本帖最后由 pic 于 9-4-2011 04:27 PM 编辑
对,就是要用ASM写。
shaddow 发表于 9-4-2011 03:12 PM


呵呵。。那么用C 写,再转去ASM。。。如果是CCS C 是可以的, 但是8051 的我不知道。。
不过简单一点, 不需要用的interrupt 那么复杂啦。。

然后用Proteus 模拟/debug, 应该会帮助很大。
回复

使用道具 举报


ADVERTISEMENT

发表于 9-4-2011 06:19 PM | 显示全部楼层
你用了几个limit switch?

你如何控制motor的正转和反转?

你的按键是active high 触发,还是active low触发?

能把你的电路图发上来吗?

这只是个简单程式而已,不管用C或ASM都能轻易办到!

看你发问的问题,就发现几个疑点了。不理清,拿不到效果的。。。

等你发图再解题!
回复

使用道具 举报

 楼主| 发表于 9-4-2011 07:02 PM | 显示全部楼层
呵呵。。那么用C 写,再转去ASM。。。如果是CCS C 是可以的, 但是8051 的我不知道。。
不过简单一点, ...
pic 发表于 9-4-2011 04:25 PM



什么是CCS C?
回复

使用道具 举报

发表于 9-4-2011 07:15 PM | 显示全部楼层
回复 10# shaddow


    CCS C 是PIC C ccompiler的其中一种。

    8051 C compiler 有 Keil C51,IAR C51等等。。。
回复

使用道具 举报

 楼主| 发表于 9-4-2011 07:30 PM | 显示全部楼层
你用了几个limit switch?

你如何控制motor的正转和反转?

你的按键是active high 触发,还是active  ...
wkloh 发表于 9-4-2011 06:19 PM


你用了几个limit switch?两个,一个给 “走” 的时候停,一个给 “回”的时候停。


你如何控制motor的正转和反转?
用relay board(不懂是不是叫relay board), 以前参加比赛用的。不是我做的,他们spoon feed我们的,到现在都不懂要怎样做一个relay board.


你的按键是active high 触发,还是active low触发?
我觉得是active low,应为一开电,所有port都是 1,我也没有改,所以因该是active low.


能把你的电路图发上来吗?



   我只有这些,有用吗?
其实我要知道的是要怎样一直loop这个

i)8051从我的P0 detect 我的keypad,如果没有按,就一直loop, 直到我按keypad
要用什么instruction?


limit switch是盖是0,还是开是0,如何define? 我的+ 接COM,- 接NC对吗?
回复

使用道具 举报

 楼主| 发表于 9-4-2011 07:58 PM | 显示全部楼层
8051从我的P0 detect 我的keypad,如果没有按,就一直loop, 直到我按keypad
要用什么instruction?

有一点想到了,但是应该很不好,用CJNE.
回复

使用道具 举报

发表于 9-4-2011 09:33 PM | 显示全部楼层
limit switch

情况一  motor正转停:
假设你的limit switch 是回传讯号 actvie low 给MCU,com端接到MCU P2.0的任何一个输入端,而NO端接地。用下面指令

JNB  P2.0,STOP_MOTOR;当P2.0查到低讯号,跳去执行停止motor程序.
JMP  START

反之回传讯号 actvie high 给MCU,com端接到P2.0的任何一个输入端,而NC端接地。
JB  P2.0,STOP_MOTOR;当P2.0查到高讯号,跳去执行停止motor程序.
JMP  START

情况二  motor 反转停:
重复情况一的接法,指定P2.1为motor 反转停检知讯号。

Keypad也可以用limit switch检查方法。

JNB   P0.2,FORWARD;
JNB   P0.3,REVERSE;
JMP   START


其它的你自己想想吧!

评分

参与人数 1积分 +30 收起 理由
fritlizt + 30 加分奖励

查看全部评分

回复

使用道具 举报

 楼主| 发表于 9-4-2011 10:44 PM | 显示全部楼层
本帖最后由 shaddow 于 9-4-2011 10:48 PM 编辑
limit switch

情况一  motor正转停:
假设你的limit switch 是回传讯号 actvie low 给MCU,com端接到MC ...
wkloh 发表于 9-4-2011 09:33 PM


用了你的方法写了,在simulator看到没问题。但在我的relay board有问题。我也用了我的方法写了一次,在simulator也没问题。但在relay board有问题。
这是我的方法:我把limit switch放在P2.0和P2.1,forward 和reverse放在 P2.7 和P2.6,因为我的simulator只给我P2按。


ORG 00H

CLR A
START:

ALOOP:
MOV A, P2   ; P2.7

ACALL DELAY

CJNE A, #7DH, ALOOP

MOV P1, #7FH ; P1.7

ACALL DELAY

LOOP0:
CLR A

MOV A, P2; P2.0

ACALL DELAY

CJNE A, #0FEH, LOOP0

MOV A, #0FFH

MOV P1, A

ACALL DELAY

LOOP1:
CLR A

MOV A, P2  ; P2.6

ACALL DELAY

CJNE A, #0BEH, LOOP1

MOV P1, #0BFH ;P1.6

ACALL DELAY

LOOP2:
CLR A

MOV A, P2 ; P2.1

ACALL DELAY

CJNE A, #0FDH, LOOP2

MOV P1, #0FFH


ACALL DELAY

JMP START

DELAY:
MOV R4, #10
D1:
MOV R5,#100

DJNZ R4, D1

DJNZ R3, DELAY

RET



END


wkloh大大,我这方法可以吗?
还有谢谢你,让我知道怎样用JNB和JB还有limit switch 接的方法。感激不尽,又帮我一个大忙了。
看来我要重新做过一个relay board和keypad 了,这里有教吗?

还有一个问题,如果要用wireless keypad,要买什么? 会难做吗? 看到人家用PS 的controller,羡慕一下。
回复

使用道具 举报

发表于 10-4-2011 12:15 AM | 显示全部楼层
呵呵。。那么用C 写,再转去ASM。。。如果是CCS C 是可以的, 但是8051 的我不知道。。
不过简单一点, ...
pic 发表于 9-4-2011 04:25 PM



   

版主,这个行不通啦。用c换去 asm好像作弊这样。 哈哈。
虽然一般上不用asm鸟。 不过一开始学asm有帮助了解mcu的说。 个人觉得。
回复

使用道具 举报


ADVERTISEMENT

发表于 10-4-2011 12:17 AM | 显示全部楼层
回复 15# shaddow


   

人家用ps controller?
ps controller用asm来做不容易做。一定的程度才能做的说。
再加上wireless ps controller.会比较难啦。你班上有人到这样的程度?
回复

使用道具 举报

 楼主| 发表于 10-4-2011 12:24 AM | 显示全部楼层
回复  shaddow


   

人家用ps controller?
ps controller用asm来做不容易做。一定的程度才能做的 ...
fritlizt 发表于 10-4-2011 12:17 AM


不知道你的PS和我说的PS一样吗,我说的是PS2 controller :
   我班我就不懂,但不管什么大大小小的比赛全部人都用。自卑
回复

使用道具 举报

发表于 10-4-2011 12:50 AM | 显示全部楼层
回复 15# shaddow



ALOOP:
MOV A, P2   ; P2.7
ACALL DELAY
CJNE A, #7DH, ALOOP
MOV P1, #7FH ; P1.7

delay拿来做什么用的?

CJNE A, #7DH, ALOOP
这个是拿来detect P2.7 吗?如果是low就开始forward/reverse?
这个方法不是不行。 不过用bit operation会比较好。 好像wkloh建议的。 用JB/JNB.
JB = jump if bit set, JNB = jump if bt not set. 方便简单。
你的方法,用byte operation, 万一有两个以上的button press,就不能了。或者其他影响。
好像你你说的
limit switch放在P2.0和P2.1,forward 和reverse放在 P2.7 和P2.6
如果你CJNE A, #7DH, ALOOP, 你要确定那时候你的P2.1, P2.6, P2.7是high.否则不work.


MOV P1, #7FH ; P1.7
这个也不是很好。 你直接把整个port 1改掉了。 你应该用set bit 还是clr bit. 没错的话8051 有这个instruction.
直接操作P1.7而不影响其他的pin. 当然如果你能确定你修改整个port不会造成任何影响, 这个是没问题的。

loop 0和其他也是一样。
简单来讲你的program 理论上是work的, 不过你要注意细节,还是有major failure的危险性。 万一limit switch 坏鸟, always low. 你的整个program就stuck 鸟。

还有一个, 要把port 当作input, 把 P2 set 成 all high, 忘了reset 过后p2是处于什么状况。 安全起见, detect 那个pin的时候,把它set high,才来detect.
好像你的case,

ALOOP:
MOV A, P2   ; P2.7
ACALL DELAY
CJNE A, #7DH, ALOOP

加一个MOV P2, #0FFH 在 ALOOP上面。
回复

使用道具 举报

发表于 10-4-2011 12:51 AM | 显示全部楼层
回复 18# shaddow


   

没错, 我讲的就是这个。
他们怎样做?其他人做给他们的module?
怎样做wireless?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 29-3-2024 04:39 AM , Processed in 0.096412 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表