• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

这个单片机程序为什么不行?

   ORG 0000H     ;程序从此地址开始运行
   LJMP MAIN     ;跳转到 MAIN 程序处

   ORG 030H     ;MAIN 从030H处开始
MAIN:SETB P1.0;
     LCALL DELAY;
     CLR P1.0;
     LCALL DELAY;
     LJMP MAIN;

DElAY:MOV R7,#250;
  D1:MOV R6,#250;
  D2:DJNZ R6,D2;
     DJNZ R7,D1;
     RET;
     END

 

这闪灯程序在仿真都好好的,为什么烧录后运行不了,而且好几个程序照书上的都不行,而复制教程的都好好,急啊,完全打击学单片机的仅存的一点信心啊!!!!格式还是语法不行!!

哪位大哥知道,明灯引路,谢谢!

全部回复(26)
正序查看
倒序查看
fu-tao
LV.4
2
2011-08-19 21:18

0
回复
贴片机
LV.8
3
2011-08-19 21:19

先硬定确件是不是好的...

0
回复
2011-08-19 21:25

为什么不用C编写呢?

0
回复
fu-tao
LV.4
5
2011-08-19 21:27
@高等数学
为什么不用C编写呢?

硬件是好的,可确定,51单片机,难道就没人知道怎么回事吗

0
回复
贴片机
LV.8
6
2011-08-19 21:40
@fu-tao
硬件是好的,可确定,51单片机,难道就没人知道怎么回事吗
建议你到这里去问:www.daxia.com/bibis  .
0
回复
2011-08-19 22:10
@fu-tao
硬件是好的,可确定,51单片机,难道就没人知道怎么回事吗

有没有烧录成功过?

0
回复
fu-tao
LV.4
8
2011-08-20 00:00
@高等数学
有没有烧录成功过?
天啊,肯定的啦,哎,失望
0
回复
2011-08-20 09:11
@fu-tao
天啊,肯定的啦,哎,失望

你还是到单片机论坛问问吧。

不知道你51是什么样的,我用的是PIC,每次烧录完了之后,必须拔了ICD2与目标板的连线,之后才可以出结果。

0
回复
贴片机
LV.8
10
2011-08-20 13:33
@高等数学
你还是到单片机论坛问问吧。不知道你51是什么样的,我用的是PIC,每次烧录完了之后,必须拔了ICD2与目标板的连线,之后才可以出结果。
主要是写完程序后复位引脚电位被拉高了.编译软件上面有一个快捷按钮,一按就行了...
0
回复
kinto
LV.5
11
2011-08-20 13:52
@贴片机
主要是写完程序后复位引脚电位被拉高了.编译软件上面有一个快捷按钮,一按就行了...

头文件有没有包含,复位电路确认了没有,晶振有没有起振?

0
回复
2011-08-20 14:14
@kinto
头文件有没有包含,复位电路确认了没有,晶振有没有起振?
单片机大家也都会啊 厉害啊
0
回复
konglingzhi
LV.6
13
2011-08-20 14:18
都没有初始化程序模块,你这东西能跑的起来才见鬼了,R6,R7在RAM的哪里,都没定义
0
回复
fu-tao
LV.4
14
2011-08-20 15:08
@konglingzhi
都没有初始化程序模块,你这东西能跑的起来才见鬼了,R6,R7在RAM的哪里,都没定义
教书上是这样写的啊,要不哪位哥手修改下让我们好好学学,期待天使出现中……
0
回复
fu-tao
LV.4
15
2011-08-20 15:14
@fu-tao
教书上是这样写的啊,要不哪位哥手修改下让我们好好学学,期待天使出现中……

 ORG 0000H     ;程序从此地址开始运行
 LJMP MAIN     ;跳转到 MAIN 程序处

 ORG 030H     ;MAIN 从030H处开始
MAIN: 
   MOV P2 ,#00H    ;P2为低电平 LED 灯亮
 ACALL DELAY  ;调用延时子程序
 MOV P2 ,#0FFH
 ACALL DELAY
 AJMP MAIN        ;跳转到主程序处

DELAY: MOV R5,#04H    ;将立即数传给寄存器R5
F3: MOV R6,#0FFH
F2: MOV R7,#0FFH
F1: DJNZ R7,F1        ;若为0程序向下执行,若不为0程序跳转到
 DJNZ R6,F2
 DJNZ R5,F3
 RET
 END

 

上面这个就烧进去行,为什么呢?

0
回复
2011-08-20 16:17
@fu-tao
 ORG0000H    ;程序从此地址开始运行 LJMPMAIN    ;跳转到MAIN程序处 ORG030H    ;MAIN从030H处开始MAIN:   MOVP2,#00H   ;P2为低电平LED灯亮 ACALLDELAY  ;调用延时子程序 MOVP2,#0FFH ACALLDELAY AJMPMAIN       ;跳转到主程序处DELAY: MOVR5,#04H   ;将立即数传给寄存器R5F3: MOVR6,#0FFHF2: MOVR7,#0FFHF1: DJNZR7,F1       ;若为0程序向下执行,若不为0程序跳转到 DJNZR6,F2 DJNZR5,F3 RET END 上面这个就烧进去行,为什么呢?

请将

      MOV R7,#250;
  D1:MOV R6,#250

改为

       MOV R7,#0FFH;
  D1:MOV R6,#0FFH

看看

0
回复
2011-08-20 16:22
@konglingzhi
都没有初始化程序模块,你这东西能跑的起来才见鬼了,R6,R7在RAM的哪里,都没定义
R6,R7这个不用定义,默认在第一工作寄存器组,字节地址为00H到07H
0
回复
835041560
LV.5
18
2011-08-20 21:26

调用延时子程序有误,上面调用时用DELAY,而定义时用DElAY,两者的"L"大小写要区分.

0
回复
qinzhendong
LV.4
19
2011-08-21 07:38
@835041560
调用延时子程序有误,上面调用时用DELAY,而定义时用DElAY,两者的"L"大小写要区分.

同意楼上  L与l

0
回复
无衣
LV.6
20
2011-08-21 12:28

标号是有点问题,你调用的是DELAY,子程序却是DElAY,不过在KEIL中,可禁用大小写敏感,估计这不会引起错误。

真正的错误是:

    单片机在执行LCALL指令时,会产生栈操作,首先要把下一条指令的地址压入堆栈,同时栈指针加1,而你在子程序中使用了R7,R7在0区的地址是07H,复位时,SP堆栈指针指向它,而你在子程序中改变了R7的值,所以,被调用的子程序不能正常的返回,导致程序跑飞。只要在MAIN的第一行加上MOV SP,#60H;使SP指向60H单元就行了。

0
回复
zvszcs
LV.12
21
2011-08-21 20:41
@无衣
标号是有点问题,你调用的是DELAY,子程序却是DElAY,不过在KEIL中,可禁用大小写敏感,估计这不会引起错误。真正的错误是:   单片机在执行LCALL指令时,会产生栈操作,首先要把下一条指令的地址压入堆栈,同时栈指针加1,而你在子程序中使用了R7,R7在0区的地址是07H,复位时,SP堆栈指针指向它,而你在子程序中改变了R7的值,所以,被调用的子程序不能正常的返回,导致程序跑飞。只要在MAIN的第一行加上MOVSP,#60H;使SP指向60H单元就行了。
路过,对程序一点不懂
0
回复
konglingzhi
LV.6
22
2011-08-22 09:21
@fu-tao
 ORG0000H    ;程序从此地址开始运行 LJMPMAIN    ;跳转到MAIN程序处 ORG030H    ;MAIN从030H处开始MAIN:   MOVP2,#00H   ;P2为低电平LED灯亮 ACALLDELAY  ;调用延时子程序 MOVP2,#0FFH ACALLDELAY AJMPMAIN       ;跳转到主程序处DELAY: MOVR5,#04H   ;将立即数传给寄存器R5F3: MOVR6,#0FFHF2: MOVR7,#0FFHF1: DJNZR7,F1       ;若为0程序向下执行,若不为0程序跳转到 DJNZR6,F2 DJNZR5,F3 RET END 上面这个就烧进去行,为什么呢?
差别就是R6,R7进行的初始化,即F3: MOV R6,#0FFH
F2: MOV R7,#0FFH。 另你第一个程序,怎么调MOV P1,0,这个是错误,0好象不识别吧,要写#00H,很久不碰单片机,很多都忘了,呵呵,编译程序时没有显示错误吗
0
回复
2011-08-23 23:31
@zvszcs
路过,对程序一点不懂
懂两点 三点就可以啦
0
回复
yousuoqiu
LV.2
24
2011-08-24 09:38
路过,之前写过,好久没弄这个了。。。
0
回复
cfbbao
LV.4
25
2011-08-24 10:01
@无衣
标号是有点问题,你调用的是DELAY,子程序却是DElAY,不过在KEIL中,可禁用大小写敏感,估计这不会引起错误。真正的错误是:   单片机在执行LCALL指令时,会产生栈操作,首先要把下一条指令的地址压入堆栈,同时栈指针加1,而你在子程序中使用了R7,R7在0区的地址是07H,复位时,SP堆栈指针指向它,而你在子程序中改变了R7的值,所以,被调用的子程序不能正常的返回,导致程序跑飞。只要在MAIN的第一行加上MOVSP,#60H;使SP指向60H单元就行了。
顶这个~~
0
回复
无衣
LV.6
26
2011-08-24 22:55
@cfbbao
顶这个~~
初学者常遇到的问题。
0
回复
fengxunshi
LV.5
27
2011-08-25 12:18
@yousuoqiu
路过,之前写过,好久没弄这个了。。。

非常常规 的51 汇编, 估计是 学校里的吧,呵,

你用什么片子跑的呀,设置不对还是

 烧进去,能不能运行 是两码事哦,

0
回复