打印

麻烦高手解释下程序

[复制链接]
1840|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yxq1024|  楼主 | 2007-4-12 13:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ov, hm, se, top, HMI
     ORG  0000H
RESET;LJMP   MAIN
      ORG    000BH
      AJMP   ITOP
      ORG    1000H
MIAN; SETB   P1.0
      JNB   P1.1,LOOP
LOOP; JNB   P1.2,LOOP1
LOOP1;MOV SP,#60H
      MOV  B,#90H
      MOV TMOD,#01H
      MOV TL0,#0B0H
      MOV TH0,#3CH
      SETB TR0
      SETB ET0
      SETB EA
HERE; SJMP HERE
ITOP; MOV TL0,#0B0H
      MOV TH0,#3CH
      DJNZ B,LOOP3
      CLR  TR0
      CPL  P1.0
LOOP3;RETI

相关帖子

沙发
yxq1024|  楼主 | 2007-4-12 13:48 | 只看该作者

刚学单片机,不是很会分析,好像程序有错

刚学单片机,不是很会分析,好像程序有错

使用特权

评论回复
板凳
yxq1024|  楼主 | 2007-4-13 09:24 | 只看该作者

没人帮忙?????????

没人帮忙?????????

使用特权

评论回复
地板
mugenwon| | 2007-4-13 09:42 | 只看该作者

自己看书

看看指令的意思就行了。

使用特权

评论回复
5
mugenwon| | 2007-4-13 10:32 | 只看该作者

看看

JNB   P1.1,LOOP
LOOP; JNB   P1.2,LOOP1
LOOP1;MOV SP,#60H

如果P1.1=0就跳到LOOP,否则顺序执行。(但是顺序执行也是LOOP,晕???)
第2句也是这样的意思

MOV SP,#60H
堆栈指针设置,就是说堆栈从#60H开始放

MOV TMOD,#01H
      MOV TL0,#0B0H
      MOV TH0,#3CH
      SETB TR0
      SETB ET0
      SETB EA
HERE; SJMP HERE

初始化定时器,然后不断执行 HERE这句

ITOP; MOV TL0,#0B0H
      MOV TH0,#3CH
      DJNZ B,LOOP3
      CLR  TR0
      CPL  P1.0
LOOP3;RETI
定时器0中断,进一次就把B减1,如果B=0,就把定时器0关了,把P1.0取反。
程序最后是P1.0=0

使用特权

评论回复
6
yxq1024|  楼主 | 2007-4-14 12:03 | 只看该作者

那这个程序那些方面要修改?现在这样能运行吗?

那这个程序那些方面要修改?现在这样能运行吗?

使用特权

评论回复
7
yxq1024|  楼主 | 2007-4-14 14:44 | 只看该作者

帮忙看看

这个程序能实现当p1.1和p1.2都为高电平时,输出p1.0由高变为低,这个低信号维持1-2分钟后,再变为高电平,程序再重新由头开始的功能吗?
   ORG  0000H
RESET;LJMP   MAIN
      ORG    000BH
      AJMP   ITOP
      ORG    1000H
MIAN; SETB   P1.0
LOOP; JNB   P1.1,LOOP
LOOP1;JNB   P1.2,LOOP1
LOOP2; CLR  P1.0
       MOV SP,#60H
       MOV  B,#90H
       MOV TMOD,#01H
       MOV TL0,#0B0H
       MOV TH0,#3CH
       SETB TR0
       SETB ET0
       SETB EA
HERE; SJMP HERE
ITOP; MOV TL0,#0B0H
      MOV TH0,#3CH
      DJNZ B,LOOP3
      CLR  TR0
      CPL  P1.0
LOOP3;RETI

使用特权

评论回复
8
古董| | 2007-4-14 16:19 | 只看该作者

同意七楼

同意七楼

使用特权

评论回复
9
jxmemail| | 2007-4-14 16:46 | 只看该作者

问题N多

肯定不行。
首先程序不会回到头,重新执行,
其次是中断程序中CLR TR0直接后果就是程序死在了HERE; SJMP HERE处。
再由,没有给B重新赋值,定时肯定不准。

使用特权

评论回复
10
yxq1024|  楼主 | 2007-4-14 21:35 | 只看该作者

谢拉 那应该正要怎样修改呢?

那应该正要怎样修改呢?那应该正要怎样修改呢?

使用特权

评论回复
11
dengzhaoju| | 2007-4-14 22:15 | 只看该作者

能够用C语言写单片机程序

   能够用C语言写单片机程序
还再用汇编写的好难得看哦, 可以C语言写的
   

使用特权

评论回复
12
chnxc| | 2007-4-14 22:33 | 只看该作者

问题

JNB   P1.1,LOOP
LOOP; JNB   P1.2,LOOP1
LOOP1;MOV SP,#60H

楼主的上面3句话有明显的错误
你这样JNB根本没作用
P1.1不管是1还是0都是运行LOOP这句
P1.2不管是1还是0都是运行LOOP1这句

你要实现什么功能再改

使用特权

评论回复
13
yxq1024|  楼主 | 2007-4-15 09:29 | 只看该作者

回dengzhaoju

对c语言不是很会,看得不是很明白

使用特权

评论回复
14
turmary| | 2007-4-15 13:16 | 只看该作者

现在开始学习吧!!!

使用特权

评论回复
15
turmary| | 2007-4-15 20:25 | 只看该作者

C的

对应的C程序5分钟写完如下(C好棒啊)~~~

#include <atmelat89x52.h>

 /*ORG  0000H
RESET;LJMP   MAIN
*/
void T1ISR(void) interrupt 1{
  TL0=0xB0;
  TH0=0x3C;
  if (B-- == 0) {
    TR0 = 0;
    P1.0 = ~P1.0;
  }
}
/*      ORG    000BH
      AJMP   ITOP
ITOP; MOV TL0,#0B0H
      MOV TH0,#3CH
      DJNZ B,LOOP3
      CLR  TR0
      CPL  P1.0
LOOP3;RETI

*/

main() {
/*
      ORG    1000H
MIAN; SETB   P1.0
LOOP; JNB   P1.1,LOOP
*/
  P1.0 = 1;
  while (!P1.1);
/*
LOOP1;JNB   P1.2,LOOP1
*/
  whlie (!P1.2);
/*
LOOP2; CLR  P1.0
       MOV SP,#60H
       MOV  B,#90H
       MOV TMOD,#01H
       MOV TL0,#0B0H
       MOV TH0,#3CH
*/
  SP = 0x60;
  B = 0x90;
  TMOD = 0x01;
  TL0 = 0xB0;
  TH0 = 0x3C;
/*
       SETB TR0
       SETB ET0
       SETB EA
*/
  TR0 = 1;
  ET0 = 1;
  EA = 1;
/*
HERE; SJMP HERE
*/
  while (1);
}

使用特权

评论回复
16
yxq1024|  楼主 | 2007-4-16 10:29 | 只看该作者

再看看

这个程序能实现当p1.1和p1.2都为高电平时,输出p1.0由高变为低,这个低信号维持1-2分钟后,再变为高电平,程序再重新由头开始的功能吗?

#include<atmelat89s52.h>
sbit p1_0=p1^0
sibt p1_1=p1^1
sibt p1_2=p1^2
#define uchar unsigned char
uchar time;
uchar period=250
 time0()interrupt 1 using 1 {
  TH0=(65536-8333)/256;
  TL0=(65536-8333)%256;
  if(++time==period)p1_0=1,time=0;
  else p1_0=0;
                              }
  main() {
    p1_0=1;
    TMOD=0x01;
    TH0=(65536-8333)/256;
    TL0=(65536-8333)%256;
    EA=1;
    ET0=1;
    if(p1_1=1,p1_2=1) p1_0=0,TR0=1;
    else TR0=0;
    do {}while(1);
    }

使用特权

评论回复
17
jxmemail| | 2007-4-16 12:17 | 只看该作者

if(p1_1=1,p1_2=1)

服了你了。写好先编译一下,通过了再拿来帖好不好。
这种想当然,只说不练的态度,你还想做什么啊。
原理上的问题是可以原谅的,但你这种低级的语法问题,看多了是
浪费时间。劝你老老实实的自己动手调试。

使用特权

评论回复
18
turmary| | 2007-4-16 19:12 | 只看该作者

楼上的说的对,LZ真是的,回家养猪切吧~~~~

使用特权

评论回复
19
mugenwon| | 2007-4-16 23:56 | 只看该作者

要成为高手,汇编是不能不学的

汇编最能锻炼你对硬件的了解。如果你能用汇编写出程序,C就是小菜一碟了。但是汇编的基础是单片机本身硬件的结构,你必须对它了如指掌比较好。

你的程序也不能说如何的错,因为你没有说明的这个程序的目的。各位不要胡乱踩。
一点建议:不要拿B来这样的通用寄存器递减的计数,因为你用了它来计数,如果其他地方也需要的话就会影响你程序执行的灵活性。你可以用R3,R4...最好是用某个内存单元。(30H~7fH 的非堆栈部分和非可位寻址部分)

另外如果软件的实时性很重要,或者代码空间要极限压缩的话,就考虑汇编看看,否则还是用C吧。

使用特权

评论回复
20
xnjdlhw| | 2007-4-17 22:15 | 只看该作者

看看

同意楼上的说法

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

26

帖子

0

粉丝