51系列单片机 程序设计 用4个开关控制步进电机进行启动停止正转和反转

程序如下,已给出。
其中 晶体振荡频率为 12MHZ,定时时间为 10ms,定时器初值也就不用计算了。
有4个按键,第一个控制正转,第二个控制反转,第三个控制停止,第四个控制启动。

我想求助的是 这程序的设计过程。
因为不是自己写的程序,请按您的思路结合此程序指出一些设计该程序中可能遇到的问题,及解决方法就好。

万分感谢!
ORG 0000H
AJMP MAIN
ORG 001BH
AJMP T1_IN
ORG 0080H
MAIN: MOV TMOD,#10H
MOV TH1,#0DBH
MOV TL1,#0F0H
MOV IE,#88H
MOV A,#00H
MOV R4,#04H
MOV DPTR,#TAB1
SETB 30H
CLR TR1
LP: ACALL KEY
SJMP LP
KEY: MOV P3,#0FFH
MOV A,P3
CPL A
JZ EXIT
ACALL DELAY
MOV A,P3
CPL A
JZ EXIT
JB ACC.0,KEY1
JB ACC.1,KEY2
JB ACC.2,KEY3
JB ACC.3,KEY4
EXIT: RET
KEY1: MOV A,P3
JNB ACC.0,KEY1
MOV DPTR,#TAB1
SETB 30H
SETB TR1
RET
KEY2: MOV A,P3
JNB ACC.1,KEY2
MOV DPTR,#TAB2
CLR 30H
SETB TR1
RET
KEY3: MOV A,P3
JNB ACC.2,KEY3
CLR TR1
RET
KEY4: MOV A,P3
JNB ACC.3,KEY4
SETB TR1
RET
T1_IN: MOV TH1,#0DBH
MOV TL1,#0F0H
MOV A,#00H
MOVC A,@A+DPTR
MOV P0,A
INC DPTR
CLR A
DJNZ R4,T1_END
JNB 30H,LP1
MOV DPTR,#TAB1
SJMP LP3
LP1: MOV DPTR,#TAB2
LP3: MOV R4,#04H
T1_END: RETI
DELAY: MOV R7,#24
L1: MOV R6,#0FAH
DJNZ R6,$
DJNZ R7,L1
RET
TAB1: DB 01H,02H,04H,08H
TAB2: DB 08H,04H,02H,01H
END

设计思路:
1、分析功能需求:四个按键控制步进电机的四种状态,那么必须要在程序中有IO口按键扫描程序;
而且步进电机的控制一定要先设置好定时器。
2、功能模块定义:四个按键对应四个函数,每个函数实现不同功能,对于正反转,先定义控制电机每一步时P0口的数据列表,把列表地址赋给DPTR,即TAB1,和TAB2,分别为正转和反转的数据列表,当按下按键1、2的时候,分别把对应的地址赋给DPTR,然后在定时器1的ISR中,轮询把数据列表中的数据一次发送给P0口控制步进电机;对于按键3、4,就是简单设置TR1,控制定时器1的打开与关闭。
大体思路就是这样,楼主发的这个程序不是很完善,只能实现基本功能,切不可用于实际工程应用,因为没有考虑到按键电流的消斗和按键冲突的处理,所以会不稳定,存在安全隐患追问

1.在程序设计中会有什么问题出现,还有该怎么解决。您能根据程序假设几个么
2.IO口按键扫描程序,请这里能细讲一下
3.定时器,在这里是怎么设置的

谢谢!

追答

1、这个程序比较简单,出现问题应该是定时器的控制,比如按键放开的时候程序里忘了CLR TR1,只要记住SET TR1和CLR TR1成对出现就OK
2、其实你的主程序里
LP: ACALL KEY
SJMP LP
KEY: MOV P3,#0FFH
MOV A,P3
CPL A
JZ EXIT
ACALL DELAY
MOV A,P3
CPL A
JZ EXIT
JB ACC.0,KEY1
JB ACC.1,KEY2
JB ACC.2,KEY3
JB ACC.3,KEY4
EXIT: RET
这一段就是IO口按键扫描程序,也是就只要单片机运行起来,这段代码就一直循环执行,然后判断P3口相应的位,如果对应的端口是高电平,就转到相应的子程序运行。举例,如果P3.2口输入了高电平,那么子程序KEY3就会运行。如果P3口没有电平输入,那么上面这段代码就会一直循环下去;
3、定时器设置
MOV TMOD,#10H //设置定时器1 为模式1
MOV TH1,#0DBH //设置TH1
MOV TL1,#0F0H //设置TL1
MOV IE,#88H //在中断使能寄存器设置定时器1中断,还有其他中断位
定时器1的设置就这几个寄存器,具体每一位是干什么的很多教材都有,可以参考一下,以上是对定时器1的设置,定时器1的开启和关闭要控制TR1,就是后面的SET TR1和CLR TR1。

追问

IO口按键扫描程序
怎么看P3.2口有没有高电平输入?
比如说,P3.2口有输入高电平,是什么指令
没有输入高电平,是什么指令

谢谢!

追答

P3口是你接按键的IO口,高低电平是按键控制的,外部输入的,JB是判断置位跳转,JB ACC.0,KEY1,就是如果ACC.0位是1时,跳转到KEY1执行,JZ指令是相反的,当操作数是0时跳转

P3口是你接按键的IO口,高低电平是按键控制的,外部输入的,JB是判断置位跳转,JB ACC.0,KEY1,就是如果ACC.0位是1时,跳转到KEY1执行,JZ指令是相反的,当操作数是0时跳转

温馨提示:答案为网友推荐,仅供参考
相似回答