(2) 可通过循环程序段的机器周期数,计算出锯齿波的周期。并可根据需要,通过延时的方法来改变波形周期。若要改变锯齿波的频率,可在AJMP MM指令前加入延迟程序即可。延时较短时可用NOP指令实现(本程序就是如此),需要延时较长时,可以使用一个延长子程序。延迟时间不同,波形周期不同,锯齿波的斜率就不同。
(3) 通过A加1,可得到正向的锯齿波,反之A减1可得到负向的锯齿波。
(4) 程序中A的变化范围是0~255,因此得到的锯齿波是满幅度的。如要求得到非满幅锯齿波,可通过计算求的数字量的处置和终值,然后在程序中通过置初值和终值的方法实现。
【例9.2】 矩形波电压发生器
采用单缓冲方式,口地址设为FEFFH.
参考程序如下:
ORG 1100H
START: MOV DPTR , #00FEH ;送DAC0832口地址
LOOP: MOV A , #dataH ;送高电平数据
MOVX @ DPTR , A
LCALL DELAYH ;调用延时子程序
MOV A , #dataL ;送低电平数据
MOVX @ DPTR , A
LCALL DELAYL ;调用延时子程序
SJMP LCALL
执行上述程序就可得到如图9.5所示的矩形波。
图9.5 D/A转换产生的矩形波
几点说明:
(1) 以上程序产生的是矩形波,其低点平的宽度由延时子程序DELAYL所延时的时间来决定,高电平的宽度则由DELAYH所延时的时间决定。
(2) 改变延时子程序DELAYL和的DELAYH延时时间,就可改变矩形波上下沿的宽度。若DELAYL=DELAYH(两者延时一样),则输出的是方波。
(3) 改变上限值或下限值便可改变矩形波的幅值;单极性输出时为0~-5V或0~+5V;双极性输出时为-5V~+5V。
【例9.3】三角波电压发生器
利用DAC0832产生三角波的参考程序如下:
MOV A , #00H ;取下限值
MOVX DPTR , #FEFFH ;指向0832口地址
SS1: MOVX @DPTR , A ;输出
NOP ;延时
NOP
NOP
SS2: INC A ;转换值增量
JNZ SS1 ;未到峰值,则继续
SS3: DEC A ;已到峰值,则取后沿
MOVX @DPTR , A ;输出
NOP ;延时
NOP
NOP
JNZ SS3 ;未到谷值,则继续
SJMP SS2 ;已到谷值,则反复
几点说明:
本程序产生的是三角波,谷值为0,峰值为+5V(或-5V)。若改变下限值或上限值,那么三角波的谷值和峰值也随之改变。
改变延时时间可改变三角波的斜率。
若在谷值和峰值出延时时间较长时,则输出梯形波,延时时间的长短取决于梯形波上下边的宽度。
9.1.4 双缓冲方式的接口与应用
在多路D/A转换的情况下,若要求同步转换输出,必须采用双缓冲方式。DAC0832采用双缓冲方式时,数字量的输入锁存和D/A转换输出是分两步进行的。
CPU分时向各路D/A转换器输入要转换的数字量并锁存在各自的输入寄存器中。
CPU对所有的D/A转换器发出控制信号,使各路输入寄存器中的数据进入DAC寄存器,实现同步转换输出。
图9.6为两片DAC0832与8031的双缓冲方式连接电路,能实现两路同步输出。图中两片0832的数据线都连到8031的P0口;ALE固定接高电平,WR1,WR2都接到8031的WR端;CS分别接高位地址P2.5和P2.6,这样两片0832的输入寄存器具有不同的地址,可以分别输入不同的数据;XFEF都接到P2.7,使两片0832的DAC寄存器具有相同的地址,以便在CPU控制下同步进行D/A转换和输出。
图9.6 8031与DAC0832双缓冲方式接口电路
实现两路同步输出的程序如下:
MOV DPTR,#0DFFFH ;送0832(1)输入锁存器地址
MOV A,#data1 ;data1送0832(1)输入锁存器