org 0000h LJMP MAIN ORG 0003H LJMP L0 MAIN:MOV R2,#0aH ;調(diào)幅倍數(shù) MOV R4,#01H ;增減選擇 MOV R5,#01H pp: SETB EA SETB EX0 ;延時(shí)計(jì)數(shù)個(gè)數(shù) MOV A,#0FFH ;讀取波形狀態(tài) 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 ;讀取正弦波數(shù)據(jù)首地址 MOVC A,@A+DPTR ;去表格數(shù)據(jù) MOV B,R2 MUL AB ;幅度大小 INC R1 XCH A,R1 CLR C SUBB A,#0AH ;是否已采樣半個(gè)周期 JNC LK1 ;C=0跳轉(zhuǎn),即R1大于0A,以采樣半個(gè)周期以上 ADD A,#0AH XCH A,R1 ;還原R1 ADD A,#80H ;8OH為零點(diǎn),取得正的幅度值 AJMP LK0 LK1:ADD A,#0AH XCH A,R1 MOV R3,A MOV A,#80H CLR C SUBB A,R3 ;80H為零點(diǎn),取得負(fù)的幅度值 LK0:MOV DPTR,#8000H ;送DA轉(zhuǎn)換入口地址 MOVX @DPTR,A MOV A,R5 KD:DEC R5 ;調(diào)用延時(shí) CALL DELAY CJNE R5,#00H,KD MOV R5,A CJNE R1,#12H,LOOP1 LJMP PP FB:MOV R1,#00H LOOP2:MOV A,R1 MOV DPTR,#TABLE2 ;讀取方波數(shù)據(jù)首地址 MOVC A,@A+DPTR ;去表格數(shù)據(jù) MOV B,R2 MUL AB ;幅度大小 INC R1 XCH A,R1 CLR C SUBB A,#0AH ;是否已采樣半個(gè)周期 JNC LK3 ;C=0跳轉(zhuǎn),即R1大于0A,以采樣半個(gè)周期以上 ADD A,#0AH XCH A,R1 ;還原R1 ADD A,#80H ;8OH為零點(diǎn),取得正的幅度值 AJMP LK2 LK3:ADD A,#0AH XCH A,R1 MOV R3,A MOV A,#80H CLR C SUBB A,R3 ;80H為零點(diǎn),取得負(fù)的幅度值 LK2:MOV DPTR,#8000H ;送DA轉(zhuǎn)換入口地址 MOVX @DPTR,A MOV A,R5 KD0:DEC R5 ;調(diào)用延時(shí) CALL DELAY CJNE R5,#00H,KD0 MOV R5,A CJNE R1,#12H,LOOP2 LJMP PP SJB:MOV R1,#00H LOOP3:MOV A,R1 MOV DPTR,#TABLE3 ;讀取三角波波數(shù)據(jù)首地址 MOVC A,@A+DPTR ;去表格數(shù)據(jù) MOV B,R2 MUL AB ;幅度大小 INC R1 XCH A,R1 CLR C SUBB A,#0DH ;是否已采樣半個(gè)周期 JNC LK5 ;C=0跳轉(zhuǎn),即R1大于D,以采樣半個(gè)周期以上 ADD A,#0DH XCH A,R1 ;還原R1 ADD A,#80H ;8OH為零點(diǎn),取得正的幅度值 AJMP LK4 LK5:ADD A,#0DH XCH A,R1 MOV R3,A MOV A,#80H CLR C SUBB A,R3 ;80H為零點(diǎn),取得負(fù)的幅度值 LK4:MOV DPTR,#8000H ;送DA轉(zhuǎn)換入口地址 MOVX @DPTR,A KD1:MOV A,R5 DEC R5 ;調(diào)用延時(shí) CALL DELAY CJNE R5,#00H,KD1 MOV R5,A CJNE R1,#18H,LOOP3 LJMP PP DELAY:NOP RET L0:CLR EA PUSH A PUSH PSW JB P1.3,L1 ;中斷子程序 CJNE R4,#00H,KL0 INC R4 SJMP LD0 KL0:MOV R4,#00H LD0:JNB P1.3,LD0 ;判斷鍵是否松開(kāi) LJMP LEND L1:JB P1.4,L2 MOV A,R4 JNZ KL1 ;判斷幅度是增還是減 CJNE R2,#0AH,KK0 ;判斷幅度是否達(dá)到最大 SJMP LD1 KK0:INC R2 ;幅度增加0.5V SJMP LD1 KL1:CJNE R2,#00H,KK1 SJMP LD1 KK1:DEC R2 ;幅度減小0.5V LD1:JNB P1.4,LD1 LJMP LEND L2:JB P1.5 ,LEND MOV A,R4 JNZ KL2 ;判斷頻率的增減 MOV A,#05H ;每次周期變化20微秒 CLR C ADD A,R5 JC LD2 MOV R5,A LJMP LD2 KL2:MOV A,R5 CLR C SUBB A,#05H JC LD2 MOV R5,A LD2:JNB P1.5,LD2 LEND:POP PSW POP A SETB EA RETI TABLE1:DB 00H,04H,08H,0bH,0cH,0cH,0bH,08H,04H,00H,04H,08H,0bH,0cH,0cH,0bH,08H ,04H TABLE2:DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,0CH,0CH,0CH,0CH,0CH,0CH,0CH,0CH ,0CH TABLE3:DB 00H,02H,04H,06H,08H,0AH,0CH,0AH,08H,06H,04H,02H,00H,02H,04H,06H,08H,0AH,0CH,0AH,08H,06H,04H,02H