单片机汇编语言经典一百例.docx
《单片机汇编语言经典一百例.docx》由会员分享,可在线阅读,更多相关《单片机汇编语言经典一百例.docx(36页珍藏版)》请在冰豆网上搜索。
单片机汇编语言经典一百例
51单片机实用程序库
4.1流水灯
程序介绍:
利用P1口通过一定延时轮流产生低电平
输出,以达到发光二极管轮流亮的效果。
实际应用中例如:
广告灯箱彩灯、霓虹灯闪烁。
程序实例(LAMP.ASM)
ORG0000H
AJMPMAIN
ORG0030H
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):
ORG0000H
MAIN:
;直接利用P1.0口产生高低电平地形成方波//////////////
ACALLDELAY
SETBP1.0
ACALLDELAY
10
CLRP1.0
AJMPMAIN
;//////////////////////////////////////////////////
DELAY:
MOVR1,#0FFH
DJNZR1,$
RET
END
五、定时器功能实例
5.1定时1秒报警
程序介绍:
定时器1每隔1秒钟将p1.o的输出状态改变1
次,以达到定时报警的目的。
实际应用例如:
定时报警器。
程序实例(DIN1.ASM):
ORG0000H
AJMPMAIN
ORG000BH
AJMPDIN0;定时器0入口
MAIN:
TFLAGEQU34H;时间秒标志,判是否到50个
0.2秒,即50*0.2=1秒
MOVTMOD,#00000001B;定时器0工作于方式
1
MOVTL0,#0AFH
MOVTH0,#3CH;设定时时间为0.05秒,定时
20次则一秒
11
SETBEA;开总中断
SETBET0;开定时器0中断允许
SETBTR0;开定时0运行
SETBP1.0
LOOP:
AJMPLOOP
DIN0:
;是否到一秒////////////////////////////////////////
INCC:
INCTFLAG
MOVA,TFLAG
CJNEA,#20,RE
MOVTFLAG,#00H
CPLP1.0
;//////////////////////////////////////////////////
RE:
MOVTL0,#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):
ORG0000H
AJMPMAIN
ORG001BH
AJMPDIN0
MAIN:
CLRP1.0;产生一个低电平,实际上
是从p1.0口产生频率
MOVTMOD,#00010000B;定时器1工作于方式0
MOVTH1,#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):
ORG0000H
AJMPMAIN
ORG001BH
AJMPDIN1
MAIN:
;定义频率200和300//////////////////////////////////
F2HEQU30H
F2LEQU31H
F3HEQU32H
F3LEQU33H
14
;//////////////////////////////////////////////////
;定义频率保持初值//////////////////////////////////
MOVR1,#50
MOVR2,#02H
;//////////////////////////////////////////////////
;频率赋初值////////////////////////////////////////
MOVF2H,#0F6H
MOVF2L,#3BH
MOVF3H,#0F8H
MOVF3L,#2FH
;//////////////////////////////////////////////////
CLRP1.0;在P1.0口产生一个低
电平,一个脉冲是由一个高电平和一个低电平组成的
MOVTMOD,#00010000B;定时器工作于方式1
MOVTH1,F2H
MOVTL1,F2L;200HZ输出
SETBEA;开总中断
SETBTR1;开定时器1运行
SETBET1;开定时器1允许
LOOP:
AJMPLOOP
DIN1:
CPLP1.0;取反P1.0口,实际
是为了不断的将p1.0的电平关系转换,即产生了频率
;频率保持时间//////////////////////////////////////
DJNZR1,RE
MOVR1,#50
DJNZR2,RE
MOVR2,#02H
15
;//////////////////////////////////////////////////
MOVA,F2H
CJNEA,F3H,XIA;频率高位到300HZ
的高位了吗?
AJMPJIA;频率高位没到
300HZ的高位值,直接将低位值加1
XIA:
INCF2L
MOVA,F2L
CJNEA,#00H,RE
INCF2H
MOVA,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:
GEEEQU30H
SHIEQU31H
BEIEQU32H
QIANEQU33H;定义个十百千
MOVGEE,#00H
MOVSHI,#00H
MOVBEI,#00H
MOVQIAN,#00H;赋初值
MOVSCON,#00H;串行口工作于方式
0.同步移位
;显示个,十,百,千//////////////////////////////////
DISPLAY:
ACALLDELAY;延时
MOVDPTR,#SETTAB
MOVA,GEE
MOVCA,A+DPTR
MOVSBUF,A
D1:
JNBTI,D1
17
CLRTI
MOVDPTR,#SETTAB
MOVA,SHI
MOVCA,A+DPTR
MOVSBUF,A
D2:
JNBTI,D2
CLRTI
MOVDPTR,#SETTAB
MOVA,BEI
MOVCA,A+DPTR
MOVSBUF,A
D3:
JNBTI,D3
CLRTI
MOVDPTR,#SETTAB
MOVA,QIAN
MOVCA,A+DPTR
MOVSBUF,A
D4:
JNBTI,D4
CLRTI
;/////////////////////////////////////////////
;个,十,百,千的依次加一/////////////////////
INCGEE
MOVA,GEE
CJNEA,#0AH,DISPLAY
MOVGEE,#00H
INCSHI
MOVA,SHI
CJNEA,#0AH,DISPLAY
18
MOVSHI,#00H
INCBEI
MOVA,BEI
CJNEA,#0AH,DISPLAY
MOVBEI,#00H
INCQIAN
MOVA,QIAN
CJNEA,#0AH,DISPLAY
MOVQIAN,#00H
AJMPDISPLAY
;//////////////////////////////////////////////////
;延时//////////////////////////////////////////////
DELAY:
MOVR1,#0FFH
E1:
MOVR2,#0FFH
DJNZR2,$
DJNZR1,E1
RET
;/////////////////////////////////////////////
SETTAB:
DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,
F6H,0EEH,3EH,9CH,7AH,9EH,8EH;数显代码
END
七、AD转换
7.1AD转换(数码显示)
程序介绍:
利用ADC0809模拟通道3输入电压,经单片机
19
处理后在数码管上用相对应的16进制数显示出来,0—5V对
应为0--0FFH,实际应用例如:
数据采集。
程序操作:
程序写完上电运行后,用本机配带的专用起微调
图15所示电位器,会在数码管上看到随不同电压而变化的对
应16进制值。
也可以用
万用表实ADC0809IN3脚
电压,来检验所对应显
示的16进制数。
图15
程序实例(ad.asm):
ORG0000H
MAIN1:
ACALLDELAY;延时
ACALL