常用的51单片机程序

发布者:kappa20最新更新时间:2021-04-19 来源: eefocus关键字:51单片机  初始化  子程序 手机看文章 扫描二维码
随时随地手机看文章

51程序集


;片内RAM初始化子程序


IBCLR:MOVA,R0

MOVR1,A

CLRA

IBC1:MOV@R1,A

INCR1

DJNZR7,IBC1

RET


;片外RAM初始化子程序


EBCLR1:MOVA,ADDPL

MOVDPL,A

MOVA,ADDPH

MOVDPH,A

CLRC

EBC11:MOVX@DPTR,A

INCDPTR

DJNZR7,EBC11

RET


;片外RAM初始化子程序(双字节个单元)


EBCLR2:MOVA,ADDPL

MOVDPL,A

MOVA,ADDPH

MOVDPH,A

MOVA,R7

JZEBC21

INCR6

EBC21:CLRA

MOVX@DPTR,A

INCDPTR

DJNZR7,EBC21

DJNZR6,EBC21

RET



;内部RAM数据复制程序

;入口:R0,R7

;占用资源:A

;堆栈需求:2字节

;出口:R1


IBMOV:MOVA,R0

ADDA,R7

MOVR0,A

MOVA,R1

ADDA,R7

MOVR1,A

IBM1:DECR0

DECR1

MOVA,@R0

MOV@R1,A

DJNZR7,IBM1

RET


;外部RAM数据复制程序

;入口:ADDPH,ADDPL,R7

;占用资源:ACC

;堆栈需求:2字节

;出口:R0,R1


EBMOV1:MOVA,ADDPL

ADDA,R7

MOVDPL,A

CLRA

ADDCA,ADDPH

MOVDPH,A

MOVA,R7

ADDA,R1

XCHA,R0

ADDCA,#00H

MOVP2,A

EBM11:DECR0

CJNER0,#0FFH,EBM12

DECP2

EBM12:DECDPL

MOVA,DPL

CJNEA,#0FFH,EBM13

DECDPH

EBM13:MOVXA,@R0

MOVX@DPTR,A

DJNZR7,EBM11

RET


;外部RAM数据复制程序

;入口:ADDPH,ADDPL,R6,R7

;占用资源:ACC

;堆栈需求:2字节

;出口:R0,R1


EBMOV2:MOVA,ADDPL

ADDA,R7

MOVDPL,A

MOVA,R6

ADDCA,ADDPH

MOVDPH,A

MOVA,R7

ADDA,R1

XCHA,R0

ADDCA,R6

MOVP2,A

MOVA,R7

JZEBM21

INCR6

EBM21:DECR0

CJNER0,#0FFH,EBM22

DECP2

EBM22:DECDPL

MOVA,DPL

CJNEA,#0FFH,EBM23

DECDPH

EBM23:MOVXA,@R0

MOVX@DPTR,A

DJNZR7,EBM21

DJNZR6,EBM21

RET


;外部RAM数据复制到内部RAM程序

;入口:ADDPH,ADDPL,R7

;占用资源:ACC

;堆栈需求:2字节

;出口:R0


ITEMOV:MOVA,ADDPL

ADDA,R7

MOVDPL,A

MOVA,ADDPH

ADDCA,#00H

MOVDPH,A

MOVA,R0

ADDA,R7

MOVR0,A

ITEM1:DECR0

DECDPL

MOVA,DPL

CJNEA,#0FFH,ITEM2

DECDPH

ITEM2:MOVXA,@DPTR

MOV@R0,A

DJNZR7,ITEM1

RET




;限幅滤波程序

;入口:A,SDAT,DELTY

;占用资源:B

;堆栈需求:2字节

;出口:A


JUGFILT:MOVB,A

CLRC

SUBBA,SDAT

JNCJUGFT1

CPLA

INCA

JUGFT1:SETBA

SUBBA,#DELTY

JNCJUGFT3

MOVA,SDAT

RET

JUGFT3:MOVA,B

MOVSDAT,A

RET


;中位值滤波程序

;入口:ADDPH,ADDPL,N

;占用资源:ESELSORT

;堆栈需求:4字节

;出口:A


MEDFILT:LCALLESELSORT

MOVA,N

CLRC

RRCA

ADDA,ADDPL

MOVDPL,A

MOVA,ADDPH

MOVDPH,A

JNCMEDFT1

INCDPH

MEDFT1:MOVXA,@DPTR

RET


;N点算术平均滤波

;入口:ADDPH,ADDPL,N

;占用资源:B,R3,R4

;堆栈需求:2字节

;出口:A


AVFILT:MOVA,ADDPL

MOVDPL,A

MOVA,ADDPH

MOVDPH,A

CLRA

MOVR3,A

MOVR4,A

MOVR7,N

AVFT1:MOVXA,@DPTR

INCDPTR

ADDA,R4

MOVR4,A

JNCAVFT2

INCR3

AVFT2:DJNZR7,AVFT1

MOVR7,N

MOVR2,#00H

LCALLNDIV31

MOVA,R4

RET


;N点加权平均滤波

;入口:ADDPH,ADDPL,N

;占用资源:B,R3,R4

;堆栈需求:2字节

;出口:A


QAVFILT:CLRA

MOVR3,A

MOVR4,A

MOVR7,N

MOVP2,ADDPH

MOVR1,ADDPL

MOVDPTR,#QAVTAB

QAVFT1:MOVCA,@A+DPTR

MOVB,A

MOVXA,@R1

INCDPTR

INCR1

MULAB

ADDA,R4

MOVR4,A

MOVA,B

ADDCA,R3

MOVR3,A

DJNZR7,QAVFT1

MOVA,R4

JNBACC.7,QAVFT2

INCR3

QAVFT2:MOVA,R3

RET

QAVTAB:DB


;一阶加权滞后滤波程序

;入口:A,DELTY

;占用资源:B,R3,R4

;堆栈需求:2字节

;出口:A


BQFILT:MOVB,A

CLRA

MOVDPTR,#ABTAB

MOVCA,@A+DPTR

MULAB

MOVR4,A

MOVR3,B

MOVA,#01H

MOVCA,@A+DPTR

MOVB,DELTY

MULAB

ADDA,R4

MOVR4,A

MOVA,B

ADDCA,R3

MOVR3,A

MOVA,R4

JNBACC.7,FT1

INCR3

FT1:MOVA,R3

MOVDELTY,A

RET

BQTAB:DB80H,80H




;双字节取补程序 /(R3R4)=(R3R4)

;入口:R3,R4

;占用资源:ACC

;堆栈需求:2字节

;出口:R3,R4


CMPT:MOVA,R4

CPLA

ADDA,#01H

MOVR4,A

MOVA,R3

CPLA

ADDCA,#00H

MOVR3,A

RET


;N节取补程序 /([R0])=([R0])

;入口:R0,R7

;占用资源:ACC,B

;堆栈需求:2字节

;出口:R0


NCMPTN:MOVB,R0

SETBC

NCPT1:MOVA,@R0

CPLA

ADDCA,#00H

MOV@R0,A

INCR0

DJNZR7,NCPT1

MOVR0,B

RET


;双字节无符号数加法程序 (R3R4+R6R7)=(R3R4)

;入口:R3,R4,R6,R7

;占用资源:ACC

;堆栈需求:2字节

;出口:R3,R4,CF


NADD:MOVA,R4

ADDA,R7

MOVR4,A

MOVA,R3

ADDCA,R6

MOVR3,A

RET



;N字节无符号数加法程序 ([R0]+[R1])=([R0])

;入口:R0,R1,R7

;占用资源:ACC,B

;堆栈需求:2字节

;出口:R0,CF


NADDN:MOVB,R0

CLRC

NADN1:MOVA,@R0

ADDCA,@R1

MOV@R0,A

INCR0

INCR1

DJNZR7,NADN1

MOVR0,B

RET


;双字节无符号数减法程序 (R3R4-R6R7)=(R3R4)

;入口:R3,R4,R6,R7

;占用资源:ACC

;堆栈需求:2字节

;出口:R3,R4


NSUB:MOVA,R4

CLRC

SUBBA,R7

MOVR4,A

MOVA,R3

SUBBA,R6

MOVR3,A

RET


;N字节无符号数减法程序 ([R0]-[R1])=([R0])

;入口:R0,R1,R7

;占用资源:ACC,B

;堆栈需求:2字节

;出口:R0,CF


NSUBN:MOVB,R0

MOVR7,N

CLRC

NSUBN1:MOVA,@R0

SUBBA,@R1

MOV@R0,A

INCR0

INCR1

DJNZR7,NSUBN1

MOVR0,B

RET


;单字节无符号数乘法程序 (R3R4*R7)=(R2R3R4)

;入口:R3,R4,R7

;占用资源:ACC,B

;堆栈需求:2字节

;出口:R2,R3,R4


NMUL21:MOVA,R4

MOVB,R7

MULAB

MOVR4,A

MOVA,B

XCHA,R3

MOVB,R7

MULAB

ADDA,R3

MOVR3,A

CLRA

ADDCA,B

MOVR2,A

CLROV

RET


;单字节无符号数乘法程序 (R2R3R4*R7)=(R5R2R3R4)

;入口:R2,R3,R4,R6,R7

;占用资源:ACC,B

;堆栈需求:2字节

;出口:R5,R2,R3,R4


NMUL31:MOVA,R4

MOVB,R7

MULAB

MOVR4,A

MOVA,B

XCHA,R3

MOVB,R7

MULAB

ADDA,R3

MOVR3,A

CLRA

ADDCA,B

XCHA,R2

MOVB,R7

MULAB

ADDA,R2

MOVR2,A

CLRA

ADDCA,B

MOVR5,A

CLROV

RET


;单字节无符号数乘法程序 (R5R2R3R4*R7)=(R7R5R2R3R4)

;入口:R5,R2,R3,R4,R7

;占用资源:ACC,B

;堆栈需求:2字节

;出口:R7,R5,R2,R3,R4


NMUL41:MOVA,R4

MOVB,R7

MULAB

MOVR4,A

MOVA,B

XCHA,R3

MOVB,R7

MULAB

ADDA,R3

MOVR3,A

CLRA

ADDCA,B

XCHA,R2

MOVB,R7

MULAB

ADDA,R2

MOVR2,A

CLRA

ADDCA,B

XCHA,R5

MOVB,R7

MULAB

ADDA,R5

MOVR5,A

CLRA

ADDCA,B

MOVR7,A

CLROV

RET


;双字节无符号数乘法程序 (R3R4*R6R7)=(R5R2R3R4)

;入口:R3,R4,R6,R7

;占用资源:ACC,B

;堆栈需求:2字节

;出口:R5,R2,R3,R4


NMUL22:MOVA,R4

MOVB,R7

MULAB

XCHA,R4

MOVR5,B

MOVB,R6

MULAB

ADDA,R5

MOVR5,A

CLRA

ADDCA,B

MOVR2,A

MOVA,R3

MOVB,R7

MULAB

ADDA,R5

MOVR5,A

MOVA,B

ADDCA,R2

MOVR2,A

CLRA

ADDCA,#00H

XCHA,R3

MOVB,R6

MULAB

ADDA,R2

MOVR2,A

MOVA,B

ADDCA,R3

XCHA,R5

MOVR3,A

CLROV

RET


;双字节无符号数乘法程序 (R2R3R4*R6R7)=(R1R5R2R3R4)

;入口:R2,R3,R4,R6,R7

;占用资源:ACC,B

;堆栈需求:2字节

;出口:R1,R5,R2,R3,R4


NMUL32:MOVA,R4

MOVB,R7

MULAB

XCHA,R4

MOVR5,B

MOVB,R6

MULAB

ADDA,R5

MOVR5,A

CLRA

ADDCA,B

MOVR1,A

MOVA,R3

MOVB,R7

MULAB

ADDA,R5

MOVR5,A

MOVA,B

ADDCA,R1

MOVR1,A

CLRA

ADDCA,#00H

XCHA,R3

MOVB,R6

MULAB

ADDA,R1

MOVR1,A

MOVA,B

ADDCA,R3

XCHA,R5

MOVR3,A

MOVA,R2

MOVB,R7

MULAB

ADDA,R1

MOVR1,A

MOVA,B

ADDCA,R5

MOVR5,A

CLRA

ADDCA,#00H

XCHA,R2

MOVB,R6

MULAB

ADDA,R5

MOVR5,A

MOVA,B

ADDCA,R2

XCHA,R1

MOVR2,A

CLROV

RET


;N字节无符号数乘法程序 ([R0]*[R1])=([R0])

;入口:R0,R1,M,N

;占用资源:ACC,B,R2,R5,R6,R7,NCNT

;堆栈需求:2字节

;出口:R0


NMULMN:MOVA,M

ADDA,R0

MOVR5,A

XCHA,R1

XCHA,R5

ADDA,N

XCHA,R0

MOVR6,A

MOVB,M

MOVNCNT,B

NMLMN1:DECR0

DECR1

CLRA

XCHA,@R1

MOV@R0,A

DJNZNCNT,NMLMN1

MOVNCNT,B

NMLMN2:CLRA

XCHA,@R0

MOVR2,A

MOVA,R6

MOVR0,A

MOVA,R5

MOVR1,A

MOVR7,N

CLRC

NMLMN3:MOVA,R2

MOVB,@R1

INCR1

MULAB

ADDCA,@R0

MOV@R0,A

INCR0

MOVA,B

ADDCA,@R0

MOV@R0,A

DJNZR7,NMLMN3

INCR0

INCR6

DJNZNCNT,NMLMN2

MOVA,R0

CLRC

SUBBA,M

SUBBA,N

MOVR0,A

RET


;单字节无符号除法程序 (R2R3R4/R7)=(R2)R3R4 余数R7

;入口:R2,R3,R4,R7

;占用资源:ACC,B,F0

;堆栈需求:3字节

;出口:(R2),R3,R4,R7,OV


NDIV31:MOVA,R2

MOVB,R7

DIVAB

PUSHA

MOVR2,B

MOVB,#10H

NDV311:CLRC

MOVA,R4

RLCA

MOVR4,A

MOVA,R3

RLCA

MOVR3,A

MOVA,R2

RLCA

MOVR2,A

MOVF0,C

CLRC

SUBBA,R7

JBF0,NDV312

JCNDV313

NDV312:MOVR2,A

INCR4

NDV313:DJNZB,NDV311

POPA

CLROV

JZNDV314

SETBOV

NDV314:XCHA,R2

MOVR7,A

RET


;单字节无符号除法程序 (R5R2R3R4/R7)=(R5)R2R3R4 余数R7

;入口:R2,R3,R4,R7

;占用资源:ACC,B,F0

;堆栈需求:3字节

;出口:(R5),R2,R3,R4,R7,OV


NDIV41:MOVA,R5

MOVB,R7

DIVAB

PUSHA

MOVR5,B

MOVB,#18H

NDV411:CLRC

MOVA,R4

RLCA

MOVR4,A

MOVA,R3

RLCA

MOVR3,A

MOVA,R2

RLCA

MOVR2,A

MOVA,R5

RLCA

MOVR5,A

MOVF0,C

CLRC

SUBBA,R7

JBF0,NDV412

JCNDV413

NDV412:MOVR5,A

INCR4

NDV413:DJNZB,NDV411

POPA

CLROV

JZNDV414

SETBOV

NDV414:XCHA,R5

MOVR7,A

RET


;双字节无符号除法程序 (R5R2R3R4/R6R7)=(R2)R3R4 余数R6R7

;入口:R5,R2,R3,R4,R6,R7

;占用资源:ACC,B,F0

;堆栈需求:4字节

;出口:(R2),R3,R4,R6,R7,OV


NDIV42:MOVA,R1

PUSHA

MOVB,#00H

NDV421:MOVA,R2

&, nbsp;CLRC

SUBBA,R7

MOVR1,A

MOVA,R5

SUBBA,R6

JCNDV422

MOVR5,A

MOVA,R1

MOVR2,A


关键字:51单片机  初始化  子程序 引用地址:常用的51单片机程序

上一篇:c51程序调用汇编函数的一种方法
下一篇:一种基于以太网的嵌入式数字监控系统

推荐阅读最新更新时间:2024-11-13 12:00

89C51单片机与1片ADC0809组成的数据采集系统编程实例
在1个由89C51单片机与1片ADC0809组成的数据采集系统中,ADC0809的8个输入通道的地址为7FF8H~7FFFH,试画出有关接口电路图,并编写出每隔1分钟轮流采集1次8个通道数据的程序,共采样50次,其采样值存入内RAM20H单元开始的存储区中。 图片1 参考程序如下: 0~7通道地址:fef8h~feffh ORG 000H LJMP MAIN ORG 0003H LJMP I_INT0 ORG 000BH LJMP I_T0 ORG 050H MAIN: MOV
[单片机]
89C<font color='red'>51单片机</font>与1片ADC0809组成的数据采集系统编程实例
34-基于51单片机的教室智能照明控制设计
具体实现功能 系统由STC89C52单片机+时钟芯片DS1302+液晶屏LCD1602+光敏电阻+红外对管+LED灯模块+按键模块构成。 具体功能: 1、用4个LED灯模拟教室的照明灯,人数小于10人亮一个灯,10-20人亮二个灯,20-30人亮三个灯,大于30人则全亮四个灯; 2、教室使用两个红外对管来检测是否有人进入并进行人数统计,人数可以统计到二位数99人,并实时将人数显示到液晶屏LCD上,液晶屏同时显示实时日期/时间/星期; 3、利用光敏电阻检测教室的光线强弱; 4、系统分自动/手动模式,可以通过按键切换模式,并有LED指示当前所在模式; 5、在自动模式下,可以设定定时时间段,在定时时间段内,当教室
[单片机]
34-基于<font color='red'>51单片机</font>的教室智能照明控制设计
#51单片机#蓝牙模块(ATKSPPHC06从机串口)的使用方法
#include AT89X51.H #include intrins.h // 函数原形定义 #define uchar unsigned char #define uint unsigned int void main (void); // 主函数 void LED_OUT(uchar X); // LED单字节串行移位函数 void LED_print (uchar p, uchar x) ; unsigned char code LED_0F ; // LED字模表 sbit DIO = P1^0; //串行数据输入 sbit RCLK = P1^1; //时钟脉冲信号 上升沿有效 sbit SCLK =
[单片机]
#<font color='red'>51单片机</font>#蓝牙模块(ATKSPPHC06从机串口)的使用方法
MCS-51单片机定时系统
定时/计数器和中断源的多少直接决定单片机的性能。MCS-51单片机内部有两个可编程的16位定时/计数器和5个中断源,具有较强的实时处理能力和对外部应急事件的处理能力。要充分发挥单片机的功能,必须充分利用定时和中断。 定时器/计数器 一、定时和延时的区别 在单片机程序清单中,经常看到延时子程序和定时(中断)子程序。它们都能使单片机间隔一段时间后再做另一件事。例如,控制两组灯的交替闪亮。以1999年第38期九版图13为例,下面分别是用延时和定时方法的源程序。 程序1: ORG 0000H AJMP MAIN ORG 50H MAIN:MOV P1,#0AAH;第一组灯亮 ACALL DELAY ;调延时子程序 MOV P1,#55H
[单片机]
MCS-<font color='red'>51单片机</font>定时系统
51单片机学习之陆 —— 1.4 数码管的显示
1 数码管的结构和原理      一般而言,数码管都有10个引脚。图上好像只有9个引脚,原因是第三引脚和第8引脚是连接在一起的,所以看上去只有9个。 根据他们的公共端又可分为共阴极和共阳极。 共阴极 和 共阳极   位选:控制那个数码管   段选:控制数码管显示东西(如1 2 3) 数码管静态显示:    stc89c52rc是共阴极的数码管 锁存器:    OE :输出允许端 (由于OE为高电平时输出为高阻态芯片不可控,所以设计电路是必须将OE接低电平。) LE : 锁存允许端 因此,我们将锁存器的LE端与单片机某一引脚相连,再将锁存器的数据输入端(D)与单片机某组I/O 口相
[单片机]
<font color='red'>51单片机</font>学习之陆 —— 1.4 数码管的显示
51单片机(AT89C52)矩阵键盘检测程序
矩阵键盘检测思路:行线设为输出、列线设为输入获得列码,行线设为输入、列线设为输出获得行码,由行列码确定键值。 本程序可改进的地方:按键状态机中,将等待按键释放语句移到第三个状态中,可进一步提高按键扫描程序效率。 #include reg52.h #define uchar unsigned char #define uint unsigned int sbit dula=P3^0; sbit wela=P3^1; #define keyport (P1) #define keystate0 0 //按键确认状态 #define keystate1 1 //按键无动作状态 char keystate=1;
[单片机]
<font color='red'>51单片机</font>(AT89C52)矩阵键盘检测程序
51单片机之C语言-4.2数组
现在我们知道了,不同的数据实际上是占用的单元格不同,8个单元格就是char,16个坑就是int,32坑就是long. 在实际应用中,可能有很多char,比如char1,char2,char3...,也很多int1,int2,int3...,也有很多long1,long2,long3等等。这么多的变量,我们能不能归个类。比如把单元格长度相同的放在一起,比如char1,char2,char3等,这样就产生了数组的概念。那么如何把这些相同长度的单元格变量放在一起呢,也就是说如何定义一个数组呢? 一维数组的定义方式如下: 类型说明符 数组名 类型说明符: 表示你想把什么长度单元格的变量放在一起,比如是char,int还是long 数
[单片机]
51单片机减1指令(4条)
这组 指令 的作用是把所指的寄存器内容减1,结果送回原寄存器,若原寄存器的内容为00H,减1后即为FFH,运算结果不影响任何标志位,这组指令共有直接、寄存器、寄存器间址等寻址方式,当直接地址是I/O口锁存器时,“读—修改—写”操作与加1指令类似。 DEC A ;(A)-1→(A)累加器A中的内容减1,结果送回累加器A中 DEC data ;(data)-1→(data)直接地址单元中的内容减1,结果送回直接地址单元中 DEC @Ri ;((Ri))-1→((Ri))寄存器Ri指向的地址单元中的内容减1,结果送回原地址单元中 DEC Rn ;(Rn)-1→(Rn)寄存器Rn中的内容减1,结果送回寄存器Rn中
[单片机]
热门资源推荐
热门放大器推荐
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved