?? 00729.asm
字號:
COM EQU 50H
DAT EQU 51H
TC0 EQU 52H ;定時器計數(shù)單元
TC1 EQU 53H ;定時技術(shù)單元2
REST0 EQU 54H ;存放通道0轉(zhuǎn)換結(jié)果
REST1 EQU 55H ;存放通道1的轉(zhuǎn)化結(jié)果
CURA EQU 56H ;當(dāng)前的轉(zhuǎn)換通道
AIN0 EQU 00H ;通道0
AIN1 EQU 01H ;通道1
LGAT EQU 33H ;量程轉(zhuǎn)換門限
BIG EQU 20H.1 ;高電壓標(biāo)志
ADCADD EQU 0F6FFH ;ADC0808 地址
RS EQU P2.1 ;LCD 寄存器選擇信號
RW EQU P2.2 ;LCD 讀/寫選擇信號
E EQU P2.3 ;LCD 使能信號
EV EQU 196 ;<5V時每個間隔的電壓值數(shù)量級為10^-4
MAXV EQU 255 ;最大數(shù)字量
;--------------------------------------
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP BT0
ORG 0030H
MAIN: MOV SP,#60H ;設(shè)置堆棧起始位置
LCALL INT ;對顯示器進(jìn)行初始化
MOV 30H,#'-' ;顯示電壓值初始化為 ------
MOV 31H,#'-' ;-
MOV 32H,#'-' ;-
MOV 33H,#'-' ;-
MOV 34H,#'-' ;-
MOV 35H,#'-' ;-
MOV R7 ,#30H ;
LCALL N1 ;顯示出"Voltage = "
MOV REST0,#00H ;轉(zhuǎn)換結(jié)果為00
MOV REST1,#00H
;--------------------------------------
;定時器初始化
;**************************************
MOV TMOD,#00H ;T0工作方式0
MOV TH0,#0CH ;定時 5ms ,fosc=12MHz時,為0C78H fosc=6MHz 時為 163CH
MOV TL0,#78H
SETB TR0 ;啟動T0
MOV TC0,#14H ;定時 100ms 采樣一次 28H=40
MOV TC1,#28H ;
MOV IE,#82H ;開定時中斷
MOV CURA,#AIN0
MOV A,CURA
MOV DPTR,#ADCADD
MOVX @DPTR,A
;--------------------------------------
;程序循環(huán)等待部分
;**************************************
LP: MOV R7,#30H ;顯示緩沖區(qū)首地址
LCALL DISPLAY ;調(diào)用顯示
SJMP LP ;循環(huán)顯示
;主程序結(jié)束
;--------------------------------------
;定時器中斷服務(wù)程序,讀取轉(zhuǎn)換結(jié)果并轉(zhuǎn)換為顯示值
;**************************************
BT0: MOV TH0,#0CH ;定時 5ms ,fosc=12MHz時,為0C78H fosc=6MHz 時為 163CH
MOV TL0,#78H
PUSH PSW
MOV PSW,#08H ;中斷中使用寄存器 1
DEC TC0 ;中斷中兩個計數(shù)單元都-1
DEC TC1
MOV A,TC0 ;如果 0 單元為 0 ,則采集 0 通道數(shù)據(jù)
CJNE A,#00H,BTN1
MOV TC0,#28H ;200ms轉(zhuǎn)換一次
MOV DPTR,#ADCADD ;讀取通道0轉(zhuǎn)換結(jié)果
MOVX A,@DPTR
MOV REST0,A
MOV A,#AIN1 ;啟動下一次通道1的轉(zhuǎn)換
MOVX @DPTR,A
LJMP V2SHOW ;轉(zhuǎn)到數(shù)據(jù)轉(zhuǎn)換程序
BTN1: MOV A,TC1
CJNE A,#00H,CST0
MOV TC1,#28H
MOV DPTR,#ADCADD
MOVX A,@DPTR
MOV REST1,A
MOV DPTR,#ADCADD ;啟動下一次通道0的轉(zhuǎn)換
MOV A,#AIN0
MOVX @DPTR,A
SJMP CONU
CST0: LJMP REI ;前面跳轉(zhuǎn)到此接力
CONU:
;---轉(zhuǎn)換結(jié)果為電壓值
V2SHOW: MOV A,REST0
CJNE A,#0FFH,UIN0
MOV A,REST1
UIN0: MOV B,#EV
MUL AB
MOV R2,B
MOV R3,A
;//////////高電壓時的值
JNB BIG,B2BCD ;小電壓
CLR BIG ;大電壓,結(jié)果乘以 2
CLR C
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,#00H
ADDC A,#00H
MOV R1,A
;---------將二進(jìn)制轉(zhuǎn)換為十進(jìn)制
B2BCD: CLR A
MOV R4,A
MOV R5,A
MOV R6,A
MOV R7,#24 ;24bit 即 3 字節(jié)
LOOP: CLR C
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R1
RLC A
MOV R1,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
DJNZ R7,LOOP
;------------------------------
;根據(jù)轉(zhuǎn)換結(jié)果選擇量程
MOV A,#LGAT
MOV B,REST0
SUBB A,B
JNC LOWM ;轉(zhuǎn)小量程
;大量程轉(zhuǎn)換程序
SMV: MOV DPTR,#DTAB ;將轉(zhuǎn)換結(jié)果放到顯示緩沖區(qū)
MOV A,R4 ;得到最高位
ANL A,#0FH
MOVC A,@A+DPTR
MOV 30H,A
MOV 31H,#02EH ;小數(shù)點
MOV A,R5 ;得到小數(shù)點后第1/2位
ANL A,#0FH
MOVC A,@A+DPTR
MOV 33H,A
MOV A,R5
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV 32H,A
MOV A,R6 ;得到小數(shù)點后第3位
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV 34H,A
LJMP CST ;轉(zhuǎn)到啟動 A/D 轉(zhuǎn)換程序
;小量程轉(zhuǎn)換程序
LOWM: MOV DPTR,#DTAB ;將轉(zhuǎn)換結(jié)果放到顯示緩沖區(qū)
MOV 30H,#02EH ;最高位顯示小數(shù)點
MOV A,R5 ;得到小數(shù)點后第1/2位
ANL A,#0FH
MOVC A,@A+DPTR
MOV 32H,A
MOV A,R5
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV 31H,A
MOV A,R6 ;得到小數(shù)點后第3位
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV 33H,A
MOV A,R6
ANL A,#0FH
MOVC A,@A+DPTR
MOV 34H,A
CST: MOV A,CURA
CJNE A,#AIN0,TAIN1
MOV CURA,#AIN1
LJMP DOCOV
TAIN1:
MOV CURA,#AIN0
DOCOV: MOV A,CURA
MOV DPTR,#ADCADD
MOVX @DPTR,A
MOV 35H,#'V' ;單位
REI: POP PSW
RETI
DTAB: DB "0123456789"
;--------二進(jìn)制轉(zhuǎn)換位十進(jìn)制
;中斷服務(wù)程序結(jié)果
;--------------------------------------
;LCD 顯示相關(guān)程序
;**************************************
DISPLAY: ;顯示
MOV COM,#08AH ;開始顯示的地址
LCALL PR1
MOV R1,#06H ;要顯示的數(shù)據(jù)個數(shù)
MOV R0,#30H ;要顯示數(shù)據(jù)的首地址
L: MOV DAT,@R0
LCALL PR2
INC R0 ;指向要顯示的下一個數(shù)據(jù)
DJNZ R1,L ;未顯示完,則顯示下一個
RET
;--------------------------------------
;逐字輸入方式演示程序段
;**************************************
N1: MOV COM,#01H ;清屏
LCALL PR1
MOV COM,#06H ;寫入數(shù)據(jù)后 AC 自動加 1
LCALL PR1
MOV COM,#080H ;開始顯示的 LCD RAM 地址
LCALL PR1
MOV DPTR,#TAB
MOV R2,#10H ;要顯示的字符數(shù)
MOV R3,#00H
WRIN: MOV A,R3
MOVC A,@A+DPTR
MOV DAT,A
LCALL PR2
INC R3
DJNZ R2,WRIN
MOV COM,#0C0H ;顯示首地址
LCALL PR1
MOV DPTR,#STAB ;顯示數(shù)據(jù)首地址
MOV R2,#10H ;16個數(shù)據(jù)
MOV R3,#00H ;要顯示的數(shù)據(jù)位
SL: MOV A,R3
MOVC A,@A+DPTR
MOV DAT,A
LCALL PR2
INC R3
DJNZ R2,SL
;以上是固定顯示標(biāo)志 "dianqi10501niuzf"
; MOV COM,#07H ;寫入數(shù)據(jù)后 AC 自動加 1
; LCALL PR1
RET
STAB: DB "dianqi10501niuzf"
TAB: DB "Voltage = ------"
;--------------------------------------
;LCD 間接控制方式下的初始化程序
;**************************************
INT: LCALL DELAY
MOV COM,#38H ;設(shè)置功能: 8位數(shù)據(jù),5X8字體
LCALL PR1
MOV COM,#01H
LCALL PR1
MOV COM,#06H
LCALL PR1
MOV COM,#0EH
LCALL PR1
RET
;--------------------------------------
;延時程序
;**************************************
DELAY: MOV R6,#0FH
MOV R7,#00H
DELAY1: NOP
DJNZ R7,DELAY1
DJNZ R6,DELAY1
RET
;--------------------------------------
;LCD 間接控制方式的驅(qū)動程序
;**************************************
;--------1.讀 BF 和 AC 值
PR0: PUSH ACC
MOV P0,#0FFH ;P0復(fù)位,準(zhǔn)備讀。
CLR RS ;RS=0
SETB E ;E=1
LCALL DELAY
MOV COM,P0 ;讀 BF 和 AC6-4 值
CLR E ;E=0
POP ACC
RET
;--------2.寫指令代碼程序
PR1: PUSH ACC
CLR RS
SETB RW
PR11: MOV P0,#0FFH
SETB E
LCALL DELAY
NOP
MOV A,P0
CLR E
JB ACC.7,PR11
CLR RW
MOV P0,COM
SETB E
CLR E
POP ACC
RET
;--------3.寫顯示數(shù)據(jù)程序
PR2: PUSH ACC
CLR RS
SETB RW
PR21: MOV P0,#0FFH
SETB E
LCALL DELAY
MOV A,P0
CLR E
JB ACC.7,PR21
SETB RS
CLR RW
MOV P0,DAT
SETB E
CLR E
POP ACC
RET
;--------4.讀顯示數(shù)據(jù)程序
PR3: PUSH ACC
CLR RS
SETB RW
PR31: MOV P0,#0FFH
SETB E
LCALL DELAY
MOV A,P0
CLR E
JB ACC.7,PR31
SETB RS
SETB RW
MOV P0,#0FFH
SETB E
MOV DAT,P0
CLR E
POP ACC
RET
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -