c语言锯齿波发生函数 锯齿波c语言程序( 四 )


⑵双缓冲方式 。双缓冲方式是先使输入寄存器接收资料 , 再控制输入寄存器的输出资料到DAC寄存器,即分两次锁存输入资料 。此方式适用于多个D/A转换同步输出的情节 。
⑶直通方式 。直通方式是资料不经两级锁存器锁存,即 CS*,XFER* ,WR1*,WR2* 均接地,ILE接高电平 。此方式适用于连续反馈控制线路和不带微机的控制系统,不过在使用时 , 必须通过另加I/O接口与CPU连接,以匹配CPU与D/A转换 。
4. DAC0832的应用举例
⑴DAC0832实现一次D/A转换 , 可以采用下面程序段 。设定要转换的数据放在1000H单元中 。
MOV BX,100H
MOV AL,[BX] ;取转换资料
OUT DX,AL
⑵在实际应用中,经常需要用到一个线性增长的电压去控制某一个检测过程,或者作为扫描电压去控制一个电子束的移动 。执行下面的程序段,利用D/A转换器产生一个锯齿波电压,实现此类控制作用 。
MOV DX,PORTA ;PORTA为D/A转换器端口地址
MOV AL,OFFH ;置初值
ROTAT:INC AL
OUT DX,AL ;往D/A转换器输出资料
CALL DELP ;调用延迟子程序
JMP ROTAT
DELY: MOV CX, DATA ;置延迟常数DATA
DELY1: LOOP DELY1
RET
如果需要一个负向的锯齿波,只要将指令INC AL改成DEC AL就可以了 。
⑶从两个不相关的文件中输出一批X-Y资料,驱动X-Y记录仪,或者控制加工复杂零件的走刀(X轴)和进刀(Y轴) 。这些在控制过程中是很有用的 。下面程序驱动X-Y记录仪的100点输出,并用软件驱动记录仪的抬笔和放笔控制 。
MOV SI, XDATA ;X轴资料指针→SI
MOV DI, YDATA ;Y轴资料指针→DI
MOV CX, 100
WE0: MOV AL,[SI]
OUT PORTX, AL ;往X轴的D/A转换器输出资料
MOV AL,[DI]
OUT PORTY,AL;往Y轴的D/A转换器输出资料
CALL DELY1 ;调延迟子程序1,等待笔移动
MOV AL,01H
OUT PORTM,AL;输出升脉冲,控制笔放下
CALL DELY2 ;调延迟子程序2,等待完成
MOV AL,00H
OUT PORTM,AL;输出降脉冲,控制笔抬起
CALL DELY2 ;调延迟子程序2,等待完成
INC SI
INC DI
LOOP WE0
HLT
DELY1:┇
RET
DELY2:┇
RET
XDATA DB…
YDATA DB…
(4).利用C语言编程:
#pragma db oe sb
#i ncludereg51.h
#i ncludeabsacc.h
#define DAC0832 XBYTE[0x7fff] /* 定义DAC0832端口地址 */
#define uchar unsigned char
void delay(uchar t) { /* 延时函数 */
while(t--);
}
void saw(void) { /* 锯齿波发生函数 */
uchar i;
for (i=0;i255;i++) {
DAC0832=i;
}
}
void square(void) { /* 方波发生函数 */
DAC0832=0x00;
delay(0x10);
DAC0832=0xff;
delay(0x10);
}
void main(void) {
uchar i,j;
i=j=0xff;
while(i--) {
saw(); /* 产生一段锯齿波 */
}
while(j--) {
square(); /* 产生一段方波 */
}
}
at89c52产生三角波 , 锯齿波 , 方波,要求用c语言写,芯片是D0832#includereg52.h
#defineuchar unsigned char
#defineuintunsigned int
//#defineFosc24000000/12000000//12分频后的频率
#define DAdataP0//DA数据端口
sbit DA_S1= P2^0;// 控制DAC0832的8位输入寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存
sbit DA_S2= P2^1;// 控制DAC0832的8位DAC寄存器 , 仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存
sbit key=P3^2;
uchar wavecount;//'抽点'计数
uchar THtemp,TLtemp;//传递频率的中间变量
//uint T_temp;
uchar judge=1;//在方波输出函数中用于简单判别作用

推荐阅读