?? 峰值電流表.asm
字號:
;---------------------------------------------------------------------------
;
;
$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 + -