51单片机汇编程序库_第1页
51单片机汇编程序库_第2页
51单片机汇编程序库_第3页
51单片机汇编程序库_第4页
51单片机汇编程序库_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

51单片机实用汇编程序库51单片机实用程序库4、1流水灯程序介绍:利用P1口通过一定延时轮流产生低电平输出,以达到发光二极管轮流亮得效果。实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。程序实例(LAMP、ASM)ORG0000HAJMPMAINORG0030HMAIN:9MOVA,#00HMOVP1,A;灭所有得灯MOVA,#11111110BMAIN1:MOVP1,A;开最左边得灯ACALLDELAY;延时RLA;将开得灯向右边移AJMPMAIN;循环DELAY:MOV30H,#0FFHD1:MOV31H,#0FFHD2:DJNZ31H,D2DJNZ30H,D1RETEND4、2方波输出程序介绍:P1、0口输出高电平,延时后再输出低电平,循环输出产生方波。实际应用中例如:波形发生器。程序实例(FAN、ASM):ORG0000HMAIN:;直接利用P1、0口产生高低电平地形成方波//////////////ACALLDELAYSETBP1、0ACALLDELAY10CLRP1、0AJMPMAIN;//////////////////////////////////////////////////DELAY:MOVR1,#0FFHDJNZR1,$RET五、定时器功能实例5、1定时1秒报警程序介绍:定时器1每隔1秒钟将p1、o得输出状态改变1次,以达到定时报警得目得。实际应用例如:定时报警器。程序实例(DIN1、ASM):ORG0000HAJMPMAINORG000BHAJMPDIN0;定时器0入口MAIN:TFLAGEQU34H;时间秒标志,判就是否到50个0、2秒,即50*0、2=1秒MOVTMOD,#00000001B;定时器0工作于方式1MOVTL0,#0AFHMOVTH0,#3CH;设定时时间为0、05秒,定时20次则一秒11SETBEA;开总中断SETBET0;开定时器0中断允许SETBTR0;开定时0运行SETBP1、0LOOP:AJMPLOOPDIN0:;就是否到一秒////////////////////////////////////////INCC:INCTFLAGMOVA,TFLAGCJNEA,#20,REMOVTFLAG,#00HCPLP1、0;//////////////////////////////////////////////////RE:MOVTL0,#0AFHMOVTH0,#3CH;设定时时间为0、05秒,定时20次则一秒RETIEND5、2频率输出公式介绍:f=1/ts51使用12M晶振,一个周期就是1微秒使用定时器1工作于方式0,最大值为65535,以产生200HZ得频率为例:200=1/t:推出t=0、005秒,即5000微秒,即一个高电平或低电平得时间为2500微秒。这样,定时值应设为65535-2500=63035,将它转换为十六进制则为:F63B.具体程序请瞧f200、asm频率递增:200HZ:63035:F63B250HZ:63535:F82F300HZ:63868:F97C5、3200HZ频率输出程序介绍:利用定时器定时,在P1、0口产生200HZ得频率输出.实际应用例如:传感器前级推动.程序实例(F200、ASM):ORG0000HAJMPMAINORG001BHAJMPDIN0MAIN:CLRP1、0;产生一个低电平,实际上就是从p1、0口产生频率MOVTMOD,#00010000B;定时器1工作于方式0MOVTH1,#0F6HMOVTL1,#3BH;频率产生得时间,详细请见频率公式SETBEA;开总中断13SETBTR1;开定时器1运行SETBET1;开定时器1允许LOOP:AJMPLOOP;无限循环DIN0:CPLP1、0;产生一个高电平,下次来就就是低电平(因为取反),一个高电平与一个低电平形成一个周期MOVTH1,#0F6HMOVTL1,#3BH;重置频率产生时间RETI;返回END5、4200——250HZ变化频率输出程序介绍:利用定时器定时时间得变化,由P1、0口产生200—-250HZ变化得频率。实际应用例如:传感器前级推动、频率发生器。程序实例(F250、ASM):ORG0000HAJMPMAINORG001BHAJMPDIN1MAIN:;定义频率200与300//////////////////////////////////F2HEQU30HF2LEQU31HF3HEQU32HF3LEQU33H14;//////////////////////////////////////////////////;定义频率保持初值//////////////////////////////////MOVR1,#50MOVR2,#02H;//////////////////////////////////////////////////;频率赋初值////////////////////////////////////////MOVF2H,#0F6HMOVF2L,#3BHMOVF3H,#0F8HMOVF3L,#2FH;//////////////////////////////////////////////////CLRP1、0;在P1、0口产生一个低电平,一个脉冲就是由一个高电平与一个低电平组成得MOVTMOD,#00010000B;定时器工作于方式1MOVTH1,F2HMOVTL1,F2L;200HZ输出SETBEA;开总中断SETBTR1;开定时器1运行SETBET1;开定时器1允许LOOP:AJMPLOOPDIN1:CPLP1、0;取反P1、0口,实际就是为了不断得将p1、0得电平关系转换,即产生了频率;频率保持时间//////////////////////////////////////DJNZR1,REMOVR1,#50DJNZR2,REMOVR2,#02H15;//////////////////////////////////////////////////MOVA,F2HCJNEA,F3H,XIA;频率高位到300HZ得高位了吗?AJMPJIA;频率高位没到300HZ得高位值,直接将低位值加1XIA:INCF2LMOVA,F2LCJNEA,#00H,REINCF2HMOVA,F2HCJNEA,F3H,RE;/////////////////////////////////////////////;频率高位加到300HZ得高位值了,低位加一,到300HZ得低位值了吗,没到出去,到了关定时器JIA:INCF2L;到了将200HZ频率得低位加1MOVA,F2LCJNEA,#F3L,RECLRTR1;/////////////////////////////////////////////RE:MOVTH1,F2HMOVTL1,F2LRETIEND16六、数显0——9999显示程序介绍:利用S51得串行口功能,实现数码管0——9999得循环显示。实际应用例如:电子计分牌。程序实例(9999、ASM):ORG0000HMAIN:GEEEQU30HSHIEQU31HBEIEQU32HQIANEQU33H;定义个十百千MOVGEE,#00HMOVSHI,#00HMOVBEI,#00HMOVQIAN,#00H;赋初值MOVSCON,#00H;串行口工作于方式0、同步移位;显示个,十,百,千//////////////////////////////////DISPLAY:ACALLDELAY;延时MOVDPTR,#SETTABMOVA,GEEMOVCA,A+DPTRMOVSBUF,AD1:JNBTI,D117CLRTIMOVDPTR,#SETTABMOVA,SHIMOVCA,A+DPTRMOVSBUF,AD2:JNBTI,D2CLRTIMOVDPTR,#SETTABMOVA,BEIMOVCA,A+DPTRMOVSBUF,AD3:JNBTI,D3CLRTIMOVDPTR,#SETTABMOVA,QIANMOVCA,A+DPTRMOVSBUF,AD4:JNBTI,D4CLRTI;/////////////////////////////////////////////;个,十,百,千得依次加一/////////////////////INCGEEMOVA,GEECJNEA,#0AH,DISPLAYMOVGEE,#00HINCSHIMOVA,SHICJNEA,#0AH,DISPLAY18MOVSHI,#00HINCBEIMOVA,BEICJNEA,#0AH,DISPLAYMOVBEI,#00HINCQIANMOVA,QIANCJNEA,#0AH,DISPLAYMOVQIAN,#00HAJMPDISPLAY;//////////////////////////////////////////////////;延时//////////////////////////////////////////////DELAY:MOVR1,#0FFHE1:MOVR2,#0FFHDJNZR2,$DJNZR1,E1RET;/////////////////////////////////////////////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):ORG0000HMAIN1:ACALLDELAY;延时ACALLAD;呼叫AD子程序;将转换得数字量屏蔽高位低位送显////////////////////MOV31H,30HMOVA,30HANLA,#0FHMOVDPTR,#SETTABMOVCA,A+DPTRMOVSBUF,AD1:JNBTI,D1CLRTI;//////////////////////////////////////////////////;将转换得数字量屏蔽低位高位送显////////////////////MOVA,30H20ANLA,#0F0HSWAPAMOVDPTR,#SETTABMOVCA,A+DPTRMOVSBUF,AD2:JNBTI,D2CLRTI;//////////////////////////////////////////////////AJMPMAIN1;返回主程序AD:MOVDPTR,#7F00H;指向转换地址MOVA,#03H;指向转换口MOVXDPTR,A;转换MOVR1,#64HD3:DJNZR1,D3;等100微秒转换完MOVXA,DPTR;转换后得值给AMOV30H,A;转换得值给30HRETDELAY:;延时MOVR2,#0FFHD14:MOVR3,#0FFHD12:DJNZR3,D12DJNZR2,D14RETSETTAB:DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6HDB0EEH,3EH,9CH,7AH,9EH,8EH217、2十六进制两位数加法器(数码显示)程序介绍:将ADC0809输入得两个不同电压(相同电压也可相加,只就是为举例说明,所以取不同电压)所对应得16进制数相加显示出来。实际应用例如:取代加法运放电路.程序操作:程序写完上电运行后,用本机配带得钟表起微调图16所示电位器,输入两个不同电压,数码管会显示两个不同得对应16进制数,随后数码管会显示两个16进制数相加得值.程序实例(add2、asm):ORG0000HMAIN:ADNUMBEREQU30H;AD转换值ADDNUMBEREQU31H;加数值1ADLEQU32H;//ADHEQU33H;ADL转换高低位值DISLEQU34H;//DISHEQU35H;显示高低位值ADDTOTALEQU36H;第一次AD转换值ADDJWEQU37H;加法进位数ADDHOLDEQU38H;赋初值////////////////////////////////////////////MOVADDHOLD,#00HMOVADDNUMBER,#00HMOVADL,#00HMOVADH,#00HMOVDISL,#00H22MOVDISH,#00HMOVADDJW,#00HMOVADDTOTAL,#00H;//////////////////////////////////////////////////MAIN1:ACALLAD;呼叫AD子程序ACALLDELAY;延时ACALLCAIFEN;呼叫AD值拆分为高低得程序ACALLDISPLAY;呼叫显示子程序MOVA,ADNUMBER;取AD值CJNEA,ADDHOLD,ADD3;与上次AD值比较,不相等,即输入了新得AD值,去AD3执行AJMPMAIN1;就是相等得,证明没有输入新得AD值,回去显示老得AD值ADD3:MOVA,ADDHOLDCJNEA,#00H,ADD4MOVADDHOLD,ADNUMBER;有一种情况就就是就是第一次进来,AD保持值里面就是放得初值00,与取得AD值不同,就是这种情况,也返回去AJMMAIN1ADD4:MOVADDNUMBER,ADDHOLD;就是真得输入了新得AD值,将上次AD值给加数,为调加法程序做准备MOVADDHOLD,ADNUMBER;将这次得AD值也保持起来.准备与上一个AD值相加;显示这次输入得AD值////////////////////////////////ACALLDELAYACALLCAIFEN23ACALLDISPLAY;//////////////////////////////////////////////////DISPLAY1:ACALLDELAY;延时ACALLADD1;呼叫加法子程序ACALLDISPLAY;显示LOOP:AJMPLOOP;返回主程序;///////////////////////////////////////AD转换AD:MOVDPTR,#7F00H;指向转换地址MOVA,#03H;指向转换口MOVXDPTR,A;转换MOVR1,#64HD1:DJNZR1,D1;等100微秒转换完MOVXA,DPTR;转换后得值给AMOVADNUMBER,A;转换得值给30HRET;//////////////////////////////////////////////////;拆分AD值程序//////////////////////////////////////CAIFEN:MOVA,ADNUMBERANLA,#0FHMOVADL,A;取低位MOVA,ADNUMBERANLA,#0F0HSWAPAMOVADH,A;取高位MOVDISL,ADL24MOVDISH,ADH;给显示值RET;//////////////////////////////////////////////////;显示//////////////////////////////////////////////DISPLAY:MOVA,DISLMOVDPTR,#SETTABMOVCA,A+DPTRMOVSBUF,AD3:JNBTI,D3CLRTIMOVA,DISHMOVDPTR,#SETTABMOVCA,A+DPTRMOVSBUF,AD4:JNBTI,D4CLRTIMOVA,ADDJWMOVDPTR,#SETTABMOVCA,A+DPTRMOVSBUF,AD5:JNBTI,D5CLRTIMOVSBUF,#00HD6:JNBTI,D6CLRTIRET;//////////////////////////////////////////////////25;加法程序//////////////////////////////////////////ADD1:CLRCMOVA,ADDNUMBER;取上次AD值ADDCA,ADDHOLD;与这次AD值相加MOVADDTOTAL,A;将此次加得值给与值JNCADDJW1;有无进位?INCADDJW;有进位,进位值给ADDJWADDJW1:ANLA,#0FHMOVDISL,A;加值取低位MOVA,ADDTOTALANLA,#0F0HSWAPAMOVDISH,A;加值取高位RET;//////////////////////////////////////////////////DELAY:;延时MOVR3,#0AHDD1:MOVR1,#0FFHD2:MOVR2,#0FFHDJNZR2,$DJNZR1,D2DJNZR3,DD1RETSETTAB:DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,260FEH,0F6HDB0EEH,3EH,9CH,7AH,9EH,8EHEND7、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次就行了.277、31十六进制六位数加法(数码显示)程序实例(add6、asm):ORG0000HMAIN:ADNUMBEREQU30H;AD转换值ADDNUMBEREQU31H;加数值1ADLEQU32H;//ADHEQU33H;ADL转换高低位值DISLEQU34H;//DISHEQU35H;显示高低位值ADDTOTALEQU36H;第一次AD转换值ADDJWEQU37H;加法进位数ADDHOLDEQU38HADDFLAGEQU39H;加标志ENDFLAGEQU40H;赋初值////////////////////////////////////////////MOVADDHOLD,#00HMOVADDNUMBER,#00HMOVADL,#00HMOVADH,#00HMOVDISL,#00HMOVDISH,#00HMOVADDJW,#00HMOVADDFLAG,#00HMOVENDFLAG,#00HMOVADDTOTAL,#00H;//////////////////////////////////////////////////MAIN1:28;显示AD值//////////////////////////////////////////ACALLDELAYACALLDELAYACALLADMAIN3:ACALLCAIFENACALLDISPLAY;//////////////////////////////////////////////////;加这次得AD值,并判就是否加了六次,就是得话就进入死循环ACALLDELAYACALLADD1ACALLDISPLAYINCADDFLAGMOVA,ADDFLAGCJNEA,#06H,MAIN2LOOP:AJMPLOOP;//////////////////////////////////////////////////;没有加到六次,继续取值加,如果没有来新AD值,还就是去显示上次加得值,有新AD值来了,显示这次AD值,并加上上次AD值,显示///////////////////////////////////////MAIN2:ACALLDELAYACALLADMOVA,ADNUMBERCJNA,ADDTOTAL,MAIN3AJMMAIN2;//////////////////////////////////////////////////;////////////////////////////////////////////AD转换AD:29MOVDPTR,#7F00H;指向转换地址MOVA,#03H;指向转换口MOVXDPTR,A;转换MOVR1,#64HD1:DJNZR1,D1;等100微秒转换完MOVXA,DPTR;转换后得值给AMOVADNUMBER,A;转换得值给30HRET;//////////////////////////////////////////////////;拆分AD值程序//////////////////////////////////////CAIFEN:MOVA,ADNUMBERANLA,#0FHMOVADL,A;取低位MOVA,ADNUMBERANLA,#0F0HSWAPAMOVADH,A;取高位MOVDISL,ADLMOVDISH,ADH;给显示值RET;//////////////////////////////////////////////////;显示//////////////////////////////////////////////DISPLAY:MOVA,DISLMOVDPTR,#SETTABMOVCA,A+DPTRMOVSBUF,A30D3:JNBTI,D3CLRTIMOVA,DISHMOVDPTR,#SETTABMOVCA,A+DPTRMOVSBUF,AD4:JNBTI,D4CLRTIMOVA,ADDJWMOVDPTR,#SETTABMOVCA,A+DPTRMOVSBUF,AD5:JNBTI,D5CLRTIMOVSBUF,#00HD6:JNBTI,D6CLRTIRET;//////////////////////////////////////////////////;加法程序//////////////////////////////////////////ADD1:CLRCMOVADDTOTAL,ADNUMBERMOVA,ADNUMBERADDCA,ADDHOLDMOVADDHOLD,AJNCADDJW1INCADDJW31ADDJW1:ANLA,#0FHMOVDISL,A;加值取低位MOVA,ADDHOLDANLA,#0F0HSWAPAMOVDISH,A;加值取高位RET;///////////////////////////////////////////////DELAY:;延时MOVR3,#0AHDD1:MOVR1,#0FFHD2:MOVR2,#0FFHDJNZR2,$DJNZR1,D2DJNZR3,DD1RETSETTAB:DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6HDB0EEH,3EH,9CH,7AH,9EH,8EHEND7、32求六位与中得最大值与最小值(数码显示)程序实例(add61、asm):ORG0000HMAIN:ADNUMBEREQU30H;AD转换值ADLEQU32H;//32ADHEQU33H;ADL转换高低位值DISLEQU34H;//DISHEQU35H;显示高低位值ADDTOTALEQU36H;第一次AD转换值ADDJWEQU37H;加法进位数ADDHOLDEQU38HADDFLAGEQU39H;加标志ENDFLAGEQU40HADH1EQU41H;AD中最大得值ADL1EQU42H;AD中最小得值ADHOLDHEQU43HADHOLDLEQU44H;求AD最大值与最小值时AD得比较值,即以此两个值为比较中转FOUREQU45HSUBEQU46H;减去高低位后得值JWHOLDEQU47H;保存进位值;赋初值////////////////////////////////////////////MOVADDHOLD,#00HMOVADL,#00HMOVADH,#00HMOVDISL,#00HMOVDISH,#00HMOVADDJW,#00HMOVADDFLAG,#00HMOVENDFLAG,#00HMOVADDTOTAL,#00HMOVADH1,#00HMOVADL1,#00H33MOVADHOLDH,#00HMOVFOUR,#00HMOVADHOLDL,#00HMOVJWHOLD,#00HMOVSUB,#00H;//////////////////////////////////////////////////MAIN1:ACALLDELAYACALLDELAYACALLAD;取AD值MAIN3:ACALLCAIFENACALLDISPLAY;显示ACALLDELAYACALLDELAY;算最大值与最小值//////////////////////////////////ACALLADDHACALLADDL;//////////////////////////////////////////////////;加与值显示///////////////////////////////////////ACALLADD1ACALLDISPLAY;//////////////////////////////////////////////////;判就是否加到了6次///////////////////////////////////INCADDFLAGMOVA,ADDFLAGCJNEA,#06H,MAIN2;/////////////////////////////////////////////////ACALLDELAY34ACALLDELAYACALLDELAYACALLDELAYACALLDELAYACALLDELAYACALLCAIFEN1;拆最小值ACALLCAIFEN2;拆最大值ACALLDISPLAY;显示最大值最小值LOOP:AJMPLOOP;判有没有来新AD值,没有显示以前,有显示现在得///////MAIN2:ACALLDELAYACALLADMOVA,ADNUMBERCJNEA,ADDTOTAL,MAIN3AJMPMAIN2;//////////////////////////////////////////////////;AD转换////////////////////////////////////////////AD:MOVDPTR,#7F00H;指向转换地址MOVA,#03H;指向转换口MOVXDPTR,A;转换MOVR1,#64HD1:DJNZR1,D1;等100微秒转换完MOVXA,DPTR;转换后得值给AMOVADNUMBER,A;转换得值给30HRET;//////////////////////////////////////////////////;拆分AD值程序//////////////////////////////////////35CAIFEN:MOVA,ADNUMBERANLA,#0FHMOVADL,A;取低位MOVA,ADNUMBERANLA,#0F0HSWAPAMOVADH,A;取高位MOVDISL,ADLMOVDISH,ADH;给显示值RET;//////////////////////////////////////////////////;显示////

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论