單片機(jī)控制DAC0832輸出正弦波三角波匯編程序
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 ;判斷鍵是否松開
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
評(píng)論