這是我單片機完成的課題。
可以實現方波正弦波三角波
并且利用視覺暫留原理顯示頻率
protues仿真和keil程序已打包上傳
單片機源程序如下:
- ORG 00H
- SEL EQU 50H ;存波形地址 00方波,01三角波,02正弦波
- RANGE EQU 51H;存幅度
- FREQ EQU 52H;存頻率
- INC_1 EQU 55H;
- INC_2 EQU 56H;
- RAN_SIN EQU 57H;三角波幅度
- ;定義按鍵的地址
- AN_SEL EQU P3.2 ;選擇波形
- AN_FREQ EQU P3.3;調節頻率
- AN_RANGE EQU P3.4;調節幅度
- AN_RST EQU P3.5;恢復
- MOV R0, #00H ;發光管的顯示頻率.由于電流小不夠負載驅動管
- MOV R1, #05H
- MOV R2, #00H
- MOV R3, #00H
- MOV R4, #00H
-
- LJMP MAIN
- ORG 0003H
- LJMP SEL_FUNC
- ORG 000BH
- LJMP FREQ_FUNC
- ORG 0013H
- LJMP RANGE_FUNC
- ORG 001BH
- LJMP SEL_RST
- ORG 0100H
- MAIN:
- MOV SP,#60H
- CLR A
- CLR C
- MOV SEL,#00H ;默認為方波
- MOV RANGE,#7FH;RANGE為中間值,且不變
- MOV FREQ,#00
- MOV P1,#00H ;P1口數據位輸出
- MOV INC_1,#00H ;三角波上升
- MOV INC_2,#00H ;三角波下降
- MOV RAN_SIN,#01H
- SETB IT1
- SETB EX1
- MOV TMOD,#66H
- MOV TL0,#0FFH
- MOV TH0,#0FFH ;外部計數 ,按一下馬上跳轉
- MOV TL1,#0FFH
- MOV TH1,#0FFH
- SETB TR0
- SETB TR1
- SETB ET0 ;啟動各種中斷
- SETB ET1
- SETB IT0
- SETB EX0
- SETB EA
- LCALL LED_SHOW
- MAIN_L:MOV A,SEL
- MOV DPTR,#WAVE
- JMP @A+DPTR ;和250的散轉指令對應,無中斷就在此循環,顯示波形
-
-
- SJMP MAIN_L
- SQUARE:
- LCALL LED_SHOW
- MOV R5,SEL
- CJNE R5,#00H,WAVE_BACK
- MOV P1,RANGE;幅值
- LCALL DELAY_Xus ;把SEL值給R5, 設定方波占空比為50%
- LCALL DELAY_1000us
- MOV P1,#00H
- LCALL DELAY_Xus
- LCALL DELAY_100us
- SJMP SQUARE
- R_SEL:;三角波
- LCALL LED_SHOW
- MOV R5,SEL
- CJNE R5,#01H,WAVE_BACK
- LCALL JINC_F
- RECT: DJNZ INC_1,RECT
- INC P1 ;三角波上升下降
- MOV A,P1
- ;LCALL DELAY_100us
- CJNE A,RANGE,RECT
- MOV INC_1,INC_2
- DOWN: DJNZ INC_2,DOWN
- DEC P1
- MOV R0,P1
- CJNE R0,#00H,DOWN
- MOV INC_2,INC_1
- LJMP R_SEL
- RET
- ;MOV P1,#00H
- ;MOV R0,P1
- ;CJNE R0,#00H,DOWN
- ;MOV INC_F2,INC_F1
- ;LJMP R_SEL
- ;RET
- JINC_F: MOV A,#0FFH
- MOV B,RANGE
- DIV AB ;檢查是不是在一個循環內部;B的值會改變;
- MOV INC_1,B ;一樣才循環
- MOV INC_2,B
- RET
- SIN:
-
- MOV DPTR,#TABLE_SIN
- S_SEL: MOV R5,SEL
- CJNE R5,#02H,WAVE_BACK
-
- SL: CLR A
- MOVC A, @A+DPTR ;數表的值和B運算得到幅度變化。
- MOV B,RAN_SIN
- DIV AB
- MOV P1,A
- LCALL DELAY_10us
- INC DPTR
- MOV A,#01H
- MOVC A,@A+DPTR
- CJNE A,#21H,S_SEL
- LJMP SIN
- WAVE_BACK:RET
- FREQ_FUNC: INC FREQ
- AN0:
- MOV R4,#0AH
- CJNE R4,#0AH,BACK
- LCALL DELAY1
- LJMP AN1
- AN1:
- INC R3
- CJNE R3,#0AH,BACK
- LCALL DELAY1
- LJMP AN2
- AN2:
- MOV R3,#00H
- INC R2
- CJNE R2,#0AH,BACK
- LJMP AN3
- AN3:
- MOV R2,#00H
- INC R1
- CJNE R1,#0AH,BACK
- LJMP AN4
- AN4:
- MOV R1,#00H
- INC R0
- CJNE R0,#0AH,BACK
- LJMP AN5
- AN5:
- MOV R0,#00H
- RETI
- BACK:RETI ;R3-R0分別是個十百千位,每一個計數滿進位
- RANGE_FUNC:INC RANGE
- INC RAN_SIN
- MOV R6,RAN_SIN
- CJNE R6,#00H,FUNC_RET
- MOV RAN_SIN,#01H
- RETI
- SEL_FUNC: INC SEL
- MOV R6,SEL
- CJNE R6,#03H,FUNC_RET
- MOV SEL,#00H
- RETI
- FUNC_RET:RETI
- SEL_RST:CLR A
- CLR C
- MOV SEL,#00H
- MOV RANGE,#7FH
- MOV FREQ,#00
- MOV P1,#00H
- MOV INC_1,#00H
- MOV INC_2,#00H
- MOV RAN_SIN,#01H
- RETI
- LED_SHOW: ;LED顯示
- SETB P2.5 ; p2.5是數碼管總開關
- MOV A,R0
- MOV DPTR,#TABLE
- MOVC A,@A+DPTR
- SETB P2.0 ;P2.0 2.1 2.2 2.3 置為0 四個 讓之前的四位頻率顯示
- MOV P0,A
- LCALL DELAY
- CLR P2.0
- MOV A,R1
- MOV DPTR,#TABLE
- MOVC A,@A+DPTR
- SETB P2.1
- MOV P0,A
- LCALL DELAY
-
- CLR P2.1
- MOV A,R2
- MOV DPTR, #TABLE
- MOVC A,@A+DPTR
- SETB P2.2
- MOV P0,A
- LCALL DELAY
-
- CLR P2.2
- MOV A,R3
- MOV DPTR,#TABLE
- MOVC A,@A+DPTR
- SETB P2.3
- MOV P0,A
- LCALL DELAY
- CLR P2.3
-
- RET
- TABLE: DB 90H,80H,0F8H,92H,99H,0B0H,82H,0A4H,0F9H,0C0H ;數碼管0-9數字
- DELAY1:MOV R6,#0FFH
- LP:MOV R7,#0FFH
- LP1:NOP
- DJNZ R7,LP1
- DJNZ R6,LP
- RET
- DELAY:MOV R6,#0FH
- LP2:MOV R7,#10
- LP3:NOP
- DJNZ R7,LP3
- DJNZ R6,LP2
- RET
- DELAY_100us: NOP
- MOV R6,#04H
- L1:MOV R7,#0AH
- L2:DJNZ R7,L2
- DJNZ R6,L1
- RET
- DELAY_1000us: NOP
- MOV R6,#0AAH
- L111:MOV R7,#0AH
- L222:DJNZ R7,L2
- DJNZ R6,L1
- RET
- DELAY_Xus:MOV A,FREQ
- MOV R6,FREQ
- JZ DE_BACK
- NOP
-
-
- L11:MOV R7,#0AH
- L22:DJNZ R7,L22
- DJNZ R6,L11
- RET
-
-
- DELAY_10us:MOV A,FREQ
- JZ DE_BACK
- MOV R3,FREQ
- DJNZ R3,$
- DE_BACK:RET
- WAVE:LCALL SQUARE
- LCALL R_SEL
- LCALL SIN
- TABLE_SIN:
- DB 80H,83H,86H,89H,8DH,90H,93H,96H
- DB 99H,9CH,9FH,0A2H,0A5H,0A8H,0ABH,0AEH
- DB 0B1H,0B4H,0B7H,0BAH,0BCH,0BFH,0C2H,0C5H
- DB 0C7H,0CAH,0CCH,0CFH,0D1H,0D4H,0D6H,0D8H
- DB 0DAH,0DDH,0DFH,0E1H,0E3H,0E5H,0E7H,0E9H
- DB 0EAH,0ECH,0EEH,0EFH,0F1H,0F2H,0F4H,0F5H
- DB 0F6H,0F7H,0F8H,0F9H,0FAH,0FBH,0FCH,0FDH
- DB 0FDH,0FEH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
- DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FEH,0FDH
- DB 0FDH,0FCH,0FBH,0FAH,0F9H,0F8H,0F7H,0F6H
- DB 0F5H,0F4H,0F2H,0F1H,0EFH,0EEH,0ECH,0EAH
- DB 0E9H,0E7H,0E5H,0E3H,0E1H,0DEH,0DDH,0DAH
- DB 0D8H,0D6H,0D4H,0D1H,0CFH,0CCH,0CAH,0C7H
- DB 0C5H,0C2H,0BFH,0BCH,0BAH,0B7H,0B4H,0B1H
- DB 0AEH,0ABH,0A8H,0A5H,0A2H,09FH,09CH,099H
- DB 096H,093H,090H,08DH,089H,086H,083H,080H
- DB 080H,07CH,079H,078H,072H,06FH,06CH,069H
- DB 066H,063H,060H,05DH,05AH,057H,055H,051H
- DB 04EH,04CH,048H,045H,043H,040H,03DH,03AH
- DB 038H,035H,033H,030H,02EH,02BH,029H,027H
- DB 025H,022H,020H,01EH,01CH,01AH,018H,016H
- DB 015H,013H,011H,010H,00EH,00DH,00BH,00AH
- DB 09H,08H,07H,06H,05H,04H,03H,02H
- DB 02H,01H,00H,00H,00H,00H,00H,00H
- DB 0AH,0BH,0DH,0EH,10H,11H,13H,15H
- DB 16H,18H,1AH,1CH,1EH,20H,22H,25H
- DB 27H,29H,2BH,2EH,30H,33H,35H,38H
- DB 3AH,3DH,40H,43H,45H,48H,4CH,4EH
- DB 51H,55H,57H,5AH,5DH,60H,63H,66H
- DB 69H,6CH,6FH,72H,76H,79H,7CH,80H,21H ;21H為 結束標志位
-
- END
復制代碼
所有資料51hei提供下載:
Protues.rar
(68.45 KB, 下載次數: 23)
2019-7-5 11:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
keil.rar
(29.85 KB, 下載次數: 20)
2019-7-5 11:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|