org 0000h
LJMP MAIN
ORG 0003H
LJMP L0
MAIN:MOV R2,#0aH ;调幅倍数
MOV R4,#01H ;增减选择
MOV R5,#01H
pp: SETB EA
SETB EX0 ;延时计数个数
MOV A,#0FFH ;读取波形状态
MOV P1,A
MOV A,P1
JNB ACC.0,ZXB ;P1.0=0 则选择正弦波
JNB ACC.1,SJB ;P1.1=0 则选择三角波
JNB ACC.2,FB ;P1.2=0 则选择方 波
AJMP PP
ZXB:MOV R1,#00H
LOOP1:MOV A,R1
MOV DPTR,#TABLE1 ;读取正弦波数据首地址
MOVC A,@A+DPTR ;去表格数据
MOV B,R2
MUL AB ;幅度大小
INC R1
XCH A,R1
CLR C
SUBB A,#0AH ;是否已采样半个周期
JNC LK1 ;C=0跳转,即R1大于0A,以采样半个周期以上
ADD A,#0AH
XCH A,R1 ;还原R1
ADD A,#80H ;8OH为零点,取得正的幅度值
AJMP LK0
LK1:ADD A,#0AH
XCH A,R1
MOV R3,A
MOV A,#80H
CLR C
SUBB A,R3 ;80H为零点,取得负的幅度值
LK0:MOV DPTR,#8000H ;送DA转换入口地址
MOVX @DPTR,A
MOV A,R5
KD:DEC R5 ;调用延时
CALL DELAY
CJNE R5,#00H,KD
MOV R5,A
CJNE R1,#12H,LOOP1
LJMP PP
FB:MOV R1,#00H