技术文档

单片机中断汇编程序 单片机入门-要从汇编开始

小编 2024-10-17 技术文档 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

闪烁灯电路_亮

闪烁灯电路_灭

51单片机外部中断处理源程序

//---------------------------------------------------

#include <reg52.h>

//---------------------------------------------------

//重定义I/0引脚名称

sbit led1=P1^1;

sbit led2=P1^2;

sbit led3=P1^3;

sbit led4=P1^4;

sbit P32=P3^2;

//---------------------------------------------------

//全局变量及位标志定义

bit FINT0;

bit FINT1;

bit FT0;

bit FT1;

bit FT2;

unsigned char T0_10ms;

unsigned char T0_50ms;

unsigned char T0_100ms;

//---------------------------------------------------

//固定函数声明

void int_0(); //外部中断0

void int_1(); //外部中断1

void timer_0(); //定时器中断1

void timer_1(); //定时器中断2

void serial_1(); //串行中断1

void serial_2(); //串行中断2

//---------------------------------------------------

//用户函数声明

void initial(); //初始化

//---------------------------------------------------

void main(){

initial();

while(1){

P32=0; //为了使按'取消'、'确定'键能够产生INT0及INT1中断

//led4=0; //上一句等价于此句

if(FINT0){ //中断0来到要做什么事情

FINT0=0;

led1=0; //INT0中断时点亮

led2=0;

led3=0;

led3=0;//可以在此设一个断点

}

if(FINT1){ //中断1来到要做什么事情

FINT1=0;

led1=1; //INT1中断时熄灭

led2=1;

led3=1;

}

if(FT0){

FT0=0;

if(++T0_10ms>30){

T0_10ms=0;

//定时多少做什么事,未初始化里定时器尚未设置

}

}

}

}

//-------------------------------------------------------------------

void initial(){

EA=1; // CPU所有中断开(IE最高位MSB)

EX0=1; // INT0中断开

IT0=0; // INT0低电平触发(为1则为下降沿触发)

EX1=1; // INT1中断开

IT1=0; // INT1低电平触发(为1则为下降沿触发)

return;

}

//-------------------------------------------------------------------

//INT0中断 由P3.2引脚产生

void int_0() interrupt 0 using 0

{

FINT0=1;

}

//-------------------------------------------------------------------

//INT1中断 由P3.3引脚产生

void int_1() interrupt 2 using 1

{

FINT1=1;

}

//-------------------------------------------------------------------

//定时器0中断

void timer_0() interrupt 1 using 2

{

FT0=1;

}

//-------------------------------------------------------------------

//定时器1中断

void timer_1() interrupt 3 using 3

{

FT1=1;

}

//-------------------------------------------------------------------

//串行中断1

void serial_1() interrupt 4

{

}

//-------------------------------------------------------------------

//定时器2中断

void timer_2() interrupt 5

{

FT2=1;

}

//-------------------------------------------------------------------

1. 项目文件夹:

先关闭其它Project,,新建一个Project,, 保存在EXT_C文件夹,此Project包含的

所有源程序文件都放在这个文件夹,统一编辑修改和编译。

2. 仿真芯片选择:

硬件仿真必须选择特定的CPU,软件仿真只需要选择一般的52系列,这里

选择常用的Atmel 89C52

3. 系统初始化文件Startup.A51:

主要是内存清零,模拟堆栈安排等系统初始化操作,有时需要修改这个宏汇编

文件, 这个Project里没有加入这个文件。

4. 单步、全速运行到中断:

编译后可以用仿真器单步查看运行结果,在判断外部中断0或1到来的地方

设置断点,全速运行,如果有外部中断(P3.2/P3.3变低或有一个下降沿),那么

程序就停在设置的断点处。

相关问答

单片机汇编 语言程序中 中断程序 怎么用,在程序中如何识别出哪里是中断服务程序,哪里是主程序?

一般在程序开头有中断子程序的入口处,在主程序里可以看到这些子程序的。标号名可以随便取,但入口地址是固定的。ORG00HAJMPMAINORG03H;外部中断0入口...

单片机中断 是怎么保存原来的数据然后继续执行的? - 奥特蛋13...

堆栈,如果你会汇编就知道有入栈出栈的动作C时编译器帮你把这个动作完成了所以你看不到。单片机中断发生后,只是自动保存了断点地址,并不保存数据。...

51 汇编中断 哪来的?

51单片机的中断源就是产生中断的源头,可以使外部中断0、外部中断1、定时器/计数器0、定时器/计数器1、串行接口。这些中断源可由用户自由配置,可以使用也可以...

51 单片机 ,用定时器 中断 ,在P1口实现1S移动一次的流水灯,用 汇编 语言编写的 程序 ?

CNTEQU30HORG0000HSJMPSTAORG000BHLJMPT0ISRORG0050HSTA:MOVTMOD,#01HMOVTH0,#3CHMOVTL0,#0B0...

单片机汇编 语言的定时器如何定义和调用使用?

TMOD定时器/计数器模式控制寄存器写入模式TH0,TL0写入初值一般为中断调用要使能计时器0时间中断,还要使能中断有效这样开中断,就可以了TMOD定时器/计数...

汇编 21号 中断 DOS功能调用是做什么的?

dos操作系统中,底层有很多驱动程序,为了使汇编语言程序开发效率更高,微软给出了一部分底层驱动程序接口供编程人员调用,这有点像C语言里的库函数,只要你按照...

单片机汇编 语言中REE:RETI什么意思啊?

REE:是个标签(label),代表地址所在,也就是说当汇编语言跳转到这里的时候会执行这个地址所在的指令RETI就是从中断返回并取出压入堆叠里面的值REE:是个标签(la...

如何设置8051 单片机 中断 优先级

[回答]PIC系列单片机只有一个中断入口(004H),所有的中断都通过该入口进入中断服务子程序,至于是哪一个中断源,只有在进入中断服务子程序后查询中断标志才...

单片机 开发中,为什么经常选用C语言和 汇编语言 ? 申请方

单片机开发经常使用汇编语言和C语言,是因为这两个语言有相对于其他语言的优势的。先说C语言吧。1、编译器容易实现。c能轻易地翻译成汇编,尤其是简...

单片机 如何按键中止-ZOL问答

你的其他12个按键也可以使用中断来处理,只是把那个暂停键设为级别最高,不管什么情况下改建按下就到该键的子程序运行(注意此时要关闭中断功能、只是判断该暂停键...

猜你喜欢