程序如下,已给出。
其中 晶体振荡频率为 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.在程序设计中会有什么问题出现,还有该怎么解决。您能根据程序假设几个么
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时跳转