单片机第七次实验课——A/D 和 D/A 实验

发布时间 2023-03-22 21:10:53作者: Ryan爱吃糖

七、单片机第七次实验课——A/D 和 D/A 实验


(1)完成 A/D 接口设计,采用查询方式和中断方式编写程序。

(2)实现 D/A 接口设计,编写程序输出方波、锯齿波、正弦波,使用示波器观察波形。

实验室里只用做第二个

锯齿波汇编:

(此处没设延时,如果设延时则一定不要设太大,不然波形会变形)

ORG 0000H
MOV A,#00H
BACK:
MOV DPTR,#8140H
MOVX @DPTR,A
MOV DPTR,#81C0H
MOVX @DPTR,A
INC A
SJMP BACK
END

锯齿波C语言:

#include<reg51.h>
#include<absacc.h>
unsigned char a=0;
main(){
    while(1){
        XBYTE[0x8140]=a;
        XBYTE[0x81c0]=a;
        a++;
    }
}

方波汇编:

ORG 0000H
MOV A,#00H
BACK:
MOV DPTR,#8140H
MOVX @DPTR,A
MOV DPTR,#81C0H
MOVX @DPTR,A
CPL A
CALL DELAY
SJMP BACK
DELAY:
MOV R7,#17H
DL1:
MOV R6,#98H
DL0:
MOV R5,#46H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
RET
END

方波C语言:

#include<reg51.h>
#include<absacc.h>
unsigned char a=0;

void delay500ms(void){
    unsigned char a,b,c;
    for(c=23;c>0;c--)
        for(b=152;b>0;b--)
            for(a=70;a>0;a--);
}

main(){
    while(1){
        XBYTE[0x8140]=a;
        XBYTE[0x81c0]=a;
        a=~a;
        delay500ms();
    }
}

正弦波汇编(查表):

MOV 0000H
NG1:MOV R0,#00H
NG2:MOV A,R0
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV DPTR,#8140H
MOVX @DPTR,A
MOV DPTR,#81C0H
MOVX @DPTR,A
INC R0
ACALL DALAY
AJMP NG2
TAB1:DB 80H,83H,86H,89H,8DH,90H,93H,96H,99H,9CH,9FH,0A2H,0A5H,0A8H,0ABH,0AEH
TAB2:DB 0B1H,0B4H,0B7H,0BAH,0BCH,0BFH,0C2H,0C5H,0C7H,0CAH,0CCH,0CFH,0D1H,0D4H,0D6H,0D8H
TAB3:DB 0DAH,0DDH,0DFH,0E1H,0E3H,0E5H,0E7H,0E9H,0EAH,0ECH,0EEH,0EFH,0F1H,0F2H,0F4H,0F5H
TAB4:DB 0F6H,0F7H,0F8H,0F9H,0FAH,0FBH,0FCH,0FDH,0FDH,0FEH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
TAB5:DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FEH,0FDH,0FDH,0FCH,0FBH,0FAH,0F9H,0F8H,0F7H,0F6H
TAB6:DB 0F5H,0F4H,0F2H,0F1H,0EFH,0EEH,0ECH,0EAH,0E9H,0E7H,0E5H,0E3H,0E1H,0DFH,0DDH,0DAH
TAB7:DB 0D8H,0D6H,0D4H,0D1H,0CFH,0CCH,0CAH,0C7H,0C5H,0C2H,0BFH,0BDH,0BAH,0B7H,0B4H,0B1H
TAB8:DB 0AEH,0ABH,0A8H,0A5H,0A2H,9FH,9CH,99H,96H,93H,90H,8DH,89H,86H,83H,80H
TAB9:DB 80H,7CH,79H,76H,72H,6FH,6CH,69H,66H,63H,60H,5DH,5AH,57H,55H,51H
TAB10:DB 4EH,4CH,48H,45H,43H,40H,3DH,3AH,38H,35H,33H,30H,2EH,2BH,29H,27H
TAB11:DB 25H,22H,20H,1EH,1CH,1AH,18H,16H,15H,13H,11H,10H,0EH,0DH,0BH,0AH
TAB12:DB 09H,08H,07H,06H,05H,04H,03H,02H,02H,01H,00H,00H,00H,00H,00H,00H
TAB13:DB 00H,00H,00H,00H,00H,00H,01H,02H,02H,03H,04H,05H,06H,07H,08H,09H
TAB14:DB 0AH,0BH,0DH,0EH,10H,11H,13H,15H,16H,18H,1AH,1CH,1EH,20H,22H,25H
TAB15:DB 27H,29H,2BH,2EH,30H,33H,35H,38H,3AH,3DH,40H,43H,45H,48H,4CH,4EH
TAB16:DB 51H,55H,57H,5AH,5DH,60H,63H,66H,69H,6CH,6FH,72H,76H,79H,7CH,7EH
DALAY:MOV R1,#10H
DALAY1:DJNZ R1,$
RET
END

正弦波C语言:

#include<reg51.h>
#include<absacc.h>
#include<math.h>
#define pi acos(-1)

main(){
    unsigned int a=0;
    unsigned char f=0;
    while(1){
        f=sin((a/180.0)*pi)*127;
        XBYTE[0x8140]=f+127;
        XBYTE[0x81C0]=f+127;
        a++;
        if(a==360)
            a=0;
    }
}