?? 2052ad轉換.asm
字號:
;本程序與學習板的接線
;學習板側----------12c2052AD側
;P0.0-------接----- (2腳)P3.0
;P0.1-------接------(3腳))P3.1
;P0.2--------接-----(6腳)P3.2
;P0.3--------接------(7腳)P3.3
;P0.4--------接------(8腳)P3.4
;P0.5--------接------(9腳)P3.5
;P0.6--------接------(11腳)P3.7
;模以量輸入引腳為12c2052AD倒數第4腳標號為P1.5的引腳
;12c2052AD的20腳接電源 10腳接地
;試驗時,可調電阻的接地端要接10K電阻.
ISP_DATA EQU 0E2H
ISP_ADDRH EQU 0E3H
ISP_ADDRL EQU 0E4H
ISP_CMD EQU 0E5H
ISP_TRIG EQU 0E6H
ISP_CONTR EQU 0E7H
;定義ISP/IAP 命令
ISP_IAP_BYTE_READ EQU 1H
ISP_IAP_BYTE_PROGRAM EQU 2H
ISP_IAP_BYTE_SECTOR EQU 3H
;定義FLASH操作等待的時間常數
ENABLE_ISP EQU 84H
DATA_FLASH_START_ADDRESS EQU 1000H
ADC_CONTR EQU 0C5H
ADC_DATA EQU 0C6H
P1M0 EQU 91H
P1M1 EQU 92H
ADC_POWER_ON_SPEED_CHANNEL_5 EQU 11100101B
SET_VOLTAGE EQU 60H
ORG 0000H
MAIN:
MOV SP,#5FH
MOV 30H,#00H
MOV 31H,#00H
MOV 32H,#00H
MOV 33H,#00H
ORL P1M0,#00100000B;高置ad io口為開路
ORL P1M1,#00100000B
MOV ADC_CONTR,#ADC_POWER_ON_SPEED_CHANNEL_5;設置AD通道
CALL DELAY
MOV DPTR,#TAB
li:
CALL AD_VOLTAGE
CALL H16_D10
CALL DISPLAY
ajmp li
update: ;刷新顯示子程序
inc 30h
mov a,30h
cjne a,#10,exit ;還沒加到十,退出
mov 30h,#00h ;加到十了,個位清零
inc 31h ;十位顯示緩沖單元加一
mov a,31h
cjne a,#10,exit ;還沒加到十,退出
mov 31h,#00h ;加到十了,十位清零
inc 32h ;百位顯示緩沖單元加一
mov a,32h
cjne a,#10,exit ;還沒加到十,退出
mov 32h,#00h ;加到十了,百位清零
inc 33h ;千位顯示緩沖單元加一
mov a,33h
cjne a,#10,exit ;還沒加到十,退出
mov 33h,#00h ;加到十了,千位清零
exit:
ret
AD_Voltage: ;40H;41H,保存所測電壓的高低位
ACALL GET_AD_RESULT
MOV A,ADC_DATA
MOV B,#100
MUL AB
MOV 40H,A
MOV 41H,B
MOV 44H,#51
MOV 45H,#00H
CALL DIV16
MOV A,42H
CJNE A,#25,NEXT_B
AJMP INC_DIV
NEXT_B:
JC NEXT22
INC_DIV:
INC 40H
NEXT22:
RET
H16_D10:
;輸入:被除數放在40H,41H,除數放在內44H,45H,商放在40H,41H,余數放在42H,43H,
MOV 44H,#100
MOV 45H,#0
CALL DIV16
MOV 31H,40H
MOV A,42H
MOV B,#10
DIV AB
MOV 30H,A
;MOV 30H,B
RET
GET_AD_RESULT:
MOV ADC_DATA,#0
ORL ADC_CONTR,#00001000B;開ADC
CALL DELAY
WAIT_AD_FINISHED:
MOV A,#00010000B
ANL A,ADC_CONTR
JZ WAIT_AD_FINISHED
ANL ADC_CONTR,#11100111B
RET
DELAY:
MOV R7,#25
D: MOV R6,#5
DJNZ R6,$
DJNZ R7,D
RET
display:mov p2,#0ffh ;將P2口置高電平
mov r7,#250 ;軟件計數器賦值
dd1:
mov a,30h ;將顯示緩沖區30H中的值送入ACC
movc a,@a+dptr ;查表取要顯示的數并把查表的結果送入ACC
MOV C,ACC.6
ORL A,#11000000B
mov p3,a ;將要顯示的數送入P0口
MOV P3.7,C
clr p1.0 ;開個位顯示單元
lcall delay100us ;延時100US
setb p1.0 ;關個位顯示單
mov a,31h ;將顯示緩沖區別31H中的值送入A
movc a,@a+dptr ;查表取要顯示的數并把查表的結果送入ACC
MOV C,ACC.6
ORL A,#11000000B
mov p3,a ;將要顯示的數送入P0口
MOV P3.7,C
clr p1.1 ;開十位顯示單元
lcall delay100us ;延時100US
setb p1.1 ;關十位顯示單元
mov a,32h ;將顯示緩沖區32H中的值送入ACC
movc a,@a+dptr ;查表取要顯示的數并把查表的結果送入ACC
MOV C,ACC.6
ORL A,#11000000B
mov p3,a ;將要顯示的數送入P0口
MOV P3.7,C
clr p1.2 ;開百位顯示單元
lcall delay100us ;延時100US
setb p1.2 ;關百位顯示單元
mov a,33h ;將顯示緩沖區33H中的值送入ACC
movc a,@a+dptr ;查表取要顯示的數并把查表的結果送入ACC
MOV C,ACC.6
ORL A,#11000000B
mov p3,a ;將要顯示的數送入P0口
MOV P3.7,C
clr p1.3 ;開千位顯示單元
lcall delay100us ;延時100US
setb p1.3 ;關千位顯示單元
djnz r7,dd1 ;R7不等于0返回至DD1處
ret ;R7等于0子程序返回
delay100us:
mov r5,#50
djnz r5,$
ret
;十六進制除法運算
;輸入:被除數放在40H,41H,除數放在內44H,45H,商放在40H,41H,余數放在42H,43H,
DIV16:
MOV R0,#40H
MOV A,@R0
JNZ LOP0
INC R0
MOV A,@R0
JNZ LOP0
CLR A
MOV 42H,A
MOV 43H,A
RET
LOP0:MOV R0,#44H
MOV A,@R0
JNZ LOP1
INC R0
MOV A,@R0
JNZ LOP1
RET
LOP1:CLR A
MOV 42H,A
MOV 43H,A
MOV R2,#10H
LOP2:CLR C
MOV R3,#04H
MOV R0,#40H
LOP3:MOV A,@R0
RLC A
MOV @R0,A
INC R0
DJNZ R3,LOP3
MOV R0,#42H
MOV R1,#44H
MOV A,@R0
CLR C
SUBB A,@R1
MOV 48H,A
INC R0
INC R1
MOV A,@R0
SUBB A,@R1
MOV 49H,A
JC LOP4
MOV R0,#42H
MOV R1,#48H
MOV A,@R1
MOV @R0,A
INC R0
INC R1
MOV A,@R1
MOV @R0,A
MOV A,40H
INC A
MOV 40H,A
LOP4:DJNZ R2,LOP2
RET
DELAY5MS:
MOV R6,#250
DL1:
MOV R5,#10
DJNZ R5,$
DJNZ R6,DL1
RET
delay_10ms:
MOV R6,#70
D3: MOV R7,#25
DJNZ R7,$
DJNZ R6,D3
RET
DELAY_1S:
MOV 53H,#100
DELAY_1S_LOOP:
CALL DELAY_10MS
DJNZ 53H,DELAY_1S_LOOP
RET
tab: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0c6h,0a1h,86h,8eh
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -