51单片机汇编程序范例

合集下载

51单片机汇编程序集

51单片机汇编程序集

1、片内RAM初始化子程序2、片外RAM初始化子程序3、片外RAM初始化子程序(双字节个单元)4、内部RAM数据复制程序5、外部RAM数据复制程序6、外部RAM数据复制程序7、外部RAM数据复制到内部RAM程序8、限幅滤波程序9、中位值滤波程序10、N点算术平均滤波;片内RAM初始化子程序IBCLR :MOV A,R0MOV R1,ACLR AIBC1 :MOV @R1,AINC R1DJNZ R7,IBC1RET;片外RAM初始化子程序EBCLR1 :MOV A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,ACLR CEBC11 :MOVX @DPTR,AINC DPTRDJNZ R7,EBC11RET;片外RAM初始化子程序(双字节个单元) EBCLR2 :MOV A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,AMOV A,R7JZ EBC21INC R6EBC21 :CLR AMOVX @DPTR,AINC DPTRDJNZ R7,EBC21DJNZ R6,EBC21RET;内部RAM数据复制程序;入口:R0,R7;堆栈需求:2字节;出口:R1IBMOV :MOV A,R0ADD A,R7MOV R0,AMOV A,R1ADD A,R7MOV R1,AIBM1 :DEC R0DEC R1MOV A,@R0MOV @R1,ADJNZ R7,IBM1RET;外部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,EBM11RET;外部RAM数据复制程序;入口:ADDPH,ADDPL,R6,R7;堆栈需求: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,EBM21RET;外部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,ITEM1RET;限幅滤波程序;入口:A,SDA T,DELTY;占用资源:B;堆栈需求:2字节;出口:AJUGFILT :MOV B,ACLR CSUBB A,SDATJNC JUGFT1CPL AINC AJUGFT1 :SETB ASUBB A,#DELTYJNC JUGFT3MOV A,SDATRETJUGFT3 :MOV A,BMOV SDA T,ARET;中位值滤波程序;入口:ADDPH,ADDPL,N;占用资源:ESELSORT;堆栈需求:4字节;出口:AMEDFILT :LCALL ESELSORTMOV A,NCLR CRRC AADD A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,AJNC MEDFT1INC DPHMEDFT1 :MOVX A,@DPTRRET;N点算术平均滤波;入口:ADDPH,ADDPL,N;占用资源:B,R3,R4;堆栈需求:2字节;出口:AA VFILT :MOV A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,ACLR AMOV R3,AMOV R4,AMOV R7,NA VFT1 :MOVX A,@DPTRINC DPTRADD A,R4MOV R4,AJNC A VFT2INC R3A VFT2 :DJNZ R7,A VFT1MOV R7,NMOV R2,#00HLCALL NDIV31MOV A,R4RET参考链接:/news/2010-10/2355.htm11、N点加权平均滤波12、一阶加权滞后滤波程序13、双字节取补程序14、N节取补程序15、双字节无符号数加法程序16、N字节无符号数加法程序17、双字节无符号数减法程序18、N字节无符号数减法程序19、单字节无符号数乘法程序20、单字节无符号数乘法程序;N点加权平均滤波;入口:ADDPH,ADDPL,N;占用资源:B,R3,R4;堆栈需求:2字节;出口:AQA VFILT :CLR AMOV R3,AMOV R4,AMOV R7,NMOV P2,ADDPHMOV R1,ADDPLMOV DPTR,#QA VTAB QA VFT1 :MOVC A,@A+DPTRMOV B,AMOVX A,@R1INC DPTRINC R1MUL ABADD A,R4MOV R4,AMOV A,BADDC A,R3MOV R3,ADJNZ R7,QA VFT1MOV A,R4JNB ACC.7,QA VFT2INC R3QA VFT2 :MOV A,R3RETQA VTAB :DB;一阶加权滞后滤波程序;入口: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,BMOV R3,AMOV A,R4JNB ACC.7,FT1INC R3FT1 :MOV A,R3MOV DELTY,ARETBQTAB :DB 80H,80H;双字节取补程序/(R3R4)=(R3R4);入口:R3,R4;占用资源:ACC;堆栈需求:2字节;出口:R3,R4CMPT :MOV A,R4CPL AADD A,#01HMOV R4,AMOV A,R3CPL AADDC A,#00HMOV R3,ARET;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,BRET;双字节无符号数加法程序(R3R4+R6R7)=(R3R4) ;入口:R3,R4,R6,R7;占用资源:ACC;堆栈需求:2字节;出口:R3,R4,CFADD A,R7MOV R4,AMOV A,R3ADDC A,R6MOV R3,ARET;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,BRET;双字节无符号数减法程序(R3R4-R6R7)=(R3R4) ;入口:R3,R4,R6,R7;占用资源:ACC;堆栈需求:2字节;出口:R3,R4NSUB :MOV A,R4CLR CSUBB A,R7MOV R4,AMOV A,R3SUBB A,R6MOV R3,ARET;N字节无符号数减法程序([R0]-[R1])=([R0]);入口:R0,R1,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R0,CFNSUBN :MOV B,R0MOV R7,NCLR CNSUBN1 :MOV A,@R0MOV @R0,AINC R0INC R1DJNZ R7,NSUBN1MOV R0,BRET;单字节无符号数乘法程序(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 OVRET;单字节无符号数乘法程序(R2R3R4*R7)=(R5R2R3R4) ;入口:R2,R3,R4,R6,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R5,R2,R3,R4NMUL31 :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,BMOV R5,ACLR OVRET;单字节无符号数乘法程序(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,BXCH A,R2MOV B,R7MUL ABADD A,R2MOV R2,ACLR AADDC A,BXCH A,R5MOV B,R7MUL ABADD A,R5MOV R5,ACLR AADDC A,BMOV R7,ACLR OVRET参考链接:/news/2010-10/2356.htm21、单字节无符号数乘法程序22、双字节无符号数乘法程序23、双字节无符号数乘法程序24、N字节无符号数乘法程序25、单字节无符号除法程序26、单字节无符号除法程序27、双字节无符号除法程序28、N字节无符号除法程序(组合)29、N字节无符号除法程序30、N字节数据左移程序;单字节无符号数乘法程序(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,BXCH A,R2MOV B,R7MUL ABADD A,R2MOV R2,ACLR AADDC A,BXCH A,R5MOV B,R7MUL ABADD A,R5MOV R5,ACLR AADDC A,BMOV R7,ACLR OVRET;双字节无符号数乘法程序(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 ABADD A,R5MOV 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 OVRET;双字节无符号数乘法程序(R2R3R4*R6R7)=(R1R5R2R3R4) ;入口:R2,R3,R4,R6,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R1,R5,R2,R3,R4 NMUL32 :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,R7MUL ABADD A,R5MOV R5,AMOV A,BADDC A,R1MOV R1,ACLR AADDC A,#00HXCH A,R3MOV B,R6MUL ABADD A,R1MOV R1,AMOV A,BADDC A,R3XCH A,R5MOV R3,AMOV A,R2MOV B,R7MUL ABADD A,R1MOV R1,AMOV A,BADDC A,R5MOV R5,ACLR AADDC A,#00HXCH A,R2MUL ABADD A,R5MOV R5,AMOV A,BADDC A,R2XCH A,R1MOV R2,ACLR OVRET;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 R1ADDC 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,ARET;单字节无符号除法程序(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,ANDV313 :DJNZ B,NDV311POP ACLR OVJZ NDV314SETB OVNDV314 :XCH A,R2MOV R7,ARET;单字节无符号除法程序(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 NDV414NDV414 :XCH A,R5MOV R7,ARET;双字节无符号除法程序(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,R5JB F0,NCV424JC NDV425NCV424 :MOV R5,AMOV A,R1MOV R2,AINC R4NDV425 :DJNZ B,NDV423POP ACLR OVJNZ NDV426SETB OVNDV426 :XCH A,R2MOV R7,AMOV A,R5MOV R6,APOP AMOV R1,ARET;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,NCNTSW AP 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,ARET;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,@R0SUBB 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,@R0ADDC A,@R1MOV @R0,AINC R0INC R1DJNZ R7,NDVMN4MOV A,#08HMUL ABMOV B,A NDVMN5 :MOV A,R3MOV R0,AMOV R7,MCLR CNDVMN6 :MOV A,@R0RLC AMOV @R0,AINC R0DJNZ R7,NDVMN6MOV F0,CMOV A,R4MOV R0,AMOV A,R5MOV R1,AMOV R7,NCLR CNDVMN7 :MOV A,@R0SUBB A,@R1MOV @R0,AINC R0INC R1DJNZ R7,NDVMN7JB F0,NDVMNBJC NDVMN8NDVMNB :MOV A,R3MOV R0,AINC @R0SJMP NDVMNANDVMN8 :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,NDVMN5MOV A,MCLR CSUBB A,NADD A,R3MOV R1,AMOV A,R2MOV @R1,AMOV A,R3MOV R0,ARET;N字节数据左移程序RLC([R0])=(CF[R0]) ;入口:R0,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R0,CFNRLCN :MOV B,R0NRLN1 :MOV A,@R0RLC AMOV @R0,AINC R0DJNZ R7,NRLN1MOV R0,BRET31、原码有符号双字节减法程序32、原码有符号双字节加法程序33、原码有符号双字节乘法程序34、原码有符号双字节除法程序35、单字节顺序查找程序36、单字节顺序查找程序37、双字节字符串顺序查找程序38、双字节字符串顺序查找程序39、N字节字符串顺序查找程序40、单字节最值查找程序41、浮点数顺序查找程序42、浮点数最值查找程序43、单字节折半查找程序;原码有符号双字节减法程序(R3R4-R6R7)=R3R4 ;入口:R3,R4,R6,R7;占用资源:ACC,DADD;堆栈需求:6字节;出口:R3,R4,OVDSUB :MOV A,R6CPL ACC.7MOV R6,ALCALL DADDRET;原码有符号双字节加法程序(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 C,ACC.7MOV A,R3CLR ACC.7MOV R3,ACLR 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 DAB1;原码有符号双字节乘法程序(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,R6CLR ACC.7MOV R6,ALCALL NMUL22MOV A,R5MOV C,SR0MOV ACC.7,CMOV R5,ARET;原码有符号双字节除法程序(R5R2R3R4/R6R7)=(R3R4) 余数(R6R7) ;入口:R5,R2,R3,R4;占用资源:ACC,SR0,NDIV42;出口: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 OVRET;单字节顺序查找程序;入口:R0,R1,A,R7;占用资源:B;堆栈需求:2字节;出口:R0,R1,AFINDB1 :MOV B,AMOV DPL,R1MOV DPH,R0 FINDB11 :MOVX A,@DPTRCJNE A,B,FINDB12MOV R1,DPLMOV R0,DPHCLR ARETFINDB12 :INC DPTRDJNZ R7,FINDB11MOV A,#0FFHRET;单字节顺序查找程序;入口:R0,R1,A,R6,R7;占用资源:B;出口:R0,R1,AFINDB2 :MOV B,AMOV DPL,R1MOV DPH,R0MOV A,R7JZ FINDB21INC R6FINDB21 :MOVX A,@DPTRCJNE A,B,FINDB22MOV R1,DPLMOV R0,DPHCLR ARETFINDB22 :INC DPTRDJNZ R7,FINDB21DJNZ R6,FINDB21MOV A,#0FFHRET;双字节字符串顺序查找程序;入口:R0,R1,R3,R4,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R0,R1,AFINDS1 :MOV DPL,R1MOV DPH,R0 FINDS11 :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,#0FFHRET;双字节字符串顺序查找程序;入口: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,#0FFHRET;N字节字符串顺序查找程序;入口:ADDPH,ADDPL,R0,R6,R7,N ;占用资源:ACC,B,R2,NCNT;堆栈需求:2字节;出口:ADDPH,ADDPL,AFINDN :MOV A,R0MOV R2,AMOV A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,AJZ FINDN1INC R6FINDN1 :MOV A,R2MOV R0,AMOV A,NMOV 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,#0FFHRET;单字节最值查找程序;入口: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 A,DPLMOV R3,AMOV A,DPHMOV R2,AMOV R4,AMOV A,R7JZ FMMB1INC R6FMMB1 :MOVX A,@DPTRMOV B,ASETB CSUBB A,R0JC FMMB2MOV R0,BMOV R3,DPLMOV R2,DPHSJMP FMMB3 FMMB2 :MOV A,BCLR CSUBB A,R1JNC FMMB3MOV R1,BMOV R5,DPLMOV R4,DPH FMMB3 :INC DPTRDJNZ R7,FMMB1DJNZ R6,FMMB1RET;浮点数顺序查找程序;入口:R0,R1,R2,R3,R4,R6,R7 ;占用资源:B,NCNT,FCMP;堆栈需求:2字节;出口:R0,R1,AFINDF :MOV DPL,R1MOV DPH,R0MOV A,R7MOV B,AMOV NCNT,R6JZ FINDF1INC NCNT FINDF1 :MOVX A,@DPTRINC DPTRMOV R5,AMOVX A,@DPTRINC DPTRMOVX 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,#0FFHRET;浮点数最值查找程序;入口: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 NCNTFMMF1 :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,FMMF1RET;单字节折半查找程序;入口:A,R0,R1,R6,R7;占用资源:B,R2;堆栈需求:2字节;出口:R0,R1SEARCHB :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,R0参考链接:/news/2010-10/2358.htm。

51单片机实用汇编程序库

51单片机实用汇编程序库

51单片机实用汇编程序库51 单片机实用程序库4、1 流水灯程序介绍:利用P1 口通过一定延时轮流产生低电平输出,以达到发光二极管轮流亮得效果。

实际应用中例如: 广告灯箱彩灯、霓虹灯闪烁。

程序实例(LAMP、ASM)ORG 0000HAJMP MAINORG 0030HMAIN:9MOV A,#00HMOV P1,A;灭所有得灯MOV A,#11111110BMAIN1:MOV P1,A;开最左边得灯ACALL DELAY ;延时RL A ;将开得灯向右边移AJMP MAIN ;循环DELAY:MOV 30H,#0FFHD1: MOV 31H,#0FFHD2: DJNZ 31H,D2DJNZ30H,D1RETEND4、2 方波输出程序介绍:P1、0 口输出高电平,延时后再输出低电平,循环输出产生方波。

实际应用中例如:波形发生器。

程序实例(FAN、ASM):ORG 0000HMAIN:;直接利用P1、0 口产生高低电平地形成方波//////////////ACALL DELAYSETB P1、0ACALL DELAY10CLR P1、0AJMP MAIN;////////////////////////////////////////////////// DEL AY:MOV R1,#0FFHDJNZ R1,$RET五、定时器功能实例5、1 定时1 秒报警程序介绍:定时器1 每隔1 秒钟将p1、o得输出状态改变1次,以达到定时报警得目得。

实际应用例如:定时报警器。

程序实例(DIN1、ASM):ORG 0000HAJMP MAINORG 000BHAJMP DIN0 ;定时器0入口MAIN:TFLA G EQU34H ;时间秒标志,判就是否到50个0、2 秒,即50*0、2=1 秒MOVTMOD,#00000001B;定时器0 工作于方式1MOVTL0,#0AFHMOV TH0,#3CH ;设定时时间为0、05 秒,定时20 次则一秒11SETB EA;开总中断SETB ET0;开定时器0 中断允许SETBTR0 ;开定时0 运行SETB P1、0LOOP: AJMP LOOPDIN0:;就是否到一秒//////////////////////////////////////// INCC:INC TFLAGMOV A,TFLAGCJNE A,#20,REMOV TFLAG,#00HCPLP1、0;////////////////////////////////////////////////// RE:MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0、05秒,定时20 次则一秒RETIEND5、2 频率输出公式介绍:f=1/ts51 使用12M 晶振,一个周期就是1微秒使用定时器1工作于方式0,最大值为65535,以产生200HZ 得频率为例:200=1/t:推出t=0、005秒,即5000微秒,即一个高电平或低电平得时间为2500微秒。

第三章MCS51单片机的指令系统和汇编语言程序示例(第5范文

第三章MCS51单片机的指令系统和汇编语言程序示例(第5范文

第三章MCS51单片机的指令系统和汇编语言程序示例(第5、6、7节)1.试分析单片机执行下列指令后累加器A和PSW中各标志位的变化状况?(1)MOV A,#19HADD A,#66H(2)MOV A,#5AHADD A,#6BH2.已知:A=85H,R0=30H,(30H)=11H, (31H)=0FFH,C=1,试计算单片机执行下列指令后累加器A和C中的值各是多少?(1)ADDC A,R0, (2)ADDC A,31H(3) ADDC A,@R0, (4) ADDC A,#85H3.已知M1和M2中分别存放两个16位无符号数的低8位,M1+1和M2+1中分别存放两个16位无符号数的高8位,计算两数之和(低8位存放在M1,高8位存放在M1+1,设两数之和不超过16位)。

4.试分析单片机执行下列指令后累加器A和PSW中各标志位的变化状况?CLR CMOV A,#52HSUBB A,#0B4H5.已知:A=0DFH,R1=40H,R7=19H,(30H)=00H,(40H)=0FFH,试分析单片机执行下列指令后累加器A和PSW中各标志位的变化状况?(1) DEC A (2) DEC R7 (3) DEC 30H (4) DEC @R16.试写出能完成85+59的BCD加法程序,并对工作过程进行分析。

7.已知:两个8位无符号乘数分别放在30H和31H单元中,编程实现他们乘积的低8位存放在32H,高8位存放在33H。

8.已知:R0=30H,(30H)=0AAH,试分析执行下列指令后累加器A和30H单元的内容是什么?(1)MOV A, #0FFH ANL A, R0(2)MOV A, #0FH ANL A, 30H(3)MOV A, #0F0H ANL A, @R0(4)MOV A, #80H ANL 30H, A9.设:A=0AAH和P1=0FFH,试编程把累加器A的低四位送入P1口的低四位,P1口的高四位保持不变。

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

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

51单片机实用汇编程序库51 单片机实用程序库4.1 流水灯程序介绍:利用P1 口通过一定延时轮流产生低电平输出,以达到发光二极管轮流亮的效果。

实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。

程序实例(LAMP.ASM)ORG 0000HAJMP MAINORG 0030HMAIN:9MOV A,#00HMOVP1,A ;灭所有的灯MOV A,#11111110BMAIN1:MOV P1,A ;开最左边的灯ACALL DELAY ;延时RL A ;将开的灯向右边移AJMP MAIN ;循环DELAY:MOV 30H,#0FFHD1: MOV 31H,#0FFHD2: DJNZ 31H,D2DJNZ 30H,D1RETEND4.2 方波输出程序介绍:P1.0 口输出高电平,延时后再输出低电平,循环输出产生方波。

实际应用中例如:波形发生器。

程序实例(FAN.ASM):ORG 0000HMAIN:;直接利用P1.0 口产生高低电平地形成方波//////////////ACALLDELAYSETBP1.0ACALL DELAY10CLRP1.0AJMPMAIN;//////////////////////////////////////////////////DELAY:MOV R1,#0FFHDJNZR1,$RETEND五、定时器功能实例5.1 定时1 秒报警程序介绍:定时器1 每隔1秒钟将p1.o的输出状态改变1次,以达到定时报警的目的。

实际应用例如:定时报警器。

程序实例(DIN1.ASM):ORG 0000HAJMP MAINORG 000BHAJMP DIN0 ;定时器0入口MAIN:TFLA G EQU 34H;时间秒标志,判是否到50个0.2秒,即50*0.2=1 秒MOV TMOD,#00000001B;定时器0 工作于方式1MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05秒,定时20 次则一秒11SETB EA ;开总中断SETB ET0 ;开定时器0中断允许SETB TR0 ;开定时0运行SETB P1.0LOOP: AJMP LOOPDIN0:;是否到一秒////////////////////////////////////////INCC: INCTFLAGMOV A,TFLAGCJNE A,#20,REMOV TFLAG,#00HCPL P1.0;//////////////////////////////////////////////////RE:MOV TL0,#0AFHMOV TH0,#3CH;设定时时间为0.05 秒,定时20次则一秒RETIEND5.2 频率输出公式介绍:f=1/ts51使用12M 晶振,一个周期是1微秒使用定时器1工作于方式0,最大值为65535,以产生200HZ 的频率为例:200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电12平或低电平的时间为2500 微秒。

51单片机经典流水灯汇编程序

51单片机经典流水灯汇编程序

单片机流水灯汇编程序设计流水灯汇编程序8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。

;用最直接的方式实现流水灯ORG 0000HSTART:MOV P1,#01111111B ;最下面的LED点亮LCALL DELAY ;延时1秒MOV P1,#10111111B ;最下面第二个的LED点亮LCALL DELAY ;延时1秒MOV P1,#11011111B ;最下面第三个的LED点亮(以下省略)LCALL DELAYMOV P1,#11101111BLCALL DELAYMOV P1,#11110111BLCALL DELAYMOV P1,#11111011BLCALL DELAYMOV P1,#11111101BLCALL DELAYMOV P1,#11111110BLCALL DELAYMOV P1,#11111111B ;完成第一次循环点亮,延时约0.25秒AJMP START ;反复循环;延时子程序,12M晶振延时约250毫秒DELAY: ;大约值:2us*256*256*2=260ms,也可以认为为250msPUSH PSW ;现场保护指令(有时可以不加)MOV R4,#2L3: MOV R2 ,#00HL1: MOV R3 ,#00HL2: DJNZ R3 ,L2 ;最内层循环:(256次)2个周期指令(R3减一,如果比1大,则转向L2)DJNZ R2 ,L1 ; 中层循环:256次DJNZ R4 ,L3 ;外层循环:2次POP PSWRETEND51单片机汇编程序集(二)2008年12月12日星期五 10:27辛普生积分程序内部RAM数据排序程序(升序)外部RAM数据排序程序(升序)外部RAM浮点数排序程序(升序)BCD小数转换为二进制小数(2位)BCD小数转换为二进制小数(N位)BCD整数转换为二进制整数(1位)BCD整数转换为二进制整数(2位)BCD整数转换为二进制整数(3位)BCD整数转换为二进制整数(N位)二进制小数(2位)转换为十进制小数(分离BCD码)二进制小数(M位)转换为十进制小数(分离BCD码)二进制整数(2位)转换为十进制整数(分离BCD码)二进制整数(2位)转换为十进制整数(组合BCD码)二进制整数(3位)转换为十进制整数(分离BCD码)二进制整数(3位)转换为十进制整数(组合BCD码)二进制整数(M位)转换为十进制整数(组合BCD码)三字节无符号除法程序(R2R3R4/R7)=(R2)R3R4 余数R7;二进制整数(2位)转换为十进制整数(分离BCD码);入口: R3,R4;占用资源: ACC,R2,NDIV31;堆栈需求: 5字节;出口: R0,NCNTIBTD21 : MOV NCNT,#00HMOV R2,#00HIBD211 : MOV R7,#0AHLCALL NDIV31MOV A,R7MOV @R0,AINC R0INC NCNTMOV A,R3ORL A,R4JNZ IBD211MOV A,R0CLR CSUBB A,NCNTMOV R0,ARET;二进制整数(2位)转换为十进制整数(组合BCD码);入口: R3,R4;占用资源: ACC,B,R7;堆栈需求: 3字节;出口: R0IBTD22 : MOV A,R0PUSH AMOV R7,#03HCLR AIBD221 : MOV @R0,AINC R0DJNZ R7,IBD221POP AMOV R0,AMOV R7,#10HIBD222 : PUSH ACLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV B,#03HIBD223 : MOV A,@R0ADDC A,@R0DA AMOV @R0,AINC R0DJNZ B,IBD223POP AMOV R0,ADJNZ R7,IBD222RET;二进制整数(3位)转换为十进制整数(分离BCD码) ;入口: R2,R3,R4;占用资源: ACC,R2,NDIV31;堆栈需求: 5字节;出口: R0,NCNTIBTD31 : CLR AMOV NCNT,AIBD311 : MOV R7,#0AHLCALL NDIV31MOV A,R7MOV @R0,AINC R0INC NCNTMOV A,R2ORL A,R3ORL A,R4JNZ IBD311MOV A,R0CLR CSUBB A,NCNTMOV R0,ARET;二进制整数(3位)转换为十进制整数(组合BCD码) ;入口: R2,R3,R4;占用资源: ACC,B,R7;堆栈需求: 3字节;出口: R0IBTD32 : MOV A,R0PUSH AMOV R7,#04HCLR AIBD321 : MOV @R0,AINC R0DJNZ R7,IBD321POP AMOV R0,AMOV R7,#18HIBD322 : PUSH ACLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AMOV B,#04HIBD323 : MOV A,@R0ADDC A,@R0DA AMOV @R0,AINC R0DJNZ B,IBD323POP AMOV R0,ADJNZ R7,IBD322RET第七个试验:流水灯数字显示综合练习----51单片机汇编语言试验教程收藏该程序运行结果为个位数码管轮流现实0,1,2,3,4,5,6,7,8然后十位数码管轮流现实0,1,2,3,4,5,6,7,8反复循环P1.0,P1.1, P1.2,P1.3, P1.4,P1.5, P1.6,P1.7, 依次点亮然后轮流点亮小喇叭不停发出滴答声:注意该程序配套为我站的倚天版开发套件:如果是标准版:因他的数码管接法不同。

MCS51单片机指令系统与汇编语言程序设计

MCS51单片机指令系统与汇编语言程序设计

MCS51单片机指令系统与汇编语言程序设计MCS-51是一种非常常见的8位单片机系列,该系列包括了多种型号的单片机,如Intel 8051、8031、8052等。

MCS-51单片机指令系统是一组用于驱动该系列单片机的指令集,汇编语言程序设计是利用这些指令来编写程序。

MCS-51单片机指令系统包含了多种指令,可以执行诸如数据传输、算术逻辑运算、控制和数据访问等功能。

这些指令通过各种不同的寻址模式来操作数据,包括立即寻址、寄存器寻址、直接寻址、间接寻址和寄存器间接寻址等。

不同的寻址模式和指令组合可以实现不同的功能。

汇编语言程序设计通过将人类可读的汇编指令翻译成机器可执行的二进制指令来编写程序。

在MCS-51单片机中,汇编指令由操作码和操作数组成。

操作码指定了所执行的操作,如数据传输、算术运算或控制指令。

操作数则指定了指令要操作的数据。

下面以一个简单的例子来说明MCS-51单片机指令系统和汇编语言程序设计的基本原理。

假设我们要编写一个程序,将两个寄存器中的数据相加,并将结果存储到第三个寄存器中。

首先,我们需要将第一个寄存器的值加载到累加器A中,这可以通过MOV指令实现。

MOV指令的操作码为01,操作数为两个寄存器的地址。

例如,MOVA,R0将R0的值加载到A中。

接下来,我们需要将第二个寄存器的值加载到B寄存器中,同样可以使用MOV指令。

MOVB,R1将R1的值加载到B中。

然后,我们可以使用ADD指令将A和B中的值相加,并将结果存储到A中。

ADD指令的操作码为04,操作数为A的地址。

例如,ADDA将累加器中的值与A寄存器中的值相加,并将结果存储到A中。

最后,我们可以使用MOV指令将A中的结果移动到第三个寄存器中,例如,MOVR2,A将A的值移动到R2中。

通过组合使用这些指令,我们可以实现将两个寄存器中的值相加并存储到第三个寄存器中的功能。

总结来说,MCS-51单片机指令系统和汇编语言程序设计是一种用于编程控制该系列单片机的方式。

51汇编程序实例.

51汇编程序实例.

51汇编程序实例:举一例说明:流水灯加数码管LOOP: ; 标号CLR P2.6 ;选中p2.6 数码管左边的8字使能SETB P2.7 ;p2.7不使能。

右边的数码管消隐MOV P0,#28H ;把28h送p0口;数码管显示0 LCALL DELAY ;延时MOV P0,#0FFH ;0ffh 送p0口,数码管清除CLR P1.0 ;点亮p1.0发光管MOV P0,#7EH ;把7eh送p0口;数码管显示1 LCALL DELAYMOV P0,#0FFHCLR P1.1 ;点亮p1.0发光管CLR P1.0 ;点亮p1.0发光管MOV P0,#0A2H ;数码管显示2LCALL DELAYMOV P0,#0FFHCLR P1.2CLR P1.1CLR P1.0MOV P0,#62H ;数码管显示3LCALL DELAYMOV P0,#0FFHCLR P1.3CLR P1.2CLR P1.1CLR P1.0MOV P0,#74H ;数码管显示4LCALL DELAYMOV P0,#0FFHCLR P1.4CLR P1.3CLR P1.2CLR P1.1CLR P1.0MOV P0,#61H ;数码管显示5;LCALL DELAYMOV P0,#0FFHCLR P1.5CLR P1.4CLR P1.3CLR P1.2CLR P1.1CLR P1.0MOV P0,#21H ; 数码管显示6LCALL DELAYMOV P0,#0FFHCLR P1.6CLR P1.5CLR P1.4CLR P1.3CLR P1.2CLR P1.1CLR P1.0MOV P0,#7AH ; 数码管显示7LCALL DELAYMOV P0,#0FFHCLR P1.7CLR P1.6CLR P1.5CLR P1.4CLR P1.3CLR P1.2CLR P1.1CLR P1.0MOV P0,#20H ; 数码管显示8LCALL DELAYMOV P0,#0FFHLCALL DELAYMOV P0,#0FFHMOV P1,#0FFH;程序到此结果为左边的数码管显示0,1,2,3,4,5,6,7,8;p1.0------------p1.7指示灯依次点亮SETB P2.6 ; 左边的8消隐CLR P2.7 ;选中p2.7 数码管右边的8字使能,;MOV P0,#28HLCALL DELAYMOV P0,#0FFHMOV P1,#0FFHCLR P1.0MOV P0,#7EHLCALL DELAYMOV P0,#0FFHMOV P1,#0FFHCLR P1.1MOV P0,#0A2HLCALL DELAYMOV P0,#0FFHMOV P1,#0FFHCLR P1.2MOV P0,#62HLCALL DELAYMOV P0,#0FFHMOV P1,#0FFHCLR P1.3MOV P0,#74HLCALL DELAYMOV P0,#0FFHMOV P1,#0FFHCLR P1.4MOV P0,#61HLCALL DELAYMOV P0,#0FFHMOV P1,#0FFHCLR P1.5MOV P0,#21HLCALL DELAYMOV P0,#0FFHMOV P1,#0FFHCLR P1.6MOV P0,#7AHLCALL DELAYMOV P0,#0FFHMOV P1,#0FFHCLR P1.7MOV P0,#20HLCALL DELAYMOV P0,#0FFHMOV P1,#0FFHMOV P0,#0FFHMOV P1,#0FFH;这一段和上一段基本相同,不同的是右边的数码管依次显示012345678,左边的不亮;;同时p1口的灯流动显示:AJMP LOOP; 注意:程序运行到此跳转到开始标号,重复执行:DELAY: ;延时子程序;参考前面的教程:CLR P3.3 ;注意小喇叭在3.3口,这里可以使小喇叭发出嗒,嗒声MOV R7,#255NOPNOPD1:MOV R6,#255setb p3.3D2: DJNZ R6,D2clr p3.3DJNZ R7,D1SETB P3.3RETENDLOOP: ;标号CLR P2.6 ;选中p2.6 数码管左边的8字使能SETB P2.7 ;p2.7不使能。

51单片机汇编程序范例

51单片机汇编程序范例

51单片机汇编程序范例(总14页)本页仅作为文档封面,使用时可以删除This document is for reference only-rar21year.March16位二进制数转换成BCD码的的快速算法-51单片机2010-02-18 00:43在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序。

程序可见:中的HEX2BCD子程序。

.说它经典,不仅是因为它已经流传已久,重要的是它的编程思路十分清晰,十分易于延伸推广。

做而论道曾经利用它的思路,很容易的编写出了48位二进制数变换成16位BCD码的程序。

但是这个程序有个明显的缺点,就是执行时间太长,转换16位二进制数,就必须循环16遍,转换48位二进制数,就必须循环48遍。

上述的HEX2BCD子程序,虽然长度仅仅为26字节,执行时间却要用331个机器周期。

.单片机系统多半是用于各种类型的控制场合,很多时候都是需要“争分夺秒”的,在低功耗系统设计中,也必须考虑因为运算时间长而增加系统耗电量的问题。

为了提高整机运行的速度,在多年前,做而论道就另外编写了一个转换程序,程序的长度为81字节,执行时间是81个机器周期,(这两个数字怎么这么巧!)执行时间仅仅是经典程序的1/4!.近来,在网上发现了一个链接:,也对这个经典转换程序进行了改进,话是说了不少,只是没有实质性的东西。

这篇文章提到的程序,一直也没有找到,也难辩真假。

这篇文章好像是选自某个著名杂志,但是在术语的使用上,有着明显的漏洞,不像是专业人员的手笔。

比如说文中提到的:“使用51条指令代码,但执行这段程序却要耗费312个指令周期”,就是败笔。

51条指令代码,真不知道说的是什么,指令周期是因各种机型和指令而异的,也不能表示确切的时间。

.下面说说做而论道的编程思路。

;-----------------------------------------------------------------------;已知16位二进制整数n以b15~b0表示,取值范围为0~65535。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编程的时候,要充分利用单字节、单周期的指令,使程序的长度和执行时间尽量缩短。
做而论道的编程思路已经给出,程序代码还是过一段时间再公布,给大家留下一个发挥的时间。
感兴趣的网友可以留言,写出自己编写的程序。
51单片机把4位16进制数转成10进制数的方法2010-02-10 23:33, 2位16进制转10进制,用除以10求商跟余数的方法,即可。
MOVX @DPTR, A
RET
仅用了24字节
16位二进制转BCD码--单片机2010-01-0314:19要求:
编写一段程序,把计数器中T0中计的数(TH0和TL0)转成8421BCD码。
并且高8位给p1口,低8位给p0口,要是转成BCD码超过16位,则给p
2.0高电平。
我是做单片机课设的,这段程序实在编不明白了,向各位大侠请教了!无比感谢中!答对有额外加分啊!!!!
MOV R1, A
MOV A,R0
RLC A
MOV R0, A
MOV A,R4;送到BCD码的低端
ADDC A, R4;带进位加。自身相加,相当于左移一位
DAA;十进制调整,变成BCD码
MOV R4, A
MOV A,R3
ADDC A, R3
DAA
MOV R3, A
MOV A,R2
ADDC A, R2
最佳
答案:
两个字节的二进制数转换成BCD码,必须编写程序来解决。
下面把这段转换程序,写成子程序的结构,便于网友移植。
;程序经过仿真调试通过,如下所示:
;------------------------------------------------------------------;MOV R0, TH1
最佳
答案:
;------------------------------------------
看来这个题目是属于MCS-51单片机的。
下面用51单片机的汇编语言来求解。
MOVB,#100
DIVAB
MOV31H, A;存百位数
MOVA,#10
XCHA,B
DIVAB
SWAP A;十位数换到高四位
ADDA,B;加上个位数
按照下面的思路做,还可以再简练些。
R0中的8位二进制数转换成3位BCD码:
MOVDPTR,#1000H;个位的地址
MOVA,R0
MOVB,#10
DIVAB
XCHA,B
MOVX @DPTR, A
INCDPTR
MOVA,#10
XCHA,B
DIVAB
XCHA,B
MOVX @DPTR, A
INCDPTR
XCHA,B
MOV R3, A
MOV R4, A
MOV R5, #16;共转换16位数
LOOP:
CLR C;c=0
MOV A,R0;从待转换低8bit数的高端移出一位到Cy(转换最先由低8位开始)
RLC A;R0xx的最高位移入到Axx
MOV R0, A
MOV A,R1;(高8位二进制数)
RLC A;此时C中的由低8位所移入的数重新移入高8位的低端MOV R1, A;相当于16bit的高端移出了1bit到C中了
4位16进制数呢?DIV指令只可以对2位16进制数进行除法运算啊,求高手解答。
例如把TH1 TL1的数值转成十进制,分别存入R4 R3 R2 R1 R0。
我要的是汇编的方法,C语言还没学到。
悬赏分:30 -解决时间:2010-2-10 22:47
;------------------------------------------------------------------
MOV R2, A
DJNZ R5, LOOP;共转换十六位数
RET
将A中的二进制数转换为3位的BCD码,其中百位数存放......2010-01-11 09:13请各位懂得帮写下这个程序片段。
将A中的二进制数转换为3位的BCD码。其中百位数存放到31H中,十位和个位数压缩后,存放到30H中。
悬赏分:80 -解决时间:2009-10-19 09:59
16位二进制数转换成BCD码的的快速算法-51单片机2010-02-18 00:43在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序。
程序可见:
http:
32.html中的HEX2BCD子程序。
.说它经典,不仅是因为它已经流传已久,重要的是它的编程思路十分清晰,十分易于延伸推广。做而论道曾经利用它的思路,很容易的编写出了48位二进制数变换成16位BCD码的程序。
但是这个程序有个明显的缺点,就是执行时间太长,转换16位二进制数,就必须循环16遍,转换48位二进制数,就必须循环48遍。
上述的HEX2BCD子程序,虽然长度仅仅为26字节,执行时间却要用331个机器周期。.单片机系统多半是用于各种类型的控制场合,很多时候都是需要“争分夺秒”的,在低功耗系统设计中,也必须考虑因为运算时间长而增加系统耗电量的问题。
;式中高4位[b15~b12]取值范围为0~15,代表了4096的个数;
;上式可以变形为:
; n = [b15~b12] * 4000 + {[b15~b12] * (100 - 4) + [b11~b0]}
;用x代表[b15~b12],有:
; n =x * 4000 + {x * (100 - 4) + [b11~b0]}
MOV A,R4;送到BCD码的低端
ADDC A,R4;带进位加。自身相加,相当于左移一位
DAA;十进制调整,变成BCD码
MOV R4, A
MOV A,R3
ADDC A,R3
DAA
MOV R3, A
MOV A,R2
ADDC A,R2
MOV R2, A
DJNZ R5, LOOP;循环16遍,转换即完成;MOV P0, R4;按照要求输出
也就是说加数和被加数都是BCD码的形式,最大也只可能是99H,也就是我们十进制数中的99,只有这样才会有实际的意义!所以你说的当A=#24H的时候的情况是不会存在的,严格的说是没有意义的!
MOV R2, B
SJMP $;到此,完成了题目要求
;------------------------------------------------------------------
;两个字节的二进制数转换成BCD码的程序如下:
;功能:16位二进制数变换成为BCD码;
;xx:
R0 R1中是16位二进制数,其中R0中是高8位;
MOV R1, TL1
CALL HEX2BCD;调用子程序把R0 R1中的数字,转换成压缩的BCD码,送到R2 R3 R4
;-------下面,把万千百十个位,分别存入R4 R3 R2 R1 R0
MOV A,R4;先分离R4中的压缩型BCD码,包含的是十位与个位的数MOV B,#16
DIV AB;除以16,目的是分离出高、低四位
这篇文章好像是选自某个著名杂志,但是在术语的使用上,有着明显的漏洞,不像是专业人员的手笔。比如说文中提到的:
“使用51条指令代码,但执行这段程序却要耗费312个指令周期”,就是败笔。51条指令代码,真不知道说的是什么,指令周期是因各种机型和指令而异的,也不能表示确切的时间。
.下面说说做而论道的编程思路。;-----------------------------------------------------------------------
悬赏分:200 -解决时间:2010-1-3 13:03
最佳
答案:16bit表示:65536,万位不超6
――――――――――――――――――――――――――
程序如下:
MOV R0, TL0;
MOV R1, TH0;待转换的16bit数分别放入(由高到低)R1R0中;CLR A
MOV R2, A;先清零
;剩下的低7位[b6~b0],已经是单字节数据,变换成BCD码那就十分简单了。
;-----------------------------------------------------------------------
从最后的表达式中可以看出,高9位变换的计算方法极为简单,只是使用左移、加减等指令即可,基本上不涉及多字节的运算。
;即:
; n =4*x (千位) + x (百位) + [b11~b0] - 4*x
;写到这里,就可以看出一点BCD码变换的意思来了。
;;上式中后面的位:
[b11~b0] - 4*x,如果小于256,那就太简单了,马上就可以去按照常规转换BCD了。
;如果数值较大,就要把[b11~b7]看成128的个数y;在百位中加上y、在十位加上3*y、并在[b6~b0]中减去2*y。
;出口:
R2 R3 R4中是BCD码,其中R2中是万位,R3中是千、百位,R4中是十、个位。
HEX2BCD:
CLR A
MOV R2, A;先对要放入转换后的压缩型BCD码的寄存器通通清零MOV R3, A
MOV R4, A
MOV R5, #16;共转换十六位数
LOOP:
CLR C
MOV A,R1;从待转换数的高端移出一位到Cy(从低8位R1开始转换)RLC A
MOV30H, A;保存
R0中的8位二进制数转换成3位BCD码-单片机编程2010-01-1023:18单片机的不难编程题!急!!!!!!
将R0中的8位二进制数转换成3位BCD码,结果存入外部RAM的1002H~1000H(从高位到低位)单元中。
例如:
地址:
R0执行后:1002H 1001H 1000H
相关文档
最新文档