rev. 一个
–10–
ad8801/ad8803
;
; 这个 子例程 负载 一个 ad8801/ad8803 dac 从 一个 8051 microcomputer,
; 使用 这 8051’s 串行 端口 在 模式 0 (变换 寄存器 模式).
; 这 dac 值 是 贮存 在 location dac_val
; 这 dac 地址 是 贮存 在 location dac_地址
;
; 能变的 declarations
;
PORT1 数据 90H ;sfr 寄存器 为 端口 1
dac_值 数据 40H ;dac 值
dac_地址 数据 41H ;dac 地址
SHIFT1 数据 042H ;高 字节 的 16-位 answer
SHIFT2 数据 043H ;低 字节 的 answer
变换_计数 数据 44H ;
;
ORG 100H ;arbitrary 开始
做_8801: CLR scon.7 ;设置 串行
CLR scon.6 ; 数据 模式 0
CLR scon.5
CLR scon.1 ;clr transmit 标记
ORL port1.1,#00001110b ;/rs, /shdn, /cs 高
CLR port1.1 ;设置 这 /cs 低
MOV shift1,dac_地址 ;放 dac 值 在 变换 寄存器
ACALL BYTESWAP ;
MOV sbuf,shift2 ;send 这 地址 字节
地址_wait: JNB scon.1,地址_wait ;wait 直到 8 位 是 sent
CLR scon.1 ;clear 这 串行 transmit 标记
MOV shift1,dac_值 ;send 这 dac 值
ACALL BYTESWAP ;
MOV sbuf,shift2 ;
valu_wait: JNB scon.1,valu_wait ;wait 又一次
CLR scon.1 ;clear 串行 标记
SETB port1.1 ;/cs 高, 获得 数据
RET ; 在 ad8801
;
byteswap: MOV 变换_计数,#8 ;变换 8 位
swap_循环: MOV 一个,shift1 ;得到 源 字节
RLC 一个 ;rotate msb 至 carry
MOV shift1,一个 ;保存 新 源 字节
MOV 一个,shift2 ;得到 destination 字节
RRC 一个 ;move carry 至 msb
MOV shift2,一个 ;保存
DJNZ 变换_计数,swap_循环 ;完毕?
RET
终止
listing 1. 软件 为 这 8051 至 ad8801/ad8803 串行 端口 接口