单片机汇编程序

单片机汇编程序,第1张

对的,这个算法的确有点迷惑人。

首先,你要明确51内核的SP是自下向上的增长方式。还有,它的压栈是先加指针,再将数据放入SP指向单元,出栈是先将SP指向单元数据d出,再将SP指针减1。

30个的数据对应的地址是20H~~3DH,使用SP指针读取数据的命令只有POP指令,它只能从3DH向前“读取”数据,这就是这个方法的迷惑之处。

所以指针要先指向3DH,这样就可以依次向前读取30个单元的值了。

能力有限,肯能讲解的不够清楚,希望对你有帮助。

1、51单片机C语言实现循环8个流水灯左移三次,后右移三次。

例程:

#include<reg51h>  //51单片机头文件

#include <intrinsh> //包含有左右循环移位子函数的库

#define uint unsigned int    //宏定义

#define uchar unsigned char  //宏定义

sbit beep=P2^3;

void delay(uint z)  //延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms

{                    //delay(500);大约延时500ms

    uint x,y;

    for(x=z;x>0;x--)

        for(y=110;y>0;y--);    

}

void main()            //主函数

{

    uchar a,i,j;

    while(1)        //大循环

    {

        a=0xfe;     //赋初值

        for(j=0;j<3;j++) for(i=0;i<8;i++)   //左移三次

        {

            P1=a;       //点亮小灯

            beep=0;     //开启蜂鸣器

            delay(50); //延时50毫秒

            beep=1;     //关闭蜂鸣器

            delay(50);  //再延时50毫秒

            a=_crol_(a,1); //将a变量循环左移一位

        }

        a=0x7f;

       for(j=0;j<3;j++) for(i=0;i<8;i++)  //右移三次

        {

            P1=a;       //点亮小灯

            beep=0;     //开启蜂鸣器

            delay(50); //延时50毫秒

            beep=1;     //关闭蜂鸣器

            delay(50);   //再延时50毫秒

            a=_cror_(a,1); //将a变量循环右移一位

        }        

    }

}

2、51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。

主程序:

void main (void)

{

bit flag=0;

uchar pluse;//脉冲个数

TMOD=0X50;

TH1=(65536-100)/256;

TL1=(65536-100)%256;

ET1=1;

EA=1;

TR1=1;

while(1)

{display(pluse);}

}

中断程序:

void timer1(void) interrupt 3

{

if(flag==0)//计数满了

{

P1^7=1;

TMOD=0X10;//转成内部定时

TH1=(65536-10000)/256;

TL1=(65536-10000)%256;

flag=1;

}

else //定时时间到

{

P1^7=0;

TMOD=0X50;//转成外部计数

TH1=(65536-100)/256;

TL1=(65536-100)%256;

pluse++;

flag=0;

}

}

#include<reg51h>包含了所有接口和地址的名称,不只是特殊功能寄存器,

#define uchar unsigned char//

#define uint unsigned int//是宏定义,这样定义以后,在接下来的程序当中就能用uint 代替unsigned int了,void DelayMS(uint x)//是一个子函数,当调用时,就直接执行大括号里面的语句,while(x--)//是循环语句,当X--=0时,就不满足条件,跳出循环。它整个的功能就是一个延时,等待单片机处理完其它任务,这样写程序符合程序的规范化和可读性的要求,

void是说明返回值是空的,即没有返回值,可以不写,LED=~LED;//是取反,每次执行这条语句就会使其值取反,若上次是0,则执行后其值变为1,

DelayMS(100);就是调用了上面的子函数,代表延时100MS

以上就是关于单片机汇编程序全部的内容,包括:单片机汇编程序、很简的51单片机C语言流水灯程序、单片机程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9352247.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存