📄 sd_adc.asm
字号:
;SD_ADC.A51 来自 《使用PHILIPS LPC 微控制器实现低成本A/D 转换》
; http://www.zlgmcu.com LPC_ADC.PDF
;2004-2-25 21:00 经过测试,效果非常好,用DT9205A万用表比较相差很小。
; 在c中调用声明为: unsigned int Get_SD_ADC(void);
$NOMOD51
$INCLUDE(reg932.INC)
NAME SimpleADC
;EXTRN DATA (LowByte,HighByte) 用r6 r7 代替后,结果出现跳变的现象消失了。
;EXTRN DATA (CMPModex,CMPbuf,CMPbufaddr)
;所得的结果放在R6(HighByte),R7(LowByte)中
SADC Segment Code
PUBLIC Get_SD_ADC ; 在c中调用声明为: unsigned int Get_SD_ADC(void);
rseg SADC
Get_SD_ADC:
PUSH ACC;
PUSH PSW;
PUSH 4;
PUSH 5;
ANL P1M1,#0EFH
ORL P1M2,#10H ; AD_CON设为上拉(P1.4)
MOV PT0AD,#30H ; 禁止CMPREF、CIN1A数字输入
ANL P0M2,#0CFH ; 设为仅为输入
ORL P0M1,#30H
MOV CMP1,#20H ; 比较器1的CIN1A为输入端,比较器使能
MOV R4,#0;
MOV R5,#0;
Precharge:
MOV A,CMP1
;ANL A,#02h
MOV C,ACC.1 ; comparatorflag –> carry
MOV P1.4,C ; P0.0 = carry/comparator P0.0
;Counter
CLR C
MOV A,R4
ADD A,#01h
MOV R4,A
MOV A,R5
ADDC A,#00h
MOV R5,A
CJNE A,#076h,Precharge ; Set Prechargecycles
MOV R4,#00h ; Lowbyte count Measurecycles
MOV R5,#00h;
;MOV LowByte,#00h;
;MOV HighByte,#00h;
MOV r7,#00h;
MOV r6,#00h;
MAINLOOP:
;Sigma
;CLR C
; MOV CMPbuf,CMP1
; MOV CMPbuf+1,CMP2
; MOV A,@R0 ; get CMPx indirect
MOV A,CMP1
;ANL A,#02h
MOV C,ACC.1;0E1h ; comparatorflag –> carry
MOV P1.4,C ; P0.0 = carry/comparator
CLR A
ADDC A, 7; LowByte ; sum carry/comparator high
MOV 7,A
MOV A,6
ADDC A,#00h ; sum carry/comparator high
MOV 6,A
;Counter Measurementcycles
CLR C
MOV A,R4
ADD A,#01h
MOV R4,A
MOV A,R5
ADDC A,#00h
MOV R5,A
CJNE A,#076h,MAINLOOP ; Highbyte count Mcycles //3.02V的次数。
POP 5;
POP 4;
POP PSW;
POP ACC;
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -