微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机使用一个IO口做RC充放电来模拟ADC

51单片机使用一个IO口做RC充放电来模拟ADC

时间:11-28 来源:互联网 点击:
AUXR DATA 08EH ;Auxiliary register

P1M1 DATA 091H ;P1M1.N,P1M0.N =00--->Standard, 01--->push-pull

P1M0 DATA 092H ; =10--->pure input, 11--->open drain

P_RC BIT P1.0 ;RC port

DLY_H DATA 30H ;Delay high byte

DLY_M DATA 31H ;delay mid byte

DLY_L DATA 32H ;delay low byte

SEND_CNT DATA 33H ;send counter

;//////////////////////////////////////////////////////////

ORG 0000H

LJMP RESET

ORG 0100H

RESET:

LCALL INIT_UART ;initial UART

LCALL INIT_IO ;initial io

MOV SP,#40H

MOV SEND_CNT,#10 ;10 results per line

MAIN:

MOV DLY_H,#25

DLY1:

MOV DLY_M,#HIGH 10000

MOV DLY_L,#LOW 10000

DLY2:

DJNZ DLY_L,DLY3

DEC DLY_M

DLY3:

MOV A,DLY_M

ORL A,DLY_L

JNZ DLY2

DJNZ DLY_H,DLY1

LCALL RC

DJNZ SEND_CNT,MAIN

MOV SEND_CNT,#10 ;10 results per line

MOV A,#0DH ;send CR

LCALL SEND_UART ;send to PC from the UART

MOV A,#0AH ;send chage line

LCALL SEND_UART ;send to PC from the UART

SJMP MAIN

;//////////////////////////////////////////////////////////

INIT_UART:

MOV SCON,#5AH ;set UART mode as 8-bit variable baudrate

MOV TMOD,#20H ;timer1 as 8-bit auto reload mode

MOV AUXR,#40H ;timer1 work at 1T mode

MOV TL1,#0FBH ;115200 bps(256 - 18432000 / 32 / 115200)

MOV TH1,#0FBH

SETB TR1

RET

;//////////////////////////////////////////////////////////

Init_IO:

ORL P1M1, #0x01 ;P1.0 config as Open-Drain

ORL P1M0, #0x01

CLR P_RC ;Clear P1.0 to 0

ORL TMOD, #0x01 ;T0 as 16 bits timer

RET

;//////////////////////////////////////////////////////////

SEND_UART:

CLR TI ;clear TI flag

MOV SBUF,A ;send current data

JNB TI,$ ;wait data sent

RET

;//////////////////////////////////////////////////////////

RC:

MOV TH0, #0 ;clear Timer 0

MOV TL0, #0

SETB P_RC ;RC charge

SETB TR0 ;enable Timer 0

JNB P_RC,$ ;wait charge finish

CLR TR0 ;deable Timer 0

CLR P_RC ;decharge

MOV R3,TH0; ;read the RC time

MOV R4,TL0;

LCALL F_HEX2_DEC

MOV A,R5

ADD A,#30H ;Charge to ASCII code

LCALL SEND_UART ;send to PC from the UART

MOV A,R6

SWAP A

ANL A,#0FH

ADD A,#30H ;Charge to ASCII code

LCALL SEND_UART ;send to PC from the UART

MOV A,R6

ANL A,#0FH

ADD A,#30H ;Charge to ASCII code

LCALL SEND_UART ;send to PC from the UART

MOV A,R7

SWAP A

ANL A,#0FH

ADD A,#30H ;Charge to ASCII code

LCALL SEND_UART ;send to PC from the UART

MOV A,R7

ANL A,#0FH

ADD A,#30H ;Charge to ASCII code

LCALL SEND_UART ;send to PC from the UART

MOV A,#20H

LCALL SEND_UART ;send to PC from the UART

MOV A,#20H

LCALL SEND_UART ;send to PC from the UART

RET

;//////////////////////////////////////////////////////////

F_HEX2_DEC: ;(R3---R4) HEX Change to DEC ---> (R5---R7), use (R2~R7), 344T

MOV R2,#16

MOV R5,#0

MOV R6,#0

MOV R7,#0

L_HEX2_DEC:

CLR C

MOV A,R4

RLC A

MOV R4,A

MOV A,R3

RLC A

MOV R3,A

MOV A,R7

ADDC A,R7

DA A

MOV R7,A

MOV A,R6

ADDC A,R6

DA A

MOV R6,A

MOV A,R5

ADDC A,R5

DA A

MOV R5,A

DJNZ R2,L_HEX2_DEC

RET

END

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top