(完整word版)单片机汇编语言经典一百例.pdf
5151 单片机实用程序库单片机实用程序库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:(完整word版)单片机汇编语言经典一百例-第1页(完整word版)单片机汇编语言经典一百例-第1页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,#0FFH(完整word版)单片机汇编语言经典一百例-第2页(完整word版)单片机汇编语言经典一百例-第2页DJNZ 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;开总中断(完整word版)单片机汇编语言经典一百例-第3页(完整word版)单片机汇编语言经典一百例-第3页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 的频率为(完整word版)单片机汇编语言经典一百例-第4页(完整word版)单片机汇编语言经典一百例-第4页例: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 工作于方式 0(完整word版)单片机汇编语言经典一百例-第5页(完整word版)单片机汇编语言经典一百例-第5页MOV 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 MAIN(完整word版)单片机汇编语言经典一百例-第6页(完整word版)单片机汇编语言经典一百例-第6页ORG 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 口产生一个低电平,一个脉冲是由一个高电平和一个低电平组成的(完整word版)单片机汇编语言经典一百例-第7页(完整word版)单片机汇编语言经典一百例-第7页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 的高位值,直接将低位值加1(完整word版)单片机汇编语言经典一百例-第8页(完整word版)单片机汇编语言经典一百例-第8页XIA: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(完整word版)单片机汇编语言经典一百例-第9页(完整word版)单片机汇编语言经典一百例-第9页六、数显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,GEE(完整word版)单片机汇编语言经典一百例-第10页(完整word版)单片机汇编语言经典一百例-第10页MOVC 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,D4(完整word版)单片机汇编语言经典一百例-第11页(完整word版)单片机汇编语言经典一百例-第11页CLR 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;/(完整word版)单片机汇编语言经典一百例-第12页(完整word版)单片机汇编语言经典一百例-第12页;延时/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 脚电压,来检验所对应显(完整word版)单片机汇编语言经典一百例-第13页(完整word版)单片机汇编语言经典一百例-第13页示的 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 A(完整word版)单片机汇编语言经典一百例-第14页(完整word版)单片机汇编语言经典一百例-第14页MOV 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:(完整word版)单片机汇编语言经典一百例-第15页(完整word版)单片机汇编语言经典一百例-第15页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;显示高低位值(完整word版)单片机汇编语言经典一百例-第16页(完整word版)单片机汇编语言经典一百例-第16页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 值比(完整word版)单片机汇编语言经典一百例-第17页(完整word版)单片机汇编语言经典一百例-第17页较,不相等,即输入了新的 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;呼叫加法子程序(完整word版)单片机汇编语言经典一百例-第18页(完整word版)单片机汇编语言经典一百例-第18页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;取高位(完整word版)单片机汇编语言经典一百例-第19页(完整word版)单片机汇编语言经典一百例-第19页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+DPTR(完整word版)单片机汇编语言经典一百例-第20页(完整word版)单片机汇编语言经典一百例-第20页MOV 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,ADDTOTAL(完整word版)单片机汇编语言经典一百例-第21页(完整word版)单片机汇编语言经典一百例-第21页ANL 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.3 软件滤波程序介绍(7.317.34):您如果接触过模电就知道,在采集电压量时经常会碰到干扰,而在模电中经常所采用(完整word版)单片机汇编语言经典一百例-第22页(完整word版)单片机汇编语言经典一百例-第22页的方法就是加电容滤波,这是用硬件实现的。实际上软件完全可以达到滤波的效果,现在介绍的是一种最经典的方法。在一次电压量的采集中,在很短的时间内对它进行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):ORG 0000H(完整word版)单片机汇编语言经典一百例-第23页(完整word版)单片机汇编语言经典一百例-第23页MAIN: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 38HADDFLAG EQU 39H;加标志ENDFLAG EQU 40H;赋初值/MOV ADDHOLD,#00HMOV ADDNUMBER,#00HMOV ADL,#00HMOV ADH,#00HMOV DISL,#00HMOV DISH,#00HMOV ADDJW,#00HMOV ADDFLAG,#00HMOV ENDFLAG,#00H(完整word版)单片机汇编语言经典一百例-第24页(完整word版)单片机汇编语言经典一百例-第24页MOV ADDTOTAL,#00H;/MAIN1:28;显示 AD 值/ACALL DELAYACALL DELAYACALL ADMAIN3:ACALL CAIFENACALL DISPLAY;/;加这次的 AD 值,并判是否加了六次,是的话就进入死循环ACALL DELAYACALL ADD1ACALL DISPLAYINC ADDFLAGMOV A,ADDFLAGCJNE A,#06H,MAIN2LOOP:AJMP LOOP;/;没有加到六次,继续取值加,如果没有来新AD 值,还是去(完整word版)单片机汇编语言经典一百例-第25页(完整word版)单片机汇编语言经典一百例-第25页显示上次加的值,有新 AD 值来了,显示这次 AD 值,并加上上次 AD 值,显示/MAIN2:ACALL DELAYACALL ADMOV A,ADNUMBERCJN A,ADDTOTAL,MAIN3AJM MAIN2;/;/AD转换AD:29MOV DPTR,#7F00H;指向转换地址MOV A,#03H;指向转换口MOVX DPTR,A;转换MOV R1,#64HD1:DJNZ R1,D1;等 100 微秒转换完MOVX A,DPTR;转换后的值给 AMOV ADNUMBER,A;转换的值给 30HRET;/;拆分 AD 值程序/CAIFEN:(完整word版)单片机汇编语言经典一百例-第26页(完整word版)单片机汇编语言经典一百例-第26页MOV A,ADNUMBERANL A,#0FHMOV ADL,A;取低位MOV A,ADNUMBERANL A,#0F0HSWAP AMOV ADH,A;取高位MOV DISL,ADLMOV DISH,ADH;给显示值RET;/;显示/DISPLAY:MOV A,DISLMOV DPTR,#SETTABMOVC A,A+DPTRMOV SBUF,A30D3:JNB TI,D3CLR TIMOV A,DISHMOV DPTR,#SETTAB(完整word版)单片机汇编语言经典一百例-第27页(完整word版)单片机汇编语言经典一百例-第27页MOVC 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;/;加法程序/ADD1:CLR CMOV ADDTOTAL,ADNUMBERMOV A,ADNUMBERADDC A,ADDHOLDMOV ADDHOLD,A(完整word版)单片机汇编语言经典一百例-第28页(完整word版)单片机汇编语言经典一百例-第28页JNC ADDJW1INC ADDJW31ADDJW1:ANL A,#0FHMOV DISL,A;加值取低位MOV A,ADDHOLDANL 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,0FEH,0F6H(完整word版)单片机汇编语言经典一百例-第29页(完整word版)单片机汇编语言经典一百例-第29页DB 0EEH,3EH,9CH,7AH,9EH,8EHEND7.32 求六位和中的最大值和最小值(数码显示)程序实例(add61.asm):ORG 0000HMAIN:ADNUMBER EQU 30H;AD 转换值ADL EQU 32H;/32ADH EQU 33H;ADL 转换高低位值DISL EQU 34H;/DISH EQU 35H;显示高低位值ADDTOTAL EQU 36H;第一次 AD 转换值ADDJW EQU 37H;加法进位数ADDHOLD EQU 38HADDFLAG EQU 39H;加标志ENDFLAG EQU 40HADH1 EQU 41H;AD 中最大的值ADL1 EQU 42H;AD 中最小的值ADHOLDH EQU 43HADHOLDL EQU 44H;求 AD 最大值与最小值时 AD 的比较值,即以此两个值为比较中转(完整word版)单片机汇编语言经典一百例-第30页(完整word版)单片机汇编语言经典一百例-第30页FOUR EQU 45HSUB EQU 46H;减去高低位后的值JWHOLD EQU 47H;保存进位值;赋初值/MOV ADDHOLD,#00HMOV ADL,#00HMOV ADH,#00HMOV DISL,#00HMOV DISH,#00HMOV ADDJW,#00HMOV ADDFLAG,#00HMOV ENDFLAG,#00HMOV ADDTOTAL,#00HMOV ADH1,#00HMOV ADL1,#00H33MOV ADHOLDH,#00HMOV FOUR,#00HMOV ADHOLDL,#00HMOV JWHOLD,#00HMOV SUB,#00H;/(完整word版)单片机汇编语言经典一百例-第31页(完整word版)单片机汇编语言经典一百例-第31页MAIN1:ACALL DELAYACALL DELAYACALL AD;取 AD 值MAIN3:ACALL CAIFENACALL DISPLAY;显示ACALL DELAYACALL DELAY;算最大值和最小值/ACALL ADDHACALL ADDL;/;加和值显示/ACALL ADD1ACALL DISPLAY;/;判是否加到了 6 次/INC ADDFLAGMOV A,ADDFLAGCJNE A,#06H,MAIN2;/ACALL DELAY(完整word版)单片机汇编语言经典一百例-第32页(完整word版)单片机汇编语言经典一百例-第32页34ACALL DELAYACALL DELAYACALL DELAYACALL DELAYACALL DELAYACALL CAIFEN1;拆最小值ACALL CAIFEN2;拆最大值ACALL DISPLAY;显示最大值最小值LOOP:AJMP LOOP;判有没有来新 AD 值,没有显示以前,有显示现在的/MAIN2:ACALL DELAYACALL ADMOV A,ADNUMBERCJNE A,ADDTOTAL,MAIN3AJMP MAIN2;/;AD 转换/AD:MOV DPTR,#7F00H;指向转换地址MOV A,#03H;指向转换口MOVX DPTR,A;转换(完整word版)单片机汇编语言经典一百例-第33页(完整word版)单片机汇编语言经典一百例-第33页MOV R1,#64HD1:DJNZ R1,D1;等 100 微秒转换完MOVX A,DPTR;转换后的值给 AMOV ADNUMBER,A;转换的值给 30HRET;/;拆分 AD 值程序/35CAIFEN:MOV A,ADNUMBERANL A,#0FHMOV ADL,A;取低位MOV A,ADNUMBERANL A,#0F0HSWAP AMOV ADH,A;取高位MOV DISL,ADLMOV DISH,ADH;给显示值RET;/;显示/DISPLAY:(完整word版)单片机汇编语言经典一百例-第34页(完整word版)单片机汇编语言经典一百例-第34页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,#SETTAB36MOVC A,A+DPTRMOV SBUF,AD5:JNB TI,D5CLR TIMOV A,FOURMOV DPTR,#SETTABMOVC A,A+DPTR(完整word版)单片机汇编语言经典一百例-第35页(完整word版)单片机汇编语言经典一百例-第35页MOV SBUF,AD6:JNB TI,D6CLR TIRET;/;加法程序/ADD1:CLR CMOV ADDTOTAL,ADNUMBERMOV A,ADNUMBERADDC A,ADDHOLDMOV ADDHOLD,AJNC ADDJW1INC ADDJWADDJW1:ANL A,#0FHMOV DISL,A;加值取低位MOV A,ADDHOLDANL A,#0F0HSWAP AMOV DISH,A;加值取高位RET37(完整word版)单片机汇编语言经典一百例-第36页(完整word版)单片机汇编语言经典一百例-第36页;/;AD 值中的最大值/ADDH:MOV A,ADH1CJNE A,#00H,ADDH1MOV ADH1,ADNUMBERAJMP READDH1:MOV A,ADNUMBERCLR CSUBB A,ADH1JC REMOV ADH1,ADNUMBERRE:RET;/;AD 值中的最小值/ADDL:MOV A,ADL1CJNE A,#00H,ADDL1MOV ADL1,ADNUMBERAJMP RE1ADDL1:MOV A,ADNUMBERCLR C(完整word版)单片机汇编语言经典一百例-第37页(完整word版)单片机汇编语言经典一百例-第37页SUBB A,ADL1JNC RE1MOV ADL1,ADNUMBERRE1:RET;/;分解 AD 最小值的个,十位/38CAIFEN1:MOV A,ADL1ANL A,#0FHMOV ADL,A;取低位MOV A,ADL1ANL A,#0F0HSWAP AMOV ADH,A;取高位MOV DISL,ADLMOV DISH,ADH;给显示值RET;/;分解 AD 最大值的个,十位/CAIFEN2:MOV A,ADH1(完整word版)单片机汇编语言经典一百例-第38页(完整word版)单片机汇编语言经典一百例-第38页ANL A,#0FHMOV ADL,A;取低位MOV A,ADH1ANL A,#0F0HSWAP AMOV ADH,A;取高位MOV JWHOLD,ADDJWMOV ADDJW,ADLMOV FOUR,ADH;给显示值RET;/DELAY:;延时MOV R3,#0AH39DD1:MOV R1,#0FFHD2:MOV R2,#0FFHDJNZ R2,$DJNZ R1,D2DJNZ R3,DD1RET;/SETTAB:(完整word版)单片机汇编语言经典一百例-第39页(完整word版)单片机汇编语言经典一百例-第39页DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6HDB 0EEH,3EH,9CH,7AH,9EH,8EHEND7.33 求减去最大和最小值后的值(数码显示)程序实例(add62.asm)ORG 0000HMAIN:ADNUMBER EQU 30H;AD 转换值ADL EQU 32H;/ADH EQU 33H;ADL 转换高低位值DISL EQU 34H;/DISH EQU 35H;显示高低位值ADDTOTAL EQU 36H;第一次 AD 转换值ADDJW EQU 37H;加法进位数ADDHOLD EQU 38HADDFLAG EQU 39H;加标志ENDFLAG EQU 40HADH1 EQU 41H;AD 中最大的值40ADL1 EQU 42H;AD 中最小的值ADHOLDH EQU 43H(完整word版)单片机汇编语言经典一百例-第40页(完整word版)单片机汇编语言经典一百例-第40页ADHOLDL EQU 44H;求 AD 最大值与最小值时 AD 的比较值,即以此两个值为比较中转FOUR EQU 45HSUB EQU 46H;减去高低位后的值JWHOLD EQU 47H;保存进位值;赋初值/MOV ADDHOLD,#00HMOV ADL,#00HMOV ADH,#00HMOV DISL,#00HMOV DISH,#00HMOV ADDJW,#00HMOV ADDFLAG,#00HMOV ENDFLAG,#00HMOV ADDTOTAL,#00HMOV ADH1,#00HMOV ADL1,#00HMOV ADHOLDH,#00HMOV FOUR,#00HMOV ADHOLDL,#00HMOV JWHOLD,#00HMOV SUB,#00H(完整word版)单片机汇编语言经典一百例-第41页(完整word版)单片机汇编语言经典一百例-第41页;/MAIN1:ACALL DELAYACALL DELAY41ACALL AD;取 AD 值MAIN3:ACALL CAIFENACALL DISPLAY;显示ACALL DELAYACALL DELAY;算最大值和最小值/ACALL ADDHACALL ADDL;/;加和值显示/ACALL ADD1ACALL DISPLAY;/;判是否加到了 6 次/INC ADDFLAGMOV A,ADDFLAGCJNE A,#06H,MAIN2(完整word版)单片机汇编语言经典一百例-第42页(完整word版)单片机汇编语言经典一百例-第42页;/ACALL DELAYACALL DELAYACALL DELAYACALL DELAYACALL DELAYACALL DELAYACALL CAIFEN1;拆最小值ACALL CAIFEN2;拆最大值ACALL DISPLAY;显示最大值最小值ACALL DELAY42ACALL DELAYACALL JIAN1;呼叫减最大值最小值程序ACALL CAIFEN3;拆分ACALL DISPLAY;显示减去最大值最小值后的值ACALL DELAYACALL DELAYACALL DELAYLOOP:AJMP LOOP(完整word版)单片机汇编语言经典一百例-第43页(完整word版)单片机汇编语言经典一百例-第43页;判有没有来新 AD 值,没有显示以前,有显示现在的/MAIN2:ACALL DELAYACALL ADMOV A,ADNUMBERCJNE A,ADDTOTAL,MAIN3AJMP MAIN2;/;AD 转换/AD:MOV DPTR,#7F00H;指向转换地址MOV A,#03H;指向转换口MOVX DPTR,A;转换MOV R1,#64HD1:DJNZ R1,D1;等 100 微秒转换完MOVX A,DPTR;转换后的值给 AMOV ADNUMBER,A;转换的值给 30HRET43;/;拆分 AD 值程序/CAIFEN:(完整word版)单片机汇编语言经典一百例-第44页(完整word版)单片机汇编语言经典一百例-第44页MOV A,ADNUMBERANL A,#0FHMOV ADL,A;取低位MOV A,ADNUMBERANL A,#0F0HSWAP AMOV ADH,A;取高位MOV DISL,ADLMOV DISH,ADH;给显示值RET;/;显示/DISPLAY:MOV A,DISLMOV DPTR,#SETTABMOVC A,A+DPTRMOV SBUF,AD3:JNB TI,D3CLR TIMOV A,DISHMOV DPTR,#SETTABMOVC A,A+DPTR(完整word版)单片机汇编语言经典一百例-第45页(完整word版)单片机汇编语言经典一百例-第45页MOV SBUF,AD4:JNB TI,D4CLR TI44MOV A,ADDJWMOV DPTR,#SETTABMOVC A,A+DPTRMOV SBUF,AD5:JNB TI,D5CLR TIMOV A,FOURMOV DPTR,#SETTABMOVC A,A+DPTRMOV SBUF,AD6:JNB TI,