51单片机实用汇编程序库(word)

合集下载

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单片机汇编程序5

51单片机汇编程序5

§5.3.2系统软件设计#include <reg51.h>#include <absacc.h>#define uchar unsigned char#define uint unsigned int/* IC卡信号输入输出 */sbit scl=P1^7;sbit sda=P1^6;/* I/O口定义*/sbit ICOUT=P3^2; /* 拔卡信号*/sbit ICIN=P3^3; /* 插卡信号,与上同接卡座微动开关*/sbit COMM=P3^4; /* 正在通信指示*/sbit BELL=P3^5; /* 蜂鸣器控制*/sbit PWR=P1^4; /* IC卡座电源控制*//* 波特率选择 */sbit BAUD=P1^2; /* 0:2400;1:4800 *//* 24c01-24c16读写驱动程序,*/sbit a0=ACC^0; /*定义ACC的位,利用ACC操作速度最快*/sbit a1=ACC^1;sbit a2=ACC^2;sbit a3=ACC^3;sbit a4=ACC^4;sbit a5=ACC^5;sbit a6=ACC^6;sbit a7=ACC^7;/* 读写数据缓冲区,24C01最多为128字节*/uchar buf[16]; /* 这里定义有效读入数据最多为16字节,用户根据需要定*/ uchar flag; /* 全局标志字节*//* 标志定义*/sbit IC_WR=flag^0; /* IC卡在读写状态标志*/sbit ONCOMM=flag^1; /* 系统与上位机在通信状态标志*/ sbit RST=flag^2; /* 系统热复位标志*/void start_ic(void){sda=1;scl=1;delay(2);sda=0; /* scl为高状态下,sda的下降调变启动*/ delay(6);scl=0;delay(6);}void stop_ic(void){sda=0;scl=1;delay(6);sda=1; /* 在scl=1,sda的0到1跳变结束*/delay(6);scl=0;sda=0;}void ack_ic(void)sda=0;delay(3);scl=1;delay(3);scl=0;sda=1;}/* 读字节函数,无应答信号*/ unsigned char rd24(void) {sda=1;scl=1;a7=sda;scl=0;scl=1;a6=sda;scl=0;scl=1;a5=sda;scl=0;scl=1;a4=sda;scl=0;scl=1;a3=sda;scl=0;scl=1;a2=sda;scl=0;scl=1;a1=sda;scl=0;scl=1;a0=sda;scl=0;sda=1;scl=1; scl=0;return(ACC);}/* 写字节函数*/void wd24(unsigned char dd) { ACC=dd;sda=a7;scl=1;scl=0;sda=a6;scl=1;scl=0;sda=a5;scl=1;scl=0;sda=a4;scl=1;scl=0;sda=a3;scl=1;scl=0;sda=a2;scl=1;scl=0;sda=a1;scl=1;scl=0;sda=a0;scl=1;scl=0;sda=1; scl=1;while(sda==1); /* 等待EEPROM应答*/SCL=0;}/* 随机地址读字节函数,address 为欲读单元地址*/uchar read_byter(uchar address){uchar x;start_ic();wd24(0a0);wd24(address);start_ic();wd24(0a1);x=rd24();stop_ic();return(x);}/* 从指定地址开始顺序地址读块数据,数据存入全局缓冲区buf中,n为数据字节数*/uchar read_bytes(uchar address,uchar n ){uchar a,y;for(y=0;y<n;y++){a=read_byter(address+y);buf[y]=a;}}/* *//* 字节写入模式写函数,其中address为单元地址,dd为数据*/ void write_byte(uchar address,uchar dd){start_ic();wd24(0a0);wd24(address);wd24(dd);stop_ic();}/* 串行通讯子程序 *//* 拨特率2400,8位数据、1停止位、无校验*//* 先用握手字节y,然后发送x个数据*//* 待发送数据在trdata缓冲区中*/void comm(uchar x,uchar y){uchar i,a;uint j;while(1){ l1: while(RI==0);RI=0;a=SBUF;if(a!=y) goto l1;for(i=0;i<x;i++){ SBUF=trdata[i];while(TI==0);TI=0;}for(j=0;j<12500;j++);}}/* 主程序初始化函数*/void init(void){RST=0; /* 系统热复位标志清除,只有拔卡才能置位*/ PWR=1; /* 关闭IC卡电源*/IC_WR=0;/* 清有卡标志*/ONCOMM=0; /* 清正在通信标志*/EX0=1; /* 允许INT0中断*/TMOD=0x20;SCON=0x50; /* 串行口工作方式,*/TH1=0xf3;TL1=0xf3;if(BAUD==0){PCON=0x80; /* 波特率设置为2400*/}else{PCON=0x00; /* 波特率设置为4800*/}TR1=1;EA=1; /* 开放中断*/}/* 将缓冲区数据16字节发往上位机*//* 拨特率2400,8位数据、1停止位、无校验*/ /* 待发送数据在buf缓冲区中*/void transfer(void){uchar i;uint j;for(i=0;i<16;i++){ SBUF=buf[i];while(TI==0);TI=0;for(j=0;j<1000;j++);}}/* 接收16字节存入缓冲区*//* 拨特率2400,8位数据、1停止位、无校验*/ /* 缓冲区为buf*/void receive(void){uchar i,a;for(i=0;i<16;i++){ while(RI==0);RI=0;a=SBUF;buf[i]=a;}/* 将缓冲区中的n字节写入IC卡address开始的区域*/void write_ic(uchar address,uchar n){uchar x,y;for(y=0;y<n;y++){write_byte(address+y,buf[y]);delay(10); /* 写之间的延时时间间隔,以保证写入*/}}/* 拔卡中断程序,主要完成IC卡下电及读写器软复位*/void int_0(void) interrupt 0 using 1{while(!ICOUT); /* 延时去抖*/delay(10);if(!ICOUT) /* 确实拔卡则进行以下处理*/{if(IC_WR|ONCOMM){PWR=1; /* 关闭IC卡电源*/BELL=0; /* 否则,则蜂鸣一声返回*/delay(10);BELL=1;RST=1; /* 设置热复位标志,以便热复位*/}}/* 延时函数,延时ms数由N决定,但不同的系统需要调整相应参数*/ void delay(uchar n){uchar i,j,k;for(k=0;k<n;k++)for(i=0;i<100;i++)for(j=0;j<255;j++) ;}void main(void){uchar a;fuwei: init(); /* 系统初始化*/while(!ICIN); /* 等待IC卡插入*/delay(10); /* 软件去抖并等待IC卡稳定*/while(!ICIN); /* 确认IC卡插入*/IC_WR=1; /* 设置读写卡标志(有卡,以便避免带电插拔)*/ /* 开始读IC卡16字节并存入缓冲区*/PWR=0;/* IC卡上电,以便读卡*/read_bytes(0,16);PWR=1;/* 关IC卡电源*//* 等待与上位机建立通信联系*/ONCOMM=1; /* 设置正在通信标志*/while(RI==0);RI=0;a=SBUF;switch(a){ case 0xaa: SBUF=0xaa;while(!TI); /* 向上位机回送AA*/TI=0;transfer(); /* 将缓冲区数据发往上位机*/break;case 0xbb: SBUF=0xbb;while(!TI); /* 向上位机回送BB*/TI=0;/* 上位机在发送前必须适当延时,以等待下位机准备好*/ receive(); /* 接收数据存放在缓冲区*/PWR=0;/* IC卡上电*/write_ic(0,16); /* 将数据写入IC卡,并回读比较*/PWR=1;/* IC卡下电*/break;default: SBUF=0xcc; /* 如果握手信号不是AA、BB,则*/while(!TI); /* 向上位机回送CC*/TI=0;}ONCOMM=0; /* 清正在通信标志*/while(!RST);goto fuwei; /* 等待拔卡中断以软复位*/}§5.4上位PC机通讯接口软件library Mycomdll;uses SysUtils,Classes;ConstCOM1:=$3f8;COM2:=$2f8;VarCOM:Word;{DLL中全局变量}Procedure Outb(Const Port:Word;Const Dbyte:Byte );pascal; BeginAsmMOV DX,PortMOV AL,DbyteOUT DX,ALEnd;End;Function Inb(Const Port:Word ):Byte;pascal;BeginAsmMOV DX,PortIN AL,DXMOV @Result,ALEnd;End;{串行口初始化,COM1、COM2可选,波特率2400、4800可选} Procedure CommInit(Const Port:Byte;Const Baud:String);Stdcall; VarBAUDL,BAUDH:Byte;BeginIf Port=1 thenCOM:=COM1;ElseCOM:=COM2;If BAUD=’2400’ thenBeginBAUDL:=$30;BAUDH:=$00;End;ElseBeginBAUDL:=$18;BAUDH:=$00;End;Outb(COM+3,$80);{设置波特率因子}Outb(COM,BAUDL);Outb(COM+1,BAUDH);Outb(COM+3,$03);{8位数据,1停止位,无校验} End;{发送一字节}Procedure SendByte(Const Dbyte:Byte);Stdcall; VarStatus:Byte;BeginRepeatStatus:=Inb(COM+5);Until((Status and $20)=$20);Outb(COM,Dbyte);End;Function ReceiveByte:Byte;Stdcall;VarStatus,Res:Byte;BeginRepeat:Status:=Inb(COM+5);Until((Status and $01)=$01);Res:=Inb(COM);ReceiveByte:=Res;End;{以下用EXPORT引出输出过程或函数} Export CommInit;Export SendByte;Export ReceiveByte;BeginEnd.。

八音盒51单片机程序(汇编)

八音盒51单片机程序(汇编)

八音盒51单片机程序(汇编);//*****************************************************;文件名: 八音盒.asm;描述: 八音盒,P1选择音乐,低电平有效,P3.0音乐输出口。

; 本程序使用的寄存器有R1至R7,40H,41H,42H单元。

; 标号TAB1处为T0的定时常数数据表。

;//*****************************************************Speaker BIT P3.4FLAG1 BIT 20HFLAG2 BIT 21HORG 0000HLJMP StartORG 0003HLJMP EXINT0ORG 000BHLJMP INT_T0ORG 0013HLJMP EXINT1ORG 001BHDJNZ R4,GOON ;中断次数不够,继续。

CLR ET1 ;持续时间到,该音符停止。

CLR ET0SJMP RE01GOON: MOV TL1,40HMOV TH1,41HRE01: RETIINT_T0: MOV C,FLAG1 JC TORETDJNZ R0,TORET MOV R0,#6MOV C,FLAG2JC TOADDSJMP TOSUB TOADD: MOV A,R3 CJNE A,#0FEH,ADD1 CLR FLAG2SJMP TORETADD1: MOV A,R2 ADD A,#1MOV R2,AMOV A,R3ADDC A,#0MOV R3,ASJMP TORET TOSUB: MOV A,R3 CJNE A,#0FBH,SUB1 SETB FLAG2SJMP TORETSUB1: MOV A,R2 SUBB A,#1MOV R2,AMOV A,R3SUBB A,#0MOV R3,ATORET: MOV TL0,R2MOV TH0,R3CPL Speaker ;音乐输出口.RETIORG 0080HEXINT0:CLR ET0CLR ET1CLR APUSH ACCPUSH ACCRETIEXINT1:CLR ET0CLR ET1CLR APUSH ACCPUSH ACCRETIStart:mov TCON, #05h ; 外部中断0下降沿触发SETB EX0 ; 打开外部中断允许位(EX0)及总中断允许位(EA) SETB EX1SETB EAMOV A,P1JNB ACC.0,Voice0JNB ACC.1,Voice1JNB ACC.2,Voice2JNB ACC.3,Voice3JNB ACC.4,Voice4JNB ACC.5,Voice5JNB ACC.6,Voice6JNB ACC.7,Voice7Sjmp StartVoice0: MOV DPTR,#tab_0 ;乐曲数据表的表头Sjmp MainVoice1: MOV DPTR,#tab_1 ;乐曲数据表的表头Sjmp MainVoice2: MOV DPTR,#tab_2 ;乐曲数据表的表头Sjmp MainVoice3: MOV DPTR,#tab_3 ;乐曲数据表的表头Sjmp MainVoice4: LJMP Main2;MOV DPTR,#tab_4 ;乐曲数据表的表头;Sjmp MainVoice5: MOV DPTR,#tab_5 ;乐曲数据表的表头Sjmp MainVoice6: MOV DPTR,#tab_6 ;乐曲数据表的表头Sjmp MainVoice7: MOV DPTR,#tab_7 ;乐曲数据表的表头Main: MOV TMOD,#11HMOV IP,#02HMOV 41H,#4CH ;T1初值放在41H,40H单元MOV 40H,#0B0H ;值越大,演奏越快SETB EASETB FLAG1CLR AMOV R1,A ;R1作为音符指针L1: MOVC A,@A+DPTRINC R1 ;指向音符的拍数字节MOV R6,A ;音级字节暂存入R6JZ L3ACALL TONEMOV TH0,R3MOV TL0,R2SETB TR0SETB ET0MOV A,R1MOVC A,@A+DPTRINC R1CJNE R1,#00H,L2MOV DPTR,#0400H ;表指针溢出,更改表头L2: ACALL LONG ;MOV A,R1AJMP L1 ;L3: MOV A,R1MOVC A,@A+DPTRMOV R7,AINC R1CJNE R1,#00H,L4MOV DPTR,#0400HL4: ACALL LONG ;MOV A,R1CJNE R7,#0FH,L1LJMP Main ;重复播放ORG 0200HTONE: MOV A,R6 ;取出音级字节RL A ;乘2,定时常数为双字节MOV 42H,A ;暂存入42H单元ADD A,#05H ;距离数表有7个字节,使查表正确MOVC A,@A+PC ;取出TH0MOV R3,AMOV A,42HINC AMOVC A,@A+PC ;取出TL0MOV R2,A ;RETTAB1: DB 0F8H,8EH,0F8H,0F9H,0F9H,5EH DB 0F9H,0BEH,0FAH,18H,0FAH,6DHDB 0FAH,0BEH,0FBH,09H,0FBH,51HDB 0FBH,95H,0FBH,0D4H,0FCH,11HDB 0FCH,49H,0FCH,7FH,0FCH,0B2HDB 0FCH,0E1H,0FDH,0FH,0FDH,39HDB 0FDH,61H,0FDH,87H,0FDH,0ABHDB 0FDH,0CDH,0FDH,0EDH,0FEH,0BHDB 0FEH,27H,0FEH,42H,0FEH,5BHDB 0FEH,73H,0FEH,8AH,0FEH,9FHDB 0FEH,0B3H,0FEH,0C6H,0FEH,0D8HDB 0FEH,0E9H,0FEH,0F9H,0FFH,08HDB 0FFH,16H,0FFH,24H,0FFH,30HDB 0FFH,3CH,0FFH,47H,0FFH,52HDB 0FFH,5CH,0FFH,66H,0FFH,6FHDB 0FFH,77H,0FFH,7FH,0FFH,86HORG 0300H ;音长子程序LONG: ADD A,#0FH ;使查表正确MOVC A,@A+PC ;取出定时器T1应中断的次数MOV R4,A ;T1应中断的次数存入R4中MOV TH1,41HMOV TL1,40HSETB TR1SETB ET1CJNE R4,#00H,$RET;音长子程序结束TAB2: DB 01,02,04,06 ;应中断的次数DB 08,10,12,14DB 16,20,24,28DB 32,40,48,64Main2: CLR FLAG1MOV TMOD,#01HMOV R3,#0FCH ; T1初值放在41H,40H单元MOV R2,#000H ;值越大,演奏越快MOV TL0,R2MOV TH0,R3SETB FLAG2SETB ET0SETB EASETB TR0MOV R0,#6sjmp $TAB_0: ;《友谊天长地久》DB 00H,04H,00H,04H,08H,04H,0DH,08H,0DH,04HDB 0DH,08H,11H,04H,0FH,08H,0DH,04HDB 0FH,08H,11H,02H,0FH,02H,0DH,08H,0DH,04HDB 11H,08H,14H,04H,16H,0DH,16H,04HDB 14H,08H,11H,04H,11H,08H,0DH,04HDB 0FH,08H,0DH,04H,0FH,08H,11H,02H,0FH,02HDB 0DH,08H,0AH,04H,0AH,08H,08H,04HDB 0DH,0CH,00H,04H,16H,04H,14H,08H,11H,04HDB 11H,08H,0DH,04H,0FH,08H,0DH,04HDB 0FH,08H,16H,04H,14H,08H,11H,04HDB 11H,08H,14H,04H,16H,0DH,19H,04HDB 14H,08H,11H,04H,11H,08H,0DH,04HDB 0FH,08H,0DH,04H,0FH,08H,11H,02H,0FH,02HDB 0DH,08H,0AH,04H,0AH,08H,08H,04HDB 0DH,0CH,00H,04H,00H,04HDB 00H,0FH ;结束标记TAB_1: ;《梁祝》DB 00H,04H,14H,04H,11H,04H,0FH,04HDB 0DH,0AH,0FH,04HDB 0CH,04H,0AH,04H,08H,08HDB 08H,0AH,18H,04HDB 16H,04H,18H,04H,14H,06H,16H,02HDB 18H,04H,16H,04H,14H,02H,16H,02H,18H,02H,16H,02H DB 19H,06H,16H,02H,14H,02H,16H,02H,14H,02H,0FH,02HDB 11H,04H,12H,04H,11H,04H,0FH,02HDB 0DH,0CHDB 0DH,04H,14H,04H,18H,04H,0FH,04HDB 0AH,04H,0DH,04H,08H,00HDB 08H,04H,0AH,02H,0DH,02H,08H,08HDB 08H,08H,05H,04H,05H,04HDB 08H,06H,0AH,02H,0DH,06H,0FH,02HDB 0AH,02H,0DH,02H,08H,04H,14H,06H,19H,02HDB 16H,03H,14H,01H,11H,02H,14H,02H,0FH,08HDB 0FH,08H,0FH,06H,11H,02HDB 0CH,04H,0AH,04H,08H,06H,0AH,02HDB 0DH,04H,0FH,04H,05H,04H,0DH,04HDB 0AH,03H,08H,01H,0AH,02H,0DH,02H,08H,08HDB 08H,08H,11H,06H,14H,02HDB 0CH,04H,0FH,04H,0AH,02H,0DH,02H,08H,04HDB 08H,08H,05H,03H,08H,01H,05H,04HDB 08H,02H,0AH,02H,0CH,02H,0FH,02H,0AH,08HDB 0AH,04H,08H,02H,0AH,02H,0DH,06H,0FH,02HDB 14H,04H,11H,04H,0FH,04H,11H,02H,0FH,02HDB 0DH,04H,0AH,02H,08H,02H,08H,02H,05H,08HDB 0DH,08H,0AH,02H,0DH,02H,0AH,02H,08H,02HDB 05H,02H,08H,02H,0AH,02H,0DH,02H,08H,08HDB 08H,0CHDB 00H,0FH ;结束标记TAB_2: ;《兰花草》DB 0AH,02H,11H,02H,11H,02H,11H,02H,11H,06H,0FH,02H DB 0DH,03H,0FH,01H,0DH,02H,0CH,02H,0AH,08HDB 16H,02H,16H,02H,16H,02H,16H,02H,16H,06H,14H,02HDB 11H,02H,14H,02H,14H,02H,13H,02H,11H,08HDB 11H,02H,16H,02H,16H,02H,14H,02H,11H,06H,0FH,02H DB 0DH,02H,0FH,02H,0DH,02H,0CH,02H,0AH,04H,05H,04H DB 06H,02H,0DH,02H,0DH,02H,0CH,02H,0AH,06H,11H,02H DB 0FH,03H,0DH,01H,0CH,02H,08H,02H,0AH,08HDB 00H,0CHDB 0AH,02H,11H,02H,11H,02H,11H,02H,11H,06H,0FH,02H DB 0DH,03H,0FH,01H,0DH,02H,0CH,02H,0AH,08HDB 16H,02H,16H,02H,16H,02H,16H,02H,16H,06H,14H,02H DB 11H,02H,14H,02H,14H,02H,13H,02H,11H,08HDB 11H,02H,16H,02H,16H,02H,14H,02H,11H,06H,0FH,02H DB 0DH,02H,0FH,02H,0DH,02H,0CH,02H,0AH,04H,05H,04H DB 06H,02H,0DH,02H,0DH,02H,0CH,02H,0AH,06H,11H,02H DB 0FH,03H,0DH,01H,0CH,02H,08H,02H,0AH,08HDB 00H,0FH ;结束标记TAB_3: ;《小草》DB 0AH,02H,0AH,02H,0DH,02H,0CH,02H,0AH,06H,00H,02H DB 0AH,02H,0AH,02H,11H,02H,0FH,02H,11H,06H,00H,02H DB11H,02H,11H,02H,14H,02H,11H,02H,0FH,02H,0FH,02H,0DH,02H, 0CH,01H,0CH,01HDB 0AH,04H,00H,02H,08H,02H,05H,06H,00H,02HDB 0AH,02H,0AH,02H,0DH,02H,0CH,02H,0AH,06H,00H,02H DB 0AH,02H,0AH,02H,11H,02H,0FH,02H,11H,06H,00H,02H DB11H,02H,11H,02H,14H,02H,11H,02H,0FH,02H,0FH,02H,0FH,02H, 0DH,02HDB 0CH,02H,0AH,02H,0AH,02H,08H,02H,0AH,06H,00H,02HDB 18H,02H,16H,04H,11H,02H,18H,02H,16H,04H,11H,02H DB 14H,02H,16H,02H,16H,02H,13H,02H,11H,08HDB 18H,02H,16H,04H,11H,02H,18H,02H,16H,04H,11H,02H DB 14H,02H,16H,02H,16H,02H,13H,02H,11H,08HDB 0FH,02H,0FH,04H,0AH,02H,0FH,02H,0FH,04H,12H,02HDB 11H,02H,0FH,02H,0FH,02H,0AH,02H,0FH,08HDB0FH,02H,0FH,04H,0AH,02H,0DH,02H,0DH,02H,00H,02H,0FH,02H DB 0CH,02H,0AH,02H,0AH,02H,08H,02H,0AH,08H; DB 18H,02H,16H,04H,11H,02H,18H,02H,16H,04H,11H,02H ; DB 14H,02H,16H,02H,16H,02H,13H,02H,11H,08H; DB 18H,02H,16H,04H,11H,02H,18H,02H,16H,04H,11H,02H ; DB 14H,02H,16H,02H,16H,02H,13H,02H,11H,08H; DB 0FH,02H,0FH,04H,0AH,02H,0FH,02H,0FH,04H,12H,02H; DB 11H,02H,0FH,02H,0FH,02H,0AH,02H,0FH,08H; DB 0FH,02H,0FH,04H,0AH,02H,0DH,02H,0DH,02H,00H,02H,0FH,02H ; DB 0CH,02H,0AH,02H,0AH,02H,08H,02H,0AH,08HDB 00H,0FH ;结束标记TAB_4: ;《千里之外》DB1BH,04H,1BH,02H,1BH,02H,1BH,02H,1DH,06H,1BH,02H,19H,02H ,19H,02H,14H,02H,14H,02H,16H,06HDB 19H,04H,19H,02H,19H,02H,19H,02H,1BH,06H,1DH,0CH DB1BH,04H,1BH,02H,1BH,02H,1BH,02H,1DH,06H,1BH,02H,19H,02H ,19H,02H,14H,02H,14H,02H,16H,06HDB19H,04H,19H,02H,19H,02H,19H,02H,1DH,06H,1DH,01H,1BH,02 H,1BH,04H,1BH,06H,14H,02HDB1BH,04H,1BH,02H,1BH,02H,1BH,02H,1DH,06H,1BH,02H,19H,02H ,19H,02H,14H,02H,14H,02H,16H,06HDB 19H,04H,19H,02H,19H,02H,19H,02H,1BH,06H,1DH,0CH DB1BH,04H,1BH,02H,1BH,02H,1BH,02H,19H,02H,19H,04H,1BH,04H ,1BH,02H,1BH,02H,1BH,02H,19H,02H,19H,04HDB16H,04H,19H,02H,19H,02H,19H,0CH,16H,04H,19H,02H,19H,02H, 19H,0CHDB 00H,0FH ;结束标记TAB_5: ;《救护车》DB 18H,06H,12H,06H,18H,06H,12H,06HDB 18H,06H,12H,06H,18H,06H,12H,06HDB 18H,06H,12H,06H,18H,06H,12H,06HDB 18H,06H,12H,06H,18H,06H,12H,06HDB 18H,06H,12H,06H,18H,06H,12H,06HDB 00H,0FH ;结束标记TAB_6: ;叮咚DB 20H,01H,00H,02H,10H,01H ;叮咚DB 00H,0FH ;结束标记TAB_7:DB 20H,01H,00H,02H,20H,01H,00H,02H ;嗲嗲DB 20H,01H,00H,02H,20H,01H,00H,02H ;嗲嗲DB 20H,01H,00H,02H,20H,01H,00H,02H ;嗲嗲DB 20H,01H,00H,02H,20H,01H,00H,02H ;嗲嗲DB 20H,01H,00H,02H,20H,01H,00H,02H ;嗲嗲DB 20H,01H,00H,02H,20H,01H,00H,02H ;嗲嗲DB 20H,01H,00H,02H,20H,01H,00H,02H ;嗲嗲DB 20H,01H,00H,02H,20H,01H,00H,02H ;嗲嗲DB 20H,01H,00H,02H,20H,01H,00H,02H ;嗲嗲DB 20H,01H,00H,02H,20H,01H,00H,02H ;嗲嗲DB 20H,01H,00H,02H,20H,01H,00H,02H ;嗲嗲DB 00H,0FH ;结束标记END。

51单片机汇编程序 (2)

51单片机汇编程序 (2)

知识创造未来
51单片机汇编程序
抱歉,我不提供编写汇编程序的服务。

但是,您可以在互联网上找到关于51单片机的汇编程序示例。

思路如下:
1. 确定程序的功能和需求。

2. 编写源代码,使用51单片机的汇编指令集来实现功能。

3. 将源代码汇编成机器码,生成可执行文件。

4. 使用相应的编程器将可执行文件烧录到51单片机。

5. 测试程序,确保功能正常。

需要注意的是,51单片机的汇编语言和汇编器可能有所不同,具体编写和调试过程可能会因此而异。

建议参考相关文档和教程以获取更详细的信息。

1。

MCS-51单片机实用子程序库

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指示的连续单元中的数据。

(完整版)51单片机汇编指令(全)

(完整版)51单片机汇编指令(全)

指令中常用符号说明Rn当前寄存器区的8个工作寄存器R0~R7(n=0~7)Ri当前寄存器区可作为地址寄存器的2个工作寄存器R0和R1(i=0,1)Direct8位内部数据寄存器单元的地址及特殊功能寄存器的地址#data表示8位常数(立即数)#data16表示16位常数Add16表示16位地址Addr11表示11位地址Rel8位代符号的地址偏移量Bit表示位地址@间接寻址寄存器或基址寄存器的前缀( )表示括号中单元的内容(( ))表示间接寻址的内容指令系统数据传送指令(8个助记符)助记符中英文注释MOV Move 移动MOV A , Rn;Rn→A,寄存器Rn的内容送到累加器AMOV A , Direct;(direct)→A,直接地址的内容送AMOV A ,@ Ri;(Ri)→A,RI间址的内容送AMOV A , #data;data→A,立即数送AMOV Rn , A;A→Rn,累加器A的内容送寄存器RnMOV Rn ,direct;(direct)→Rn,直接地址中的内容送RnMOV Rn , #data;data→Rn,立即数送RnMOV direct , A;A→(direct),累加器A中的内容送直接地址中MOV direct , Rn;(Rn)→direct,寄存器的内容送到直接地址MOV direct , direct;(direct)→direct,直接地址的内容送到直接地址MOV direct , @Ri;((Ri))→direct,间址的内容送到直接地址MOV direct , #data;8位立即数送到直接地址中MOV @Ri , A;(A)→@Ri,累加器的内容送到间址中MOV @Ri , direct;direct→@Ri,直接地址中的内容送到间址中MOV @Ri , #data; data→@Ri ,8位立即数送到间址中MOV DPTR , #data16;data16→DPTR,16位常数送入数据指针寄存器,高8位送入DPH,低8位送入DPL中(单片机中唯一一条16位数据传送指令)(MOV类指令共16条)MOVC Move Cod 查表指令MOVC A , @A+PC;PC+1→PC,(A+PC)→AMOVC A , @A+DPTR;(A+DPTR) →A(MOVC类指令共两条)MOVX Move External 与外部数据寄存区传送数据MOVX A , @DPTR;(DPTR)→A,DPTR间址单元内容送AMOVX @DPTR , A;A→(DPTR),A中内容送入DPTR间址单元MOVX A , @Ri;(Ri)→A,Ri间址单元内容送AMOVX @Ri , A;A→(Ri),A中内容送Ri间址单元(MOVX类指令4条)XCH Exchange 交换指令XCH A , Rn;Rn←→A , Rn的内容与A的内容交换XCH A , Direct; Direct ←→A ,直接地址的内容与A的内容交换XCH A , @Ri;(Ri)←→A ,间址的内容与A的内容交换XCHD Exchange Decimal十进制交换XCHD A , @Ri;(Ri.3~Ri.0) ←→A.3~A.0,间址内容低四位与A中内容低四位交换SWAP Swap 交换SWAP A;A.3~A.0←→ A.7~A.4 , A中低四位与高四位内容交换PUSH Push 入栈PUSH direct;SP+1→SP , (direct)→(SP);直接地址内容压入堆栈顶POP Pop 出栈POP direct;(SP)→(direct) , SP-1→SP;堆栈内容弹出到直接地址●算术运算类指令(7个助记符)ADD Add 加法运算ADD A , Rn;A + Rn→A , A与Rn的内容相加,结果送到A中ADD A , direct;(direct)+A→A,A与直接地址的内容相加,结果送到A中ADD A , @Ri;((Ri))+A→A, A与间址中的内容相加,结果送到A中ADD A , #data;data+A→A,A与立即数相加,和送入AADDC ADD with Carry 带进位加法ADDC A , Rn;A + Rn+CY→A , A与Rn的内容、进位状态相加,结果送到A中ADDC A , direct;(direct)+A+CY→A,A与直接地址的内容、进位状态相加,结果送到A中ADDC A , @Ri;((Ri))+A+CY→A, A与间址中的内容、进位状态相加,结果送到A中ADDC A , #data;data+A+CY→A,A与立即数、进位状态相加,和送入ASUBB Subbtract with Borrow 带进位减法SUBB A , Rn;A-Rn-CY→A,A减寄存器Rn的内容及进位标志,结果送ASUBB A , direct; A-(direct)-CY→A,A直接地址的内容及进位标志,结果送ASUBB A , @Ri; A-((Ri))-CY→A,A间址的内容及进位标志,结果送ASUBB A , #data; A-data-CY→A,A立即数及进位标志,结果送AMUL Multiply 乘法指令MUL AB;A x B→B和A,结果16位,高8位存入B,低8位存入A;若结果大于FFH,则将溢出标志OV置1DIV Divide 除法指令DIV AB;A÷B 商→A,余数→B;若除数为0,结果不确定,则将溢出标志OV置1INC Increment 加1指令INC A;A+1→A,A加1,结果放在AINC Rn; Rn +1→ Rn, Rn加1,结果放在RnINC direct; (direct)+1→ direct,直接地址的内容加1,结果放在该地址中INC @Ri;((Ri))+1→( Ri),间址中的内容加1,结果放在该间址中INC DPTR;(DPTR)+1→DPTR,数据指针内容加1,结果放在数据指针寄存器(DPTR)中DEC Decrement 减1指令INC A;A-1→A,A减1,结果放在AINC Rn; Rn -1→ Rn, Rn减1,结果放在RnINC direct; (direct)-1→ direct,直接地址的内容减1,结果放在该地址中INC @Ri;((Ri))-1→( Ri),间址中的内容减1,结果放在该间址中DA Decimal Adjust 十进制加法调整指令DA A;在加法指令后,把A中二进制码自动调整为BCD码;DA A只能更跟在ADD或ADDC加法指令后,不适用于减法●逻辑运算指令(9个助记符)ANL Logical And 逻辑与运算ANL A , Rn; (A)与(Rn)→A, A的内容与Rn中的内容相与,结果放在A中ANL A , direct; (A)与(direct)→A, A的内容与直接地址中的内容相与,结果放在A中ANL A , @Ri; (A)与((Ri))→A, A的内容与间址的内容相与,结果放在A中ANL A , #data; (A)与(data)→A, A的内容与立即数相与,结果放在A中ANL direct , A; (direct)与(A)→direct, 直接地址中的内容相与A的内容相与,结果放在直接地址中ANL direct , #data;(direct)与#data→direct, 直接地址中的内容相与立即数相与,结果放在直接地址中ORL Logical OR 逻辑或运算ORL A , Rn; (A) 或(Rn)→A, A的内容与Rn中的内容相或,结果放在A中ORL A , direct; (A) 或(direct)→A, A的内容与直接地址中的内容相或,结果放在A中ORL A , @Ri; (A) 或((Ri))→A, A的内容与间址的内容相或,结果放在A中ORL A , #data; (A) 或(data)→A, A的内容与立即数相或,结果放在A中ORL direct , A; (direct) 或A)→direct, 直接地址中的内容相与A的内容相或,结果放在直接地址中ORL direct , #data;(direct) 或#data→direct, 直接地址中的内容相与立即数相或,结果放在直接地址中XRL Logical exclusive or 逻辑异或运算ORL A , Rn; (A) 异或(Rn)→A, A的内容与Rn中的内容相异或,结果放在A中ORL A , direct; (A) 异或(direct)→A, A的内容与直接地址中的内容相异或,结果放在A中ORL A , @Ri; (A) 异或((Ri))→A, A的内容与间址的内容相异或,结果放在A中ORL A , #data; (A) 异或(data)→A, A的内容与立即数相异或,结果放在A中ORL direct , A; (direct) 或A)→direct, 直接地址中的内容相与A的内容相异或,结果放在直接地址中ORL direct , #data;(direct) 异或#data→direct, 直接地址中的内容相与立即数相异或,结果放在直接地址RL Rotate Left 循环左移指令RL A;每执行一次,A中的内容左移一位RR Rotate Right 循环右移指令RR A;每执行一次,A中的内容右移一位RLC Rotate Left with the Carry flag 带进位循环左移指令RLC A;每执行一次,CY和A中的内容左移一位RRC Rotate Right with the Carry flag带进位循环又移指令RRC A;每执行一次,CY和A中的内容右移一位注意:循环移位指令只能对A中的内容进行移位操作CPL Complement 取反指令(求补指令)CPL A;累加器内容按位取反,0变1,1变0CLR Clear 清零指令CLR A;累加器清零(A各位全变为0)●控制转移指令(9个助记符)LJMP Long Jump 长跳转指令LJMP add16;add16→PC,无条件跳转到add16地址,可在64KB范围内转移AJMP Absolute Jump 绝对跳转指令AJMP add11;add11→PC,无条件跳转到add11地址,可在2KB范围内转移SJMP Short Jump 短跳转指令SJMP rel;PC+2+rel→PC,rel是偏移量,8位有符号数(-127~127),可向前后跳转±128个地址单元JMP Jump 跳转指令JMP @A+DPTR;A+DPTR→PC,属于散转指令,无条件转向A与DPTR内容相加后形成的新地址JZ Jump if acc is Zero累加器为零转移JZ rel;A=0转向PC+2+rel→PC,A≠0,顺序执行JNZ Jump if acc is Not Zero累加器不为零转移JNZ rel;A≠0转向PC+2+rel→PC,A=0,顺序执行CJNE Compare and Jump if Not Equal比较不相等则转移CJNE A , direct , rel;A≠(direct)转向PC+3+rel→PC,否则顺序执行(PC+3 →PC);(A)>(direct)CY=0, (A)<(direct)CY=1CJNE A , #data , rel;A≠(data)转向PC+3+rel→PC,否则顺序执行(PC+3 →PC);(A)>(data)CY=0,( A)<(data)CY=1CJNE Rn , #data , rel; Rn≠(data)转向PC+3+rel→PC,否则顺序执行(PC+3 →PC); (Rn) >(data)CY=0, (Rn) <(data)CY=1CJNE @Ri , #data , rel;((Ri))≠(data)转向PC+3+rel→PC,否则顺序执行(PC+3 →PC); ((Ri))>(data)CY=0, ((Ri)) <(data)CY=1DJNE Decrement and Jump if Not Zero 减1不为0则转移DJNE Rn , rel;Rn-1→Rn, Rn≠0转向PC+2+rel→PC,否则顺序执行(PC+2→PC)DJNZ direct , rel;(direct-1)→direct, direct≠0转向PC+2+rel→PC,否则顺序执行(PC+2→PC)LCALL Long Call 长条用指令LCALL addr16;调用程序入口地址为addr16的之程序ACALL Absolute Call短调用ACALL addr11;调用程序入口地址为addr11的之程序RET ReturnRET;放在子程序最后,使程序准确返回到主程序断点处RETI Return from InterruptRETI;中断返回指令,能清楚优先级状态NOP No Operation 空操作指令NOP;空操作,产生一个机器周期延时●位操作指令MOV Move 数据传送指令MOV C , bit;(bit)→C,寻址位的状态送入CMOV bit , C;(C)→bit,C的转态送入地址中CLR Clear 清零指令CLR C;0→C,清零累加器CLR bit;清零直接寻址位CPL Complement 取反指令(求补指令)CPL C;c取反CPL bit;直接寻址位取反SETB Set Bit 置位SETB C;C置1SETB bit;直接寻址位置1ANL And Logical 与逻辑运算ANL C , bit;直接寻址位与C相与,结果放在CANL C , /bit; 直接寻址位与非C相与,结果放在CORL OR Logical 或逻辑运算ORL C , bit;直接寻址位与C相或,结果放在CORL C , /bit; 直接寻址位与非C相或,结果放在CJC Jump if Carry is set 进位位为1则转移JC rel;C=1,转向PC+2+rel→PC,否则顺序执行PC+2→PCJNC Jump if Carry is Not set 进位位为不为1则转移JNC rel;C=0,转向PC+2+rel→PC,否则顺序执行PC+2→PCJB Jump if Bit is set 进位位为1则转移JB bit , rel;(bit)=1,转向PC+3+rel→PC,否则顺序执行PC+3→PCJNB Jump if Bit is Not set 进位位为1则转移JNB bit , rel;(bit)=0,转向PC+3+rel→PC,否则顺序执行PC+3→PCJBC Jump if Bit is set and Clear bit指定位等于1转移并清该位JBC bit , rel; (bit)=1,转向PC+3+rel→PC,同时0→bit否则顺序执行PC+3→PC伪指令ORG Origin 代码起始地址指令ORG 0000HMOV A , #0010H;这条指令从0000H这个地址单元开始写起END End 汇编程序结束指令END;汇编指令结束DB字节定义伪指令ORG 1000HDB 01H , 02H;则(1000H)=01H,(1001H)=02HORG 1100HDB ‘01’;则(1100H)=30H,30H是0的ASCII码,(1101H)=31H,31H是1的ASCII码DW双字节定义伪指令ORG 2000HDW 2546H , 0178H; (2000H)=25H, (2001H)=46H, (2002H)=01H, (2003H)=78H,EQU数据赋值伪指令X EQU n;将n的值赋给xBIT位数据赋值伪指令y BIT b;y是用户定义标号,b为0或1MACRO宏指令宏指令名MACRO 形式参数······代码段······ENDM;宏指令定义结束寻址方式及相关的存储空间寻址方式寻址范围寄存器寻址R0~R7A 、B、C(CY)、AB(双字节)、DPTR(双字节)、PC(双字节)直接寻址内部RAM低128字节特殊功能寄存器内部RAM位寻区的128个位特殊功能寄存器中可寻址的位寄存器间接寻址内部数据存储器RAM【@R0,@R1,@SP(仅PUSH,POP)】内部数据存储器单元的低4位(@R0,@R1)外部RAM或I/O口(@R0,@R1,@DPTR)立即寻址程序存储器(常数)程序存储器(@A+PC,@A+DPTR)基寄存器加变址寄存器间接寻址。

经典51单片机实用子程序库(二)

经典51单片机实用子程序库(二)

51单片机实用子程序库(二)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。

在程序说明中,用[R0]或[R1]来表示R0或R1指示的十进制浮点操作数。

例如有一个十进制浮点操作数存放在30H、31H、32H中,数值是 -0.07315,即-0.7315乘以10的-1次方,则(30H)=0FFH,31H=73H,(32H)=15H。

完整word版,51单片机指令表

完整word版,51单片机指令表

此表主要是为了方便大家查阅每条指令的作用,写法以及字节数和周期数,建议大家保存为书签。

助记符指令说明字节数周期数(数据传递类指令)MOV A,Rn 寄存器传送到累加器 1 1MOV A,direct 直接地址传送到累加器 2 1MOV A,@Ri 累加器传送到外部RAM(8 地址) 1 1MOV A,#data 立即数传送到累加器 2 1MOV Rn,A 累加器传送到寄存器 1 1MOV Rn,direct 直接地址传送到寄存器 2 2MOV Rn,#data 累加器传送到直接地址 2 1MOV direct,Rn 寄存器传送到直接地址 2 1MOV direct,direct 直接地址传送到直接地址 3 2MOV direct,A 累加器传送到直接地址 2 1MOV direct,@Ri 间接RAM 传送到直接地址 2 2MOV direct,#data 立即数传送到直接地址 3 2MOV @Ri,A 直接地址传送到直接地址 1 2MOV @Ri,direct 直接地址传送到间接RAM 2 1MOV @Ri,#data 立即数传送到间接RAM 2 2MOV DPTR,#data16 16 位常数加载到数据指针 3 1 MOVC A,@A+DPTR 代码字节传送到累加器 1 2 MOVC A,@A+PC 代码字节传送到累加器 1 2 MOVX A,@Ri 外部RAM(8 地址)传送到累加器 1 2 MOVX A,@DPTR 外部RAM(16 地址)传送到累加器 1 2 MOVX @Ri,A 累加器传送到外部RAM(8 地址) 1 2 MOVX @DPTR,A 累加器传送到外部RAM(16 地址) 1 2 PUSH direct 直接地址压入堆栈 2 2POP direct 直接地址弹出堆栈 2 2XCH A,Rn 寄存器和累加器交换 1 1XCH A, direct 直接地址和累加器交换 2 1 XCH A, @Ri 间接RAM 和累加器交换 1 1 XCHD A, @Ri 间接RAM 和累加器交换低4 位字节 1 1(算术运算类指令)INC A 累加器加1 1 1 INC Rn 寄存器加1 1 1 INC direct 直接地址加1 2 1 INC @Ri 间接RAM 加1 1 1 INC DPTR 数据指针加1 1 2 DEC A 累加器减1 1 1 DEC Rn 寄存器减1 1 1 DEC direct 直接地址减1 2 2 DEC @Ri 间接RAM 减1 1 1 MUL AB 累加器和B 寄存器相乘 1 4 DIV AB 累加器除以B 寄存器 1 4 DA A 累加器十进制调整 1 1 ADD A,Rn 寄存器与累加器求和 1 1 ADD A,direct 直接地址与累加器求和 2 1 ADD A,@Ri 间接RAM 与累加器求和 1 1 ADD A,#data 立即数与累加器求和 2 1 ADDC A,Rn 寄存器与累加器求和(带进位) 1 1 ADDC A,direct 直接地址与累加器求和(带进位) 2 1 ADDC A,@Ri 间接RAM 与累加器求和(带进位) 1 1 ADDC A,#data 立即数与累加器求和(带进位) 2 1 SUBB A,Rn 累加器减去寄存器(带借位) 1 1 SUBB A,direct 累加器减去直接地址(带借位) 2 1 SUBB A,@Ri 累加器减去间接RAM(带借位) 1 1 SUBB A,#data 累加器减去立即数(带借位) 2 1(逻辑运算类指令)ANL A,Rn 寄存器“与”到累加器 1 1 ANL A,direct 直接地址“与”到累加器 2 1 ANL A,@Ri 间接RAM“与”到累加器 1 1 ANL A,#data 立即数“与”到累加器 2 1 ANL direct,A 累加器“与”到直接地址 2 1 ANL direct, #data 立即数“与”到直接地址 3 2 ORL A,Rn 寄存器“或”到累加器 1 2 ORL A,direct 直接地址“或”到累加器 2 1 ORL A,@Ri 间接RAM“或”到累加器 1 1 ORL A,#data 立即数“或”到累加器 2 1 ORL direct,A 累加器“或”到直接地址 2 1 ORL direct, #data 立即数“或”到直接地址 3 1 XRL A,Rn 寄存器“异或”到累加器 1 2 XRL A,direct 直接地址“异或”到累加器 2 1 XRL A,@Ri 间接RAM“异或”到累加器 1 1 XRL A,#data 立即数“异或”到累加器 2 1 XRL direct,A 累加器“异或”到直接地址 2 1 XRL direct, #data 立即数“异或”到直接地址 3 1 CLR A 累加器清零 1 2 CPL A 累加器求反 1 1 RL A 累加器循环左移 1 1 RLC A 带进位累加器循环左移 1 1 RR A 累加器循环右移 1 1 RRC A 带进位累加器循环右移 1 1 SWAP A 累加器高、低4 位交换 1 1(控制转移类指令)JMP @A+DPTR 相对DPTR 的无条件间接转移 1 2 JZ rel 累加器为0 则转移 2 2 JNZ rel 累加器为1 则转移 2 2CJNE A,direct,rel 比较直接地址和累加器,不相等转移 3 2 CJNE A,#data,rel 比较立即数和累加器,不相等转移 3 2 CJNE Rn,#data,rel 比较寄存器和立即数,不相等转移 2 2 CJNE @Ri,#data,rel 比较立即数和间接RAM,不相等转移 3 2 DJNZ Rn,rel 寄存器减1,不为0 则转移 3 2 DJNZ direct,rel 直接地址减1,不为0 则转移 3 2 NOP 空操作,用于短暂延时 1 1 ACALL add11 绝对调用子程序 2 2 LCALL add16 长调用子程序 3 2 RET 从子程序返回 1 2 RETI 从中断服务子程序返回 1 2 AJMP add11 无条件绝对转移 2 2 LJMP add16 无条件长转移 3 2 SJMP rel 无条件相对转移 2 2(布尔指令)CLR C 清进位位 1 1 CLR bit 清直接寻址位 2 1 SETB C 置位进位位 1 1 SETB bit 置位直接寻址位 2 1 CPL C 取反进位位 1 1 CPL bit 取反直接寻址位 2 1 ANL C,bit 直接寻址位“与”到进位位 2 2 ANL C,/bit 直接寻址位的反码“与”到进位位 2 2 ORL C,bit 直接寻址位“或”到进位位 2 2 ORL C,/bit 直接寻址位的反码“或”到进位位 2 2 MOV C,bit 直接寻址位传送到进位位 2 1 MOV bit, C 进位位位传送到直接寻址 2 2 JC rel 如果进位位为1 则转移 2 2 JNC rel 如果进位位为0 则转移 2 2JB bit,rel 如果直接寻址位为1 则转移 3 2 JNB bit,rel 如果直接寻址位为0 则转移 3 2 JBC bit,rel 直接寻址位为1 则转移并清除该位 2 2(伪指令)ORG 指明程序的开始位置DB 定义数据表DW 定义16 位的地址表EQU 给一个表达式或一个字符串起名DATA 给一个8 位的内部RAM 起名XDATA 给一个8 位的外部RAM 起名BIT 给一个可位寻址的位单元起名END 指出源程序到此为止(指令中的符号标识)Rn 工作寄存器R0-R7Ri 工作寄存器R0 和R1@Ri 间接寻址的8 位RAM 单元地址(00H-FFH)#data8 8 位常数#data16 16 位常数addr16 16 位目标地址,能转移或调用到64KROM 的任何地方addr11 11 位目标地址,在下条指令的2K 范围内转移或调用Rel 8 位偏移量,用于SJMP 和所有条件转移指令,范围-128~+127 Bit 片内RAM 中的可寻址位和SFR 的可寻址位Direct 直接地址,范围片内RAM 单元(00H-7FH)和80H-FFH$ 指本条指令的起始位置。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

51 单片机实用程序库 4.1 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮的效果。实际应用中例如: 广告灯箱彩灯、霓虹灯闪烁。 程序实例(LAMP.ASM) ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A ;灭所有的灯 MOV A,#11111110B MAIN1: MOV P1,A ;开最左边的灯 ACALL DELAY ;延时 RL A ;将开的灯向右边移 AJMP MAIN ;循环 DELAY: MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ 30H,D1 RET END 4.2 方波输出 程序介绍:P1.0 口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN.ASM): ORG 0000H MAIN: ;直接利用P1.0 口产生高低电平地形成方波////////////// ACALL DELAY SETB P1.0 ACALL DELAY 10 CLR P1.0 AJMP MAIN ;////////////////////////////////////////////////// DELAY: MOV R1,#0FFH DJNZ R1,$ RET END 五、定时器功能实例 5.1 定时1 秒报警 程序介绍:定时器1 每隔1 秒钟将p1.o 的输出状态改变1 次,以达到定时报警的目的。实际应用例如:定时报警器。 程序实例(DIN1.ASM): ORG 0000H AJMP MAIN ORG 000BH AJMP DIN0 ;定时器0 入口 MAIN: TFLA G EQU 34H ;时间秒标志,判是否到50 个 0.2 秒,即50*0.2=1 秒 MOV TMOD,#00000001B;定时器0 工作于方式 1 MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05 秒,定时 20 次则一秒 11 SETB EA ;开总中断 SETB ET0 ;开定时器0 中断允许 SETB TR0 ;开定时0 运行 SETB P1.0 LOOP: AJMP LOOP DIN0: ;是否到一秒//////////////////////////////////////// INCC: INC TFLAG MOV A,TFLAG CJNE A,#20,RE MOV TFLAG,#00H CPL P1.0 ;////////////////////////////////////////////////// RE: MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05 秒,定时 20 次则一秒 RETI END 5.2 频率输出公式 介绍:f=1/t s51 使用12M 晶振,一个周期是1 微秒使用定时器1 工作于方式0,最大值为65535,以产生200HZ 的频率为 例: 200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电 12 平或低电平的时间为2500 微秒。这样,定时值应设为 65535-2500=63035,将它转换为十六进制则为:F63B。 具体程序请看f200.asm 频率递增: 200HZ:63035:F63B 250HZ:63535:F82F 300HZ:63868:F97C 5.3 200HZ 频率输出 程序介绍:利用定时器定时,在P1.0 口产生200HZ 的频率输出。实际应用例如:传感器前级推动。 程序实例(F200.ASM): ORG 0000H AJMP MAIN ORG 001BH AJMP DIN0 MAIN: CLR P1.0 ;产生一个低电平,实际上 是从p1.0 口产生频率 MOV TMOD,#00010000B ;定时器1 工作于方式0 MOV TH1,#0F6H MOV TL1,#3BH ;频率产生的时间,详细请 见频率公式 SETB EA ;开总中断 13 SETB TR1 ;开定时器1 运行 SETB ET1 ;开定时器1 允许 LOOP: AJMP LOOP ;无限循环 DIN0: CPL P1.0 ;产生一个高电平, 下次来就是低电平(因为取反),一个高电平和一个低电平 形成一个周期 MOV TH1,#0F6H MOV TL1,#3BH ;重置频率产生时间 RETI ;返回 END 5.4 200——250HZ 变化频率输出 程序介绍:利用定时器定时时间的变化,由P1.0 口 产生200——250HZ 变化的频率。实际应用例如:传感器 前级推动、频率发生器。 程序实例(F250.ASM): ORG 0000H AJMP MAIN ORG 001BH AJMP DIN1 MAIN: ;定义频率200 和300////////////////////////////////// F2H EQU 30H F2L EQU 31H F3H EQU 32H F3L EQU 33H 14 ;////////////////////////////////////////////////// ;定义频率保持初值////////////////////////////////// MOV R1,#50 MOV R2,#02H ;////////////////////////////////////////////////// ;频率赋初值//////////////////////////////////////// MOV F2H,#0F6H MOV F2L,#3BH MOV F3H,#0F8H MOV F3L,#2FH ;////////////////////////////////////////////////// CLR P1.0 ;在P1.0 口产生一个低 电平,一个脉冲是由一个高电平和一个低电平组成的 MOV TMOD,#00010000B ;定时器工作于方式1 MOV TH1,F2H MOV TL1,F2L ;200HZ 输出 SETB EA ;开总中断 SETB TR1 ;开定时器1 运行 SETB ET1 ;开定时器1 允许 LOOP: AJMP LOOP DIN1: CPL P1.0 ;取反P1.0 口,实际 是为了不断的将p1.0 的电平关系转换,即产生了频率 ;频率保持时间////////////////////////////////////// DJNZ R1,RE MOV R1,#50 DJNZ R2,RE MOV R2,#02H 15 ;////////////////////////////////////////////////// MOV A,F2H CJNE A,F3H,XIA ;频率高位到300HZ 的高位了吗? AJMP JIA ;频率高位没到 300HZ 的高位值,直接将低位值加1 XIA: INC F2L MOV A,F2L CJNE A,#00H,RE INC F2H MOV A,F2H CJNE A,F3H,RE ;///////////////////////////////////////////// ;频率高位加到300HZ 的高位值了,低位加一,到300HZ 的低 位值了吗,没到出去,到了关定时器 JIA: INC F2L ;到了将200HZ 频率的低位加1 MOV A,F2L CJNE A,#F3L,RE CLR TR1 ;///////////////////////////////////////////// RE: MOV TH1,F2H MOV TL1,F2L RETI END 16 六、数显 0——9999 显示 程序介绍:利用S51 的串行口功能,实现数码管0— —9999 的循环显示。实际应用例如:电子计分牌。 程序实例(9999.ASM): ORG 0000H MAIN: GEE EQU 30H SHI EQU 31H BEI EQU 32H QIAN EQU 33H ;定义个十百千 MOV GEE,#00H MOV SHI,#00H MOV BEI,#00H MOV QIAN,#00H ;赋初值 MOV SCON,#00H ;串行口工作于方式 0.同步移位 ;显示个,十,百,千////////////////////////////////// DISPLAY: ACALL DELAY ;延时 MOV DPTR,#SETTAB MOV A,GEE MOVC A,@A+DPTR MOV SBUF,A D1: JNB TI,D1

相关文档
最新文档