T0832-1asm
;D/A转换实验,产生方波
;根据CHECK配置信息修改下列符号值
IOY0 EQU 9C00H ;片选IOY0对应的端口始地址
;
DA0832 EQU IOY0+00H4 ;DA0832的端口地址
STACK1 SEGMENT STACK
DW 256 DUP()
STACK1 ENDS
DATA SEGMENT
STR1 DB 'DA0832: Square Wave $' ;定义显示的字符串
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET STR1 ;显示字符串
MOV AH,9
INT 21H
LOOP1: MOV DX,DA0832 ;写00H,输出低电平
MOV AL,00H
OUT DX,AL
CALL DALLY
MOV DX,DA0832 ;写0FH,输出高电平
MOV AL,7FH
OUT DX,AL
CALL DALLY
MOV AH,1 ;判断是否有按键按下
INT 16H
JZ LOOP1 ;无按键则跳回继续循环,有则退出
QUIT: MOV AX,4C00H ;返回到DOS
INT 21H
DALLY PROC NEAR ;软件延时子程序
PUSH CX
PUSH AX
MOV CX,0050H
D1: MOV AX,5000H
D2: DEC AX
JNZ D2
LOOP D1
POP AX
POP CX
RET
DALLY ENDP
CODE ENDS
END START
;T0832-2asm
;D/A转换实验,产生三角波
;根据CHECK配置信息修改下列符号值
IOY0 EQU 9C00H ;片选IOY0对应的端口始地址
;
DA0832 EQU IOY0+00H4 ;DA0832的端口地址
STACK1 SEGMENT STACK
DW 256 DUP()
STACK1 ENDS
DATA SEGMENT
STR1 DB 'DA0832: Triangle Wave $' ;定义显示的字符串
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET STR1 ;显示字符串
MOV AH,9
INT 21H
LOOP1: MOV AL,00H ;D/A转换起始值
UP: MOV DX,DA0832 ;启动D/A转换
OUT DX,AL
CALL DALLY
INC AL
CMP AL,7FH
JNE UP
DOWN: MOV DX,DA0832
OUT DX,AL
CALL DALLY
DEC AL
CMP AL,00H
JNE DOWN
MOV AH,1 ;判断是否有按键按下
INT 16H
JZ LOOP1 ;无按键则跳回继续循环,有则退出
QUIT: MOV AX,4C00H ;返回到DOS
INT 21H
DALLY PROC NEAR ;软件延时子程序
PUSH CX
PUSH AX
MOV CX,0010H
D1: MOV AX,0100H
D2: DEC AX
JNZ D2
LOOP D1
POP AX
POP CX
RET
DALLY ENDP
CODE ENDS
END START
我做的滤波器
#include<reg51h>
#include"mathh"
#define N 25
#define PI 31415926
sbit da_wr1=P3^6;
sbit da_cs=P2^7;
void InputWave();
float FIR();
void da0832();
float fHn[N]={00,00,0001,-0002,001,-009,
-0018,0049,-002,011,028,064,028,
-011,-002,0049,-0018,-0009,001,
-0002,-0002,0001,00,00
};
float fXn[N]={00};
float fInput,fOutput;
float fSignal1,fSignal2;
float fStepSignal1,fStepSignal2;
float f2PI;
int i;
float FIN[256],FOUT[256];
int nIn ,nOut;
main(void)
{
nIn=0;nOut=0;
f2PI=2PI;
fSignal1=00;
fSignal2=PI01;
fStepSignal1=2PI/30;
fStepSignal2=2PI14;
while(1)
{
// fInput=InputWave();
InputWave();
// FIN[nIn]=fInput;
// nIn++;nIn%=256;
fOutput=FIR();
FOUT[nOut]=fOutput;
nOut++;
if(nOut>=256)
{nOut=0;da0832();
}
}
}
/float InputWave()
{
for(i=N-1;i>0;i--) fXn[i]=fXn[i-1];
fXn[0]=sin(fSignal1)+cos(fSignal2)/60;
fSignal1+=fStepSignal1;
if(fSignal1>=f2PI) fSignal1-=f2PI;
fSignal2+=fStepSignal2;
if(fSignal2>=f2PI) fSignal2-=f2PI;
return(fXn[0]);
} /
void InputWave()
{
int i;
for(i=0;i<=15000;i++)
{
fXn[i]=(sin(PI2i/N15000)+1)5;
}
}
float FIR()
{
float fSum;
fSum=0;
for(i=0;i<N;i++) fSum+=(fXn[i]fHn[i]);
return(fSum);
}
void da0832()
{
unsigned char i;
da_cs=0;//da转换输出使能标志置位
da_wr1=0;//输入寄存器的官写选通信号,表示单片机要传送数据了
for (i=0;i<255;i++)
P0=FOUT[i];
da_wr1=1;//数据传送完成,使能锁存
da_cs=1;
}
请告诉我AD芯片是什么?1563?08090832先给你贴一个0832的程序你看看。通过芯片资料的时序图你也可以自己写出来的
unsigned char A_D(bit CH)
{
unsigned char i;
CS = 0; //片选
Clk = 0; //时钟拉低
Clk = 1; //时钟拉高
DIO = 1; //启动信号
if ( CH == 0 ) //通道选择
{
Clk = 0;
Clk = 1;
DIO = 1; //通道0的第一位
Clk = 0;
Clk = 1;
DIO = 0; //通道0的第二位
}
else
{
Clk = 0;
Clk = 1;
DIO = 1; //通道1的第一位
Clk = 0;
Clk = 1;
DIO = 1; //通道1的第二位
}
Clk = 1;
Clk = 0;
for( i = 0;i < 8;i++ ) //读取八位AD值
{
Clk = 1;
Clk = 0;
if ( DIO )
adval = (adval>>1) | 0x80;
else
adval = (adval>>1) | 0x00;
}
CS = 1; //释放ADC0832
return(adval); //返回采样值
}
有些51系列单片机是自带AD的,貌似是STC89S58,貌似,以前记得有人用过
以上就是关于用汇编语言编写一个程序,能用键盘选择选择产生正弦波、方波、三角形波和锯齿波形全部的内容,包括:用汇编语言编写一个程序,能用键盘选择选择产生正弦波、方波、三角形波和锯齿波形、求dac0832与51单片机接口电路图,、求有关a/d转换的c语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)