📄 ex8-6.asm
字号:
ORG 0000H
START: LJMP MAIN
ORG 0003H ;外部中断 入口
LJMP INSER ;转到中断服务程序
ORG 0030H
MAIN: MOV DPTR,#7FFFH ;DAC0832地址
SETB EX0 ;允许 中断
SETB IT0 ;负边沿触发方式
SETB EA ;开中断
HERE: JB 20H.0,ST ;阶梯波处理
JB 20H.1,TRI ;三角波处理
JB 20H.2,SQ ;方波处理
JB 20H.3,SIN ;正弦波处理
SJMP HERE ;等待中断
INSER: JNB P1.0, LL1 ;中断服务程序,查询按键
SJMP L1
LL1: MOV 20H,#00H
SETB 20H.0 ;设置阶梯波标志
SJMP RT
L1: JNB P1.2, LL2
SJMP L2
LL2: MOV 20H,#00H
SETB 20H.1 ;设三角梯波标志
SJMP RT
L2: JNB P1.4, LL3
SJMP L3
LL3: MOV 20H,#00H
SETB 20H.2 ;设置方波标志
SJMP RT
L3: JNB P1.6, LL4
SJMP RT
LL4: MOV 20H,#00H
SETB 20H.3 ;设置正弦波标志
RT: RETI ;中断返回
ST: MOV A,#00H ;阶梯波
LOOPP: MOVX @DPTR,A ;启动D/A转换
INC A
JB 20H.0,LOOPP ;连续输出波形
LJMP HERE
TRI: MOV A,#00H ;三角波
UP: MOVX @DPTR,A ;启动D/A转换
INC A ;上升沿
CJNE A,#0FFH,UP
DOWN: MOVX @DPTR,A ;启动D/A转换
DEC A ;下降沿
CJNE A,#00H,DOWN
JB 20H.1, UP ;连续输出波形
LJMP HERE
SQ: MOV A,#00H ;方波
MOVX @DPTR,A ;DAC输出低电平
ACALL DELAY ;延时1
MOV A,#0FFH
MOVX @DPTR,A ;DAC输出高电平
ACALL DELAY ;延时2
JB 20H.2, SQ ;连续输出波形
LJMP HERE
SIN: MOV DPTR,#SINTAB ;正弦波
MOV R0,#6DH
LOOP: CLR A
MOVC A,@A+DPTR
MOV @R0,A
INC DPTR
INC R0
CJNE R0,#80H,LOOP
MOV DPTR,#7FFFH ;DAC0832端口地址
MOV R0,#6DH
LOOP1: MOV A,@R0 ;取得第一个1/4周期的数据
MOVX @DPTR,A ;送往DAC0832
INC R0
CJNE R0,#7FH,LOOP1
LOOP2: MOV A,@R0 ;取得第二个1/4周期的数据
MOVX @DPTR,A ;送往DAC0832
DEC R0
CJNE R0,#6DH,LOOP2
LOOP3: MOV A,@R0 ;取得第三个1/4周期的数据
CPL A ;数据取反
MOVX @DPTR,A ;送往DAC0832
INC R0
CJNE R0,#7FH,LOOP3
LOOP4: MOV A,@R0 ;取得第四个1/4周期的数据
CPL A ;数据取反
MOVX @DPTR,A ;送往DAC0832
DEC R0
CJNE R0,#6DH,LOOP4
JB 20H.3, LOOP1 ;输出连续波形
LJMP HERE
SINTAB: DB 7FH,89H,94H,9FH,0AAH,0B4H,0BEH,0C8H,0D1H,0D9H
DB 0E0H,0E7H,0EDH,0F2H,0F7H,0FAH,0FCH,0FEH,0FFH
DELAY: MOV R4,#0FH ;延时子程序
LOOP11: MOV R5,#10H
LOOP22: NOP
NOP
NOP
DJNZ R5,LOOP22
DJNZ R4,LOOP11
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -