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

用汇编语言编写一个程序,能用键盘选择选择产生正弦波、方波、三角形波和锯齿波形,第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

首先使用电压比较器电路将正弦波转化成方波,以方便单片机接收,参考下图(该电路可接收峰峰值正负12V的正弦波),如果你的正弦波电路和单片机电路使用了不同的电源,则还需进行隔离处理

#include <AT89X51H>

//数码管位代码表(P0口)//

unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

//数码管段代码表(P2口,共阴且高位接a,低位接h笔段)//

unsigned char code dispcode[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,

0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0x00};

//8位数据缓冲器//

unsigned char dispbuf[8];

unsigned char temp[8];

unsigned char dispcount;

unsigned char T0count;

unsigned char timecount;

bit flag;

unsigned long x;

//初始化模块//

void initial(void){

TMOD=0x15;

TH0=0;

TL0=0;

TH1=(65536-4000)/256;

TL1=(65536-4000)%256;

TR1=0;

TR0=0;

ET0=1;

ET1=1;

EA=1;

}

////

//显示模块//

void dataDisplay(){

unsigned char i;

for(i=0;i<8;i++){

temp[i]=0;

}

i=0;

while(x/10){

temp[i]=x%10;

x=x/10;

i++;

}

temp[i]=x;

for(i=0;i<8;i++){

dispbuf[i]=temp[i];

}

P2=dispcode[dispbuf[dispcount]];

P0=dispbit[dispcount];

dispcount++;

if(dispcount==8){

dispcount=0;

}

}

////

//信号频率测量模块//

float frequency(float freq){

initial();

TR0=1;TR1=1;

if(timecount==250){

TR0=0;

freq=T0count65536+TH0256+TL0;

return(freq);

}

}

////

//信号周期测量模块//

float cycle(float count){

initial();

if(P3_4==1){

TR0=1;TR1=1;

if(P3_4==0){

TR0=0;

count=1000000/(timecount4000+TH1256+TL1-61536);

}

}

return(count);

}

////

//定时中断服务程序1//

void t1(void) interrupt 3 using 0{

//initial();

//TR0=1;

//TR1=1;

TH1=(65536-4000)/256;

TL1=(65536-4000)%256;

timecount++;

}

////

//定时中断服务程序2//

void t0(void) interrupt 1 using 0{

//initial();

//TR0=1;

//TR1=1;

T0count++;

}

////

//主函数//

void main(void){

while(1){

x=frequency(x);

if(x<100){

x=cycle(x);

}

dataDisplay();

}

}

////

以上就是关于用汇编语言编写一个程序,能用键盘选择选择产生正弦波、方波、三角形波和锯齿波形全部的内容,包括:用汇编语言编写一个程序,能用键盘选择选择产生正弦波、方波、三角形波和锯齿波形、求51单片机测量正弦波(20~100hz)的频率的c程序,最好是已经通过测试过的、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9868885.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存