51单片机实用程序库(汇编).doc_第1页
51单片机实用程序库(汇编).doc_第2页
51单片机实用程序库(汇编).doc_第3页
51单片机实用程序库(汇编).doc_第4页
51单片机实用程序库(汇编).doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

4.1 流水灯程序介绍:利用P1 口通过一定延时轮流产生低电平输出,以达到发光二极管轮流亮的效果。实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。程序实例(LAMP.ASM)ORG 0000HAJMP MAINORG 0030HMAIN:9MOV A,#00HMOV P1,A ;灭所有的灯MOV A,#11111110BMAIN1:MOV P1,A ;开最左边的灯ACALL DELAY ;延时RL A ;将开的灯向右边移AJMP MAIN ;循环DELAY:MOV 30H,#0FFHD1: MOV 31H,#0FFHD2: DJNZ 31H,D2DJNZ 30H,D1RETEND4.2 方波输出程序介绍:P1.0 口输出高电平,延时后再输出低电平,循环输出产生方波。实际应用中例如:波形发生器。程序实例(FAN.ASM):ORG 0000HMAIN:;直接利用P1.0口产生高低电平地形成方波/ACALL DELAYSETB P1.0ACALL DELAY10CLR P1.0AJMP MAIN;/DELAY:MOV R1,#0FFHDJNZ R1,$RETEND五、定时器功能实例5.1 定时1秒报警程序介绍:定时器1每隔1秒钟将p1.o的输出状态改变1次,以达到定时报警的目的。实际应用例如:定时报警器。程序实例(DIN1.ASM):ORG 0000HAJMP MAINORG 000BHAJMP DIN0 ;定时器0入口MAIN:TFLA G EQU 34H ;时间秒标志,判是否到50个0.2秒,即50*0.2=1秒MOV TMOD,#00000001B;定时器0工作于方式1MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05秒,定时20次则一秒11SETB EA ;开总中断SETB ET0 ;开定时器0中断允许SETB TR0 ;开定时0运行SETB P1.0LOOP: AJMP LOOPDIN0:;是否到一秒/INCC: INC TFLAGMOV A,TFLAGCJNE A,#20,REMOV TFLAG,#00HCPL P1.0;/RE:MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05秒,定时20次则一秒RETIEND5.2 频率输出公式介绍:f=1/ts51 使用12M晶振,一个周期是1微秒使用定时器1工作于方式0,最大值为65535,以产生200HZ的频率为例:200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电12平或低电平的时间为2500 微秒。这样,定时值应设为65535-2500=63035,将它转换为十六进制则为:F63B。具体程序请看f200.asm频率递增:200HZ:63035:F63B250HZ:63535:F82F300HZ:63868:F97C5.3 200HZ频率输出程序介绍:利用定时器定时,在P1.0 口产生200HZ的频率输出。实际应用例如:传感器前级推动。程序实例(F200.ASM):ORG 0000HAJMP MAINORG 001BHAJMP DIN0MAIN:CLR P1.0 ;产生一个低电平,实际上是从p1.0口产生频率MOV TMOD,#00010000B ;定时器1工作于方式0MOV TH1,#0F6HMOV TL1,#3BH ;频率产生的时间,详细请见频率公式SETB EA ;开总中断13SETB TR1 ;开定时器1运行SETB ET1 ;开定时器1允许LOOP: AJMP LOOP ;无限循环DIN0: CPL P1.0 ;产生一个高电平,下次来就是低电平(因为取反),一个高电平和一个低电平形成一个周期MOV TH1,#0F6HMOV TL1,#3BH ;重置频率产生时间RETI ;返回END5.4 200250HZ变化频率输出程序介绍:利用定时器定时时间的变化,由P1.0 口产生200250HZ变化的频率。实际应用例如:传感器前级推动、频率发生器。程序实例(F250.ASM):ORG 0000HAJMP MAINORG 001BHAJMP DIN1MAIN:;定义频率200和300/F2H EQU 30HF2L EQU 31HF3H EQU 32HF3L EQU 33H14;/;定义频率保持初值/MOV R1,#50MOV R2,#02H;/;频率赋初值/MOV F2H,#0F6HMOV F2L,#3BHMOV F3H,#0F8HMOV F3L,#2FH;/CLR P1.0 ;在P1.0口产生一个低电平,一个脉冲是由一个高电平和一个低电平组成的MOV TMOD,#00010000B ;定时器工作于方式1MOV TH1,F2HMOV TL1,F2L ;200HZ输出SETB EA ;开总中断SETB TR1 ;开定时器1运行SETB ET1 ;开定时器1允许LOOP: AJMP LOOPDIN1:CPL P1.0 ;取反P1.0口,实际是为了不断的将p1.0的电平关系转换,即产生了频率;频率保持时间/DJNZ R1,REMOV R1,#50DJNZ R2,REMOV R2,#02H15;/MOV A,F2HCJNE A,F3H,XIA ;频率高位到300HZ的高位了吗?AJMP JIA ;频率高位没到300HZ的高位值,直接将低位值加1XIA: INC F2LMOV A,F2LCJNE A,#00H,REINC F2HMOV A,F2HCJNE A,F3H,RE;/;频率高位加到300HZ的高位值了,低位加一,到300HZ的低位值了吗,没到出去,到了关定时器JIA:INC F2L ;到了将200HZ频率的低位加1MOV A,F2LCJNE A,#F3L,RECLR TR1;/RE:MOV TH1,F2HMOV TL1,F2LRETIEND16六、数显09999显示程序介绍:利用S51的串行口功能,实现数码管09999 的循环显示。实际应用例如:电子计分牌。程序实例(9999.ASM):ORG 0000HMAIN:GEE EQU 30HSHI EQU 31HBEI EQU 32HQIAN EQU 33H ;定义个十百千MOV GEE,#00HMOV SHI,#00HMOV BEI,#00HMOV QIAN,#00H ;赋初值MOV SCON,#00H ;串行口工作于方式0.同步移位;显示个,十,百,千/DISPLAY:ACALL DELAY ;延时MOV DPTR,#SETTABMOV A,GEEMOVC A,A+DPTRMOV SBUF,AD1: JNB TI,D117CLR TIMOV DPTR,#SETTABMOV A,SHIMOVC A,A+DPTRMOV SBUF,AD2: JNB TI,D2CLR TIMOV DPTR,#SETTABMOV A,BEIMOVC A,A+DPTRMOV SBUF,AD3: JNB TI,D3CLR TIMOV DPTR,#SETTABMOV A,QIANMOVC A,A+DPTRMOV SBUF,AD4: JNB TI,D4CLR TI;/;个,十,百,千的依次加一/INC GEEMOV A,GEECJNE A,#0AH,DISPLAYMOV GEE,#00HINC SHIMOV A,SHICJNE A,#0AH,DISPLAY18MOV SHI,#00HINC BEIMOV A,BEICJNE A,#0AH,DISPLAYMOV BEI,#00HINC QIANMOV A,QIANCJNE A,#0AH,DISPLAYMOV QIAN,#00HAJMP DISPLAY;/;延时/DELAY: MOV R1,#0FFHE1: MOV R2,#0FFHDJNZ R2,$DJNZ R1,E1RET;/SETTAB:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,F6H,0EEH,3EH,9CH,7AH,9EH,8EH ;数显代码END七、AD 转换7.1 AD转换(数码显示)程序介绍:利用ADC0809模拟通道3输入电压,经单片机19处理后在数码管上用相对应的16进制数显示出来,05V对应为0-0FFH,实际应用例如:数据采集。程序操作:程序写完上电运行后,用本机配带的专用起微调图15所示电位器,会在数码管上看到随不同电压而变化的对应16进制值。也可以用万用表实ADC0809IN3脚电压,来检验所对应显示的16进制数。图15程序实例(ad.asm):ORG 0000HMAIN1:ACALL DELAY ;延时ACALL AD ;呼叫AD子程序;将转换的数字量屏蔽高位低位送显/MOV 31H,30HMOV A,30HANL A,#0FHMOV DPTR,#SETTABMOVC A,A+DPTRMOV SBUF,AD1: JNB TI,D1CLR TI;/;将转换的数字量屏蔽低位高位送显/MOV A,30H20ANL A,#0F0HSWAP AMOV DPTR,#SETTABMOVC A,A+DPTRMOV SBUF,AD2: JNB TI,D2CLR TI;/AJMP MAIN1 ;返回主程序AD: MOV DPTR,#7F00H ;指向转换地址MOV A,#03H ;指向转换口MOVX DPTR,A ;转换MOV R1,#64HD3: DJNZ R1,D3 ;等100微秒转换完MOVX A,DPTR ;转换后的值给AMOV 30H,A ;转换的值给30HRETDELAY: ;延时MOV R2,#0FFHD14: MOV R3,#0FFHD12: DJNZ R3,D12DJNZ R2,D14RETSETTAB:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6HDB 0EEH,3EH,9CH,7AH,9EH,8EH217.2 十六进制两位数加法器(数码显示)程序介绍:将ADC0809输入的两个不同电压(相同电压也可相加,只是为举例说明,所以取不同电压)所对应的16进制数相加显示出来。实际应用例如:取代加法运放电路。程序操作:程序写完上电运行后,用本机配带的钟表起微调图16所示电位器,输入两个不同电压,数码管会显示两个不同的对应16进制数,随后数码管会显示两个16进制数相加的值。程序实例(add2.asm):ORG 0000HMAIN:ADNUMBER EQU 30H ;AD转换值ADDNUMBER EQU 31H ;加数值1ADL EQU 32H ;/ADH EQU 33H ;ADL转换高低位值DISL EQU 34H ;/DISH EQU 35H ;显示高低位值ADDTOTAL EQU 36H ;第一次AD转换值ADDJW EQU 37H ;加法进位数ADDHOLD EQU 38H;赋初值/MOV ADDHOLD,#00HMOV ADDNUMBER,#00HMOV ADL,#00HMOV ADH,#00HMOV DISL,#00H22MOV DISH,#00HMOV ADDJW,#00HMOV ADDTOTAL,#00H;/MAIN1:ACALL AD ;呼叫AD子程序ACALL DELAY ;延时ACALL CAIFEN ;呼叫AD值拆分为高低的程序ACALL DISPLAY ;呼叫显示子程序MOV A,ADNUMBER ;取AD值CJNE A,ADDHOLD,ADD3 ;与上次AD值比较,不相等,即输入了新的AD值,去AD3执行AJMP MAIN1 ;是相等的,证明没有输入新的AD值,回去显示老的AD值ADD3: MOV A,ADDHOLDCJNE A,#00H,ADD4MOV ADDHOLD,ADNUMBER ;有一种情况就是是第一次进来,AD保持值里面是放的初值00,与取的AD值不同,是这种情况,也返回去AJM MAIN1ADD4: MOV ADDNUMBER,ADDHOLD ;是真的输入了新的AD值,将上次AD值给加数,为调加法程序做准备MOV ADDHOLD,ADNUMBER ;将这次的AD值也保持起来。准备与上一个AD值相加;显示这次输入的AD值/ACALL DELAYACALL CAIFEN23ACALL DISPLAY;/DISPLAY1:ACALL DELAY ;延时ACALL ADD1 ;呼叫加法子程序ACALL DISPLAY ;显示LOOP: AJMP LOOP ;返回主程序;/AD转换AD:MOV DPTR,#7F00H;指向转换地址MOV A,#03H ;指向转换口MOVX DPTR,A ;转换MOV R1,#64HD1: DJNZ R1,D1 ;等100微秒转换完MOVX A,DPTR ;转换后的值给AMOV ADNUMBER,A ;转换的值给30HRET;/;拆分AD值程序/CAIFEN:MOV A,ADNUMBERANL A,#0FHMOV ADL,A ;取低位MOV A,ADNUMBERANL A,#0F0HSWAP AMOV ADH,A ;取高位MOV DISL,ADL24MOV DISH,ADH ;给显示值RET;/;显示/DISPLAY:MOV A,DISLMOV DPTR,#SETTABMOVC A,A+DPTRMOV SBUF,AD3: JNB TI,D3CLR TIMOV A,DISHMOV DPTR,#SETTABMOVC A,A+DPTRMOV SBUF,AD4: JNB TI,D4CLR TIMOV A,ADDJWMOV DPTR,#SETTABMOVC A,A+DPTRMOV SBUF,AD5: JNB TI,D5CLR TIMOV SBUF,#00HD6: JNB TI,D6CLR TIRET;/25;加法程序/ADD1:CLR CMOV A,ADDNUMBER ;取上次AD值ADDC A,ADDHOLD ;与这次AD值相加MOV ADDTOTAL,A ;将此次加的值给和值JNC ADDJW1 ;有无进位?INC ADDJW ;有进位,进位值给ADDJWADDJW1: ANL A,#0FHMOV DISL,A ;加值取低位MOV A,ADDTOTALANL A,#0F0HSWAP AMOV DISH,A ;加值取高位RET;/DELAY: ;延时MOV R3,#0AHDD1: MOV R1,#0FFHD2 : MOV R2,#0FFHDJNZ R2,$DJNZ R1,D2DJNZ R3,DD1RETSETTAB:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,260FEH,0F6HDB 0EEH,3EH,9CH,7AH,9EH,8EHEND7.4过程检定程序介绍(7.417.43):本程序用软件模拟了一个振动传感器软件搜频的全过程。振动传感器是通过在激励端给传感器一定频率的电压,在感应端感应一定频率的电压值。所以它能测很多东西,比如不同的压力所感应不同电压值,不同油品粘度也可以感应不同电压值,等等。但是这存在一个问题?就是传感器何时才能达到谐振状态呢,于是这就要给激励端变化的频率来测感应端的电压,感应端的电压在这个变化频率内何时最大,这时所给的频率就是所搜到的谐振频率。以前没有单片机软件控制时,我们只能通过硬件不断的给激励端变化频率电压,然后测感应端电压,来搜到谐振频率。7.41是在p1.0口输出并显示变化的频率200-250hz(省略了2的显示),7.42在7.41的基础上增加了AD输入量的显示。743将会在您输入变化AD值后,将搜到的AD值与频率值显示出来。实际应用如压力检测,粘度检测。程序操作:因为7.41和7.42只是7.43的铺垫。所以在59将7.43程序写入并上电后,您将会在数码管左两位看到200-250HZ变化频率的显示(省略2),右边看到输入AD值的显示。您可以用钟表起微调AD输入的电位器,使AD值上升,下降。在变化频率显示完后,程序将会把您所输入的最大的AD值与其所对应的频率一起显示出来,这就是软件模拟的全过程。7.41 P1.0口产生200250HZ变化频率输出(数码显示)程序实例(f25dis.asm):ORG 0000HAJMP MAINORG 001BHAJMP DIN1MAIN:;定义频率200和300/F2H EQU 30H60F2L EQU 31HF3H EQU 32HF3L EQU 33H;/DISFLAG EQU 34H ;显示标志DISL EQU 35H ;显示低位DISH EQU 36H ;显示高位;定义频率保持初值/MOV R1,#50MOV R2,#02H;/;显示赋初值/MOV DISFLAG,#00HMOV DISL,#00HMOV DISH,#00H;/;频率赋初值/MOV F2H,#0F6HMOV F2L,#3BHMOV F3H,#0F8HMOV F3L,#2FH;/CLR P1.0 ;在P1.0口产生一个低电平,一个脉冲是由一个高电平和一个低电平组成的MOV TMOD,#00010000B;定时器工作于方式1MOV TH1,F2HMOV TL1,F2L ;200HZ输出SETB EA ;开总中断61SETB TR1 ;开定时器1运行SETB ET1 ;开定时器1允许DISPLAY:MOV SBUF,#00HD1: JNB TI,D1CLR TIMOV SBUF,#00HD2: JNB TI,D2CLR TIMOV A,DISLMOV DPTR,#SETTABMOVC A,A+DPTRMOV SBUF,AD3: JNB TI,D3CLR TIMOV A,DISHMOV DPTR,#SETTABMOVC A,A+DPTRMOV SBUF,AD4: JNB TI,D4CLR TIACALL DELAYAJMP DISPLAYLOOP: AJMP LOOPDIN1:CPL P1.0 ;取反P1.0口,实际是为了不断的将p1.0的电平关系转换,即产生了频率;频率保持时间/62DJNZ R1,REMOV R1,#50DJNZ R2,REMOV R2,#02H;/INC DISFLAGMOV A,DISFLAGCJNE A,#0AH,FFMOV DISFLAG,#00HINC DISLMOV A,DISLCJNE A,#0AH,FFMOV DISL,#00HINC DISH;/FF: MOV A,F2HCJNE A,F3H,XIA ;频率高位到300HZ的高位了吗?AJMP JIA;频率高位没到300HZ的高位值,直接将低位值加1/XIA: INC F2LMOV A,F2LCJNE A,#00H,REINC F2HMOV A,F2HCJNE A,F3H,RE;/;频率高位加到300HZ的高位值了,低位加一,到300HZ的低63位值了吗,没到出去,到了关定时器/JIA:INC F2L ;到了将200HZ频率的低位加1MOV A,F2LCJNE A,#F3L,RECLR TR1;/RE:MOV TH1,F2HMOV TL1,F2LRETIDELAY:MOV R3,#0FFHD5: DJNZ R3,D5RETSETTAB:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6HDB 0EEH,3EH,9CH,7AH,9EH,8EH ;数显代码END7.42 在显示频率输出的同时显示AD值(数码显示)程序实例(ad25dis.asm):ORG 0000HAJMP MAINORG 001BHAJMP DIN1MAIN:64;定义频率200和300/F2H EQU 30HF2L EQU 31HF3H EQU 32HF3L EQU 33H;/DISFLAG EQU 34H ;显示标志DISL EQU 35H ;显示低位DISH EQU 36H ;显示高位ADNUMBER EQU 37H ;AD值DISADL EQU 38H ;显示AD低位DISADH EQU 39H ;显示AD高位;定义频率保持初值/MOV R1,#100MOV R2,#02H;/MOV ADNUMBER,#00H ;AD转换数初值;显示高低位初值/MOV DISADL,#00HMOV DISADH,#00H;/;显示赋初值/MOV DISFLAG,#00HMOV DISL,#00HMOV DISH,#00H;/;频率赋初值/MOV F2H,#0F6H65MOV F2L,#3BHMOV F3H,#0F8HMOV F3L,#2FH;/CLR P1.0 ;在P1.0口产生一个低电平,一个脉冲是由一个高电平和一个低电平组成的MOV TMOD,#00010000B;定时器工作于方式1MOV TH1,F2HMOV TL1,F2L ;200HZ输出SETB EA ;开总中断SETB TR1 ;开定时器1运行SETB ET1 ;开定时器1允许ADDIS:ACALL AD ;呼叫AD子程序;将转换的数字量屏蔽高位低位送DISADL保存/MOV A,ADNUMBERANL A,#0FHMOV DISADL,A;/;将转换的数字量屏蔽低位,将高位送DISADH保存/MOV A,ADNUMBERANL A,#0F0HSWAP AMOV DISADH,A;/DISPLAY:MOV A,DISADL66MOV DPTR,#SETTABMOVC A,A+DPTRMOV SBUF,AD1: JNB TI,D1CLR TIMOV A,DISADHMOV DPTR,#SETTABMOVC A,A

温馨提示

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

评论

0/150

提交评论