产品概述

单片机汇编实验 单片机入门-要从汇编开始

小编 2024-11-24 产品概述 23 0

单片机入门-要从汇编开始

简介

单片机 是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器、显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等功能集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。单片机的发展先后经历了4位、8位、16位和32位等阶段。8位单片机由于功能强,被广泛用于工业控制、智能接口、仪器仪表等各个领域,8位单片机在中、小规模应用场合仍占主流地位,代表了单片机的发展方向,在单片机应用领域发挥着越来越大的作用。

51单片机

单片机的开发主要包括CPU开发、程序开发、 存储器开发、计算机开发及C语言程序开发,同时得到开发能够保证单片机在十分复杂的计算机与控制环境中可以正常有序的进行。程序开发嵌入式系统的合理应用得到了大力推广,对程序进行开发时要求能够自动执行各种指令,这样可以快速准确地采集外部数据,提高单片机的应用效率。

为啥选汇编入门

很多电子爱好者都想学习单片机这门技术,初学者入门从底层硬件入手基于汇编和c两种语言,详细的介绍了单片机的原理,指令,寄存器,以及接口等,后面还为你准备了一些小的设计。都是从单片机最基本的东西讲起,相信你一定能看懂,并且学会单片机这门有意思的技术,有什么问题可在文章后面的评论留言。

初学单片机汇编有利于深入结构的了解,但是真正工作的时候,用的是C语言;汇编语言一般只在处理器启动的时候用一下,或C语言插入汇编的调用,之后就全是C语言,汇编移植性太差,但是它的效率高,时间精度能控制好。一般汇编都不需要你自己写,拿来用就行,主要还是C语言。可以肯定的告诉 你,99%用C语言。

51单片机开发板

现在单片机的编程大多 是C语言完成

但有时代码中必须嵌入汇编语言解决某些特定的问题

对于程序调试 汇编语言更是不可或缺。

直接使用汇编指令编写单片机程序,对硬件的控制更加直接,可以直接操作物理地址,寄存器,端口等;其它更高级的语言(如:C语言)对硬件的控制是依赖于类库来实现的。并且,对于一些对程序大小和运行速度有非常严苛要求的项目而言,都必须使用汇编指令。C语言只是为了方便编写,与机器打交道的其实都是2进制得代码,汇编语言就是这些代码好记忆的名称和规则,只是比C语言难理解些。

单片机

单片机最小系统

包括

电源电路时钟晶振电路复位电路

时钟晶振电路、复位电路

程序存储器中有七个特设的地址,其功能分别是用于:0000H 复位时ROM的地址;0003H 外部中断0入口地址;000BH 定时器计数器0溢出中断入口地址;0013H 外部中断1入口地址;001BH 定时器计数器1溢出中断入口地址;0023H串行口中断入口地址;002BH 定时/计数器2溢出中断入口地址。

0000H地址是单片机复位时的PC地址,从0000H开始执行程序。

其他6个地址是单片机相应不同的中断时,所跳向对应的入口地址。

该表也叫中断向量表或称中断向量,在写程序时,这些地址不要占用。使用时一般在这6个地址写跳转指令,如AJMP,LMJP等等。

单片机汇编指令

为解决某些特定的问题代码中必须嵌入汇编语言以代替C语言完成的单片机的编程,汇编语言对于程序调试是不可或缺的。它包括:算术操作类指令,布尔变量操作类指令,逻辑操作数指令,控制转移类指令。

常用单片机汇编指令:

1 .MOV A,Rn 寄存器内容送入累加器

2 .MOV A,direct 直接地址单元中的数据送入累加器

3 .MOV A,@Ri (i=0,1)间接RAM 中的数据送入累加器

4 .MOV A,#data 立即数送入累加器

5 .MOV Rn,A 累加器内容送入寄存器

6 .MOV Rn,direct 直接地址单元中的数据送入寄存器

7 .MOV Rn,#data 立即数送入寄存器

8 .MOV direct,A 累加器内容送入直接地址单元

9 .MOV direct,Rn 寄存器内容送入直接地址单元

布尔变量操作类指令:

1. CLR C 清进位位

2 .CLR bit 清直接地址位

3 .SETB C 置进位位

4 .SETB bit 置直接地址位

控制转移类指令

1. ACALL addr11 绝对(短)调用子程序

2 .LCALL addr16 长调用子程序

3 .RET 子程序返回

4 .RETI 中断返回

5 .AJMP addr11 绝对(短)转移

6 .LJMP addr16 长转移

7 .SJMP rel 相对转移

8 .JMP @A+DPTR 相对于DPTR 的间接转移

9. JZ rel 累加器为零转移

10. JNZ rel 累加器非零转移

11. CJNE A,direct,rel 累加器与直接地址单元比较,不相等则转移

12 .CJNE A,#data,rel 累加器与立即数比较,不相等则转移

13 .CJNE Rn,#data,rel 寄存器与立即数比较,不相等则转移

14 .CJNE @Ri,#data,rel 间接RAM 单元与立即数比较,不相等则转移

15 .DJNZ Rn,rel 寄存器减1,非零转移

16 .DJNZ direct,rel 直接地址单元减1,非零转移

17 .NOP 空操作

闪烁灯汇编代码

流程图

闪烁灯汇编代码:

ORG 0000H ;初始地址

LJMP A0A0 ;跳转至I/O初始化

ORG 002BH

A0A0:MOV P0,#0FFH ;P0口初始化

MOV P1,#0FFH ;P1口初始化

MOV P2,#0FFH ;P2口初始化

MOV P3,#0FFH ;P3口初始化

A0A1:SETB P1.5 ;P1.5置1(高电平)

LCALL DELA0 ;调用延时

CLR P1.5 ;P1.5清0(低电平)

LCALL DELA0 ;调用延时

LJMP A0A1 ;跳转至开头循环

DELA0:MOV 68H,#5 ;延时

DELA1:MOV 67H,#248

DELA2:MOV 66H,#250

DJNZ 66H,$

DJNZ 67H,DELA2

DJNZ 68H,DELA1

RET

END

闪烁灯电路_亮

闪烁灯电路_灭

单片机实验过程

单片机综合训练Ⅰ实验指导书

目 录

一、 实验环境介绍 11、Keil集成开发环境介绍 1二、 实验内容 9实验一 练习使用集成调试软件 9实验二 简单输入输出 10实验三 定时器应用 11实验四 流水灯程序设计 13

一、实验环境介绍1、Keil集成开发环境介绍Keil集成开发环境是众多单片机应用开发的优秀软件之一,它集编辑、编译、仿真于一体,支持汇编语言、PLM语言、C语言的程序设计,界面友好,易学易用。(1)建立工作文件夹在规定的盘符建立一个以自己学号命名的文件夹,作为工作文件夹,将日后实验所有的文件都存放在该文件夹中。(2)进入集成开发环境双击桌面图标,进入uVision4集成开发环境。

(3)新建工程选择菜单“porject—new uvision project”,弹出“Creat New Project”对话框;

在“保存在”下拉列表中选择自己的工作文件夹,在“文件名”文本框中键入工程名(不需要键入扩展名,扩展名默认为 .uv2),单击“保存”按钮,关闭“新建工程”对话框,弹出“为目标‘target 1’选择设备”对话框,选择目标芯片型号;

选择Atmel公司的89C52芯片,单击“确定”按钮,关闭对话框,新建一个工程。

(4)新建源程序选择菜单“File—New”新建源程序文件Text1

单击保存按钮,以.C后缀名保存改文件。

(5)将源程序添加到工程中右键单击“工程窗口”中的“Source Group 1”,在弹出的菜单中选择“增加文件到组”;(注:软件汉化有误)

弹出“增加文件到组”对话框;

选中欲添加的源程序,单击“Add”按钮,源程序添加到工程中。但是,该对话框并不关闭,等待用户继续添加其他程序。添加完毕后,单击“关闭”按钮,关闭对话框。“工程窗口”中,“Source Group 1”下将出现该源程序文件名。

若对同一个文件二次添加,则会弹出如下警告框。

(6)编译和连接单击“Rebuild all target files”按钮,对原程序进行编译和连接,构造结果将在“Build Output”窗口中显示。如果程序有语法错误,则会指出错误类型及所在行,修改后,重新构造,直至没有任何语法错误。

(7)开始调试单击“开始/停止调试”按钮,进入调试状态。

在调试状态下,“构造工具栏”变为“调试工具栏”。通过单步运行,查看寄存器、存储器的值,判断程序是否运行正确。若不正确,找出问题所在,单击“开始/停止调试”按钮,停止调试,进入编辑状态,修改程序,重新编译、调试。(8)查看寄存器进入调试状态后,“工程窗口”变为“寄存器窗口”,可以查看CPU各寄存器的值。(9)查看存储器单击“存储器窗口”按钮,打开存储器窗口;该窗口共有4个标签,可显示4个存储器的值。单击一个标签,在地址栏中输入要查看的存储器单元的类型及地址。片内数据存储器 I : [地址]片外数据存储器 X : [地址]程序存储器 C : [地址]若要人为修改某存储单元的值,可右键单击该单元,在弹出的菜单中选择“更新存储器”,在弹出的文本框中输入该单元的新值,单击“确定”即可。注:十六进制数前加“0x”。(10)单步运行在调试状态下,源程序的左边有一个黄色的箭头,指示当前程序执行的位置,即将要执行的一条指令。单击“单步”按钮,程序执行一条指令,黄色箭头下移一行。寄存器和存储器的值的变化显示在相应位置。执行过的指令左边用一绿色方块标记。(11)运行到光标行若想快速、连续执行若干条指令,可将光标定位在这些指令的最后一行处,单击“运行到光标行”按钮,即可。(12)全速运行对于有些程序,只有全速运行才能实现其功能,这时只需单击“运行”按钮;若要暂停运行,单击“暂停”按钮。(13)将源程序从工程中删除一个程序调试成功后,若要调试另一个程序,可不必新建工程,只需新建一个源程序,添加到原有的工程中,同时,将前一个源程序从工程中删除。在“工程窗口”中,单击要删除的源程序名,按“Delete”键,在弹出的对话框中选择“确定”即可。对于初学者,一般一个工程中只包含一个源程序,应将多余的源程序删除。

二、实验内容实验一练习使用集成调试软件1.实验目的(1)练习使用Keil集成调试软件;(2)进一步熟悉语言指令的功能。2.实验内容按照实验指导书的说明,结合附录中的例子,练习使用Keil集成调试软件,为以后的实验打下基础。3.实验器材计算机1台4.实验步骤(1)新建工程;(2)输入源程序;(3)将源程序添加到工程中;(4)编译和连接;(5)运行程序;(6)观察记录运行过程和结果。5.实验报告要求(1)列出源程序,并加以注释;(2)结构复杂的程序,画出流程图;(3)对实验过程和结果进行分析;(4)写出心得体会。

实验二简单输入输出1.实验目的(1)进一步理解I/O口的工作原理;(2)掌握输入/输出程序的设计方法2.实验内容编写程序,点亮发光二极管3.实验器材(1)计算机1台 (2)仿真器1台 (3)开发板一套4.硬件电路

5.试编写程序点亮开发板上的发光二极管6.思考与发挥(1)如何实现多个开关控制多个发光二极管? (2)如何实现8个发光二极管闪烁?

实验三定时器应用1.实验目的(1)进一步了解定时器的结构和工作原理;(2)掌握定时器的应用程序设计方法。2.实验内容编写定时程序,实现发光二级管D1的定时1s亮灭3.实验器材(1)计算机1台 (2)仿真器1台 (3)开发板1套4.硬件连线

5.实验程序

6.思考与发挥(1)如何改变亮灭的频率?(2)计数初值变大,亮灭频率将如何变化?

实验四流水灯程序设计1.实验目的初步掌握C51程序设计方法。2.实验内容编写程序,使D0-D8,8个LED呈现流水灯效果进行左移右移滚动3.实验器材(1)计算机1台 (2)仿真器1台 (3)开发板1套4.实验程序/**************************************************************************************

LED流水灯实验 * 1

实现现象:下载程序后LED呈现流水灯效果进行左移右移滚动注意事项:无***************************************************************************************/

#include “reg52.h” //此文件中定义了单片机的一些特殊功能寄存器#include<intrins.h> //因为要用到左右移函数,所以加入这个头文件

typedef unsigned int u16; //对数据类型进行声明定义typedef unsigned char u8;

#define led P2 //将P2口定义为led 后面就可以使用led代替P2口

/*******************************************************************************

函 数 名 : delay函数功能 : 延时函数,i=1时,大约延时10us*******************************************************************************/void delay(u16 i){while(i–);}

/*******************************************************************************

函 数 名 : main函数功能 : 主函数输 入 : 无输 出 : 无******************************************************************************/void main(){u8 i;led=0xfe;delay(50000); //大约延时450mswhile(1){/ for(i=0;i<8;i++){P2=~(0x01<<i); //将1右移i位,然后将结果取反赋值到P2口delay(50000); //大约延时450ms}*/for(i=0;i<7;i++) //将led左移一位{led=crol(led,1);delay(50000); //大约延时450ms}for(i=0;i<7;i++) //将led右移一位{led=cror(led,1);delay(50000); //大约延时450ms}}}本例中main是主函数名,要执行的主函数的内容称为主函数体,主函数体用大括号{ }括起来。函数体中包含若干条将被执行的程序语句,每条语句都必须以分号为结束符。5.思考与发挥(1)流水灯的间隔时间怎么确定?(2)流水灯的移动方向和顺序怎么确定?

相关问答

单片机实验 中,怎么用 汇编 比较大小?

51单片机中,没有专门的有符号数比较指令,只能通过一些变通的方法来实现,比如:比较30H和40H中有符号数的大小,结果放在R2中,大于则为1,等于为0,小于为128...5...

单片机汇编 语言流水灯程序延时0.5秒,一共四个灯循环?

4只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。;用最直接的方式实现流水灯ORG0000HSTART:MOVP1,#01111111B;最下面的LED点亮LCALLDE.....

单片机 汇编 语言编写一个。用十个按钮分别控制十个灯。比如:按下按钮K1 LED1灯亮。按下"?

检测是否有按键按下,相应的指示灯点亮,并熄灭其它的指示灯。至于10S锁住其他按钮,如果程序不做其它的事情,最简单的方法就是点亮指示灯后延时10S,再回到主函...

单片机 C51的 汇编语言 编程

pragma只是用于之间潜入asm代码,不是变了相的混合编程技术,它不能直接调用其他文件(注意是文件)中的函数。真正意义上的多模块编程,每个模块之间都...

为什么大学 单片机 都讲 汇编 语言?

对单片机而言,汇编语言有以下优势:1.汇编语言的执行效率高,比C语言的执行效率都高。2.用汇编语言可以锻炼以机器指令编码的能力,可以以最优化的方式编写代码...

单片机汇编 一个100ms的延时程序?

DELAY:MOVR3,#100;2DLY0:MOVR2,#249;2*100DLY1:DJNZR2,DLY1;249*2*100MOVR2,#248;2*100DLY2...

单片机汇编 指令ACALL怎么用?

ACALL是51汇编的子程序调用指令,其使用范围是±2K范围,超出这个范围的调用将会出错,这时可以使用LCALL即长调用语句。调用格式如下:ACALL标号(子程序名)例...

问两个关于 单片机汇编 指令的题!1、若A=78H,R0=34H,(34H)=DCH...

[最佳回答]1(1)A=ACH,Cy=0;(2)A=54H,Cy=1;(3)A=23,Cy=1;(4)A=CE,Cy=0;2(1)~~~~~~~~~~太多了没耐心写下去了,挺简单就是按位与然后把结果存放到前面的变...

单片机汇编 语言实现三盏灯每隔两秒亮一盏?

LED1EQUP1.0LED2EQUP1.1LED3EQUP1.2ORG0000HLJMPMAINORG000BHLJMPT0ISRORG0030HMAIN:MOVTMOD,...

单片机汇编 语言和c语言区别?

学了C语言和单片机,来挑战下这个问题。Keil5同时支持汇编语言.asm和C语言.c。以下以51单片机为例。对于汇编语言,你要掌握100多条指令,背下来更好[呲牙]要区分...

猜你喜欢