51单片机实用汇编程序库.docx
《51单片机实用汇编程序库.docx》由会员分享,可在线阅读,更多相关《51单片机实用汇编程序库.docx(71页珍藏版)》请在冰点文库上搜索。
![51单片机实用汇编程序库.docx](https://file1.bingdoc.com/fileroot1/2023-7/5/8152d452-a261-4c9a-b2a2-615211cdb232/8152d452-a261-4c9a-b2a2-615211cdb2321.gif)
51单片机实用汇编程序库
51单片机实用程序库
4、1流水灯
程序介绍:
利用P1 口通过一定延时轮流产生低电平
输出,以达到发光二极管轮流亮得效果。
实际应用中例如:
广告灯箱彩灯、霓虹灯闪烁。
程序实例(LAMP、ASM)
ORG0000H
AJMPMAIN
ORG 0030H
MAIN:
9
MOVA,#00H
MOVP1,A;灭所有得灯
MOVA,#11111110B
MAIN1:
MOVP1,A ;开最左边得灯
ACALLDELAY;延时
RLA;将开得灯向右边移
AJMPMAIN ;循环
DELAY:
MOV30H,#0FFH
D1:
MOV31H,#0FFH
D2:
DJNZ31H,D2
DJNZ30H,D1
RET
END
4、2方波输出
程序介绍:
P1、0口输出高电平,延时后再输出低电
平,循环输出产生方波。
实际应用中例如:
波形发生器。
程序实例(FAN、ASM):
ORG 0000H
MAIN:
;直接利用P1、0 口产生高低电平地形成方波//////////////
ACALLDELAY
SETBP1、0
ACALLDELAY
10
CLRP1、0
AJMP MAIN
;//////////////////////////////////////////////////
DELAY:
MOVR1,#0FFH
DJNZR1,$
RET
END
五、定时器功能实例
5、1定时1秒报警
程序介绍:
定时器1每隔1秒钟将p1、o得输出状态改变1
次,以达到定时报警得目得。
实际应用例如:
定时报警器。
程序实例(DIN1、ASM):
ORG 0000H
AJMPMAIN
ORG000BH
AJMPDIN0;定时器0入口
MAIN:
TFLAGEQU 34H;时间秒标志,判就是否到50个
0、2秒,即50*0、2=1 秒
MOV TMOD,#00000001B;定时器0 工作于方式
1
MOV TL0,#0AFH
MOV TH0,#3CH;设定时时间为0、05 秒,定时
20 次则一秒
11
SETBEA;开总中断
SETB ET0;开定时器0中断允许
SETBTR0;开定时0运行
SETBP1、0
LOOP:
AJMPLOOP
DIN0:
;就是否到一秒////////////////////////////////////////
INCC:
INCTFLAG
MOVA,TFLAG
CJNEA,#20,RE
MOVTFLAG,#00H
CPL P1、0
;//////////////////////////////////////////////////
RE:
MOV TL0,#0AFH
MOVTH0,#3CH;设定时时间为0、05 秒,定时
20次则一秒
RETI
END
5、2频率输出公式
介绍:
f=1/t
s51使用12M 晶振,一个周期就是1微秒使用定时器1
工作于方式0,最大值为65535,以产生200HZ得频率为
例:
200=1/t:
推出t=0、005秒,即5000微秒,即一个高电
12
平或低电平得时间为2500微秒。
这样,定时值应设为
65535-2500=63035,将它转换为十六进制则为:
F63B.
具体程序请瞧f200、asm
频率递增:
200HZ:
63035:
F63B
250HZ:
63535:
F82F
300HZ:
63868:
F97C
5、3200HZ 频率输出
程序介绍:
利用定时器定时,在P1、0口产生200HZ
得频率输出.实际应用例如:
传感器前级推动.
程序实例(F200、ASM):
ORG 0000H
AJMPMAIN
ORG001BH
AJMPDIN0
MAIN:
CLRP1、0;产生一个低电平,实际上
就是从p1、0口产生频率
MOVTMOD,#00010000B ;定时器1工作于方式0
MOV TH1,#0F6H
MOVTL1,#3BH ;频率产生得时间,详细请
见频率公式
SETBEA;开总中断
13
SETBTR1;开定时器1运行
SETBET1 ;开定时器1允许
LOOP:
AJMPLOOP ;无限循环
DIN0:
CPLP1、0;产生一个高电平,
下次来就就是低电平(因为取反),一个高电平与一个低电平
形成一个周期
MOVTH1,#0F6H
MOVTL1,#3BH ;重置频率产生时间
RETI;返回
END
5、4200——250HZ 变化频率输出
程序介绍:
利用定时器定时时间得变化,由P1、0口
产生200—-250HZ 变化得频率。
实际应用例如:
传感器
前级推动、频率发生器。
程序实例(F250、ASM):
ORG 0000H
AJMPMAIN
ORG001BH
AJMPDIN1
MAIN:
;定义频率200 与300//////////////////////////////////
F2HEQU30H
F2L EQU31H
F3HEQU32H
F3LEQU33H
14
;//////////////////////////////////////////////////
;定义频率保持初值//////////////////////////////////
MOVR1,#50
MOVR2,#02H
;//////////////////////////////////////////////////
;频率赋初值////////////////////////////////////////
MOV F2H,#0F6H
MOV F2L,#3BH
MOVF3H,#0F8H
MOVF3L,#2FH
;//////////////////////////////////////////////////
CLRP1、0;在P1、0口产生一个低
电平,一个脉冲就是由一个高电平与一个低电平组成得
MOVTMOD,#00010000B;定时器工作于方式1
MOVTH1,F2H
MOVTL1,F2L;200HZ输出
SETBEA;开总中断
SETB TR1 ;开定时器1 运行
SETB ET1 ;开定时器1允许
LOOP:
AJMPLOOP
DIN1:
CPL P1、0 ;取反P1、0口,实际
就是为了不断得将p1、0得电平关系转换,即产生了频率
;频率保持时间//////////////////////////////////////
DJNZR1,RE
MOVR1,#50
DJNZR2,RE
MOVR2,#02H
15
;//////////////////////////////////////////////////
MOVA,F2H
CJNEA,F3H,XIA;频率高位到300HZ
得高位了吗?
AJMP JIA;频率高位没到
300HZ得高位值,直接将低位值加1
XIA:
INC F2L
MOVA,F2L
CJNEA,#00H,RE
INCF2H
MOV A,F2H
CJNEA,F3H,RE
;/////////////////////////////////////////////
;频率高位加到300HZ得高位值了,低位加一,到300HZ得低
位值了吗,没到出去,到了关定时器
JIA:
INCF2L;到了将200HZ频率得低位加1
MOVA,F2L
CJNEA,#F3L,RE
CLRTR1
;/////////////////////////////////////////////
RE:
MOVTH1,F2H
MOVTL1,F2L
RETI
END
16
六、数显
0——9999显示
程序介绍:
利用S51得串行口功能,实现数码管0—
—9999得循环显示。
实际应用例如:
电子计分牌。
程序实例(9999、ASM):
ORG0000H
MAIN:
GEEEQU 30H
SHI EQU31H
BEIEQU32H
QIAN EQU33H;定义个十百千
MOVGEE,#00H
MOVSHI,#00H
MOV BEI,#00H
MOVQIAN,#00H ;赋初值
MOVSCON,#00H;串行口工作于方式
0、同步移位
;显示个,十,百,千//////////////////////////////////
DISPLAY:
ACALL DELAY ;延时
MOVDPTR,#SETTAB
MOVA,GEE
MOVCA,A+DPTR
MOVSBUF,A
D1:
JNBTI,D1
17
CLRTI
MOV DPTR,#SETTAB
MOV A,SHI
MOVCA,A+DPTR
MOV SBUF,A
D2:
JNBTI,D2
CLRTI
MOVDPTR,#SETTAB
MOVA,BEI
MOVC A,A+DPTR
MOVSBUF,A
D3:
JNB TI,D3
CLRTI
MOVDPTR,#SETTAB
MOVA,QIAN
MOVCA,A+DPTR
MOV SBUF,A
D4:
JNBTI,D4
CLR TI
;/////////////////////////////////////////////
;个,十,百,千得依次加一/////////////////////
INCGEE
MOVA,GEE
CJNEA,#0AH,DISPLAY
MOVGEE,#00H
INCSHI
MOVA,SHI
CJNEA,#0AH,DISPLAY
18
MOV SHI,#00H
INCBEI
MOVA,BEI
CJNE A,#0AH,DISPLAY
MOVBEI,#00H
INC QIAN
MOV A,QIAN
CJNE A,#0AH,DISPLAY
MOV QIAN,#00H
AJMP DISPLAY
;//////////////////////////////////////////////////
;延时//////////////////////////////////////////////
DELAY:
MOVR1,#0FFH
E1:
MOVR2,#0FFH
DJNZR2,$
DJNZ R1,E1
RET
;/////////////////////////////////////////////
SETTAB:
DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,
F6H,0EEH,3EH,9CH,7AH,9EH,8EH;数显代码
END
七、AD转换
7、1 AD转换(数码显示)
程序介绍:
利用ADC0809 模拟通道3输入电压,经单片机
19
处理后在数码管上用相对应得16 进制数显示出来,0—5V对
应为0--0FFH,实际应用例如:
数据采集。
程序操作:
程序写完上电运行后,用本机配带得专用起微调
图15所示电位器,会在数码管上瞧到随不同电压而变化得对
应16进制值。
也可以用
万用表实ADC0809IN3 脚
电压,来检验所对应显
示得16进制数。
图15
程序实例(ad、asm):
ORG0000H
MAIN1:
ACALLDELAY;延时
ACALLAD ;呼叫AD 子程序
;将转换得数字量屏蔽高位低位送显////////////////////
MOV31H,30H
MOVA,30H
ANLA,#0FH
MOVDPTR,#SETTAB
MOVCA,A+DPTR
MOVSBUF,A
D1:
JNBTI,D1
CLRTI
;//////////////////////////////////////////////////
;将转换得数字量屏蔽低位高位送显////////////////////
MOVA,30H
20
ANLA,#0F0H
SWAPA
MOV DPTR,#SETTAB
MOVCA,A+DPTR
MOVSBUF,A
D2:
JNB TI,D2
CLRTI
;//////////////////////////////////////////////////
AJMPMAIN1;返回主程序
AD:
MOVDPTR,#7F00H;指向转换地址
MOVA,#03H;指向转换口
MOVXDPTR,A;转换
MOVR1,#64H
D3:
DJNZR1,D3;等100微秒转换完
MOVXA,DPTR;转换后得值给A
MOV30H,A ;转换得值给30H
RET
DELAY:
;延时
MOV R2,#0FFH
D14:
MOVR3,#0FFH
D12:
DJNZR3,D12
DJNZ R2,D14
RET
SETTAB:
DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,
0FEH,0F6H
DB 0EEH,3EH,9CH,7AH,9EH,8EH
21
7、2十六进制两位数加法器(数码显示)
程序介绍:
将ADC0809输入得两个不同电压(相同电
压也可相加,只就是为举例说明,所以取不同电压)所对应
得16 进制数相加显示出来。
实际应用例如:
取代加法运放
电路.
程序操作:
程序写完上电运行后,用本机配带得钟表
起微调图16所示电位器,输入两个不同电压,数码管会显
示两个不同得对应16 进制数,随后数码管会显示两个16
进制数相加得值.
程序实例(add2、asm):
ORG 0000H
MAIN:
ADNUMBER EQU30H ;AD转换值
ADDNUMBEREQU31H;加数值1
ADLEQU32H;//
ADHEQU33H ;ADL转换高低位值
DISL EQU34H;//
DISH EQU35H ;显示高低位值
ADDTOTAL EQU36H;第一次AD转换值
ADDJWEQU37H;加法进位数
ADDHOLDEQU38H
;赋初值////////////////////////////////////////////
MOVADDHOLD,#00H
MOV ADDNUMBER,#00H
MOVADL,#00H
MOVADH,#00H
MOVDISL,#00H
22
MOVDISH,#00H
MOVADDJW,#00H
MOVADDTOTAL,#00H
;//////////////////////////////////////////////////
MAIN1:
ACALLAD;呼叫AD 子程序
ACALLDELAY;延时
ACALLCAIFEN;呼叫AD值拆分为高
低得程序
ACALLDISPLAY;呼叫显示子程序
MOVA,ADNUMBER ;取AD值
CJNEA,ADDHOLD,ADD3;与上次AD值比
较,不相等,即输入了新得AD值,去AD3执行
AJMPMAIN1;就是相等得,证
明没有输入新得AD值,回去显示老得AD值
ADD3:
MOVA,ADDHOLD
CJNEA,#00H,ADD4
MOV ADDHOLD,ADNUMBER;有一种情况就
就是就是第一次进来,AD保持值里面就是放得初值00,与取得AD值
不同,就是这种情况,也返回去
AJMMAIN1
ADD4:
MOVADDNUMBER,ADDHOLD;就是真得输入
了新得AD值,将上次AD值给加数,为调加法程序做准备
MOVADDHOLD,ADNUMBER;将这次得AD
值也保持起来.准备与上一个AD 值相加
;显示这次输入得AD值////////////////////////////////
ACALLDELAY
ACALLCAIFEN
23
ACALLDISPLAY
;//////////////////////////////////////////////////
DISPLAY1:
ACALLDELAY;延时
ACALLADD1;呼叫加法子程序
ACALLDISPLAY ;显示
LOOP:
AJMPLOOP;返回主程序
;///////////////////////////////////////AD转换
AD:
MOVDPTR,#7F00H;指向转换地址
MOV A,#03H;指向转换口
MOVX DPTR,A ;转换
MOV R1,#64H
D1:
DJNZR1,D1 ;等100微秒转换完
MOVX A,DPTR;转换后得值给A
MOV ADNUMBER,A ;转换得值给30H
RET
;//////////////////////////////////////////////////
;拆分AD值程序//////////////////////////////////////
CAIFEN:
MOVA,ADNUMBER
ANLA,#0FH
MOVADL,A;取低位
MOVA,ADNUMBER
ANLA,#0F0H
SWAPA
MOVADH,A;取高位
MOVDISL,ADL
24
MOVDISH,ADH;给显示值
RET
;//////////////////////////////////////////////////
;显示//////////////////////////////////////////////
DISPLAY:
MOVA,DISL
MOVDPTR,#SETTAB
MOVCA,A+DPTR
MOVSBUF,A
D3:
JNBTI,D3
CLR TI
MOVA,DISH
MOV DPTR,#SETTAB
MOVC A,A+DPTR
MOVSBUF,A
D4:
JNBTI,D4
CLRTI
MOVA,ADDJW
MOV DPTR,#SETTAB
MOVCA,A+DPTR
MOVSBUF,A
D5:
JNBTI,D5
CLRTI
MOVSBUF,#00H
D6:
JNBTI,D6
CLR TI
RET
;//////////////////////////////////////////////////
25
;加法程序//////////////////////////////////////////
ADD1:
CLRC
MOVA,ADDNUMBER;取上次AD值
ADDCA,ADDHOLD;与这次AD 值相加
MOVADDTOTAL,A ;将此次加得值给与
值
JNCADDJW1;有无进位?
INCADDJW;有进位,进位值给
ADDJW
ADDJW1:
ANL A,#0FH
MOVDISL,A;加值取低位
MOVA,ADDTOTAL
ANLA,#0F0H
SWAPA
MOVDISH,A;加值取高位
RET
;//////////////////////////////////////////////////
DELAY:
;延时
MOVR3,#0AH
DD1:
MOVR1,#0FFH
D2:
MOVR2,#0FFH
DJNZR2,$
DJNZR1,D2
DJNZR3,DD1
RET
SETTAB:
DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,
26
0FEH,0F6H
DB0EEH,3EH,9CH,7AH,9EH,8EH
END
7、3软件滤波
程序介绍(7、31—7、34):
您如果接触过模电就知道,
在采集电压量时经常会碰到干扰,而在模电中经常所采用
得方法就就是加电容滤波,这就是用硬件实现得.实际上软件
完全可以达到滤波得效果,现在介绍得就是一种最经典得方
法。
在一次电压量得采集中,在很短得时间内对它进行6
次采集,将它转换为数字量后求与(7、31),分析出6 次
输入中得最大值与最小值(7、32),然后减去最大值与最
小值(7、33),除以4(7、44)得到平均值.这样实际上
就完成了一次软件滤波。
省去了复杂得硬件,而且取得了
好而精确得效果。
实际应用例如:
精确数据采集。
程序操作:
程序写入上电运行后,用本实验仪自带得
钟表起微调电位器依次输入6个电压量.7、31程序会显示
与值,7、32会继续显示最大与最小值,7、33 程序会继续显
示减后所剩得值,7、34 程序会继续显示除4 后得值。
算法说明:
为什么要选择取6个数进行计算呢?
因为
在汇编中做计算就是非常麻烦得,取6个数,减去最大值与
最小值后,取平均值就是除4、计算机得内部计算都就是二进
制,而二进制每除一个2,实际上就是向右移一次.所以为
了计算方便,我们选择取6个数,最后在算除法得时候,
只需要用单片机自带得右移位命令移2 次就行了.
27
7、31十六进制六位数加法(数码显示)
程序实例(add6、asm):
ORG0000H
MAIN:
ADNUMBEREQU30H;AD转换值
ADDNUMBEREQU 31H;加数值1
ADL EQU32H ;//
ADHEQU33H;ADL转换高低位值
DISLEQU34H;//
DISHEQU35H ;显示高低位值
ADDTOTALEQU36H;第一次AD转换值
ADDJW EQU37H;加法进位数
ADDHOLD EQU38H
ADDFLAGEQU 39H;加标志
ENDFLAGEQU40H
;赋初值////////////////////////////////////////////
MOVADDHOLD,#00H
MOVADDNUMBER,#00H
MOVADL,#00H
MOV ADH,#00H
MOVDISL,#00H
MOVDISH,#00H
MOV ADDJW,#00H
MOV ADDFLAG,#00H
MOV ENDFLAG,#00H
MOV ADDTOTAL,#00H
;//////////////////////////////////////////////////
MAIN1:
28
;显示AD值//////////////////////////////////////////
ACALLDELAY
ACALLDELAY
ACALL AD
MAIN3:
ACALL CAIFEN
ACALL DISPLAY
;//////////////////////////////////////////////////
;加这次得