单片机汇编语言经典一百例.docx
- 文档编号:30579471
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:65
- 大小:36.69KB
单片机汇编语言经典一百例.docx
《单片机汇编语言经典一百例.docx》由会员分享,可在线阅读,更多相关《单片机汇编语言经典一百例.docx(65页珍藏版)》请在冰豆网上搜索。
单片机汇编语言经典一百例
51单片机实用程序库
4.1流水灯
程序介绍:
利用P1口通过一定延时轮流产生低电平
输出,以达到发光二极管轮流亮的效果。
实际应用中例如:
广告灯箱彩灯、霓虹灯闪烁。
程序实例(LAMP.ASM)
ORG0000H
AJMPMAIN
ORG0030H
MAIN:
9
MOVA,tiOOH
MOVPl,A;灭所有的灯
MOVA,#1111U1OB
MAIN1:
MOVPl,A;开最左边的灯
ACALLDELAY;延时
RLA;将开的灯向右边移
AJMPMAIN;循环
DELAY:
MOV30H,#OFFH
DI:
MOV31H,#OFFH
D2:
DJNZ31H,D2
DJNZ30H,DI
RET
END
4.2方波输出
程序介绍:
P1.0口输出高电平,延时后再输出低电
平,循环输出产生方波。
实际应用中例如:
波形发生器。
程序实例(FAN.ASM):
ORG0000H
MAIN:
;直接利用P1.0口产生高低电平地形成方波//////////////
ACALLDELAY
SETBPl.0
ACALLDELAY
10
CLRPl.0
AJMPMAIN
■J//////////////////////////////!
!
/////////////!
!
//
DELAY:
MOVRl,ttOFFH
DJNZRl,$
RET
END
五、定时器功能实例
5.1定时1秒报警
程序介绍:
定时器1每隔1秒钟将pl.o的输出状态改变1次,以达到定时报警的目的。
实际应用例如:
定时报警器。
程序实例(DINI.ASM):
ORG0000H
AJMPMAIN
ORGOOOBH
AJMPDINO;定时器0入口
MAIN:
TFLAGEQU34H;时间秒标志,判是否到50个
0.2秒,即50*0.2=1秒
MOVTMOD,#00000001B;定时器0工作于方式
1
MOVTLO,#OAFH
MOVTHO,#3CH;设定时时间为0.05秒,定时
20次则一秒
SETBEA;开总中断
SETBETO;开定时器0中断允许
SETBTRO;开定时0运行
SETBP1.0
LOOP:
AJMPLOOP
DINO:
;是否到一秒////////////////////////////////////////
INCC:
INCTFLAG
MOVA,TFLAG
CJNEA,#20,RE
MOVTFLAG,#00H
CPLPl.0
;//////////////////////////////////////////////////
RE:
MOVTLO,#0AFH
MOVTHO,#3CH;设定时时间为0.05秒,定时
20次则一秒
RETI
END
5.2频率输出公式
介绍:
f=l/t
s51使用12M晶振,一个周期是1微秒使用定时器1
工作于方式0,最大值为65535,以产生200HZ的频率为
例:
200=l/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
AJMPDINO
MAIN:
CLRP1.0;产生一个低电平,实际上
是从pl.O口产生频率
MOVTMOD,#00010000B;定时器1工作于方式0
MOVTH1,#0F6H
MOVTL1,#3BH;频率产生的时间,详细请
见频率公式
SETBEA;开总中断
13
SETBTR1;开定时器1运行
SETBET1;开定时器1允许
LOOP:
AJMPLOOP;无限循环
DINO:
CPLPl.0;产生一个高电平,
下次来就是低电平(因为取反),一个高电平和一个低电平
形成一个周期
MOVTH1,#0F6H
MOVTL1,#3BH;重置频率产生时间
RETI;返回
END
5.4200——250HZ变化频率输出
程序介绍:
利用定时器定时时间的变化,由P1.0口
产生200——250HZ变化的频率。
实际应用例如:
传感器
前级推动、频率发生器。
程序实例(F250.ASM):
ORG0000H
ORGOO1BH
AJMPDINI
MAIN:
;定义频率200和300//////////////////////////////////
F2HEQU30H
F2LEQU31H
F3HEQU32H
F3LEQU33H
14
;//////////////////////////////////////////////////
;定义频率保持初值//////////////////////////////////
MOVRl,#50
MOVR2,#02H
■J//////////////////////////////!
!
/////////////!
!
//
;频率赋初值////////////////////////////////////////
MOVF2H,#0F6H
MOVF2L,#3BH
MOVF3H,#0F8H
MOVF3L,#2FH
I//////////////////////////////////////////////////
CLRP1.0;在戸1.0口产生一个低
电平,一个脉冲是由一个高电平和一个低电平组成的
MOVTMOD,ttOOOlOOOOB;定时器工作于方式1
MOVTH1,F2H
MOVTL1,F2L;200HZ输出
SETBEA;开总中断
SETBTRI;开定时器1运行
SETBET1;开定时器1允许
LOOP:
AJMPLOOP
DINI:
CPLP1.0;取反P1.0口,实际
是为了不断的将pl.0的电平关系转换,即产生了频率
;频率保持时间//////////////////////////////////////
DJNZRl,RE
MOVRl,#50
DJNZR2,RE
MOVR2,#02H
15
;//////////////////////////////////////////////////
MOVA,F2H
CJNEA,F3H,XIA;频率高位到300HZ
的高位了吗?
AJMPJIA;频率高位没到
300HZ的高位值,直接将低位值加1
XIA:
INCF2L
MOVA,F2L
CJNEA,ftOOH,RE
INCF2H
MOVA,F2H
CJNEA,F3H,RE
J//////////////////////////////!
/////////////
;频率高位加到300HZ的高位值了,低位加一,到300HZ的低
位值了吗,没到出去,到了关定时器
JIA:
INCF2L;到了将200HZ频率的低位加1
MOVA,F2L
CJNEA,#F3L,RE
CLRTRI
I/////////////////////////////////////////////
RE:
MOVTH1,F2H
MOVTL1,F2L
RETI
END
六、数显
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
MOVCA,©A+DPTR
MOVSBUF,A
DI:
JNBTI,D1
17
CLRTI
MOVDPTR,#SETTAB
MOVA,SHI
MOVCA,©A+DPTR
MOVSBUF,A
D2:
JNBTI,D2
CLRTI
MOVDPTR,ttSETTAB
MOVA,BEI
MOVCA,©A+DPTR
MOVSBUF,A
D3:
JNBTI,D3
CLRTI
MOVDPTR,#SETTAB
MOVA,QIAN
MOVCA,©A+DPTR
MOVSBUF,A
D4:
JNBTI,D4
81
AVJdsIa IHS IHSONI Hoo#IZJgoAOW AVJdsIa・HVO= MMeONI二二二二二二三二二二—姜參字忻・+・匕二二二二二三三三三二二三二二三二二三三 二二二二二二二二二二二二二二二二二二二二二二二二三 Av」dsladRf< Hoott.NVSAOW Av」dsla・HVO甘<男 Kvs Nvs另I Hoo#AOW Av」dsla・HVO甘 Hoo#・IHSAOW ;延时////////////////////////////////////////////// DELAY: MOVRl,ftOFFH El: MOVR2,ttOFFH DJNZR2,$ DJNZR1,E1 RET J//////////////////////////////! ! //////////// SETTAB: DBOFCH,60H,ODAH,0F2H,66H,0B6H,OBEH,OEOH,OFEH, F6H,OEEH,3EH,9CH,7AH,9EH,8EH;数显代码 END 七、AD转换 7.1AD转换(数码显示) 程序介绍: 利用ADC0809模拟通道3输入电压,经单片机 19 处理后在数码管上用相对应的16进制数显示出来,0—5V对 应为0—OFFH,实际应用例如: 数据釆集。 程序操作: 程序写完上电运行后,用本机配带的专用起微调图15所示电位器,会在数码管上看到随不同电压而变化的对应16进制值。 也可以用 万用表实ADC0809IN3脚 电压,来检验所对应显 示的16进制数。 图15 程序实例(ad.asm): ORG0000H MAIN1: ACALLDELAY;延时 ACALLAD;呼叫AD子程序 ;将转换的数字量屏蔽高位低位送显//////////////////// MOV31H,30H MOVA,30H ANLA,tiOFH MOVDPTR,ttSETTAB MOVCA,©A+DPTR MOVSBUF,A DI: JNBTI,D1 CLRTI ;////////////////////////////////////////////////// ;将转换的数字量屏蔽低位高位送显//////////////////// MOVA,30H 20 ANLA,tiOFOH SWAPA MOVDPTR,#SETTAB MOVCA,©A+DPTR MOVSBUF,A D2: JNBTI,D2 CLRTI I////////////////////////////////////////////////// AJMPMAIN1;返回主程序 AD: MOVDPTR,#7F00H;指向转换地址 MOVA,#03H;指向转换口 MOVX@DPTR,A;转换 MOVRl,#64H D3: DJNZR1,D3;等100微秒转换完 MOVXA,@DPTR;转换后的值给A MOV30H,A;转换的值给30H RET DELAY: ;延时 MOVR2,tiOFFH D14: MOVR3,#OFFH D12: DJNZR3,D12 DJNZR2,D14 RET SETTAB: DBOFCH,60H,ODAH,0F2H,66H,0B6H,OBEH,OEOH, OFEH,0F6H DBOEEH,3EH,9CH,7AH,9EH,8EH 21 7.2十六进制两位数加法器(数码显示) 程序介绍: 将ADC0809输入的两个不同电压(相同电 压也可相加,只是为举例说明,所以取不同电压)所对应的16进制数相加显示出来。 实际应用例如: 取代加法运放电路。 程序操作: 程序写完上电运行后,用木机配带的钟表 起微调图16所示电位器,输入两个不同电压,数码管会显示两个不同的对应16进制数,随后数码管会显示两个16进制数相加的值。 程序实例(add2.asm): ORG0000H MAIN: ADNUMBEREQU30H;AD转换值 ADDNUMBEREQU31H;加数值1 ADLEQU32H;// ADHEQU33H;ADL转换高低位值 DISLEQU34H;// DISHEQU35H;显示高低位值 ADDTOTALEQU36H;第一次AD转换值 ADDJWEQU37H;加法进位数 ADDHOLDEQU38H ;赋初值//////////////////////////////////////////// MOVADDHOLD,#00H MOVADDNUMBER,#00H MOVADL,#00H MOVADH,#00H MOVDISL,#00H 22 MOVDISH,#00H MOVADDJW,#00H MOVADDTOTAL,ftOOH ■J//////////////////////////////! ! /////////////! ! // MAINl: ACALLAD;呼叫AD子程序 ACALLDELAY;延时 ACALLCAIFEN;呼叫AD值拆分为高 低的程序 ACALLDISPLAY;呼叫显示子程序 MOVA,ADNUMBER;取AD值 CJNEA,ADDHOLD,ADD3;与上次AD值比 较,不相等,即输入了新的AD值,去AD3执行 AJMPN1AIN1;是相等的,证 明没有输入新的AD值,回去显示老的AD值 ADD3: MOVA,ADDHOLD CJNEA,ttOOH,ADD4 MOVADDHOLD,ADNUMBER;有一种情况就 是是第一次进来,AD保持值里面是放的初值00,与取的AD值 不同,是这种情况,也返回去 AJMMAIN1 ADD4: MOVADDNUMBER,ADDHOLD;是真的输入 了新的AD值,将上次AD值给加数,为调加法程序做准备 MOVADDHOLD,ADNUMBER;将这次的AD 值也保持起来。 准备与上一个AD值相加 ;显示这次输入的AD值//////////////////////////////// ACALLDELAY ACALLCAIFEN 23 ACALLDISPLAY \///////I//////////////II//////////////I/////////// DISPLAY1: ACALLDELAY;延时 ACALLADD1;呼叫加法子程序 ACALLDISPLAY;显示 LOOP: AJMPLOOP;返回主程序 ;///////////////////////////////////////AD转换 AD: MOVDPTR,#7FOOH;指向转换地址 MOVA,#03H;指向转换口 MOVX©DPTR,A;转换 MOVRl,#64H DI: DJNZR1,D1;等100微秒转换完 MOVXA,©DPTR;转换后的值给A MOVADNUMBER,A;转换的值给30H RET J///////////////////////////I///////////////////// ;拆分AD值程序////////////////////////////////////// CAIFEN: MOVA,ADNUMBER ANLA,tiOFH MOVADL,A;取低位 MOVA,ADNUMBER ANLA,#OFOH SWAPA MOVDISL,ADL 24 MOVDISH,ADH;给显示値 RET ;////////////////////////////////////////////////// ;显示////////////////////////////////////////////// DISPLAY: MOVA,DISL MOVDPTR,#SETTAB MOVCA,©A+DPTR MOVSBUF,A D3: JNBTI,D3 CLRTI MOVA,DISH MOVDPTR,#SETTAB MOVCA,©A+DPTR MOVSBUF,A D4: JNBTI,D4 CLRTI MOVA,ADDJW MOVCA,©A+DPTR MOVSBUF,A D5: JNBTI,D5 CLRTI MOVSBUF,#OOH D6: JNBTI,D6 CLRTI RET J///I//////////////////! ////////////////////////// 25 ;加法程序////////////////////////////////////////// ADD1: CLRC MOVA,ADDNUMBER;取上次AD值 ADDCA,ADDHOLD;与这次AD值相加 MOVADDTOTAL,A;将此次加的值给和 值 JNCADDJW1;有无进位? INCADDJW;有进位,进位值给 ADDJW ADDJW1: ANLA,#OFH MOVA,ADDTOTAL ANLA,ftOFOH SWAPA MOVDISH,A;加值取高位 RET J//////I//////////////II//////////////I/////////// DELAY: ;延时 MOVR3,ttOAH DD1: MOVRl,#OFFH D2: MOVR2,#OFFH DJNZR2,$ DJNZR1,D2 DJNZR3,DD1 RET SETTAB: DBOFCH,60H,ODAH,0F2H,66H,0B6H,OBEH,OEOH, 26 OFEH,0F6H DBOEEH,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): MAIN: ADNUMBEREQU30H;AD转换值 ADDNUMBEREQU31H;加数值1 ADLEQU32H;// ADHEQU33H;ADL转换高低位值 DISLEQU34H;// DISHEQU35H;显示高低位值 ADDTOTALEQU36H;第一次AD转换值 ADDJWEQU37H;加法进位数 ADDHOLDEQU38H ADDFLAGEQU39H;加标志 ENDFLAGEQU40H ;赋初值//////////////////////////////////////////// MOVADDHOLD,#00H MOVADDNUMBER,ftOOH MOVADL,#00H MOVADH,#00H MOVDISL,#00H MOVDISH,#00H MOVADDJW,#00H MOVADDFLAG,#00H MOVENDFLAG,ttOOH MOVADDTOTAL,#OOH ;////////////////////////////////////////////////// MAIN1: 28 ;显示AD值/////////〃///////////////////〃////////// ACALLDELAY ACALLDELAY ACALLAD MAIN3: ACALLCAIFEN ACALLDISPLAY ;////////////////////////////////////////////////// ;加这次的AD值,并判是否加了六次,是的话就进入死循环 ACALLDELAY ACALLADD1 ACALLDISPLAY I
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 汇编语言 经典 一百
![提示](https://static.bdocx.com/images/bang_tan.gif)