1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| ORG 0000H AJMP MAIN
ORG 0003H LJMP INT0_ISR
ORG 0013H LJMP INT1_ISR
ORG 0050H MAIN: MOV IE,#85H ;1000 0101,允许外部中断INT1和INT0,开中断总开关 SETB PX1 ;设外部中断1为高优先级中断 ; TCON不作其他配置,保持复位时的全0(外部中断触发方式为低电平)
;MOV R0 #02H ;为控制方波占空比而设置的计数变量
SAWTOOTH: ;锯齿波 CLR A MOV DPTR,#7FFFH LOOP_SAWTOOTH: MOVX @DPTR,A INC A SJMP LOOP_SAWTOOTH
INT0_ISR: ;P3.2所接的开关置为低时进入外部中断0 SQUARE: MOV DPTR,#7FFFH CLR A ;对A清零 MOVX @DPTR,A LOOP_SQUARE: CPL A MOVX @DPTR,A ACALL DELAY ;高电平 一段延时 CPL A MOVX @DPTR,A ACALL DELAY ;低电平 两段延时 ACALL DELAY JB P3.2,EXIT ;若P3.2所接的开关被置为高,则退出中断 SJMP LOOP_SQUARE ;若P3.2所接的开关仍为低,则继续输出方波
DELAY: MOV R7,#0FFH DJNZ R7,$ RET
EXIT: RETI
INT1_ISR: ;P3.3所接的开关置为低时进入外部中断1 JB P3.2,TRIANGLE ;若P3.2所接的开关被置为高,则输出三角波。否则输出正弦波。 JB P3.3,EXIT ;若P3.3所接的开关被置为高,则退出中断
SIN: MOV R1,#63 ;一个周期内输出64个点 LOOP_SIN: MOV DPTR,#TAB MOV A,R1 MOVC A,@A+DPTR MOVX @DPTR,A NOP ;延时,可根据实际情况更改 DJNZ R1,LOOP_SIN SJMP INT1_ISR
TAB: ;正弦波数据表 DB 80H,8CH,98H,0A5H,0B0H,0BCH,0C7H,0D1H DB 0DAH,0E2H,0EAH,0F0H,0F6H,0FAH,0FDH,0FFH DB 0FFH,0FFH,0FDH,0FAH,0F6H,0F0H,0EAH,0E3H DB 0DAH,0D1H,0C7H,0BCH,0B1H,0A5H,99H,8CH DB 80H,73H,67H,5BH,4FH,43H,39H,2EH DB 25H,1DH,15H,0FH,09H,05H,02H,00H DB 00H,00H,02H,05H,09H,0EH,15H,1CH DB 25H,2EH,38H,43H,4EH,5AH,66H,73H
TRIANGLE: MOV DPTR,#7FFFH CLR A ;对A清零 LOOP_TRIANGLE_INC: MOVX @DPTR,A INC A CJNE A,#0FFH,LOOP_TRIANGLE_INC LOOP_TRIANGLE_DEC: MOVX @DPTR,A DEC A JNZ LOOP_TRIANGLE_DEC JB P3.3,EXIT ;若P3.3所接的开关被置为高,则退出中断 JNB P3.2,INT1_ISR ;若P3.2所接的开关被置为低,则进入中断服务程序1 LJMP LOOP_TRIANGLE_INC
END
|