单片机定时中断 循环点亮LED灯

来源:百度知道 编辑:UC知道 时间:2024/06/17 15:28:05
我有个51单片机的实验,要求51单片机的P1口外接发光二极管依次点亮1秒,不断循环。(1秒延时采用定时器定时)
我的程序如下:
ORG 0000H
AJMP MAIN
ORG 001BH
AJMP SERVE
MAIN: MOV A,#01H
LOOP: RL A
MOV P1,A
MOV TMOD,#10H
MOV 30H,#0AH
SETB ET1
SETB EA
MOV TH1,#3CH
MOV TL1,#0B0H
SETB TR1
SJMP $
SERVE:PUSH PSW
PUSH ACC
MOV TH1,#3CH
MOV TL1,#0B0H
DJNZ 30H,RETUNT
MOV 30H,#0AH
AJMP LOOP
RETUNT:POP ACC
POP PSW
RETI
END

其实我对这东西非常不了解,所以这个程序肯定是有问题的.希望会的人能帮我指出错误,同时帮我提出解决方法.

在此我指出你程序的三点:
1:你写汇编程序注意程序的入口地址,比如:“ORG 0000H,主程序开始的入口ORG 0100,中断程序开始的入口 ORG 0200等等...”。你要知道汇编和C不同,汇编比起C语言要相对机械一些。汇编程序是写入硬件内部的,严格的配合硬件的结构,于是从上往下执行时,你的汇编程序注意标程序的入口地址,加上合适的跳转。
2:你把PSW ACC入栈保护起来做什么? 搞得程序执行都不按常理了。你找书熟悉下它们,有时画蛇添足也会出问题的。
3:main程序前面一般都是初始化程序,而你的程序前面是要循环的内容。写程序不仅需要逻辑,还需要你写得规范,条理清澈。

以下我帮你修改了你写得程序,“//”后面接的是多余的程序。我还帮你添加了几条,你自己对照看。 下面的程序可以直接烧进单片机板子调试出现象。你也可以用KEIL自己仿真看。下面的程序你把它们完整黏贴上KEIL编译就可。不需要改了,我QQ272414531,有什么问题可以直接问我。如果答案满意,请采纳,谢谢:
ORG 0000H
LJMP MAIN
ORG 001BH
LJMP SERVE
ORG 0100H
MAIN: //MOV A,#01H
LOOP: //RL A
SETB C
MOV A,#0feH
MOV P1,#0FEH
MOV TMOD,#10H
MOV 30H,#0AH
SETB ET1
SETB EA
MOV TH1,#3CH
MOV TL1,#0B0H
SETB TR1
SJMP $
ORG 0200H
SERVE://PUSH PSW
//PUSH ACC
MOV TH1,#3CH
MOV TL1,#0B0H
DJNZ 30H,RETUNT