st
equ
p37
eoc
equ
p36
oe
equ
p35
BAI
EQU
30H
SHI
EQU
31H
GEWEI
EQU
32H
org
0000h
MOV
DPTR,#0FEF8H
;AD转换IN0通道地址
MOV
A,#00H
MOVX
@DPTR,A
;启动AD转换
START:
clr
st
setb
st
clr
st
jnb
eoc,$
setb
oe
mov
30H,P2
clr
oe
mov
a,30h
mov
b,#100
div
ab
LOOP:
MOV
BAI,A
MOV
SHI,B
MOV
A,SHI
MOV
B,#10
DIV
AB
MOV
SHI,A
MOV
GEWEI,B
MOV
A,BAI
MOV
P1,A
CLR
P32
LCALL
DELAY
SETB
P32
MOV
A,SHI
MOV
P1,A
CLR
P31
LCALL
DELAY
SETB
P31
MOV
A,GEWEI
mov
p1,a
CLR
P30
LCALL
DELAY
SETB
P30
SJMP
START
DELAY:
mov
R6,#5
D1:
MOV
R7,#200
DJNZ
R7,$
DJNZ
R6,D1
RET
end
这是我编的程序,可以用,你只用0通道的话那就把那个通道选择的三个引脚全接地就是了。
MOV
DPTR,#0FEF8H
;AD转换IN0通道地址
MOV
A,#00H
MOVX
@DPTR,A
;启动AD转换
这个是启动转换的语句
以上的程序是实现,电位器调节过程中,数码管从0到255变化
ADC0809要工作得在单片机的ALE脚上接个四分频的器件,不然ADC0809是不会工作的。QQ:77254708
比如8位的AD转换吧,转换0~5V为数字量信号,就是把5V分成256份,每份是5/256,这个也就是精度,最小一份就是5/256 V,002V左右,比如输入信号为5V,就占了256份,AD输出结果换成16进制就是0xff,比如说输入是31V,就占了31/(5/256)=15872份,所以输出结果只能是158份,0x9e,就偏差了072份,就是0725/256=0014V,就偏差了0014V左右,如果10位的AD转换,每份就是5/1024,精度也就高了很多,反过来DA转换也是一样的,不明白可以继续问
ORG 0000H
AJMP START1
ORG 0040H
START1:
MOV SP,#80H
MOV 0E1H,#00110100B ;启动看门狗
ACALL ADC_Power_On ;开ADC电源, 第一次使用时要打开内部模拟电源
;开ADC电源, 可适当加延时,1mS以内就足够了
ACALL Set_P17_ASF ;设置 P17 为模拟功能口
ACALL Set_ADC_Channel_7 ;设置 P17 作为A/D转换通道
MOV TL0,#0B0H
MOV TH0,#3CH
MOV TMOD,#21H ;置计数器模式
MOV IE,#8AH ;;EA,ET0,ET1
SETB TR0 ;启动定时器
START2:
NOP
NOP
ACALL Get_AD_Result
MOV 30H, ADC_Channel_7_Result
ACALL DISP ;调入其他程序,或AD取值在中断中
;------------------------------
ADC_CONTR EQU 0BCH ;A/D转换寄存器
ADC_RES EQU 0BDH ;8位A/D转换结果寄存器
P1ASF EQU 9DH ;P1口中的相应位作为模拟功能使用时的控制寄存器,如做A/D用,相应位要置1
ADC_Power_On_Speed_Channel_7 EQU 10100111 ;P17作为A/D输入
ADC_Channel_7_Result EQU 32H ;7通道A/D转换结果(32H,31H)
;数据在A中,地址按8951芯片 10H
BYTE_ADDR_HIGH EQU 00H ;字节地址高位
BYTE_ADDR_LOW EQU 00H
SECTOR_ADDR_HIGH EQU 00H ;扇区地址高位
SECTOR_ADDR_LOW EQU 00H
IAP_DATA EQU 0C2H
IAP_ADDRH EQU 0C3H
IAP_ADDRL EQU 0C4H
IAP_CMD EQU 0C5H
IAP_TRIG EQU 0C6H
IAP_CONTR EQU 0C7H
;定义ISP/IAP命令及等待时间
ISP_IAP_BYTE_READ EQU 1 ;字节读
ISP_IAP_BYTE_PROGRAM EQU 2 ;字节写
ISP_IAP_SECTOR_ERASE EQU 3 ;扇区擦除
WAIT_TIME EQU 3 ;等待时间
;--------------------------------------------------------------
ADC_Power_On:
PUSH ACC
ORL ADC_CONTR, #80H ;开A/D转换电源
;MOV A, #20H
ACALL Delay ;开A/D转换电源后要加延时,1mS以内就足够了
POP ACC
RET
;-------------------------------------------------------------
;设置P17为模拟功能
Set_P17_ASF:
PUSH ACC
MOV A, #10000000B
ORL P1ASF, A
POP ACC
RET
;-------------------------------------------------------------
;设置 P17 为普通IO
Set_P17_Normal_IO:
PUSH ACC
MOV A, #01111111B
ANL P1ASF, A
POP ACC
RET
;-------------------------------------------------------------
Set_ADC_Channel_7:
MOV ADC_CONTR, #ADC_Power_On_Speed_Channel_7
;选择P17作为A/D转换通道
;MOV A, #05H ;更换 A/D 转换通道后要适当延时, 使输入电压稳定
;以后如果不更换 A/D 转换通道的话, 不需要加延时
ACALL Delay ;切换 A/D 转换通道,加延时20uS~200uS就可以了,与输入电压源的内阻有关
;如果输入电压信号源的内阻在10K以下,可不加延时
RET
;-------------------------------------------------------------
Get_AD_Result:
PUSH ACC ;入栈保护
MOV ADC_RES, #0
ORL ADC_CONTR, #00001000B ;启动 AD 转换
NOP ;在对ADC_CONTR寄存器进行写 *** 作后,要加4个空 *** 作延时,才能够正确读到ADC_CONTR的值
NOP
NOP
NOP
Wait_AD_Finishe:
MOV A, #00010000B ;判断 AD 转换是否完成
ANL A, ADC_CONTR
JZ Wait_AD_Finishe ;AD 转换尚未完成, 继续等待
ANL ADC_CONTR, #11100111B ;清0 ADC_FLAG, ADC_START 位, 停止A/D转换
MOV A, ADC_RES
MOV ADC_Channel_7_Result, A ;保存 AD 转换结果
POP ACC
RET
;---------------------------------------------------------------
Delay:
PUSH 02 ;将寄存器组0 的 R2 入栈
PUSH 03 ;将寄存器组0 的 R3 入栈
MOV R3, #02 ;2 CLOCK ---------------------+
Delay_Loop1: ;
MOV R2, #249 ;2 CLOCK ------+
Delay_Loop: ; | 1002 CLOCK
DJNZ R2, Delay_Loop ;4 CLOCK |
DJNZ R3, Delay_Loop1 ;4 CLOCK ------+
POP 03
POP 02
RET
;-------------------------------------------------------
END
以上就是关于急求:单片机 0809AD转换汇编程序全部的内容,包括:急求:单片机 0809AD转换汇编程序、单片机AD和DA转换具体过程是怎么样的、能给个STC单片机内部ad转换的程序吗万谢。。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)