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

笔记:下一章1、2、3……正在开发阶段。请再次访问此网页以获取最新信息。

笔记:要测试这些程序中的任何一个或写一个自己并测试,您现在不需要购买微控制器。您可以使用8051模拟器测试您的程序。这是一个大的名单8051模拟器可用的。一开始,尝试列表中给出的第一个给予EDSIM51。它很容易使用工具。

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

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

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

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

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

现在让我们来指令集8051微控制器。8051指令集可以如下所示进行分类。

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

按照给定的链接,您可以在其中访问8051微控制器的完整说明列表 -8051指令集(参见第一个表下面的标题字母顺序)。

注意:-8051微控制器属于MCS-51的微控制器系列。这基本上意味着任何其他8051个变体微控制器(由任何其他制造商制造的MCS-51系列)必须使用对MCS-51制造的相同指令集。所以 ”指令译码器”下MCS-51系列中的所有微控制器的一部分是相同的。例子:Atmel的AT89C2051是一个这样的微控制器,根据MCS-51系列下降。因此,对于英特尔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, call, jz, jnz, cjne, djnz, jmp, nop, ret, reti

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一

您可以按照上面给出该链接了解详细所有指令。有在8051或MCS-51指令集44点的指令。

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

程序找n个自然数的总和,并储存总和

方案描述: -数字“n”存储在位置35h中。必须从0到n生成的自然数字从位置55h存储。自然数量必须存储在位置36H。

分析程序描述,我们需要3个寄存器。r0存储“n”的值(在位置35h中给出)并充当用于生成自然数字的计数器,用于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 //这是间接寻址模式here.It直接是不可能将传送数据从一个寄存器到另一个寄存器中。因此,像MOV R5的指令,R7是invalid.Instead我们使用直接地址(07)寄存器R7的寄存器组的#00所生成的自然数传送到寄存器R5.Indirect它的存储位置用于寻址因为我们需要直接保存生成的自然数的存储器地址。R5保持的起始位置的地址(存储区域),作为其值即#55H。通过间接寻址,我们可以将R7中的任何值直接保存到位置#55H。

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

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

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

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

STOP:SJMP STOP //在程序结束时写入一个无限循环。当达到该指令程序的控制会卡死在这个指令,因为它是一个无限loop.To得到这个无限循环的系统重置了必须应用。

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

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

分析程序中,我们可以看到,我们需要两个寄存器存储起始源和目的地的位置。比方说我们把R0作为源和R2作为目标寄存器。现在我们需要一个计数器来计算10个字节转移从源到目标数据。让我们R3为。这是不可能直接通过使用任何种类的寻址模式的数据从一个寄存器传送到另一个寄存器中。因此,我们需要蓄能器之间的站作为临时寄存器。因此,这里是它:

程序:

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

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

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

LOOP: MOV A, @R0//使用间接寻址方式。Ro (30H)位置的内容被复制到累加器。

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

INC R0 //滚装递增1以指向下一个位置。

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

DJNZ R3, LOOP //计数器寄存器R3减1,检查是否为零。参见第一个程序“自然数之和”中的解释DJNZ

停止:sjmp stop //无限循环终止节目

生成斐波纳契系列

注意:-如果你有兴趣了解Fibonacci系列的起源和背后的故事

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

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

笔记:如果你听到的术语斐波纳契数列的第一次,在这里有一个很好看的 -斐波纳契数列的一代

程序:

BEGIN: MOV R1,30H //获取值“N”

MOV R7,#40H //系列的第一个数字“0”被存储。

使用间接寻址移动@ r7,#00h //加载值'o'来解决40h

Inc R7 //递增R7的值,从40h到41h存储下一个数字'1'

mov @ r7,#01h //将值“1”存储到位置41h。请注意,“o”和'1'是Fibonacci系列的种子值,必须手动生成。

MOV R5,#42H //新寄存器R5中装入位置的地址42H存储系列的下一个值,通过将2个先前生成的数字生成的。

12月R1

Dec R1 //计数值“n”递减2,因为我们已经生成并存储了第1个数字。

DEC R7 // R7现在从41H减少到40H。我们需要添加40H和41 H的内容来获取被存储在42H的数量。

LOOP:MOV A,@ R7 //在R7内容被移动到累加器。

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

ADD A,@ R7 //这两个值相加,并存储在加速。

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

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

DJNZ R1,LOOP //计数“N”进行检查,以零(要知道如果产生所有高达n中的数字)。

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

这3节目足够了“开始踢”在8051编程中。即将到来的文章将解释更多的节目和概念。我建议你下载Edsim51模拟器(或您更喜欢的任何其他人)并尝试这些计划。根据这些代码进行更改,并根据您的想法编写简单的代码 - 例如乘以2个数字,生成特定的系列,算术计算器等。只有通过自己做,您可以掌握编程的艺术!

快乐学习!

作者

18.评论

  1. 加里

    我注意到在您的环路斐波纳契您递增R7;因为R7已经在更高的地址(41H),它被编程以获取值,这将添加一个未知值。

    LOOP:MOV A,@ R7 //在R7内容被移动到累加器(当返回到该标签是在地址41H)

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

    添加一个,@ r7 //两个值添加并存储在acc中。(现在它在这个地址处的42h,未知值,并且会给我们一个错误的总和,加上每次迭代,我们只将一个数字添加到累加器和存储中这个数字比再次迭代)

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

  2. swetha.

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

  3. Govada Lakshman Chandra

    我想要使用低频射频识别的收费广场系统的程序或基于射频识别的相关程序,如果发现

  4. Vaibhav的bagal

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

  5. vaibhav.

    惠……
    Jojo你会回答我以前的Quetion吗?

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

    请求……回答一些问题我现在不能再等了。

  6. vaibhav.

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

    • 穆罕默德·阿斯加尔

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

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

  7. vaibhav.

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

    • 乔乔

      你好Vaibhav的,

      8051单片机没有HLT指令。HLT仅在8085微处理器及其变体的指令集中可用。

      • vaibhav.

        喔...。好的谢谢…

  8. 纽斯Stankevicius

    你好,
    首先,感谢您对这些伟大的文章和教程在8051它帮助了我很多!
    然而,我注意到第一个程序“查找N个自然数的和”(至少我是这样认为的)中的一个简单错误。
    这里是:
    MOV @ R5,07H
    EdSim说:
    未知标签 - @ R5
    在另一篇文章“8051微控制器的寻址模式”中,您说“只允许R0和R1形成寄存器间接寻址指令。”
    那么,你为什么使用R5来存储自然数的位置?
    我用R1代替,而这一切得很完美。

    • 纽斯Stankevicius

      我还注意到您使用间接寄存器中的第3方案“要生成斐波纳契数列”解决:
      MOV @ R7,#00H
      MOV @R5,
      问题还是一样的。这是一个简单的错误,还是有什么我不明白的地方?
      你为什么要使用这些确切的寄存器?
      提前谢谢你!

      • 乔乔

        你好纽斯,

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

        谢谢,
        Jojo.

  9. 哈巴

    你好主席先生,我有一个薄薄的软件8051 usbasp和thinnkware 8051编程套件。问题是我不知道如何将它连接到kit ...套件上没有特殊的引脚,而不是por pins以外的套件.pls帮助我……。

    网站:thinnkware.com

    • 乔乔

      您好哈比布,设法得到一个数据表从thinnkware.com的编程工具。

  10. Anurag马利克

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

Baidu