谁能给我一些简单的51单片机的汇编程序,然后用c语言翻译一下啊

如题所述

ORG      00H                  ;起始地址

STRAT                    ;程序已开始初始一些所需要的变量,如进位c清零等

           MOV      A,#0FFH       ;累加器的八位全置一(0ffh),发光二极管全熄灭         

           CLR        C                 ;进位c被清零,c=0

           MOV     R1,#8         ;R1等于八,循环八次(右移八次),用R1做计数器

RIGHT

            RRC        A             ;把进位c在累加器A中从左到右轮换一次

            MOV       P2,A              ;输出到P2口

            CALL      DELAY               ;调用延时子程序,延时一秒

             DJNZ      R1,RIGHT           ;R1减一如果不为零,跳回RIGHT循环执行

            MOV       R2,#7                 ;   R2=7为向左流动设置次数

LEFT           

            RLC       A                   ;把进位C在累加器中从左向右轮换一位

             MOV      P2,A           ;    输出至P2口

             CALL      DELAY   ;调用延时子程序延时1秒

             DJNZ       R2,LEFT;是否左移了七次,如果不是则跳回LEFT继续执行 

             JMP        START                   ;跳回一开始重复执行该流水灯程序

DELAY

                     MOV   R3,#20

D1:            

                    MOV   R4,#100

D2:              

                    MOV    R5,#248

                    DJNZ   R5,$ ;R5减一如果不为零就执行本行。时间计算【1+(248×2)】×100×20

                    DJNZ     R4,D2              ;上一个语句是执行一次耗费两个周期,要执行248次

                    DJNZ     R3,D1        ;所以时间就是248×2,MOV R5,#248这个语句是一个周期

                                                   ;所以为248×2+1,DJNZ  R4,D2这个是R4减一次就执行D2

                     RET                    ;   DJNZ R3,D1同理  所以是(1+248×2)×100×20个机器周期

                     END       ;如果是按12兆的晶振(一个机器周期1微妙)来算那 时间等于(1+248×2)×100×20个机器周期×1微妙=1000000微妙=1秒,如果是11.0592兆的晶振那 时间等于(1+248×2)×100×20×12/11.0592微妙,也就是说一个机器周期的时间等于12/(晶振的频率)。

这个是P2口 8个灯的循环亮程序;顺便帮你写个c语言的程序,高手勿喷啊

 #include<reg51.h> 

  #include<intrins.h>

  #define uint unsigned int

  #define uchar unsigned char

  void delay();

  void main()

  {   

   uchar a;

    P2=0x01;

   while(1)

{   

    for(a=0;a<7;a++)

    {

      P2=_crol_(P1,1);

      delay();

    }

    for(a=0;a<7;a++)

       {

      P2=_cror_(P1,1);

         delay();

    }

  }

  }

   void delay()

   {

 uchar s,i;

 for(s=10;s>0;s--)

      for(i=100;i>0;i--);  

   }

c语言就不多说啦,仅供参考。不过我觉得还是用c语言单片机编程简单。 电路连接见仿真图

追问

我就想知道例如MOV R4#100 对应的是c语言哪一句,写一个汇编语言,旁边写一个相同作用的c语言,就是用c语言在旁边翻译出来,用文字解释太抽象了,不好理解,能用c语言对应的是汇编的哪一句就最好了,因为分开写,还是看不懂汇编说的是什么意思啊

追答

用C语言直接操作寄存器不是很方便,得先绑定寄存器的地址;
*(volatile unsigned int *)(R4)=0x00000003;//数字为R4寄存器的地址,
R4=100;
这个你可以看单片机的datesheet上查找R4的具体地址;
翻译过来就是这句;
R3 R4寄存器是用来存放数据的,
在C语言中你定义了一个变量会被存放到寄存器中去,但是具体存放到哪个寄存器是编译器决定的,就像这样 int a; a=100; 用来存放一个数据的

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