用汇编语言编写一个程序,能用键盘选择选择产生正弦波、方波、三角形波和锯齿波形

用汇编语言编写一个程序,能用键盘选择选择产生正弦波、方波、三角形波和锯齿波形,第1张

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语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9694652.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存