51单片机常用子程序汇总
51单片机汇编程序集

1、片内RAM初始化子程序2、片外RAM初始化子程序3、片外RAM初始化子程序(双字节个单元)4、内部RAM数据复制程序5、外部RAM数据复制程序6、外部RAM数据复制程序7、外部RAM数据复制到内部RAM程序8、限幅滤波程序9、中位值滤波程序10、N点算术平均滤波11、N点加权平均滤波12、一阶加权滞后滤波程序13、双字节取补程序14、N节取补程序15、双字节无符号数加法程序16、N字节无符号数加法程序17、双字节无符号数减法程序18、N字节无符号数减法程序19、单字节无符号数乘法程序20、单字节无符号数乘法程序21、单字节无符号数乘法程序22、双字节无符号数乘法程序23、双字节无符号数乘法程序24、N字节无符号数乘法程序25、单字节无符号除法程序26、单字节无符号除法程序27、双字节无符号除法程序28、N字节无符号除法程序(组合)29、N字节无符号除法程序30、N字节数据左移程序31、原码有符号双字节减法程序32、原码有符号双字节加法程序33、原码有符号双字节乘法程序34、原码有符号双字节除法程序35、单字节顺序查找程序36、单字节顺序查找程序37、双字节字符串顺序查找程序38、双字节字符串顺序查找程序39、N字节字符串顺序查找程序40、单字节最值查找程序41、浮点数顺序查找程序42、浮点数最值查找程序43、单字节折半查找程序1.片内RAM初始化子程序IBCLR:MOV A,R0MOV R1,ACLR AIBC1:MOV@R1,AINC R1DJNZ R7,IBC1RET2.片外RAM初始化子程序EBCLR1:MOV A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,ACLR CEBC11:MOVX@DPTR,AINC DPTRDJNZ R7,EBC11RET3.片外RAM初始化子程序(双字节个单元) EBCLR2:MOV A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,AMOV A,R7JZ EBC21INC R6EBC21:CLR AMOVX@DPTR,AINC DPTRDJNZ R7,EBC21DJNZ R6,EBC21RET4.内部RAM数据复制程序;入口:R0,R7;占用资源:A;堆栈需求:2字节;出口:R1IBMOV:MOV A,R0ADD A,R7MOV R0,AMOV A,R1ADD A,R7MOV R1,AIBM1:DEC R0DEC R1MOV A,@R0MOV@R1,ADJNZ R7,IBM1RET5.外部RAM数据复制程序;入口:ADDPH,ADDPL,R7;占用资源:ACC;堆栈需求:2字节;出口:R0,R1EBMOV1:MOV A,ADDPLADD A,R7MOV DPL,ACLR AADDC A,ADDPHMOV DPH,AMOV A,R7ADD A,R1XCH A,R0ADDC A,#00HMOV P2,AEBM11:DEC R0CJNE R0,#0FFH,EBM12DEC P2EBM12:DEC DPLMOV A,DPLCJNE A,#0FFH,EBM13DEC DPHEBM13:MOVX A,@R0MOVX@DPTR,ADJNZ R7,EBM11RET6.外部RAM数据复制程序;入口:ADDPH,ADDPL,R6,R7 ;占用资源:ACC;堆栈需求:2字节;出口:R0,R1EBMOV2:MOV A,ADDPLADD A,R7MOV DPL,AMOV A,R6ADDC A,ADDPHMOV DPH,AMOV A,R7ADD A,R1XCH A,R0ADDC A,R6MOV P2,AMOV A,R7JZ EBM21INC R6EBM21:DEC R0CJNE R0,#0FFH,EBM22DEC P2EBM22:DEC DPLMOV A,DPLCJNE A,#0FFH,EBM23DEC DPHEBM23:MOVX A,@R0MOVX@DPTR,ADJNZ R7,EBM21DJNZ R6,EBM21RET7.外部RAM数据复制到内部RAM程序;入口:ADDPH,ADDPL,R7;占用资源:ACC;堆栈需求:2字节;出口:R0ITEMOV:MOV A,ADDPLADD A,R7MOV DPL,AMOV A,ADDPHADDC A,#00HMOV DPH,AMOV A,R0ADD A,R7MOV R0,AITEM1:DEC R0DEC DPLMOV A,DPLCJNE A,#0FFH,ITEM2DEC DPHITEM2:MOVX A,@DPTRMOV@R0,ADJNZ R7,ITEM1RET8.限幅滤波程序;入口:A,SDAT,DELTY;占用资源:B;堆栈需求:2字节;出口:AJUGFILT:MOV B,ACLR CSUBB A,SDATJNC JUGFT1CPL AINC AJUGFT1:SETB ASUBB A,#DELTYJNC JUGFT3MOV A,SDATRETJUGFT3:MOV A,BMOV SDAT,ARET9.中位值滤波程序;入口:ADDPH,ADDPL,N;占用资源:ESELSORT;堆栈需求:4字节;出口:AMEDFILT:LCALL ESELSORT MOV A,NCLR CRRC AADD A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,AJNC MEDFT1INC DPHMEDFT1:MOVX A,@DPTR RET10.N点算术平均滤波;入口:ADDPH,ADDPL,N;占用资源:B,R3,R4;堆栈需求:2字节;出口:AAVFILT:MOV A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,ACLR AMOV R3,AMOV R4,AMOV R7,NAVFT1:MOVX A,@DPTRINC DPTRADD A,R4MOV R4,AJNC AVFT2INC R3AVFT2:DJNZ R7,AVFT1MOV R7,NMOV R2,#00HLCALL NDIV31MOV A,R4RET11.N点加权平均滤波;入口:ADDPH,ADDPL,N;占用资源:B,R3,R4;堆栈需求:2字节;出口:AQAVFILT:CLR AMOV R3,AMOV R4,AMOV R7,NMOV P2,ADDPHMOV R1,ADDPLMOV DPTR,#QAVTAB QAVFT1:MOVC A,@A+DPTR MOV B,AMOVX A,@R1INC DPTRINC R1MUL ABADD A,R4MOV R4,AMOV A,BADDC A,R3MOV R3,ADJNZ R7,QAVFT1MOV A,R4JNB ACC.7,QAVFT2INC R3QAVFT2:MOV A,R3RETQAVTAB:DB12.一阶加权滞后滤波程序;入口:A,DELTY;占用资源:B,R3,R4;堆栈需求:2字节;出口:ABQFILT:MOV B,ACLR AMOV DPTR,#ABTABMOVC A,@A+DPTRMUL ABMOV R4,AMOV R3,BMOV A,#01HMOVC A,@A+DPTRMOV B,DELTYMUL ABADD A,R4MOV R4,AMOV A,BADDC A,R3MOV R3,AMOV A,R4JNB ACC.7,FT1INC R3FT1:MOV A,R3MOV DELTY,ARETBQTAB:DB80H,80H13.双字节取补程序/(R3R4)=(R3R4);入口:R3,R4;占用资源:ACC;堆栈需求:2字节;出口:R3,R4CMPT:MOV A,R4CPL AADD A,#01HMOV R4,AMOV A,R3CPL AADDC A,#00HMOV R3,ARET14.N节取补程序/([R0])=([R0]);入口:R0,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R0NCMPTN:MOV B,R0SETB CNCPT1:MOV A,@R0CPL AADDC A,#00HMOV@R0,AINC R0DJNZ R7,NCPT1MOV R0,BRET15.双字节无符号数加法程序(R3R4+R6R7)=(R3R4) ;入口:R3,R4,R6,R7;占用资源:ACC;堆栈需求:2字节;出口:R3,R4,CFNADD:MOV A,R4ADD A,R7MOV R4,AMOV A,R3ADDC A,R6MOV R3,ARET16.N字节无符号数加法程序([R0]+[R1])=([R0]);入口:R0,R1,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R0,CFNADDN:MOV B,R0CLR CNADN1:MOV A,@R0ADDC A,@R1MOV@R0,AINC R0INC R1DJNZ R7,NADN1MOV R0,BRET17.双字节无符号数减法程序(R3R4-R6R7)=(R3R4) ;入口:R3,R4,R6,R7;占用资源:ACC;堆栈需求:2字节;出口:R3,R4NSUB:MOV A,R4CLR CSUBB A,R7MOV R4,AMOV A,R3SUBB A,R6MOV R3,ARET18.N字节无符号数减法程序([R0]-[R1])=([R0]);入口:R0,R1,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R0,CFNSUBN:MOV B,R0MOV R7,NCLR CNSUBN1:MOV A,@R0SUBB A,@R1MOV@R0,AINC R0INC R1DJNZ R7,NSUBN1MOV R0,BRET19.单字节无符号数乘法程序(R3R4*R7)=(R2R3R4);入口:R3,R4,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R2,R3,R4NMUL21:MOV A,R4MOV B,R7MUL ABMOV R4,AMOV A,BXCH A,R3MOV B,R7MUL ABADD A,R3MOV R3,ACLR AADDC A,BMOV R2,ACLR OVRET20.单字节无符号数乘法程序(R2R3R4*R7)=(R5R2R3R4) ;入口:R2,R3,R4,R6,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R5,R2,R3,R4NMUL31:MOV A,R4MOV B,R7MOV R4,AMOV A,BXCH A,R3MOV B,R7MUL ABADD A,R3MOV R3,ACLR AADDC A,BXCH A,R2MOV B,R7MUL ABADD A,R2MOV R2,ACLR AADDC A,BMOV R5,ACLR OVRET21.单字节无符号数乘法程序(R5R2R3R4*R7)=(R7R5R2R3R4) ;入口:R5,R2,R3,R4,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R7,R5,R2,R3,R4NMUL41:MOV A,R4MOV B,R7MUL ABMOV R4,AMOV A,BXCH A,R3MOV B,R7MUL ABADD A,R3MOV R3,ACLR AADDC A,BMOV B,R7MUL ABADD A,R2MOV R2,ACLR AADDC A,BXCH A,R5MOV B,R7MUL ABADD A,R5MOV R5,ACLR AADDC A,BMOV R7,ACLR OVRET22.双字节无符号数乘法程序(R3R4*R6R7)=(R5R2R3R4) ;入口:R3,R4,R6,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R5,R2,R3,R4NMUL22:MOV A,R4MOV B,R7MUL ABXCH A,R4MOV R5,BMOV B,R6MUL ABADD A,R5MOV R5,ACLR AADDC A,BMOV R2,AMOV A,R3MOV B,R7MUL ABMOV R5,AMOV A,BADDC A,R2MOV R2,ACLR AADDC A,#00HXCH A,R3MOV B,R6MUL ABADD A,R2MOV R2,AMOV A,BADDC A,R3XCH A,R5MOV R3,ACLR OVRET23.双字节无符号数乘法程序(R2R3R4*R6R7)=(R1R5R2R3R4) ;入口:R2,R3,R4,R6,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R1,R5,R2,R3,R4NMUL32:MOV A,R4MOV B,R7MUL ABXCH A,R4MOV R5,BMOV B,R6MUL ABADD A,R5MOV R5,ACLR AADDC A,BMOV R1,AMOV A,R3MOV B,R7ADD A,R5 MOV R5,A MOV A,B ADDC A,R1 MOV R1,A CLR A ADDC A,#00H XCH A,R3 MOV B,R6 MUL AB ADD A,R1 MOV R1,A MOV A,B ADDC A,R3 XCH A,R5 MOV R3,A MOV A,R2 MOV B,R7 MUL AB ADD A,R1 MOV R1,A MOV A,B ADDC A,R5 MOV R5,A CLR A ADDC A,#00H XCH A,R2 MOV B,R6 MUL AB ADD A,R5 MOV R5,A MOV A,B ADDC A,R2 XCH A,R1 MOV R2,A CLR OVRET24.N字节无符号数乘法程序([R0]*[R1])=([R0]) ;入口:R0,R1,M,N;占用资源:ACC,B,R2,R5,R6,R7,NCNT;堆栈需求:2字节;出口:R0NMULMN:MOV A,MADD A,R0MOV R5,AXCH A,R1XCH A,R5ADD A,NXCH A,R0MOV R6,AMOV B,MMOV NCNT,BNMLMN1:DEC R0DEC R1CLR AXCH A,@R1MOV@R0,ADJNZ NCNT,NMLMN1MOV NCNT,BNMLMN2:CLR AXCH A,@R0MOV R2,AMOV A,R6MOV R0,AMOV A,R5MOV R1,AMOV R7,NCLR CNMLMN3:MOV A,R2MOV B,@R1INC R1MUL ABADDC A,@R0MOV@R0,AINC R0MOV A,BADDC A,@R0MOV@R0,ADJNZ R7,NMLMN3INC R0INC R6DJNZ NCNT,NMLMN2MOV A,R0CLR CSUBB A,MSUBB A,NMOV R0,ARET25.单字节无符号除法程序(R2R3R4/R7)=(R2)R3R4余数R7 ;入口:R2,R3,R4,R7;占用资源:ACC,B,F0;堆栈需求:3字节;出口:(R2),R3,R4,R7,OVNDIV31:MOV A,R2MOV B,R7DIV ABPUSH AMOV R2,BMOV B,#10HNDV311:CLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AMOV F0,CCLR CSUBB A,R7JB F0,NDV312JC NDV313NDV312:MOV R2,AINC R4NDV313:DJNZ B,NDV311POP ACLR OVJZ NDV314SETB OVNDV314:XCH A,R2MOV R7,ARET26.单字节无符号除法程序(R5R2R3R4/R7)=(R5)R2R3R4余数R7 ;入口:R2,R3,R4,R7;占用资源:ACC,B,F0;堆栈需求:3字节;出口:(R5),R2,R3,R4,R7,OVNDIV41:MOV A,R5MOV B,R7DIV ABPUSH AMOV R5,BMOV B,#18HNDV411:CLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AMOV A,R5RLC AMOV R5,AMOV F0,CCLR CSUBB A,R7JB F0,NDV412JC NDV413NDV412:MOV R5,AINC R4NDV413:DJNZ B,NDV411POP ACLR OVJZ NDV414SETB OVNDV414:XCH A,R5MOV R7,ARET27.双字节无符号除法程序(R5R2R3R4/R6R7)=(R2)R3R4余数R6R7 ;入口:R5,R2,R3,R4,R6,R7;占用资源:ACC,B,F0;堆栈需求:4字节;出口:(R2),R3,R4,R6,R7,OVNDIV42:MOV A,R1PUSH AMOV B,#00HNDV421:MOV A,R2CLR CSUBB A,R7MOV R1,AMOV A,R5SUBB A,R6JC NDV422MOV R5,AMOV A,R1MOV R2,AINC BSJMP NDV421NDV422:PUSH BMOV B,#10HNDV423:CLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AXCH A,R5RLC AXCH A,R5MOV F0,CCLR CSUBB A,R7MOV R1,AMOV A,R5SUBB A,R6JB F0,NCV424JC NDV425NCV424:MOV R5,AMOV A,R1MOV R2,AINC R4NDV425:DJNZ B,NDV423 POP ACLR OVJNZ NDV426SETB OVNDV426:XCH A,R2MOV R7,AMOV A,R5MOV R6,APOP AMOV R1,ARET28.N字节无符号除法程序(组合)([R0]/[R1])=([R0]);入口:R0,R1,M,N;占用资源:ACC,R2,R3,R4,R5,R7,NCNT,F0,NADDN,NSUBBN,NRLCN ;堆栈需求:4字节;出口:R0;NDIVMN:MOV A,MCLR CSUBB A,NMOV NCNT,AADD A,R0MOV R4,AXCH A,R0MOV R3,AMOV A,R1MOV R5,AMOV R2,#00HNDVMN1:MOV R7,NLCALL NSUBNMOV A,R5MOV R1,AJC NDVMN2INC R2SJMP NDVMN1NDVMN2:MOV R7,NLCALL NADDNMOV A,NCNTSWAP ARR AMOV NCNT,ANDVMN3:MOV A,R3MOV R0,AMOV R7,MLCALL NRLCNMOV F0,CMOV A,R4MOV R0,AMOV A,R5MOV R1,AMOV R7,NLCALL NSUBNJB F0,NDVMN4JC NDVMN5NDVMN4:MOV A,R3MOV R0,AINC@R0SJMP NDVMN6NDVMN5:MOV A,R5MOV R1,AMOV R7,NLCALL NADDNNDVMN6:DJNZ NCNT,NDVMN3MOV A,R4MOV R1,AMOV A,R2MOV@R1,AMOV A,R3MOV R0,ARET29.N字节无符号除法程序(集成)([R0]/R[1])=([R0]) ;入口:R0,R1,M,N;占用资源:ACC,R2,R3,R4,R5,R7,F0;堆栈需求:2字节;出口:R0NDIVMN:MOV A,MCLR CSUBB A,NMOV B,AADD A,R0MOV R4,AXCH A,R0MOV R3,AMOV A,R1MOV R5,AMOV R2,#00H NDVMN1:MOV R7,NCLR CNDVMN2:MOV A,@R0 SUBB A,@R1MOV@R0,AINC R0INC R1DJNZ R7,NDVMN2MOV A,R4MOV R0,AMOV A,R5MOV R1,AJC NDVMN3INC R2SJMP NDVMN1 NDVMN3:MOV R7,NCLR CNDVMN4:MOV A,@R0 ADDC A,@R1MOV@R0,AINC R0INC R1DJNZ R7,NDVMN4MOV A,#08HMUL ABMOV B,A NDVMN5:MOV A,R3MOV R0,AMOV R7,MCLR CNDVMN6:MOV A,@R0 RLC AMOV@R0,AINC R0DJNZ R7,NDVMN6MOV F0,CMOV R0,AMOV A,R5MOV R1,AMOV R7,NCLR CNDVMN7:MOV A,@R0SUBB A,@R1MOV@R0,AINC R0INC R1DJNZ R7,NDVMN7JB F0,NDVMNBJC NDVMN8 NDVMNB:MOV A,R3MOV R0,AINC@R0SJMP NDVMNA NDVMN8:MOV R7,NMOV A,R4MOV R0,AMOV A,R5MOV R1,ACLR CNDVMN9:MOV A,@R0ADDC A,@R1MOV@R0,AINC R0INC R1DJNZ R7,NDVMN9 NDVMNA:DJNZ B,NDVMN5 MOV A,MCLR CSUBB A,NADD A,R3MOV R1,AMOV A,R2MOV A,R3MOV R0,ARET30.N字节数据左移程序RLC([R0])=(CF[R0]);入口:R0,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R0,CFNRLCN:MOV B,R0CLR CNRLN1:MOV A,@R0RLC AMOV@R0,AINC R0DJNZ R7,NRLN1MOV R0,BRET31.原码有符号双字节减法程序(R3R4-R6R7)=R3R4 ;入口:R3,R4,R6,R7;占用资源:ACC,DADD;堆栈需求:6字节;出口:R3,R4,OVDSUB:MOV A,R6CPL ACC.7MOV R6,ALCALL DADDRET32.原码有符号双字节加法程序(R3R4+R6R7)=R3R4 ;入口:R3,R4,R6,R7;占用资源:ACC,SR0,NADD,NSUB,CMPT;堆栈需求:4字节;出口:R3,R4,OVDADD:MOV A,R3MOV C,ACC.7MOV SR0,CXRL A,R6MOV A,R3CLR ACC.7MOV R3,AMOV A,R6CLR ACC.7MOV R6,AJC DAB2LCALL NADDMOV A,R3JB ACC.7,DABEDAB1:MOV C,SR0MOV ACC.7,CMOV R3,ACLR OVRETDABE:SETB OVRETDAB2:LCALL NSUBMOV A,R3JNB ACC.7,DAB1LCALL CMPTCPL SR0SJMP DAB133.原码有符号双字节乘法程序(R3R4*R6R7)=(R5R2R3R4) ;入口:R3,R4,R6,R7;占用资源:ACC,SR0,NMUL22;堆栈需求:4字节;出口:R5,R2,R3,R4IMUL:MOV A,R3XRL A,R6MOV C,ACC.7MOV SR0,CMOV A,R3CLR ACC.7MOV R3,AMOV A,R6MOV R6,ALCALL NMUL22MOV A,R5MOV C,SR0MOV ACC.7,CMOV R5,ARET34.原码有符号双字节除法程序(R5R2R3R4/R6R7)=(R3R4)余数(R6R7) ;入口:R5,R2,R3,R4;占用资源:ACC,SR0,NDIV42;堆栈需求:6字节;出口:R3,R4,R6,R7,OVIDIV:MOV A,R5XRL A,R6MOV C,ACC.7MOV SR0,CMOV A,R5CLR ACC.7MOV R5,AMOV A,R6CLR ACC.7MOV R6,ALCALL NDIV42MOV A,R3JB ACC.7,IDIVEJB OV,IDIVEMOV C,SR0MOV ACC.7,CMOV R3,ARETIDIVE:SETB OVRET35.单字节顺序查找程序;入口:R0,R1,A,R7;占用资源:B;堆栈需求:2字节;出口:R0,R1,AFINDB1:MOV B,AMOV DPL,R1MOV DPH,R0FINDB11:MOVX A,@DPTR CJNE A,B,FINDB12MOV R1,DPLMOV R0,DPHCLR ARETFINDB12:INC DPTRDJNZ R7,FINDB11MOV A,#0FFHRET36.单字节顺序查找程序;入口:R0,R1,A,R6,R7;占用资源:B;堆栈需求:2字节;出口:R0,R1,AFINDB2:MOV B,AMOV DPL,R1MOV DPH,R0MOV A,R7JZ FINDB21INC R6FINDB21:MOVX A,@DPTR CJNE A,B,FINDB22MOV R1,DPLMOV R0,DPHCLR ARETFINDB22:INC DPTRDJNZ R7,FINDB21DJNZ R6,FINDB21MOV A,#0FFHRET37.双字节字符串顺序查找程序;入口:R0,R1,R3,R4,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R0,R1,AFINDS1:MOV DPL,R1MOV DPH,R0FINDS11:MOVX A,@DPTRINC DPTRCLR CSUBB A,R4JNZ FINDS12MOVX A,@DPTRSUBB A,R3JNZ FINDS12MOV A,DPLCLR CSUBB A,#01HMOV R1,AMOV A,DPHSUBB A,#00HMOV R0,ACLR ARETFINDS12:DJNZ R7,FINDS11MOV A,#0FFHRET38.双字节字符串顺序查找程序;入口:R0,R1,R3,R4,R6,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R0,R1,AFINDS2:MOV DPL,R1MOV DPH,R0MOV A,R7JZ FINDS21INC R6FINDS21:MOVX A,@DPTRINC DPTRCLR CSUBB A,R4JNZ FINDS22MOVX A,@DPTRSUBB A,R3JNZ FINDS22MOV A,DPLCLR CSUBB A,#01HMOV R1,AMOV A,DPHSUBB A,#00HMOV R0,ACLR ARETFINDS22:DJNZ R7,FINDS21DJNZ R6,FINDS21MOV A,#0FFHRET39.N字节字符串顺序查找程序;入口:ADDPH,ADDPL,R0,R6,R7,N ;占用资源:ACC,B,R2,NCNT;堆栈需求:2字节;出口:ADDPH,ADDPL,A FINDN:MOV A,R0MOV R2,AMOV A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,AMOV A,R7JZ FINDN1INC R6FINDN1:MOV A,R2MOV R0,AMOV NCNT,AFINDN2:MOVX A,@DPTRCLR CSUBB A,@R0JNZ FINDN3INC DPTRINC R0DJNZ NCNT,FINDN2MOV A,DPLCLR CSUBB A,NMOV ADDPL,AMOV A,DPHSUBB A,#00HMOV ADDPH,ACLR ARETFINDN3:CLR CMOV A,R0SUBB A,R2JNZ FINDN4INC DPTRFINDN4:DJNZ R7,FINDN1DJNZ R6,FINDN1MOV A,#0FFHRET40.单字节最值查找程序;入口:R0,R1,R6,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R0(最大值),R1(最小值),R2,R3,R4,R5 FMAMIB:MOV DPL,R1MOV DPH,R0MOVX A,@DPTRMOV R0,AMOV R1,AMOV R3,AMOV R5,AMOV A,DPHMOV R2,AMOV R4,AMOV A,R7JZ FMMB1INC R6FMMB1:MOVX A,@DPTR MOV B,ASETB CSUBB A,R0JC FMMB2MOV R0,BMOV R3,DPLMOV R2,DPHSJMP FMMB3FMMB2:MOV A,BCLR CSUBB A,R1JNC FMMB3MOV R1,BMOV R5,DPLMOV R4,DPHFMMB3:INC DPTRDJNZ R7,FMMB1DJNZ R6,FMMB1RET41.浮点数顺序查找程序;入口:R0,R1,R2,R3,R4,R6,R7 ;占用资源:B,NCNT,FCMP;堆栈需求:2字节;出口:R0,R1,AFINDF:MOV DPL,R1MOV DPH,R0MOV A,R7MOV NCNT,R6JZ FINDF1INC NCNTFINDF1:MOVX A,@DPTRINC DPTRMOV R5,AMOVX A,@DPTRINC DPTRMOV R6,AMOVX A,@DPTRINC DPTRMOV R7,ALCALL FCMPJNZ FINDF2MOV A,DPLCLR CSUBB A,#03HMOV R1,AMOV A,DPHSUBB A,#00HMOV R0,ACLR ARETFINDF2:DJNZ B,FINDF1DJNZ NCNT,FINDF1MOV A,#0FFHRET42.浮点数最值查找程序;入口:ADDPH,ADDPL,R6,R7;占用资源:ACC,B,NCNT,ITEMOV,EBMOV,MOVB,MOVR1,FCMP ;堆栈需求:5字节;出口:[R0](最大值),[R1](最小值),R2,R3,R4,R5FMAMIF:MOV A,ADDPLMOV R3,AMOV R5,AMOV DPL,AMOV A,ADDPHMOV R2,AMOV R4,AMOV DPH,AMOV B,R7MOV R7,#03HLCALL ITEMOVMOV R7,#03HLCALL IBMOVMOV A,BJZ FMMF1INC NCNT FMMF1:PUSH BMOVX A,@DPTRINC DPTRMOV R2,AMOVX A,@DPTRINC DPTRMOV R3,AMOVX A,@DPTRINC DPTRMOV R4,ALCALL MOVR1LCALL FCMPJNC FMMF2MOV A,R0XCH A,R1MOV R0,ALCALL MOVBMOV R5,DPLMOV R4,DPHMOV A,R0XCH A,R1MOV R0,ASJMP FMMF3 FMMF2:MOV A,R0XCH A,R1MOV R0,ALCALL MOVR1LCALL FCMPMOV A,R0XCH A,R1MOV R0,AJZ FMMF3JC FMMF3LCALL MOVBMOV R3,DPLMOV R2,DPH FMMF3:POP BDJNZ B,FMMF1DJNZ NCNT,FMMF1RET43.单字节折半查找程序;入口:A,R0,R1,R6,R7;占用资源:B,R2;堆栈需求:2字节;出口:R0,R1 SEARCHB:MOV B,AMOV A,R1ADD A,R7MOV R7,AMOV A,R0ADDC A,R6MOV R6,AMOV A,R7SUBB A,#01HMOV R7,AJNC SECH1DEC R6SECH1:MOV A,R7CLR CSUBB A,R1MOV A,R6SUBB A,R0JNC SECH2MOV A,#0FFHRETSECH2:MOV A,R7ADD A,R1MOV R2,AMOV A,R6ADDC A,R0RRC AMOV DPH,AMOV A,R2RRC AMOV DPL,AMOVX A,@DPTRCLR CSUBB A,BJNC SECH3INC DPTRMOV R0,DPHMOV R1,DPLSJMP SECH1 SECH3:JZ SECH5MOV A,DPLSUBB A,#01HMOV R7,AJNC SECH4MOV R6,DPHDEC R6SECH4:SJMP SECH1 SECH5:MOV R0,DPH MOV R1,DPLCLR ARET。
分享简洁51单片机常用子程序2

//uchar seg[10]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};//七段uchar seg[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};//七段小数点不亮/************* 音乐数据表 *****************/unsigned char n=0; //n为节拍常数变量unsigned char code music_tab[] ={0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,0x20, 0x40, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x10,0x1C, 0x10, 0x18 , 0x40,0x1C, 0x20, 0x20 , 0x20,0x1C, 0x20, 0x18 , 0x20,0x20, 0x80, 0xFF , 0x20,0x30, 0x1C, 0x10 , 0x18,0x20, 0x15, 0x20 , 0x1C,0x20, 0x20, 0x20 , 0x26,0x40, 0x20, 0x20 , 0x2B,0x20, 0x26, 0x20 , 0x20,0x20, 0x30, 0x80 , 0xFF,0x20, 0x20, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x20, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x80,0x20, 0x30, 0x1C , 0x10,0x20, 0x10, 0x1C , 0x10,0x20, 0x20, 0x26 , 0x20,0x2B, 0x20, 0x30 , 0x20,0x2B, 0x40, 0x20 , 0x15,0x1F, 0x05, 0x20 , 0x10,0x1C, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x30,0x20, 0x30, 0x1C , 0x10,0x18, 0x40, 0x1C , 0x20,0x20, 0x20, 0x26 , 0x40,0x13, 0x60, 0x18 , 0x20,0x15, 0x40, 0x13 , 0x40,0x18, 0x80, 0x00};uchar h[4];uint i;uchar ADCRS;uchar Rchar;uchar X=0;float hres;void delayms(int t)//51单片机常用延时子程序毫秒级延时{int i; //声明变量i--内循环变量int j; //声明变量j--外循环变量for(j=0;j<t;j++){for (i=0;i<150;i++);//循环加法计算,消耗CPU时间,达到延时的目的}}uchar ADC(void) //adc 子程序,本程序针对常用并行8位AD芯片ADC0804 {uchar ADCRes; //声明一个uchar(无符号单字节变量,用于保存AD转换结果) P0=0xFF;//拉高P0数据总线,为读做准备(51单片机中,读取IO端口时,必须先拉高对应端口)WR=0;//把ADC0804的WR脚拉低DAC_WR=1;delayms(1);}}void int0() interrupt 1 //采用中断0 控制节拍{ TH0=0xd8;TL0=0xef;n--;}void delay (unsigned char m) //控制频率延时{unsigned i=3*m;while(--i);}void jkc_Flash_LED(void) //接于P0口的8个LED闪烁例程{P2=0XFF; //P2口高电平,关掉数码管while(1){P0=0X00;//P0端口拉低,灯亮delayms(200);P0=0XFF;//P0端口拉高,灯灭delayms(200);}void jkc_Horse_LED(void) //跑马灯例程{unsigned char temp;P2=0XFF; //P2口高电平,关掉数码管temp=0x01;P0=~temp; //temp 按位取反后赋给P0,直接输出temp(0x01),最低位是1高电平,灯不亮,低电平才亮,所以要反转位delayms(100);while(1){P0=~temp;temp<<=1;//temp向左移动一位,即里面的1向左移动一位。
51单片机实用子程序(汇编)

《MCS-51单片机实用子程序库(96年版)》周航慈目前已有若干版本的子程序库公开发表,它们各有特色。
笔者在1988年也编制了两个子程序库(定点子程序库和浮点子程序库),并在相容性、透明性、容错性和算法优化方面作了一些工作。
本程序库中的开平方算法为笔者研究的快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。
经过八年来全国广大用户的实际使用,反馈了不少信息,陆续扩充了一些新的子程序,纠正了一些隐含错误,成为现在这个最新版本。
本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:(1)按当前流行的以 IBM PC 为主机的开发系统对汇编语言的规定,将原子程序库的标号和位地址进行了调整,读者不必再进行修改,便可直接使用。
(2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。
(3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理程序的工作变得更简单直观。
在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈需求,各项目的意义请参阅《单片机应用程序设计技术》第六章 6.3.7 节的内容。
程序清单中开列了四个栏目:标号、指令、操作数、注释。
为方便读者理解,注释尽力详细。
子程序库的使用方法如下:1.将子程序库全部内容链接在应用程序之后,统一编译即可。
优点是简单方便,缺点是程序太长,大量无关子程序也包含在其中。
2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。
有些子程序需要调用一些低级子程序,这些低级子程序也应该包含在内。
优点是程序紧凑,缺点是需要对子程序库进行仔细删节。
(一)MCS-51定点运算子程序库及其使用说明定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下:1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。
MCS-51单片机实用子程序库

《MCS-51单片机实用子程序库(96年版)》周航慈目前已有若干版本的子程序库公开发表,它们各有特色。
笔者在1988年也编制了两个子程序库(定点子程序库和浮点子程序库),并在相容性、透明性、容错性和算法优化方面作了一些工作。
本程序库中的开平方算法为笔者研究的快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。
经过八年来全国广大用户的实际使用,反馈了不少信息,陆续扩充了一些新的子程序,纠正了一些隐含错误,成为现在这个最新版本。
本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:(1)按当前流行的以 IBM PC 为主机的开发系统对汇编语言的规定,将原子程序库的标号和位地址进行了调整,读者不必再进行修改,便可直接使用。
(2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。
(3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理程序的工作变得更简单直观。
在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈需求,各项目的意义请参阅《单片机应用程序设计技术》第六章 6.3.7 节的内容。
程序清单中开列了四个栏目:标号、指令、操作数、注释。
为方便读者理解,注释尽力详细。
子程序库的使用方法如下:1.将子程序库全部内容链接在应用程序之后,统一编译即可。
优点是简单方便,缺点是程序太长,大量无关子程序也包含在其中。
2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。
有些子程序需要调用一些低级子程序,这些低级子程序也应该包含在内。
优点是程序紧凑,缺点是需要对子程序库进行仔细删节。
(一)MCS-51定点运算子程序库及其使用说明定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下:1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。
MCS-51单片机实用子程序库

MCS-51单片机实用子程序库(7)2007年06月22日星期五 19:12(25)标号:FTOD功能:格式化浮点数转换成双字节定点数入口条件:格式化浮点操作数在[R0]中。
出口信息:OV=1时溢出,OV=0时转换成功:定点数的绝对值在[R0]中(双字节),数符在位1FH中,F0=1 时为整数,CY=1时为一字节整数一字节小数,否则为纯小数。
影响资源:PSW、A、B、R2、R3、R4、位1FH 堆栈需求:6字节FTOD: LCALL MVR0 ;将[R0]传送到第一工作区MOV A,R2JZ FTD4 ;阶码为零,纯小数JB ACC.7,FTD4;阶码为负,纯小数SETB CSUBB A,#10HJC FTD1SETB OV ;阶码大于16,溢出RETFTD1: SETB CMOV A,R2SUBB A,#8 ;阶码大于8否?JC FTD3FTD2: MOV B,#10H ;阶码大于8,按双字节整数转换LCALL FTD8SETB F0 ;设立双字节整数标志CLR CCLR OVRETFTD3: MOV B,#8 ;按一字节整数一字节小数转换LCALL FTD8SETB C ;设立一字节整数一字节小数标志CLR F0CLR OVRETFTD4: MOV B,#0 ;按纯小数转换LCALL FTD8CLR OV ;设立纯小数标志CLR F0CLR CRETFTD8: MOV A,R2 ;按规定的整数位数进行右规CJNE A,B,FTD9MOV A,R3 ;将双字节结果传送到[R0]中MOV @R0,AINC R0MOV A,R4MOV @R0,ADEC R0RETFTD9: CLR CLCALL RR1 ;右规一次SJMP FTD8(26)标号:BTOF功能:浮点BCD码转换成格式化浮点数入口条件:浮点BCD码操作数在[R0]中。
出口信息:转换成的格式化浮点数仍在[R0]中。
影响资源:PSW、A、B、R2~R7、位1DH~1FH 堆栈需求:6字节BTOF: INC R0 ;判断是否为零。
MCS-51单片机实用子程序库(4)

MCS-51单片机实用子程序库(4)作者: 来源:51mcu上篇:MCS-51单片机实用子程序库(3)下篇:MCS-51单片机实用子程序库(5)(二)MCS-51浮点运算子程序库及其使用说明本浮点子程序库有三个不同层次的版本,以便适应不同的应用场合:1.小型库(FQ51A.ASM):只包含浮点加、减、乘、除子程序。
2.中型库(FQ51B.ASM):在小型库的基础上再增加绝对值、倒数、比较、平方、开平方、数制转换等子程序。
3.大型库(FQ51.ASM):包含本说明书中的全部子程序。
为便于读者使用本程序库,先将有关约定说明如下:1.双字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据,地址小的单元存放高字节。
如果[R0]=1234H,若(R0)=30H,则(30H)=12H,(31H)=34H。
2.二进制浮点操作数:用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节纯小数(原码)来表示。
当尾数的最高位为1时,便称为规格化浮点数,简称操作数。
在程序说明中,也用[R0]或[R1]来表示R0或R1指示的浮点操作数,例如:当[R0]=-6.000时,则二进制浮点数表示为83C000H。
若(R0)=30H,则(30H)=83H,(31H)=0C0H,(32H)=00H。
3.十进制浮点操作数:用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(二进制补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节BCD码纯小数(原码)来表示。
当十进制数的绝对值大于1时,阶码就等于整数部分的位数,如 876.5 的阶码是03H,-876.5 的阶码是 83H;当十进制数的绝对值小于1时,阶码就等于 80H 减去小数点后面零的个数,例如 0.00382 的阶码是 7EH,-0.00382的阶码是 0FEH。
51单片机指令表汇总

51单片机指令表汇总51 单片机是一种广泛应用于电子工程和嵌入式系统开发的微控制器。
要熟练掌握 51 单片机的编程,了解其指令表是至关重要的。
下面就为大家汇总一下 51 单片机的常见指令。
数据传送类指令MOV 指令:这是最基本的数据传送指令,用于在寄存器之间、寄存器与存储器之间传送数据。
例如,“MOV A, 50H”就是将立即数 50H传送到累加器 A 中。
MOVX 指令:用于在片外数据存储器和累加器 A 之间进行数据传送。
比如“MOVX A, @DPTR”,将片外数据存储器中由数据指针 DPTR 所指定单元的内容传送到累加器 A 中。
MOVC 指令:用于访问程序存储器中的数据表格。
“MOVC A, @A+DPTR”是常见的用法。
算术运算类指令ADD 指令:实现加法运算。
像“ADD A, R0”就是将累加器 A 的内容和寄存器 R0 的内容相加,结果存放在累加器 A 中。
ADDC 指令:带进位加法指令。
考虑了上一次运算产生的进位标志。
SUBB 指令:用于减法运算,并且会考虑借位标志。
逻辑运算类指令ANL 指令:进行逻辑与操作。
例如“ANL A, R0”,将累加器 A 和寄存器 R0 的内容进行逻辑与运算,结果存放在累加器 A 中。
ORL 指令:执行逻辑或操作。
XRL 指令:实现逻辑异或运算。
控制转移类指令JC 指令:若进位标志为 1 则跳转。
JZ 指令:若累加器 A 的内容为 0 则跳转。
LJMP 指令:长跳转指令,可以跳转到 64KB 程序存储器空间的任意位置。
位操作类指令SETB 指令:将指定的位设置为 1。
例如“SETB P10”,将 P1 端口的第 0 位置 1。
CLR 指令:把指定的位清零。
这些只是 51 单片机指令的一部分,实际应用中还有更多的指令和组合使用方式。
在编程时,合理选择和运用这些指令能够实现各种复杂的功能。
比如,通过数据传送指令来初始化变量和读取外部数据;利用算术运算指令进行数值计算;借助逻辑运算指令处理逻辑关系;使用控制转移指令实现程序的分支和循环;运用位操作指令控制单个引脚的状态。
80C51单片机C语言常用模块子程序

j=i+1; } } } return j; }
3、利用 74Ls164 输出脉冲继续数码管显示的计数: void clear164()//将 164 输出所以清零 { char k; for(k=0;k<8;k++) { DIN=1; CLK=0; CLK=1; } } 4、数码管显示子程序: void display(char wei,char shu) { uchar m,n; clear164(); DIN=0; for(n=wei;n>0;n--)//去掉没有显示的位数 {CLK=0; CLK=1; DIN=1; } CLK=0; CLK=1; P0=table[shu]; //显示号码的位数 delay(5); for(m=8-wei;m>0;m--)//去掉剩下的位数 { DIN=1; CLK=0; CLK=1; } } 5、中断子程序:
} DIN=0; CLK=0; CLK=1; for(z=8;z>x;z--) { DIN=1; CLK=0; CLK=1; } } void main() { init(); while(1) { uchar i; if(flag==0) { shi=num/10; wei(7); P0=table[shi]; delay(1); P0=0xff; ge=num%10; wei(8); P0=table[ge]; delay(1); P0=0xff; } if(flag==1) { for(i=0;i<8;i++) { wei(i+1); P0=table1[i]; delay(1); P0=0xff; } } }
#define uint unsigned int #define uchar unsigned char sbit CLK=P3^4; sbit DIN=P2^3; bit flag; uchar shi,ge; uchar num,num1; uchar code table[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x11,0xC1,0x63,0x85,0x61,0x7 1,0xFD };//0 到 F 的代码 uchar code table1[]={0x09,0x99,0x03,0x01,0x9f,0x03,0x25,0x0d}; // 学号的代码 94081013 void init(); //初始化函数声明 void delay(uint t) //延时函数 { uint i,j; for(i=t;i>0;i--) for(j=125;j>0;j--); } void wei(uint x) //数码管第 X 位显示 { uchar y,z; for(y=8;y>9-x;y--) { DIN=1; CLK=0; CLK=1;
51单片机汇编指令总结

51单片机汇编指令总结数据传输指令一.片内ram数据传输指令1.以累加器a为目的操作数的指令:mova,rnmova,directmova,@rimova,#data2.以寄存器rn为目的操作数的指令:movrn,amovrn,directmovrn,data3.以轻易地址为目的操作数的指令:movdirect,amovdirect,rnmovdirect1,derect2movdirect,@rimovdirect,#data4.间接地址为目的操作数的指令:mov@ri,amov@ri,directmov@ri,#data5.十六位数据传送指令:movdptr,#data16二.累加器a与片外ram数据传输指令:movxa,@rimovxa,@dptrmovx@ri,amovx@dptr,a三.换算串行:movca,@a+dptr(先pc←(pc)+1,后a←((a)+(dptr)))+movca,@a+pc(先pc←(pc)+1,后a←((a)+(pc)))四.互换指令:1.字节交换指令:xcha,rnxcha,directxcha,@ri2.半字节交换指令:xchda,@ri3.累加器半字节交换指令:swapa五.栈操作指令:1.push(入栈指令)pushdirect2.pop(出栈指令)popdirect算术运算指令:一.乘法加法指令:1.加法指令:adda,rnadda,directadda,@riadda,#data2.拎位次乘法指令:addca,rna←(a)+(rn)+cyaddca,directa←(a)+(direct)+cyaddca,@ria←(a)+((ri))+cyaddca,#dataa←(a)+(data)+cy3.带借位减法指令:subba,rna←(a)-cy-(rn)subba,directa←(a)-cy-(direct)subba,@ria←(a)-cy-((ri))subba,#dataa←(a)-cy-#data二.乘法乘法指令:1.乘法指令:mulabba←(a)×(b)高字节放到b中,低字节放到a中2.乘法指令:divaba←(a)÷(b)的商,(b)←(a)÷(b)的余数三.加1减1指令:1.提1指令:incaa←(a)+1incrnrn←(rn)+1incdirectdirect←(direct)+1inc@ri(ri)←((ri))+1incdptrdptr←(dptr)+12.减至1指令:decadecrndecdirectdec@ri四.十进制调制指令:daa调整累加器a的内容为bcd码逻辑操作方式指令:一.逻辑与、或、异或指令:1.逻辑与指令:anla,rnanla,directanla,@rianla,#data2.逻辑或这而令:orla,rnorla,directorla,@riorla,#dataorldirect,aorldirect,#data3.逻辑异或指令:xrla,rnxrla,directxrla,@rixrla,#dataxrldirect,axrldirect,#data二.清零、row指令:1.累加器a清零指令:crla2.累加器arow指令:cpla三.循环位移指令:1.累加器a循环左移指令:rla2.累加器a循环右移指令:rra3.累加器a连同进位位循环左移指令:rlca4.累加器a连同进位位循环右移指令:rrca控制转移指令:一.无条件迁移指令:1.绝对转移指令:ajmpaddr11(先pc+2,然后将addr11的高十位托付给pc,pc的高六位维持不变)2.长转移指令:ljmpaddr16(用addr16的值替代pc的值)3.相对迁移(长迁移)指令:sjmprel(带符号的偏移字节数)(pc+2,再加rel赋值给pc)4.间接转移指令:jmp@a+dptr(a)+(dptr)→(pc)二.条件转移指令:1.累加器判零迁移指令:jzrel先pc+2;后判断,a为0时转移,pc+rel赋值给pc;否则顺序继续执行jnzrel先pc+2,后判断,a不为0时转移,pc+rel赋值给pc;否则顺序执行2.比较转移指令:cjne目的操作数,源操作数,relcjnea,direct,rel先pc+3传回pc,再比较目的操作数和原操作数cjnea,#data,rel目>源时,程序转移,pc+rel传回pc且cy=0cjnern,#data,rel目=源时,程序顺序执行cjne@ri,#data,rel目djnzrn,rel先pc\\+2,rn-1,当rn为0时程序顺序继续执行,否则pc+rel传到pcdjnzdirect,rel先pc+3,direct-1,direct为0时程序顺序继续执行,否则pc+rel传到pc二.子程序调用、返回指令:1.绝对调用指令acall:acalladdr11先pc+2,sp+1将pc的低八位存入sp;sp+1,将pc的高八位取走sp。
MCS-51单片机实用子程序库

DJNZ R6,BHD3 ;共计算16bit小数MOV A,R4ADD A,#0B0H ;剩余部分达到0.50否?JNC BHD4 ;四舍INC R3 ;五入MOV A,R3JNZ BHD4INC R2BHD4: RET(24)标号:MM功能:求单字节十六进制无符号数据块的极值入口条件:数据块的首址在DPTR中,数据个数在R7中。
出口信息:最大值在R6中,地址在R2R3中;最小值在R7中,地址在R4R5中。
影响资源:PSW、A、B、R1~R7 堆栈需求:4字节MM: MOV B,R7 ;保存数据个数MOVX A,@DPTR ;读取第一个数据MOV R6,A ;作为最大值的初始值MOV R7,A ;也作为最小值的初始值MOV A,DPL ;取第一个数据的地址MOV R3,A ;作为最大值存放地址的初始值MOV R5,A ;也作为最小值存放地址的初始值MOV A,DPHMOV R2,AMOV R4,AMOV A,B ;取数据个数DEC A ;减一,得到需要比较的次数JZ MME ;只有一个数据,不需要比较MOV R1,A ;保存比较次数PUSH DPL ;保护数据块的首址PUSH DPHMM1: INC DPTR ;指向一个新的数据MOVX A,@DPTR ;读取这个数据MOV B,A ;保存SETB C ;和最大值比较SUBB A,R6JC MM2 ;不超过当前最大值,保持当前最大值MOV R6,B ;超过当前最大值,更新最大值存放地址MOV R2,DPH ;同时更新最大值存放地址MOV R3,DPLSJMP MM3MM2: MOV A,B ;和最小值比较CLR CSUBB A,R7JNC MM3 ;大于或等于当前最小值,保持当前最小值MOV R7,B ;更新最小值MOV R4,DPH ;更新最小值存放地址MOV R5,DPLMM3: DJNZ R1,MM1 ;处理完全部数据POP DPH ;恢复数据首址POP DPLMME: RET(25)标号:MMS功能:求单字节十六进制有符号数据块的极值入口条件:数据块的首址在DPTR中,数据个数在R7中。
MCS-51单片机实用子程序库

MCS-51单片机实用子程序库日期2000-6-5作者电子设计工作室/home1/azhu内容目前已有若干版本的子程序库公开发表,它们各有特色。
本程序库中的开平方算法为快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。
本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:(1)按当前流行的以IBM PC 为主机的开发系统对汇编语言的规定,读者不必再进行修改,便可直接使用。
(2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。
(3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理程序的工作变得更简单直观。
在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈需求,各项目的意义请参阅《单片机应用程序设计技术》第六章 6.3.7 节的内容。
程序清单中开列了四个栏目:标号、指令、操作数、注释。
为方便读者理解,注释尽力详细。
子程序库的使用方法如下:1.将子程序库全部内容链接在应用程序之后,统一编译即可。
优点是简单方便,缺点是程序太长,大量无关子程序也包含在其中。
2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。
有些子程序需要调用一些低级子程序,这些低级子程序也应该包含在内。
优点是程序紧凑,缺点是需要对子程序库进行仔细删节。
(一)MCS-51定点运算子程序库及其使用说明定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下:1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。
地址小的单元存放数据的高字节。
例如:[R0]=123456H,若(R0)=30H,则(30H)=12H,(31H)=34H,(32H)=56H。
2.运算精度:单次定点运算精度为结果最低位的当量值。
8051单片机子程序集合

为应对考试而准备的常用子程序集合(1)标号:BCDA功能:多字节BCD码加法入口条件:字节数在R7中,被加数在[R0]中,加数在[R1]中。
出口信息:和在[R0]中,最高位进位在CY中。
影响资源:PSW、A、R2 堆栈需求:2字节BCDA MOV A,R7 ;取字节数至R2中MOV R2,AADD A,R0 ;初始化数据指针MOV R0,AMOV A,R2ADD A,R1MOV R1,ACLR CBCD1 DEC R0 ;调整数据指针DEC R1MOV A,@R0ADDC A,@R1 ;按字节相加DA A ;十进制调整MOV @R0,A ;和存回[R0]中DJNZ R2,BCD1 ;处理完所有字节RET(2)标号:BCDB功能:多字节BCD码减法入口条件:字节数在R7中,被减数在[R0]中,减数在[R1]中。
出口信息:差在[R0]中,最高位借位在CY中。
影响资源:PSW、A、R2、R3 堆栈需求:6字节BCDB LCALL NEG1 ;减数[R1]十进制取补LCALL BCDA ;按多字节BCD码加法处理CPL C ;将补码加法的进位标志转换成借位标志MOV F0,C ;保护借位标志LCALL NEG1 ;恢复减数[R1]的原始值MOV C,F0 ;恢复借位标志RETNEG1 MOV A,R0 ;[R1]十进制取补子程序入口XCH A,R1 ;交换指针XCH A,R0LCALL NEG ;通过[R0]实现[R1]取补MOV A,R0XCH A,R1 ;换回指针XCH A,R0RET(4)标号:BRLN功能:多字节BCD码左移十进制一位(乘十)入口条件:字节数在R7中,操作数在[R0]中。
出口信息:结果仍在[R0]中,移出的十进制最高位在R3中。
影响资源:PSW、A、R2、R3 堆栈需求:2字节BRLN MOV A,R7 ;取字节数至R2中MOV R2,AADD A,R0 ;初始化数据指针MOV R0,AMOV R3,#0 ;工作单元初始化BRL1 DEC R0 ;调整数据指针MOV A,@R0 ;取一字节SWAP A ;交换十进制高低位MOV @R0,A ;存回MOV A,R3 ;取低字节移出的十进制高位XCHD A,@R0 ;换出本字节的十进制高位MOV R3,A ;保存本字节的十进制高位DJNZ R2,BRL1 ;处理完所有字节RET(14)标号:HASC功能:单字节十六进制数转换成双字节ASCII码入口条件:待转换的单字节十六进制数在累加器A中。
MCS-51单片机实用子程序库(7)

MCS-51单片机实用子程序库(7)作者: 来源:51mcu上篇:MCS-51单片机实用子程序库(6)下篇:嵌入式系统综述(25)标号:FTOD功能:格式化浮点数转换成双字节定点数入口条件:格式化浮点操作数在[R0]中。
出口信息:OV=1时溢出,OV=0时转换成功:定点数的绝对值在[R0]中(双字节),数符在位1FH中,F0=1 时为整数,CY=1时为一字节整数一字节小数,否则为纯小数。
影响资源:PSW、A、B、R2、R3、R4、位1FH 堆栈需求:6字节FTOD: LCALL MVR0 ;将[R0]传送到第一工作区MOV A,R2JZ FTD4 ;阶码为零,纯小数JB ACC.7,FTD4;阶码为负,纯小数SETB CSUBB A,#10HJC FTD1SETB OV ;阶码大于16,溢出RETFTD1: SETB CMOV A,R2SUBB A,#8 ;阶码大于8否?JC FTD3FTD2: MOV B,#10H ;阶码大于8,按双字节整数转换LCALL FTD8SETB F0 ;设立双字节整数标志CLR CCLR OVRETFTD3: MOV B,#8 ;按一字节整数一字节小数转换LCALL FTD8SETB C ;设立一字节整数一字节小数标志CLR F0CLR OVRETFTD4: MOV B,#0 ;按纯小数转换LCALL FTD8CLR OV ;设立纯小数标志CLR F0CLR CRETFTD8: MOV A,R2 ;按规定的整数位数进行右规CJNE A,B,FTD9MOV A,R3 ;将双字节结果传送到[R0]中MOV @R0,AINC R0MOV A,R4MOV @R0,ADEC R0RETFTD9: CLR CLCALL RR1 ;右规一次SJMP FTD8(26)标号:BTOF功能:浮点BCD码转换成格式化浮点数入口条件:浮点BCD码操作数在[R0]中。
出口信息:转换成的格式化浮点数仍在[R0]中。
单片机实用子程序库大全

内容目前已有若干版本的子程序库公开发表,它们各有特色。
本程序库中的开平方算法为快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。
本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:(1)按当前流行的以 IBM PC 为主机的开发系统对汇编语言的规定,读者不必再进行修改,便可直接使用。
(2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。
(3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理程序的工作变得更简单直观。
在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈需求,各项目的意义请参阅《单片机应用程序设计技术》第六章 6.3.7 节的内容。
程序清单中开列了四个栏目:标号、指令、操作数、注释。
为方便读者理解,注释尽力详细。
子程序库的使用方法如下:1.将子程序库全部内容链接在应用程序之后,统一编译即可。
优点是简单方便,缺点是程序太长,大量无关子程序也包含在其中。
2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。
有些子程序需要调用一些低级子程序,这些低级子程序也应该包含在内。
优点是程序紧凑,缺点是需要对子程序库进行仔细删节。
(一)MCS-51定点运算子程序库及其使用说明定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下:1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。
地址小的单元存放数据的高字节。
例如:[R0]=123456H,若(R0)=30H,则(30H)=12H,(31H)=34H,(32H)=56H。
2.运算精度:单次定点运算精度为结果最低位的当量值。
3.工作区:数据工作区固定在PSW、A、B、R2~R7,用户只要不在工作区中存放无关的或非消耗性的信息,程序就具有较好的透明性。
单片机指令表汇总

51单片机指令表汇总51单片机是一种广泛应用的微控制器,其指令集是进行编程的基础。
下面将51单片机的指令表进行汇总,以帮助初学者更好地理解其指令集。
一、数据传输指令1、MOV指令:将源操作数的内容传送到目标操作数。
2、XCH指令:将两个操作数的内容互换。
3、MOVC指令:从外部存储器将数据传送到目标操作数。
4、MOVX指令:将外部存储器中的数据传送到目标操作数。
5、PUSH指令:将数据压入堆栈。
6、POP指令:从堆栈中弹出数据。
二、算术运算指令1、ADD指令:将两个操作数相加,并将结果存放在目标操作数中。
2、SUB指令:从目标操作数中减去源操作数,并将结果存放在目标操作数中。
3、MUL指令:将两个操作数相乘,并将结果存放在目标操作数中。
4、DIV指令:将目标操作数除以源操作数,并将结果存放在目标操作数中。
5、ANL指令:对目标操作数和源操作数进行按位与运算,并将结果存放在目标操作数中。
6、ORL指令:对目标操作数和源操作数进行按位或运算,并将结果存放在目标操作数中。
7、XRL指令:对目标操作数和源操作数进行按位异或运算,并将结果存放在目标操作数中。
8、CPL指令:对目标操作数进行按位取反运算,并将结果存放在目标操作数中。
9、INC指令:将目标操作数加1。
10、DEC指令:将目标操作数减1。
11、ASR指令:将目标操作数右移n位,最高位用符号位补齐。
12、LSR指令:将目标操作数右移n位,最低位用0补齐。
13、ROL指令:将目标操作数循环左移n位,最高位移入最低位。
14、ROR指令:将目标操作数循环右移n位,最低位移入最高位。
单片机汇编指令表一、概述在单片机的世界里,汇编语言扮演着举足轻重的角色。
它是一种低级语言,能够直接与硬件进行交互,提供高效的代码执行效率。
下面,我们将详细列出一些常见的单片机汇编指令,以及它们的功能。
二、指令表1、MOV指令:用于将数据从一个寄存器移动到另一个寄存器。
例如,MOV R1, R2将把 R2的内容移动到 R1中。
MCS-51单片机实用子程序库6

MCS-51单片机实用子程序库(六)(17)标号:FSQR功能:浮点数开平方(快速逼近算法)入口条件:操作数在[R0]中。
出口信息:OV=0时,平方根仍在[R0]中,OV=1时,负数开平方出错。
影响资源:PSW、A、B、R2~R7 堆栈需求:2字节FSQR: MOV A,@R0JNB ACC.7,SQRSETB OV ;负数开平方,出错RETSQR: INC R0INC R0MOV A,@R0DEC R0ORL A,@R0DEC R0JNZ SQMOV @R0,#41H;尾数为零,不必运算CLR OVRETSQ: MOV A,@R0MOV C,ACC.6 ;将阶码扩展成8bit补码MOV ACC.7,CINC A ;加一CLR CRRC A ;除二MOV @R0,A ;得到平方根的阶码,回存之INC R0 ;指向被开方数尾数的高字节JC SQR0 ;原被开方数的阶码是奇数吗?MOV A,@R0 ;是奇数,尾数右规一次RRC AMOV @R0,AINC R0MOV A,@R0RRC AMOV @R0,ADEC R0SQR0: MOV A,@R0JZ SQR9 ;尾数为零,不必运算MOV R2,A ;将尾数传送到R2R3中INC R0MOV A,@R0MOV R3,AMOV A,R2 ;快速开方,参阅定点子程序说明ADD A,#57HJC SQR2ADD A,#45HADD A,#24HMOV B,#0E3HMOV R4,#80H SJMP SQR3SQR1: MOV B,#0B2H MOV R4,#0A0H SJMP SQR3SQR2: MOV B,#8DH MOV R4,#0D0H SQR3: MUL AB MOV A,BADD A,R4MOV R4,AMOV B,AMUL ABXCH A,R3CLR CSUBB A,R3MOV R3,AMOV A,BXCH A,R2SUBB A,R2MOV R2,ASQR4: SETB C MOV A,R4RLC AMOV R6,ACLR ARLC AMOV R5,AMOV A,R3SUBB A,R6MOV B,AMOV A,R2SUBB A,R5JC SQR5INC R4MOV R2,AMOV R3,BSJMP SQR4SQR5: MOV A,R4 XCH A,R2RRC AMOV A,R3MOV R5,AMOV R4,#8SQR6: CLR CMOV A,R3RLC AMOV R3,ACLR CMOV A,R5SUBB A,R2JB F0,SQR7JC SQR8SQR7: MOV R5,AINC R3SQR8: CLR CMOV A,R5RLC AMOV R5,AMOV F0,CDJNZ R4,SQR6MOV A,R3 ;将平方根的尾数回传到[R0]中MOV @R0,ADEC R0MOV A,R2MOV @R0,ASQR9: DEC R0 ;数据指针回归原位CLR OV ;开方结果有效RET(18)标号:FPLN功能:浮点数多项式计算入口条件:自变量在[R0]中,多项式系数在调用指令之后,以40H结束。
MCS-51单片机实用子程序库6

MCS-51单片机实用子程序库(六)(17)标号:FSQR功能:浮点数开平方(快速逼近算法)入口条件:操作数在[R0]中。
出口信息:OV=0时,平方根仍在[R0]中,OV=1时,负数开平方出错。
影响资源:PSW、A、B、R2~R7 堆栈需求:2字节FSQR: MOV A,@R0JNB ACC.7,SQRSETB OV ;负数开平方,出错RETSQR: INC R0INC R0MOV A,@R0DEC R0ORL A,@R0DEC R0JNZ SQMOV @R0,#41H;尾数为零,不必运算CLR OVRETSQ: MOV A,@R0MOV C,ACC.6 ;将阶码扩展成8bit补码MOV ACC.7,CINC A ;加一CLR CRRC A ;除二MOV @R0,A ;得到平方根的阶码,回存之INC R0 ;指向被开方数尾数的高字节JC SQR0 ;原被开方数的阶码是奇数吗?MOV A,@R0 ;是奇数,尾数右规一次RRC AMOV @R0,AINC R0MOV A,@R0RRC AMOV @R0,ADEC R0SQR0: MOV A,@R0JZ SQR9 ;尾数为零,不必运算MOV R2,A ;将尾数传送到R2R3中INC R0MOV A,@R0MOV R3,AMOV A,R2 ;快速开方,参阅定点子程序说明ADD A,#57HJC SQR2ADD A,#45HJC SQR1ADD A,#24HMOV B,#0E3HMOV R4,#80H SJMP SQR3SQR1: MOV B,#0B2H MOV R4,#0A0H SJMP SQR3SQR2: MOV B,#8DH MOV R4,#0D0H SQR3: MUL AB MOV A,BADD A,R4MOV R4,AMOV B,AMUL ABXCH A,R3CLR CSUBB A,R3MOV R3,AMOV A,BXCH A,R2SUBB A,R2MOV R2,ASQR4: SETB CMOV A,R4RLC AMOV R6,ACLR ARLC AMOV R5,AMOV A,R3SUBB A,R6MOV B,AMOV A,R2SUBB A,R5JC SQR5INC R4MOV R2,AMOV R3,BSJMP SQR4SQR5: MOV A,R4XCH A,R2RRC AMOV F0,CMOV A,R3MOV R5,AMOV R4,#8SQR6: CLR CMOV A,R3RLC AMOV R3,ACLR CMOV A,R5SUBB A,R2JB F0,SQR7JC SQR8SQR7: MOV R5,AINC R3SQR8: CLR CMOV A,R5RLC AMOV R5,AMOV F0,CDJNZ R4,SQR6MOV A,R3 ;将平方根的尾数回传到[R0]中MOV @R0,ADEC R0MOV A,R2MOV @R0,ASQR9: DEC R0 ;数据指针回归原位CLR OV ;开方结果有效RET(18)标号:FPLN功能:浮点数多项式计算入口条件:自变量在[R0]中,多项式系数在调用指令之后,以40H结束。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/***************************************************************
模块功能:通过串口连续发送n个字节的数据
参数说明:
s:待发送数据的首地址
n:要发送数据的字节数
***************************************************************/
}
2、I
(1)启动总线函数
/***************************************************************
模块功能:发送I2C总线起始条件
***************************************************************/
voidSendD(unsigned char *s,unsignedchar n)
{
unsigned charunX;
if(n>0)
{
ES=0; //关闭串口中断
for(unX=0;unX<n;unX++)
{
SBUF=*s;
while(TI==0);
TI=0;
s++;
}
ES=1; //开串口中断
}
retc=retc<<1;
if(SDA==1)retc=retc+1;
Nop();
Nop();
}
SCL=0;
Nop();
Nop();
return(retc);
}
***************************************************************/
void Stop_I2c()
{
SDA=0;
Nop();
SCL=1;
Nop();
Nop();
Nop();
Nop();
Nop();
SDA=1;
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
SCL=0;
}
Nop();
Nop();
SDA=1; //8位发送完后释放数据线,准备接收应答位Nop();来自Nop();SCL=1;
Nop();
Nop();
Nop();
if(SDA==1) ACK=0;
else ACK=1;
SCL=0;
Nop();
Nop();
Nop();
SDA=0;
Nop();
Nop();
Nop();
Nop();
Nop();
SCL=0;//钳住I2C总线,准备发送或接受数据
Nop();
Nop();
}
(
/***************************************************************
模块功能:发送I2C总线结束条件
unsigned charRcvB()
{
unsigned charunX,retc;
retc=0;
SDA=1;//置数据线为输入模式
for(unX=0;unX<8;unX++)//传送数据
{
Nop();
SCL=0;
Nop();
Nop();
Nop();
Nop();
Nop();
SCL=1;
Nop();
Nop();
}
(4)
/***************************************************************
模块功能:用来接收从器件传来的数据(1个字节)
***************************************************************/
Nop();
}
(3)字节数据传送函数
/***************************************************************
模块功能:将字节c发送出去,可以是地址或数据,发送完后等待应答,并对此状态位进行操作,发送数据正常ACK=1;否则ACK=0;
***************************************************************/
#include<reg51.h>
#include<intrins.h>
#defineNop() _nop_()//空指令
sbitSDA=P1^3;
sbitSCL=P1^2;
bit ACK;
void Start_I2c()
{
SDA=1;
Nop();
SCL=1;
Nop();
Nop();
Nop();
Nop();
voidSendB(unsigned char c)
{
unsigned charunY;
for(unY=0;unY<8;unY++)//传送数据
{
if((c<<unY)&0x80) SDA=1; //发送位
else SDA=0;
Nop();
SCL=1;//置时钟位为1,通知被控器件开始接受数据位
Nop();