⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 峰值电流表.asm

📁 本程序是本人开发峰值电流表利用C8051F330的10位AD编写的汇编程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;---------------------------------------------------------------------------
; 
; 
$include (c8051f330.inc) 
;********************位单元定义**************************
						SDA BIT P1.1					;I2C数据线
						SCL BIT P1.0					;I2C时钟线
						PB0 BIT P0.1						
						FLAG0_180 BIT 00H
						RCV_FLAG BIT 01H				;串口接收成功标志
;*********************字节单元定义************************													TEMP EQU 40H					;暂存寄存器
						INDEX EQU 41H					;正弦表格检索寄存器
						RCOUNT EQU 42H				;串口通讯接收字节数计数器
						ADDR EQU 43H					;串口通讯接收缓冲器首地址寄存器
						ADCOUNT EQU 44H				;ADC转换次数计数器
						SUMH EQU 45H					;10次ADC转换数据和的高位字节
						SUML EQU 46H					;10次ADC转换数据和的低位字节
						CH452_CMD EQU 47H			;CH452命令寄存器
						TEMPH EQU 48H
						TEMPL EQU 49H
						TEMP1 EQU 4AH
						DIZHI EQU 4BH					;本机地址寄存器
						PEEKH EQU 4CH					;10次ADC转换数据和的峰值高位字节
						PEEKL EQU 4DH					;10次ADC转换数据和的峰值低位字节
						BEILVH EQU 4EH				;参考电压倍率高位字节
						BEILVL EQU 4FH				;参考电压倍率低位字节
						DISP1000 EQU 30H			;LED显示器千位数暂存单元
						DISP100 EQU 31H				;LED显示器百位数暂存单元
						DISP10 EQU 32H				;LED显示器十位数暂存单元
						DISP1 EQU 33H 				;LED显示器个位数暂存单元
						RESULTH EQU 34H
						RESULTL EQU 35H
						R_BUF EQU 60H
						T_BUF EQU 70H;-----------------------------------------------------------------------------; RESET and INTERRUPT VECTORS;-----------------------------------------------------------------------------            ; Reset Vector            ;cseg AT 0            ;ljmp Main                      ; Locate a jump to the start of
            ORG 0000H
						LJMP MAIN           ; code at the reset vector.						;ORG 000BH
						;LJMP TIMER0
						ORG 0023H
            LJMP SVC_SCI					;转串行口中断服务程序;-----------------------------------------------------------------------------; CODE SEGMENT;-----------------------------------------------------------------------------;Blink       segment  CODE

            ;rseg     Blink                			; Switch to this code segment.
            ;using    0                    			; Specify register bank for the
             ORG 0100H                             	; following program code.Main:		
				MOV OSCICN,#0C0H						;内部振荡器使能,系统时钟8分频(24.5MHz)
;***********C0H:8分频,C1H:4分频,C2H:2分频,C3H:不分频*************
        ; Disable the WDT.
        ANL  PCA0MD, #NOT(040h)      ;禁止看门狗
				LCALL D80MS
				LCALL D80MS
				LCALL D80MS
				LCALL D80MS
				;ORL RSTSRC,#10H
				;LCALL D20MS
				;ANL RSTSRC,#0EFH
				;LCALL D20MS				orl  P0SKIP,#04h           ;skip LED pin in crossbar
        orl  P0SKIP,#01h						;P0.0被交叉开关跳过(参考电压输出)
				MOV RSTSRC,#04H
    		MOV  XBR0,#01h							;UART的TX0、RX0连接到P0.4、P0.5
    		MOV  XBR1,#40h							;交叉开关使能
				MOV  TMOD,#20h							;T1工作在方式2(8位自动装载)
    		MOV  TH1,#0F3h							;定时器初值(对应于波特率9600)
				MOV  SCON0,#10h							;允许接收
				MOV  IE,#10h								;允许接收中断
				SETB TR1										;启动T1
				MOV RCOUNT,#08H							;通讯帧字节计数器置初值
				MOV ADDR,#60H								;接收缓冲区首地址
				CLR EX1
				CLR EA											
				CLR RCV_FLAG								;通讯成功标志清零
				ORL P0,#01001101B
				LCALL CH452_INI
				LCALL CH452_INI
				LCALL D1S
				LCALL D1S
				LCALL D1S
				LCALL D1S
				MOV T_BUF,#00H
				MOV T_BUF+1,#01H
				MOV T_BUF+2,#02H
				MOV T_BUF+3,#03H
				MOV T_BUF+4,#04H
				MOV T_BUF+5,#05H
				MOV T_BUF+6,#06H
				MOV T_BUF+7,#07H
				MOV T_BUF+8,#08H
				CLR A
				MOV C,P0.2
				MOV ACC.0,C
				MOV C,P0.3
				MOV ACC.1,C
				MOV C,P0.6
				MOV ACC.2,C
				MOV DIZHI,A					;存本机地址
				;MOV DISP1000,#02H
				;MOV DISP100,#03H
				;MOV DISP10,#04H
				;MOV DISP1,#05
				;LCALL DISP
LOOP2: ;LCALL TRANS
				;LCALL D1S
				;LCALL D1S
				;LCALL D1S
				SETB ES0
				SETB EA
				;JNB RCV_FLAG,$
				;CLR RCV_FLAG
				;SJMP LOOP2               ; assignments
        ORL P1MDOUT,#28H          ; make LED pin output push-pull
				ANL P1MDOUT,#0F8H					;P1.0,P1.1,P1.2为开漏输出
        ORL P1MDIN,#28H           ; make LED pin input mode digital
				ANL P0MDOUT,#0FDH					;P0.1为开漏输出
				SETB P0.1
				MOV P1MDIN,#0FBH;					; P1.2 为模拟量输入                                		*/ 
  			MOV P1SKIP,#04H;					;P1.2被交叉开关跳过					
  			MOV AMX0P,#0AH;						;P1.2配置为正输入
  			MOV AMX0N,#11H;						;GND配置为负输入
  			MOV ADC0CF,#0F8H					;SAR clock = 31, 右对齐
				ORL REF0CN,#01H						;内部电压基准使能
				MOV PEEKH,#00H						;峰值初值清零
				MOV PEEKL,#00H
				MOV SUMH,#00H
				MOV SUML,#00H
				MOV ADCOUNT,#0AH
LOOP:  	ORL ADC0CN,#80H						;ADC0使能
				SETB AD0BUSY							;启动ADC
				JB AD0BUSY,$							;查询ADC是否结束?
				MOV R2,SUMH
				MOV R3,SUML
				MOV R4,ADC0H
				MOV R5,ADC0L
				CALL HEX2A
				MOV SUMH,R2
				MOV SUML,R3
				DJNZ ADCOUNT,LOOP
				MOV ADCOUNT,#0AH
				;JB P0.1,NEXT
				MOV PEEKH,#00H							;峰值初值清零
				MOV PEEKL,#00H
NEXT:		LCALL JISUAN
				JNB RCV_FLAG,NEXTA
				CLR RCV_FLAG
				MOV T_BUF,#01H							;上位机地址01
				MOV T_BUF+1,DIZHI						;电流表地址
				MOV T_BUF+2,#02H						;数据类型为2,数据为测量电流值
				MOV T_BUF+3,#00H
				MOV T_BUF+4,RESULTH					;测量结果高位(BCD码)
				MOV T_BUF+5,RESULTL
				MOV T_BUF+6,#00H						;测量结果低位(BCD码)
				CLR A
				MOV R2,#07H
				MOV R0,#T_BUF
SLOOP:	ADD A,@R0
				INC R0
				DJNZ R2,SLOOP							;计算校验和
				MOV T_BUF+7,A								;校验和存发送缓冲区第八个字节
				CALL TRANS									;发送一帧数据
NEXTA:	LCALL D1S
				;LCALL D1S
				SETB EA
				MOV SUMH,#00H
				MOV SUML,#00H
				MOV ADCOUNT,#0AH
				SJMP LOOP

;************接收中断服务程序,接收上位机命令*************

SVC_SCI:						
						PUSH ACC		
						PUSH PSW
	 					JBC RI0,SVC_SCI_RI
						SJMP SVC_SCI_Z
SVC_SCI_RI:	MOV A,SBUF0
						;MOV ADDR,SBUF
						MOV R1,ADDR
						MOV @R1,A
						INC ADDR
						DJNZ RCOUNT,SVC_SCI_Z
						MOV R0,#R_BUF
						CLR A
						MOV R2,#07H
SCI_LOOP:		ADD A,@R0
						INC R0
						DJNZ R2,SCI_LOOP						;计算校验和
						CJNE A,R_BUF+7,SVC_SCI_1		;与接收到的校验和比较,不同则中断返回,接收数据不正确
						MOV A,R_BUF							
						CJNE A,DIZHI,SVC_SCI_1			;校验和相同,判断接收到的地址是否是本机地址?
						SETB RCV_FLAG								;成功接收一帧数据标志位置1
SVC_SCI_1:	MOV RCOUNT,#08H
						MOV ADDR,#60H
						;CLR EA
SVC_SCI_Z:	POP PSW
						POP ACC 
						RETI
TRANS:			MOV R7,#08H				;将60H单元开始的连续10个字节通过串口发给PC机						
						MOV R0,#70H
TRANSA:			MOV A,@R0
						MOV SBUF0,A
WAITA:			JNB TI0,WAITA
						CLR TI0
						INC R0
						DJNZ R7,TRANSA
						SETB EA
						RET

D20MS:		MOV R6,#14H
D201:			ACALL D1MS
					DJNZ R6,D201
					RET
D80MS:		MOV R6,#50H
D801:			ACALL D1MS
					DJNZ R6,D801
					RET
D1MS:			MOV R7,#0C7H	;1T
DD1:			NOP						;1T
					NOP						;1T
					NOP						;1T
					DJNZ R7,DD1		;2T
					RET						;2T
D250MS:		MOV R5,#0CH
DD2:			ACALL D20MS
					DJNZ R5,DD2
					RET
D500MS:		MOV R5,#19H
DD3:			CALL D20MS
					DJNZ R5,DD3
					RET
D1S:			MOV R5,#19H
DD4:			ACALL D20MS
					DJNZ R5,DD4
					RET

;转换结果的计算判断子程序
JISUAN:		MOV R3,PEEKH
					MOV R4,PEEKL
					MOV R6,SUMH						
					MOV R7,SUML
					CALL NSUB
					JNC JSEND				;原峰值大于现测量值,原峰值保持,显示不变
					MOV PEEKH,SUMH		;原峰值小于现测量值,刷新峰值和显示值
					MOV PEEKL,SUML
					MOV R2,PEEKH			;先将AD转换值乘244(参考电压值的100倍)
					MOV R3,PEEKL
					MOV R6,#04H;09h;00H
					MOV R7,#0C4H;88h;0F4H
					CALL MULD				;调用双字节乘法子程序
					MOV R6,#0ah;03H			;然后除1023
					MOV R7,#00h;FFH
					CALL DIVD				;调用双字节除法法子程序
					MOV A,R2
					MOV R6,A
					MOV A,R3
					MOV R7,A
					CALL HB2				;转换成BCD码,这时的结果是实际电压值的1000倍
					MOV T_BUF,R4
					MOV T_BUF+1,R5
					;CALL TRANS
					LCALL CHABIAO
					MOV R4,B				;转换存R4R5
					MOV R5,A
					MOV RESULTH,R4
					MOV RESULTL,R5
					;CALL TRANS
					MOV A,R4
					SWAP A
					ANL A,#0FH
					MOV DISP1000,A
					MOV A,R4
					ANL A,#0FH
					MOV DISP100,A
					MOV A,R5
					SWAP A
					ANL A,#0FH
					MOV DISP10,A
					MOV A,R5
					ANL A,#0FH
					MOV DISP1,A				;各位数存入相应的显示缓存器中再调用显示子程序
					LCALL DISP
JSEND:		RET
CHABIAO:	MOV TEMPH,R4
					MOV TEMPL,R5
					MOV TEMP1,R5
					MOV A,TEMPL
					SWAP A
					ANL A,#0FH
					MOV R5,A
					MOV A,R4
					SWAP A
					MOV TEMP,A
					ANL A,#0F0H
					ORL A,R5
					MOV R3,A
					MOV A,TEMP
					ANL A,#0FH
					MOV R2,A		;取BCD码的整数位
					LCALL BH2
					MOV TEMPH,R2	;转换为16进制数
					MOV TEMPL,R3
					MOV R4,TEMPL
					MOV R3,TEMPH
					MOV R7,#80H
					MOV R6,#00
					LCALL NSUB
					JNC CHAB1			;大于等于80H转CHAB1
					MOV DPTR,#TABLE1	;小于80H表格首地址为TABLE1
					MOV A,TEMPL
					ADD A,TEMPL			;偏移量乘2
					SJMP CHABC
CHAB1:		MOV R4,TEMPL
					MOV R3,TEMPH
					MOV R7,#00H
					MOV R6,#01H
					LCALL NSUB
					JNC CHAB2		   ;大于等于100H转CHAB2
					MOV DPTR,#TABLE2   ;小于100H表格首地址为TABLE2
					MOV R4,TEMPL
					MOV R3,TEMPH
					MOV R7,#80H
					MOV R6,#00H
					LCALL NSUB		   ;计算第二表格的偏移量
					MOV A,R4
					ADD A,R4		   ;偏移量乘2
					SJMP CHABC
CHAB2:		MOV R4,TEMPL
					MOV R3,TEMPH
					MOV R7,#80H
					MOV R6,#01H
					LCALL NSUB
					JNC CHAB3		   ;大于等于180H转CHAB3
					MOV DPTR,#TABLE3   ;小于180H表格首地址为TABLE3
					MOV R4,TEMPL
					MOV R3,TEMPH
					MOV R7,#00H
					MOV R6,#10H
					LCALL NSUB		   ;计算第三表格的偏移量
					MOV A,R4
					ADD A,R4		   ;偏移量乘2
					SJMP CHABC
CHAB3:		MOV DPTR,#TABLE4	;大于等于180H表格首地址为TABLE4
					MOV R4,TEMPL
					MOV R3,TEMPH
					MOV R7,#80H
					MOV R6,#10H
					LCALL NSUB			;计算第四表格的偏移量
					MOV A,R4
					ADD A,R4			;偏移量乘2
CHABC:		MOV R0,A			;暂存偏移量
					MOVC A,@A+DPTR		;取出表格高字节
					SWAP A
					ANL A,#0F0H	
					MOV B,A				;高字节在B
					INC R0				;偏移量+1,指向低字节地址
					MOV A,R0
					MOVC A,@A+DPTR		;取低字节存A
					SWAP A
					MOV R1,A
					ANL A,#0FH
					ORL A,B
					MOV B,A
					MOV A,TEMP1
					ANL A,#0FH
					MOV TEMP1,A
					MOV A,R1
					ANL A,#0F0H
					ORL A,TEMP1
TORET:		RET
TABLE1:	DW 0000H,0001H,0002H,0003H,0004H,0005H,0006H,0007H,0008H,0009H
				DW 0010H,0011H,0012H,0013H,0014H,0015H,0016H,0010H,0011H,0012H
				DW 0013H,0014H,0015H,0016H,0017H,0018H,0019H,0020H,0021H,0022H
				DW 0023H,0024H,0025H,0026H,0027H,0028H,0029H,0030H,0031H,0032H
				DW 0033H,0034H,0035H,0036H,0037H,0038H,0039H,0040H,0041H,0042H
				DW 0043H,0044H,0045H,0046H,0047H,0048H,0049H,0050H,0051H,0052H
				DW 0053H,0054H,0055H,0056H,0057H,0058H,0059H,0060H,0061H,0062H
				DW 0063H,0064H,0065H,0066H,0067H,0068H,0069H,0070H,0071H,0072H
				DW 0073H,0074H,0075H,0076H,0077H,0078H,0079H,0080H,0081H,0082H
				DW 0083H,0084H,0085H,0086H,0087H,0088H,0089H,0090H,0091H,0092H
				DW 0093H,0094H,0095H,0096H,0097H,0098H,0099H,0100H,0101H,0102H
				DW 0103H,0104H,0105H,0106H,0107H,0107H,0108H,0109H,0111H,0112H
				DW 0113H,0114H,0115H,0116H,0117H,0118H,0119H,0120H

TABLE2: DW 0121H,0122H,0123H,0124H,0125H,0126H,0127H,0128H,0129H,0130H
				DW 0131H,0132H,0133H,0134H,0135H,0136H,0137H,0138H,0139H,0140H
				DW 0141H,0142H,0143H,0144H,0145H,0146H,0147H,0148H,0149H,0150H
				DW 0152H,0153H,0154H,0155H,0156H,0157H,0158H,0159H,0160H,0161H
				DW 0163H,0164H,0165H,0166H,0167H,0168H,0169H,0170H,0171H,0172H
				DW 0173H,0174H,0175H,0176H,0177H,0178H,0179H,0180H,0181H,0182H
				DW 0183H,0184H,0185H,0186H,0187H,0188H,0189H,0190H,0191H,0192H
				DW 0193H,0194H,0195H,0196H,0197H,0198H,0199H,0200H,0201H,0202H
				DW 0203H,0204H,0205H,0206H,0207H,0208H,0209H,0210H,0211H,0212H
				DW 0213H,0214H,0215H,0216H,0217H,0218H,0219H,0220H,0221H,0222H
				DW 0223H,0224H,0225H,0225H,0226H,0227H,0228H,0229H,0230H,0231H
				DW 0234H,0235H,0236H,0237H,0238H,0239H,0240H,0241H,0242H,0243H
				DW 0244H,0245H,0246H,0247H,0248H,0249H,0250H,0251H

TABLE3:	DW 0254H,0255H,0256H,0257H,0258H,0259H,0260H,0261H,0262H,0264H
				DW 0265H,0266H,0267H,0268H,0269H,0270H,0270H,0271H,0272H,0273H
				DW 0274H,0275H,0276H,0277H,0278H,0279H,0280H,0281H,0282H,0283H
				DW 0286H,0287H,0288H,0289H,0290H,0291H,0292H,0293H,0294H,0295H
				DW 0296H,0297H,0298H,0299H,0300H,0301H,0302H,0303H,0304H,0305H
				DW 0306H,0307H,0308H,0309H,0310H,0311H,0312H,0313H,0314H,0315H
				DW 0316H,0317H,0318H,0319H,0320H,0321H,0322H,0323H,0324H,0325H
				DW 0326H,0327H,0328H,0329H,0330H,0331H,0332H,0333H,0334H,0335H
				DW 0336H,0337H,0338H,0339H,0340H,0341H,0342H,0343H,0344H,0345H
				DW 0346H,0347H,0348H,0349H,0350H,0351H,0352H,0353H,0354H,0355H
				DW 0356H,0357H,0358H,0359H,0360H,0360H,0362H,0363H,0364H,0365H
				DW 0366H,0367H,0368H,0369H,0370H,0370H,0372H,0373H,0374H,0375H
				DW 0376H,0377H,0378H,0379H,0380H,0381H,0382H,0383H

TABLE4:	DW 0384H,0385H,0386H,0387H,0388H,0389H,0390H,0391H,0392H,0393H
				DW 0396H,0397H,0398H,0399H,0400H,0401H,0402H,0403H,0404H,0405H
				DW 0406H,0407H,0408H,0409H,0410H,0411H,0412H,0413H,0414H,0415H
				DW 0416H,0417H,0418H,0419H,0420H,0421H,0422H,0423H,0424H,0425H
				DW 0426H,0427H,0428H,0429H,0430H,0431H,0432H,0433H,0434H,0435H
				DW 0436H,0437H,0438H,0439H,0440H,0441H,0442H,0443H,0444H,0445H
				DW 0446H,0447H,0448H,0449H,0450H,0451H,0452H,0450H,0451H,0452H
				DW 0453H,0454H,0455H,0456H,0457H,0458H,0459H,0460H,0461H,0462H
				DW 0463H,0464H,0465H,0466H,0467H,0468H,0469H,0470H,0471H,0472H
				DW 0473H,0474H,0475H,0476H,0477H,0478H,0479H,0480H,0481H,0482H
				DW 0483H,0484H,0485H,0486H,0487H,0488H,0489H,0490H,0491H,0492H
				DW 0493H,0494H,0495H,0496H,0497H,0498H,0499H,0499H,0500H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -