?? 模數(shù)轉(zhuǎn)換(ad)程序.asm
字號:
;;MCU:89S51 COLCK:11.0592MHZ
;;;;;讀到AD,并通過RS232送入電腦顯示數(shù)據(jù),電腦中要打開串口調(diào)試軟件,才能顯示實驗板送來的數(shù)據(jù)
;;;;;
;***********************************************************************
;;;接線說明:
;;; J13的3腳和J3的3腳連 ,J13的4和J3的4連,,J13的5和J3的4連,J3的6和J7的5連
;***********************************************************************
CS EQU P1.5
CLK EQU P1.6
DI EQU P1.4
DO EQU P1.7
ADOK BIT 30H
AD0832 EQU 70H
AD0832DATA EQU 60H
;;;樣例:讀到AD,并通過RS232送入電腦顯示數(shù)據(jù)
ORG 0000H
AJMP MAIN
ORG 0080H
MAIN:
main1: ACALL A200MS
ACALL A200MS
MOV R0,#01h;02H ;選通道1
ACALL AD
MOV A,AD0832
;;因為AD0832的VREF為5V,它的分辨率:5/255=0.0196
;;計算電壓:AD0832*0.0196,為了計算方便先去掉0.0196的小數(shù)點,變成196,計算好了再把小數(shù)點補上
MOV B,#0C4H ;196
MUL AB ;AD轉(zhuǎn)換的數(shù)值*分辨率就是測量到的電壓
MOV R7,A
MOV R6,B
ACALL HB2 ;把2個雙字節(jié)十六進制電壓轉(zhuǎn)換成雙字節(jié)BCD碼電壓方便觀察
;;;;把電壓小數(shù)點補上,小數(shù)點后取2位,第三位用四舍五入,如電壓是0.5096,那就是0.51
MOV A,R5 ; 數(shù)據(jù)四舍五入處理
CLR C
ADD A,#50H
DA A
MOV R5,A
MOV A,R4
ADDC A,#00
DA A
MOV R4,A
MOV A,R3
ADDC A,#00
DA A
MOV R3,A
;; 補小數(shù)點,小數(shù)點后取2位:*.**V
MOV R1,#30H
MOV A,R3
ANL A,#0FH ;
MOV @R1,A ;電壓整數(shù)位
INC R1
MOV @R1,#0AH ;"."小數(shù)點
INC R1
MOV A,R4
ANL A,#0F0H
SWAP A
MOV @R1,A ;小數(shù)點后第一位
INC R1
MOV A,R4
ANL A,#0FH
MOV @R1,A ;小數(shù)點后第2位
INC R1
MOV @R1,#0BH ;"V"
INC R1
MOV @R1,#0CH
INC R1
MOV @R1,#0CH ;空格,這是讓數(shù)據(jù)顯示時使數(shù)據(jù)之間有空格
ACALL RS232 ;
ACALL A200MS
ACALL A200MS
AJMP MAIN1
A200MS: ;200MS延時
MOV R6,#00
A200MS1: MOV R7,#0EFH
A200MS2: NOP
DJNZ R7,A200MS2
DJNZ R6,A200MS1
RET
;;;;;;;把測量到的電壓通過串行口發(fā)送到電腦顯示*.**V, "*"是顯示的電壓值,波特率為2400.
RS232:
;MOV R6,#00H
MOV TMOD,#20H;設(shè)定T1為定時方式2
MOV TH1,#0F4H;定時初值
MOV TL1,#0F4H;
MOV PCON,#00;波特率為2400
SETB TR1;;;;;啟動定時器
MOV SCON,#50H;串口方式1
MOV R0,#30H;#BLK1;;數(shù)據(jù)地址指針
MOV R7,#7;;;數(shù)據(jù)長度
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AAA0: MOV A,@R0
;SWAP A
MOV DPTR,#ADASCII
MOVC A,@A+DPTR ;把數(shù)據(jù)轉(zhuǎn)換成ASCII顯示
MOV SBUF,A;@R0;發(fā)送一個數(shù)據(jù)
;MOV A,R6
;ADD A,@R0 ;求校驗和
;MOV R6,A ;保存校驗和
INC R0;;;;;;;;數(shù)據(jù)地址指針加1
AAA1: JBC TI,AAA2;;;
SJMP AAA1;;;;
AAA2: DJNZ R7,AAA0;;數(shù)據(jù)發(fā)送完了嗎?
RET
ADASCII: DB "0","1","2","3","4","5","6","7","8","9",".","V"," "
;;HB2 功能:雙字節(jié)十六進制整數(shù)轉(zhuǎn)換成雙字節(jié)BCD碼整數(shù)
;;;入口條件:待轉(zhuǎn)換的雙字節(jié)十六進制整數(shù)在R6、R7中。
;;;出口信息:轉(zhuǎn)換后的三字節(jié)BCD碼整數(shù)在R3、R4、R5中。
;;;;影響資源:PSW、A、R2~R7 堆棧需求: 2字節(jié)
HB2: CLR A ;BCD碼初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;轉(zhuǎn)換雙字節(jié)十六進制整數(shù)
HB3: MOV A,R7 ;從高端移出待轉(zhuǎn)換數(shù)的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD碼帶進位自身相加,相當(dāng)于乘2
ADDC A,R5
DA A ;十進制調(diào)整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;雙字節(jié)十六進制數(shù)的萬位數(shù)不超過6,不用調(diào)整
DJNZ R2,HB3 ;處理完16bit
RET
;;; 模數(shù)轉(zhuǎn)換(AD)程序.ASM
;;;作者 :LYP103
;;;入口參數(shù):R0:01H是選通道1,02H是選通道2
;;;;;;;返回值 :AD0832(AD的數(shù)據(jù)),ADOK為0表示AD轉(zhuǎn)化成功,1表示AD轉(zhuǎn)化沒成功,通道選擇有誤
;;;;;;; 占用 :A,R7 ,R0 ,AD0832,ADOK
;;;;;;;程序要預(yù)先定義:AD0832,CLK,CS,DI,DO,ADOK
AD: SETB ADOK
CLR CLK
NOP
CLR CS ; 啟動轉(zhuǎn)換開始
NOP
NOP
NOP
NOP
CJNE R0,#01H,AD1 ;01
SETB DI
SETB CLK ;1
NOP
NOP
CLR CLK
NOP
SETB DI ;選通道1(AD1)
NOP
SETB CLK ;2
NOP
NOP
CLR CLK
NOP
CLR DI
NOP
SETB CLK ;3
NOP
NOP
CLR CLK
AJMP AD2
AD1: CJNE R0,#02H,AD1;選通道2(AD2)
SETB DI
SETB CLK
NOP
NOP
CLR CLK
NOP
SETB DI
NOP
SETB CLK
NOP
NOP
CLR CLK
NOP
SETB DI
NOP
SETB CLK
NOP
NOP
CLR CLK
AD2: NOP
NOP
NOP
NOP
NOP
;首次讀AD數(shù)據(jù),MSB(高位)在前
MOV R7,#08H
clr a
AD3: SETB CLK
NOP
NOP
CLR CLK
NOP
MOV C,DO
RLC A
DJNZ R7,AD3
MOV AD0832,A ;將AD的值保存到AD0832中
;;;再次讀AD數(shù)據(jù),LSB(低位)在前
MOV R7,#07H
MOV C,DO
RRC A
AD4: SETB CLK
NOP
NOP
CLR CLK
NOP
MOV C,DO
RRC A
DJNZ R7,AD4
NOP
NOP
SETB CS ;結(jié)束AD
mov ad0832+1,a
xrl a,ad0832
jnz ad05 ;如2次數(shù)據(jù)是相等的AD轉(zhuǎn)化成功
CLR ADOK
RET
AD05: SETB ADOK
SETB CS ;結(jié)束AD
RET
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -