📄 模数转换(ad)程序.asm
字号:
;;MCU:89S51 COLCK:11.0592MHZ
;;;;;读到AD,并通过RS232送入电脑显示数据,电脑中要打开串口调试软件,才能显示实验板送来的数据
;;;;;
;***********************************************************************
;;;接线说明:
;;; 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送入电脑显示数据
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的小数点,变成196,计算好了再把小数点补上
MOV B,#0C4H ;196
MUL AB ;AD转换的数值*分辨率就是测量到的电压
MOV R7,A
MOV R6,B
ACALL HB2 ;把2个双字节十六进制电压转换成双字节BCD码电压方便观察
;;;;把电压小数点补上,小数点后取2位,第三位用四舍五入,如电压是0.5096,那就是0.51
MOV A,R5 ; 数据四舍五入处理
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
;; 补小数点,小数点后取2位:*.**V
MOV R1,#30H
MOV A,R3
ANL A,#0FH ;
MOV @R1,A ;电压整数位
INC R1
MOV @R1,#0AH ;"."小数点
INC R1
MOV A,R4
ANL A,#0F0H
SWAP A
MOV @R1,A ;小数点后第一位
INC R1
MOV A,R4
ANL A,#0FH
MOV @R1,A ;小数点后第2位
INC R1
MOV @R1,#0BH ;"V"
INC R1
MOV @R1,#0CH
INC R1
MOV @R1,#0CH ;空格,这是让数据显示时使数据之间有空格
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
;;;;;;;把测量到的电压通过串行口发送到电脑显示*.**V, "*"是显示的电压值,波特率为2400.
RS232:
;MOV R6,#00H
MOV TMOD,#20H;设定T1为定时方式2
MOV TH1,#0F4H;定时初值
MOV TL1,#0F4H;
MOV PCON,#00;波特率为2400
SETB TR1;;;;;启动定时器
MOV SCON,#50H;串口方式1
MOV R0,#30H;#BLK1;;数据地址指针
MOV R7,#7;;;数据长度
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AAA0: MOV A,@R0
;SWAP A
MOV DPTR,#ADASCII
MOVC A,@A+DPTR ;把数据转换成ASCII显示
MOV SBUF,A;@R0;发送一个数据
;MOV A,R6
;ADD A,@R0 ;求校验和
;MOV R6,A ;保存校验和
INC R0;;;;;;;;数据地址指针加1
AAA1: JBC TI,AAA2;;;
SJMP AAA1;;;;
AAA2: DJNZ R7,AAA0;;数据发送完了吗?
RET
ADASCII: DB "0","1","2","3","4","5","6","7","8","9",".","V"," "
;;HB2 功能:双字节十六进制整数转换成双字节BCD码整数
;;;入口条件:待转换的双字节十六进制整数在R6、R7中。
;;;出口信息:转换后的三字节BCD码整数在R3、R4、R5中。
;;;;影响资源:PSW、A、R2~R7 堆栈需求: 2字节
HB2: CLR A ;BCD码初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;转换双字节十六进制整数
HB3: MOV A,R7 ;从高端移出待转换数的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD码带进位自身相加,相当于乘2
ADDC A,R5
DA A ;十进制调整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;双字节十六进制数的万位数不超过6,不用调整
DJNZ R2,HB3 ;处理完16bit
RET
;;; 模数转换(AD)程序.ASM
;;;作者 :LYP103
;;;入口参数:R0:01H是选通道1,02H是选通道2
;;;;;;;返回值 :AD0832(AD的数据),ADOK为0表示AD转化成功,1表示AD转化没成功,通道选择有误
;;;;;;; 占用 :A,R7 ,R0 ,AD0832,ADOK
;;;;;;;程序要预先定义:AD0832,CLK,CS,DI,DO,ADOK
AD: SETB ADOK
CLR CLK
NOP
CLR CS ; 启动转换开始
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数据,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数据,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 ;结束AD
mov ad0832+1,a
xrl a,ad0832
jnz ad05 ;如2次数据是相等的AD转化成功
CLR ADOK
RET
AD05: SETB ADOK
SETB CS ;结束AD
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -