本文是教你开发8051单片机的系列程序。我将这个编程教程分成如下所示的一系列章节。所以你可以从第一章开始,然后到第二章和第三章,以此类推。所以让我们现在就开始吧!

注意:接下来的第1、2、3章。。正在开发阶段。请再次访问此页面以获取更新。

注意:要测试这些程序或编写一个自己的程序并进行测试,您现在不需要购买微控制器板。您可以使用8051模拟器测试您的程序。这里有一个很大的清单8051模拟器可用。在开始时,尝试列表中的第一个,Edsim51。这是一种容易使用的工具。

要编程世界上任何可用的微控制器,首先需要学习和理解它的指令集。指令集包含一组指令,可供程序员创建他喜欢的任何类型的程序。或者,通过另一种方式,程序员可以使用指令集创建他正在制作的特定应用程序所需的程序。因此,首先需要掌握所有可用的指令,指令如何工作,指令的执行如何影响微控制器(影响寄存器、psw、堆栈等),以及它在程序中的使用方式。一旦掌握了指令集,就可以开始玩程序了。在开始编程之前,有一些先决条件。如果你真的是新的微控制器,如果8051是第一个你正在玩,请阅读以下文章首先。

1.微处理器与微控制器的区别

2.8051单片机基础-管脚图-架构-存储器组织

3.8051的寻址方式- - - - - -在为8051编写任何程序之前,您必须阅读本文,因为本文记录了指令处理的根。

4.8051特殊功能寄存器和I/O端口

现在让我们来看看8051单片机的指令集。8051指令集的分类如下所示。

  • 数据传输/数据移动指令
  • 算术运算指令
  • 分支程序的指令
  • 创建子例程的指令
  • 逻辑操作说明
  • 布尔运算指令
  • 特殊用途说明

跟随给定的链接,在那里你可以访问完整的指令列表8051微控制器-8051指令集(参见第一个表下面的标题字母顺序)。

注意:-8051微控制器属于MCS-51系列微控制器。这基本上意味着,任何其他制造商制造的8051变体微控制器(属于MCS-51系列)必须使用为MCS-51制作的同一套指令。因此,“指令解码器“MCS-51系列的部分微控制器是一样的。例子:Atmels AT89c2051就是属于MCS-51系列的微控制器之一。因此,为Intel 8051编写的程序也可以用来运行AT89C2051(您可能需要做一些修改以匹配硬件差异)。

1.数据传输指令包括–MOV、MOVC、MOVX、PUSH、POP、XCH、XCHD

2.在structions for arithmetic operations are- add, addc, subb, mul, div, inc, dec, da a

3.分支和子例程的说明–LJMP、AJMP、SJMP、LCALL、ACALL、JZ、JNZ、CJNE、DJNZ、JMP、NOP、RET、REI

4.逻辑操作说明- anl, orl, xrl, clr, cpl, rl, rlc, rr, rrc, swap

5.布尔变量操作说明- setb, mov, clr, jb, jnb, jbc, anl, orl, cpl, jc, JNC

6.特殊用途指令包括- movc, movx, swap, xch, xchd, jbc, reti, da a

通过上面给出的链接,您可以了解所有的详细说明。在8051或MCS-51指令集中有44条指令。

我假设你已经完成了数据传输/算术/分支和子程序指令。现在让我们写一个非常简单的程序。

一个程序来找到N个自然数的和并存储和

项目描述:-数字“N”存储在35H位置。从0到N生成的自然数必须从位置55H存储。自然数的和必须保存在36H位置。

分析程序描述,我们需要3个寄存器。R0存储“N”的值(给定位置35 h)和作为一个计数器生成自然数到N R5用于保存价值的第一个自然数的存储位置,然后R5是增加了一个每个存储每个新生成的自然数。R7初始化为0,并递增1以生成自然数。

程序:

MOV PSW, #00H //通过执行此指令选择寄存器组'0'。

MOV R0,35H//存储在位置35H中的“N”值被传输到R0。

MOV R5, #55H//存储自然数'#55H'的起始位置被转移到R5

MOV A,#00H//累加器使用值0启动,用于累计添加自然数。

MOV R7, #00H// R7被初始化为'0'以生成自然数。注意:'0'不是一个自然数。

LOOP: INC R7// R7加1生成下一个自然数。

MOV @R5, 07H//这里使用的是间接寻址模式。不可能直接将数据从一个寄存器传送到另一个寄存器。所以像MOV R5, R7这样的指令是无效的。在stead we use the direct address (07) of register R7 of register bank #00 to transfer the generated natural number to it's storage location in register R5.Indirect addressing is used as we need to save the generated natural number directly to memory address. R5 holds the starting location address (of the storage area) as its value i.e #55H.通过间接寻址,我们可以将R7中的任何值直接保存到位置#55H。

INC R5//存储位置从#55H增加1到#56H,以存储下一个生成的自然数

ADD A, R7//将生成的自然数添加到累加器的内容中。

DJNZ R0,LOOP//寄存器Ro的值(“N”的值)递减1。根据停止条件0对其进行检查。如果其R0不等于零,程序控制将再次移动到label LOOP,并再次执行INC R7的步骤,直到R0等于零。当R0等于零时,程序控制将退出循环并移到下面给出的下一条指令。

MOV 36H,A//累加器中自然数的和被移动到存储位置36H。

STOP: SJMP STOP//在程序末尾写的一个无限循环。当这个指令到达时,程序控制将在这个指令处卡住,因为它是一个无限循环。要走出这个无限循环,必须应用系统复位。

将数据块从一个位置复制到另一个位置的简单程序

项目描述:-从30H开始存储的10字节数据将从50H开始复制到另一个位置。

分析程序,我们看到,我们需要两个寄存器来存储源和目的地的起始位置。假设我们取R0作为源寄存器,R2作为目标寄存器。现在我们需要一个计数器来计数从源到目的传输的10字节数据。我们取R3。不可能通过使用任何一种寻址方式将数据从一个寄存器直接转移到另一个寄存器。所以我们需要一个累加器作为临时寄存器。这就是它:

程序:

MOV R0,#30H //源数据的起始位置地址被移动到R0。

MOV R1,#50H//目的地起始位置的地址移动到R1

MOV R3,#OAH//设置计数器R3为10。你也可以使用十进制数如MOV R3,#10d。

循环:MOV A,使用@R0//间接寻址模式。Ro(30小时)位置的内容物被复制到收集器中。

MOV @R1, A//复制累加器中的内容到Ra所指向的位置(即50H)。

INC R0 // Ro加1指向下一个位置。

INC R1//R1递增1以指向下一个位置。

DJNZ R3,循环//计数器寄存器R3递减1,并对照0进行检查。参见第一个程序“自然数之和”中的解释DJNZ

STOP: SJMP STOP //无限循环终止程序

生成斐波那契数列

注意:-如果你有兴趣了解斐波那契数列的起源及其背后的故事

项目描述:-我们都知道,斐波那契级数在数学上是一个无穷级数它的长度是0 1 1 2 3 5 8 13 21....

这里我们要写一个程序生成N项的斐波那契级数。N的值在30H位置可用,我们将从40H位置保存系列。

注意:如果你是第一次听到斐波那契数列,请仔细阅读斐波那契级数生成

程序:

开始:MOV R1,30H//获取“N”的值

MOV R7,#40H //序列的第一个数字'0'存储在这里。

MOV @R7,#00H //通过间接寻址的方式加载值'o'到40H

INC R7 //将R7的值从40H增加到41H,以存储下一个数字'1'

MOV @R7, #01H //存储值'1'到位置41H。注意'o'和'1'是fibonacci序列的种子值,必须手动生成。

MOV R5,#42H //用位置地址42H加载新的寄存器R5来存储序列的下一个值,由之前生成的2个数字相加生成。

12月1日

DEC R1 //计数值N减2,因为我们已经生成并存储了前两个数字。

DEC R7 // R7现在从41H减少到40H。我们需要添加40H和41h的内容,得到要存储在42H中的数字。

MOV A, @R7 // R7中的内容被移动到累加器。

INC R7 // R7被增加以获得下一个值。

ADD A,@R7 //这两个值被添加并存储在Acc中。

MOV@R5,A//新生成的序列值存储在R5持有的地址中。

INC R5//R5递增以存储下一个值。

DJNZ R1,LOOP //计数“N”被检查为零(以知道是否所有的数字都生成了N)。

停止:SJMP STOP//在此处无限运行或程序执行结束。

这3个程序就足够了“启动”8051年编程。更多的程序和概念将在后面的文章中解释。我建议你下载Edsim51模拟器(或其他你喜欢的)并尝试这些程序。修改这些代码,并根据你的想法编写简单的代码,比如乘2个数字,生成一个特定的序列,算术计算器等。只有自己动手,你才能掌握编程的艺术!

学习快乐!

作者

18评论

  1. 加里

    我注意到在斐波那契循环中R7是递增的;这将增加一个未知的值,因为R7已经在较高的地址(41H),它被编程来获取值。

    MOV A, @R7 // R7中的内容被移动到累加器。(当返回到这个标签时,地址是41H)

    INC R7 // R7被增加以获得下一个值。

    ADD A,@R7 //这两个值被添加并存储在Acc中。(现在它在42H,这个地址的未知值会给我们一个错误的和,加上在每次迭代中我们只向accumulator添加一个数字并存储该数字,然后再进行迭代)

    MOV@R5,A//新生成的序列值存储在R5持有的地址中。

  2. Swetha

    有人能用简单的语言给我解释一下微处理器程序吗?我不知道任何关于…所以请解释我从基本的,以便我能容易地理解…

  3. GOVADA LAKSHMAN钱德拉

    请我想要使用低频rfid或基于rfid的相关程序(如果找到)的收费广场系统程序

  4. vaibhav bagal

    在8051中,为什么程序不被NOP指令终止,为什么程序被循环终止

  5. vaibhav

    惠…。。
    乔乔,你能回答我之前的问题吗?

    请求……请尽快给我答复。

    请回答我现在等不及了。

  6. vaibhav

    你好先生,
    8051指令集中也有NOP指令
    那么为什么不使用NOP指令终止程序呢?
    为什么只使用无限循环来终止程序?
    请详细回答我。

    • 穆罕默德Asgar

      在您的程序中,当控制器发现NOP指令时,它不执行任何操作,只需增加堆栈指针,然后转到下一个位置。

      但当它在程序中发现end指令时,就停止控制器,使sp地址递增。
      这就是为什么我们使用end指令来终止程序。

  7. vaibhav

    你好,先生,这篇文章真的很棒。但是我在整篇文章中没有得到一件事,那就是为什么程序被无限循环终止,为什么不被HLT指令????终止plzzzzz回复

    • 乔乔

      你好Vaibhav,

      8051微控制器中没有HLT指令。HLT仅适用于8085微处理器及其变体的指令集。

      • vaibhav

        哦……好的谢谢…

  8. Dainius Stankevicius

    你好,
    首先,感谢您提供的这些关于8051的精彩文章和教程。它帮助了我很多!
    然而,我注意到在第一个程序“求N个自然数之和”中有一个简单的错误(至少我这么认为)。
    这里是:
    MOV @R5, 07年h
    EdSim说:
    未知标签- @R5
    在另一篇文章“8051微控制器的寻址模式”中,您说“只允许R0和R1形成寄存器间接寻址指令。”
    那么,为什么要使用R5存储自然数的位置呢?
    我用的是R1,结果很完美。

    • Dainius Stankevicius

      我还注意到你在第三个程序“生成斐波那契数列”中使用了间接寄存器寻址:
      MOV @R7 # 00 h
      MOV @R5,
      所以问题又是一样的。这是一个简单的错误,还是我显然不明白的地方?
      你为什么要用这些寄存器?
      提前谢谢你!

      • 乔乔

        你好Dainius,

        这是我这边的错误。谢谢你的通知。在间接寻址模式下只能使用R0和R1。要使用更多寄存器,可以切换组。我在写这篇文章的时候没有校对过那些程序。在模拟器中进行测试之后,我将稍后纠正它们。

        谢谢
        乔乔

  9. habeeb

    你好,先生,我有一个thinkware 8051 usbasp和thinkware 8051编程工具包,问题是我没有。i don’我不知道如何连接它与套件..除了端口引脚,套件上没有特别的引脚..请帮助我.......

    网站:thinnkware.com

    • 乔乔

      你好,Habeeb,试着从thinnkware.com上获取编程工具包的数据表。

  10. Anurag马利克

    这是我为8051找到的最好的教程。你已经很好地解释了基础知识。谢谢

Baidu