51单片机实用程序库流水灯程序介绍:利用P1 口通过一定延时轮流产生低电平输出,以达到发光二极管轮流亮的效果。
实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。
程序实例()ORG 0000HAJMP MAINORG 0030HMAIN:9MOV A,#00HMOV P1,A ;灭所有的灯MOV A,#BMAIN1:MOV P1,A ;开最左边的灯ACALL DELAY ;延时RL A ;将开的灯向右边移AJMP MAIN ;循环DELAY:MOV 30H,#0FFHD1: MOV 31H,#0FFHD2: DJNZ 31H,D2DJNZ 30H,D1RETEND方波输出程序介绍:口输出高电平,延时后再输出低电平,循环输出产生方波。
实际应用中例如:波形发生器。
程序实例():ORG 0000HMAIN:;直接利用口产生高低电平地形成方波步移位;显示个,十,百,千算机的内部计算都是二进制,而二进制每除一个2,实际上是向右移一次。
所以为了计算方便,我们选择取6个数,最后在算除法的时候,只需要用单片机自带的右移位命令移2次就行了。
27十六进制六位数加法(数码显示)程序实例: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 38HADDFLAG EQU 39H ;加标志ENDFLAG EQU 40H;赋初值//////////////////////////////////////////// MOV ADDHOLD,#00HMOV ADDNUMBER,#00HMOV ADL,#00HMOV ADH,#00HMOV DISL,#00HMOV DISH,#00HMOV ADDJW,#00HMOV ADDFLAG,#00HMOV ENDFLAG,#00HMOV 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值,还是去显示上次加的值,有新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: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,#SETTAB MOVC A,@A+DPTR MOV SBUF,A30D3: JNB TI,D3CLR TIMOV A,DISHMOV DPTR,#SETTAB MOVC A,@A+DPTR MOV 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,AJNC 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,0F6HDB 0EEH,3EH,9CH,7AH,9EH,8EHEND求六位和中的最大值和最小值(数码显示)程序实例():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的比较值,即以此两个值为比较中转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;////////////////////////////////////////////////// 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 DELAY34ACALL 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 ;转换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:MOV A,DISLMOV DPTR,#SETTAB MOVC A,@A+DPTR MOV SBUF,AD3: JNB TI,D3CLR TIMOV A,DISHMOV DPTR,#SETTAB MOVC A,@A+DPTR MOV SBUF,AD4: JNB TI,D4CLR TIMOV A,ADDJW MOV DPTR,#SETTAB 36MOVC A,@A+DPTRMOV SBUF,AD5: JNB TI,D5CLR TIMOV A,FOURMOV DPTR,#SETTABMOVC A,@A+DPTRMOV 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;//////////////////////////////////////////////////;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 CSUBB 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,ADH1ANL 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:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H, 0FEH,0F6HDB 0EEH,3EH,9CH,7AH,9EH,8EHEND求减去最大和最小值后的值(数码显示)程序实例()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 43HADHOLDL 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;////////////////////////////////////////////////// MAIN1:ACALL DELAYACALL DELAY41ACALL AD ;取AD值MAIN3: ACALL CAIFENACALL DISPLAY ;显示ACALL DELAYACALL DELAY;算最大值和最小值////////////////////////////////// ACALL ADDH;//////////////////////////////////////////////////;加和值显示/////////////////////////////////////// ACALL ADD1ACALL DISPLAY;/////////////////////////////////////////////////;判是否加到了6次////////////////////////////////// INC ADDFLAGMOV A,ADDFLAGCJNE A,#06H,MAIN2;////////////////////////////////////////////////// ACALL DELAYACALL DELAYACALL DELAYACALL DELAYACALL DELAYACALL CAIFEN1 ;拆最小值ACALL CAIFEN2 ;拆最大值ACALL DISPLAY ;显示最大值最小值ACALL DELAY42ACALL DELAYACALL JIAN1 ;呼叫减最大值最小值程序ACALL CAIFEN3 ;拆分ACALL DISPLAY ;显示减去最大值最小值后的值ACALL DELAYACALL DELAYLOOP: AJMP LOOP;判有没有来新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: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 MOV SBUF,AD4: JNB TI,D4CLR TI44MOV A,ADDJW MOV DPTR,#SETTAB MOVC A,@A+DPTR MOV SBUF,AD5: JNB TI,D5CLR TIMOV A,FOUR MOV DPTR,#SETTAB MOVC A,@A+DPTR 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,#0F0H45SWAP AMOV DISH,A ;加值取高位RET;/////////////////////////////////////////////////;AD值中的最大值/////////////////////////////////// ADDH:MOV A,ADH1CJNE A,#00H,ADDH1MOV ADH1,ADNUMBERAJMP READDH1: MOV A,ADNUMBERSUBB A,ADH1JC REMOV ADH1,ADNUMBERRE: RET;//////////////////////////////////////////////////;AD值中的最小值//////////////////////////////////// ADDL:MOV A,ADL1CJNE A,#00H,ADDL1MOV ADL1,ADNUMBERAJMP RE1ADDL1: MOV A,ADNUMBERCLR CSUBB A,ADL1MOV ADL1,ADNUMBER46RE1: RET;//////////////////////////////////////////////////;分解AD最小值的个,十位//////////////////////////// CAIFEN1: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,ADH1ANL A,#0FHMOV ADL,A ;取低位MOV A,ADH1ANL A,#0F0HSWAP AMOV ADH,A ;取高位MOV JWHOLD,ADDJWMOV ADDJW,ADLMOV FOUR,ADH ;给显示值RET47;//////////////////////////////////////////////////;分解减去最高位和最低位的数//////////////////////// CAIFEN3:MOV A,SUBANL A,#0FHMOV ADL,AMOV A,SUBANL A,#0F0HSWAP AMOV ADH,AMOV DISL,ADLMOV DISH,ADHRET;//////////////////////////////////////////////////;减去最高位和最低位//////////////////////////////// JIAN1:MOV FOUR,#00HMOV ADDJW,JWHOLDMOV A,ADDHOLD ;取和值CLR CSUBB A,ADH1 ;减最高位JNC JIAN2DEC ADDJW ;有进位,高位减一JIAN2:CLR CSUBB A,ADL1 ;减低位JNC TUI ;无进位出去,有进位高位减一48DEC ADDJWTUI: MOV SUB,A ;取减的值给SUBRET;////////////////////////////////////////////////// ;滤波////////////////////////////////////////////// DELAY: ;延时MOV R3,#0AHDD1: MOV R1,#0FFHD2 : MOV R2,#0FFHDJNZ R2,$DJNZ R1,D2DJNZ R3,DD1RET;//////////////////////////////////////////////////SETTAB:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H, 0FEH,0F6HDB 0EEH,3EH,9CH,7AH,9EH,8EHEND除4所得软件滤波值(数码显示)程序实例():ORG 0000HMAIN:ADNUMBER EQU 30H ;AD转换值ADL EQU 32H ;//ADH EQU 33H ;ADL转换高低位值DISL EQU 34H ;//49DISH 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的比较值,即以此两个值为比较中转FOUR EQU 45HSUB EQU 46H ;减去高低位后的值JWHOLD EQU 47H ;保存进位值;赋初值////////////////////////////////////////// MOV ADDHOLD,#00HMOV ADH,#00H MOV DISL,#00H MOV DISH,#00H MOV ADDJW,#00H MOV ADDFLAG,#00H MOV ENDFLAG,#00H MOV ADDTOTAL,#00H MOV ADH1,#00H MOV ADL1,#00H MOV ADHOLDH,#00H MOV FOUR,#00H50MOV ADHOLDL,#00H MOV JWHOLD,#00H;////////////////////////////////////////////////// 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 DELAYACALL DELAYACALL DELAY51ACALL DELAYACALL DELAYACALL DELAYACALL CAIFEN1 ;拆最小值ACALL CAIFEN2 ;拆最大值ACALL DISPLAY ;显示最大值最小值ACALL DELAYACALL DELAYACALL JIAN1 ;呼叫减最大值最小值程序ACALL CAIFEN3 ;拆分ACALL DISPLAY ;显示减去最大值最小值后的值ACALL DELAYACALL DELAYACALL DELAYACALL LUBO ;滤波程序ACALL DELAYACALL CAIFEN3。