⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 51.txt

📁 基于51单片机的函数发生器的源代码。已验证通过。
💻 TXT
字号:
程序清单:
        DAADR EQU 7FFEH
        INO EQU 7FF8H
        IN1 EQU 7FF9H
        IN2 EQU 7FFAH
        ORG 0000H
        AJMP MAIN
        ORG 0030H
MAIN:  MOV SP,#70H                  ;设置堆栈指针
        LCALL ADC                   ;调用A/D转换程序
        LCALL DISP                   ;调用显示子程序
        MOV A,30H           
        CJNE A,#80H,AA               ;判断频率高低,确定发送点数 
AA:     JC A1
        CJNE A,#0C0H,BB
BB:     JC A2
        MOV R7,#5
        AJMP WAVE
A1:     MOV R7,#1
        AJMP WAVE
A2:     MOV R7,#3
        AJMP WAVE
;********初始检测有无按键按下******************
WAVE:   JB P2.0,ZH1           ;按键按下为低电平
        LCALL DELAY0
ZH1:    JNB P2.0,ZHJC         ;跳到锯齿波发生程序
        JB P2.2,ZH2
        LCALL DELAY0        ;延时去抖
ZH2:    JNB P2.2,SAN          ;跳到三角波发生程序
        JB P2.3,ZH3 
        LCALL DELAY0
ZH3:    JNB P2.3,SIN          ;跳到正弦波发生程序
        JB P2.1,ZH4
        LCALL DELAY0
ZH4:    JNB P2.1,FANJC        ;跳到方波发生程序
        AJMP  WAVE
;*****************波形产生函数*****************
ZHJC:   MOV DPTR,#DAADR    ;正向锯齿波
DA1:    MOV R6,#00H
DA2:    MOV A,R6
        ADD A,R7
        MOVX @DPTR,A        ;将数据送到D/A转换模块
        LCALL DELAY
        LCALL DELAY1
        MOV 33H,P2             ;扫描按键,如果有键按下则返回
        ORL 33H,#0F0H
        MOV R5,33H
        CJNE R5,#0FFH,DA3        
        CJNE R6,#0FFH,DA2
        AJMP DA1
DA3:    RET
SAN:    MOV DPTR,#DAADR       ;三角波
        MOV R6,#00H
        MOV A,R7
        RL  A
        MOV R7,A
        MOV A,R6
DA5:    ADD A,R7
        MOVX @DPTR,A
        LCALL DELAY
        LCALL DELAY1
        MOV 33H,P2
        ORL 33H,#0F0H
        MOV R5,33H
        CJNE R5,#0FFH,DA8
        CJNE A,#0FFH,DA5
DA7:    SUBB A,R7
        MOVX @DPTR,A
        LCALL DELAY
        LCALL DELAY1
        MOV 33H,P2
        ORL 33H,#0F0H
        MOV R5,33H
        CJNE R5,#0FFH,DA8
        CJNE A,#00H,DA7
DA8:    RET
SINS:   MOV  R6,#00H
        MOV A,R6             ;单路正弦波
SIN:    ADD A,R7
        MOV DPTR,#TABH     ;取正弦值表首地址
        MOVC A,@A+DPTR
        MOV DPTR,#DAADR
        MOVX @DPTR,A
        LCALL DELAY
        LCALL DELAY1
        MOV 33H,P2
        ORL 33H,#0F0H
        MOV R5,33H
        CJNE R5,#0FFH,SIN2
        AJMP SIN
SIN2:   RET
FANJC:  MOV DPTR,#DAADR     ;方波
        MOV R6,#00H
        MOV A,R7
        RL  A
        MOV R7,A
        MOV A,R6
FAN5:   ADD A,R7
        MOV R6,A
        MOV A,#0FFH
        MOVX @DPTR,A
        LCALL DELAY
        LCALL DELAY1
        MOV 33H,P2
        ORL 33H,#0F0H
        MOV R5,33H
        CJNE R5,#0FFH,FAN8
        CJNE R6,#0FFH,FAN5
FAN7:   MOV A,R6
        SUBB A,R7
        MOV R6,A
        MOV A,#00H
        MOVX @DPTR,A
        LCALL DELAY
        LCALL DELAY1
        MOV 33H,P2
        ORL 33H,#0F0H
        MOV R5,33H
        CJNE R5,#0FFH,FAN8
        CJNE R6,#00H,FAN7
FAN8:   RET
;***************A/D转换****************
ADC:   MOV DPTR,#7FF8H     ;P2.7=0, 且指向IN0
        MOV R1,#30H          ;置数码区首地址
        MOV R2,#02
READ:  MOVX @DPTR,A
HERE:  JNB P2.5,HERE        ;等待转换结束
        MOVX A,@DPTR       ;读取转换后数据
        MOVX @R1,A
        INC R1
        INC DPTR
        DJNZ R2,READ
        SETB RS0             ;选择寄存器组1
        RR A                 ;经过计算得到延时程序初值
        MOV R3,#9CH
        MOV R4,#40H
        CLR C
        XCH A,R4
        SUBB A,R4
        MOV R4,A
        MOV A,30H
        RR A
        XCH A,R3
        SUBB A,B
        MOV R3,A
        MOV R1,A
        MOV A,R4
        MOV B,#02H
        DIV AB
        MOV R3,A
        CLR RS0
        RET
;**********码制变换和显示程序***************
DISP:   SETB RS1          ;选择寄存器组2
       ;两个通道待转换的数据分别以十六进制形式放置在30H、31H
       ;40H和41H存放通道0转换的后BCD码
       ;42H和43H存放通道1转换后的BCD码
       ;将通道0的数据转换为需要显示的频率数
        MOV  R0,#30H    ;指向通道0的数据
        MOV A,@R0
        MOV B,#07H
        DIV AB
        MOV B,#10
        DIV AB
        MOV 40H,A
        MOV 41H,B
       ;将通道1的数据转换为需要显示的频率数
        MOV  R0,#31H      ;指向通道0的数据
        MOV A,@R0
        MOV B,#07H
        DIV AB
        MOV B,#10
        DIV AB
        MOV 42H,A
        MOV 43H,B
DIR:    SETB RS1            ;选择寄存器组2
        MOV R2,#04H        ;显示6个数码管
        MOV  R0,#40H       ;显示缓冲区首地址送R0
DL0:    MOV A,@R0         ;取要显示的数作查表偏移量
        MOV DPTR,#TAB     ;指向段码表首
        MOVC A,@A+DPTR   ;查表得段码
        MOV SBUF,A         ;发送显示
DL1:    JNB TI,DL1           ;等待发送完一帧
        CLR TI               ;清中断标志,准备继续发送
        INC R0               ;更新显示单元
        DJNZ R2,DL0         ;重复显示所有数码管
        CLR RS1             ;恢复第0组工作寄存器
        RET
;************波形延时子程序************
;延时单位256us
DELAY:SETB RS0
       MOV R2,#128
       DJNZ R2,$
       DJNZ R1,DELAY
       CLR RS0
       RET
;************波形延时程序2************
;延时单位2us
DELAY1:SETB RS0
        DJNZ R3,DELAY1
        CLR RS0
        RET
;***************按键延时**************
DELAY0:SETB RS0
        SETB RS1
        MOV R2,#20
LOOP2: MOV R3,#250
        DJNZ R3,$
        DJNZ R2,LOOP2
        CLR RS0
        CLR RS1
        RET
TABH:DB 80H,83H,86H,89H,08DH,90H,93H,96H            ;正弦函数值
      DB 99H,09CH,09FH,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,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,0DFH,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,99H
      DB 96H,93H,90H,08DH,89H,86H,83H,80H
      DB 80H,07CH,79H,76H,72H,06FH,06CH,69H
      
DB 66H,63H,60H,05DH,05AH,57H,55H,51H
      DB 04EH,04CH,48H,45H,43H,40H,03DH,03AH
      DB 38H,35H,33H,30H,02EH,02BH,29H,27H
      DB 25H,22H,20H,01EH,01CH,01AH,18H,16H
      DB 15H,13H,11H,10H,0EH,0DH,0BH,0AH
      DB 09H,08H,07H,06H,05H,04H,03H,02H
      DB 02H,01H,00H,00H,00H,00H,00H,00H
      DB 00H,00H,00H,00H,00H,00H,02H,01H
DB 02H,03H,04H,05H,06H,07H,08H,09H
      DB 0AH,0BH,0DH,0EH,10H,11H,13H,15H
      DB 16H,18H,01AH,01CH,01EH,20H,22H,25H
      DB 27H,29H,02BH,02EH,30H,33H,35H,38H
      DB 03AH,03DH,40H,43H,45H,48H,04CH,04EH
      DB 51H,55H,57H,05AH,05DH,60H,63H,66H
      DB 69H,06CH,06FH,72H,76H,79H,07CH,80H

TAB: DB 03FH,06H,05BH,04FH,66H,06DH,07DH,07H         ;七段码表
     DB 07FH,06FH,77H,07CH,39H,05EH,79H,71H
     END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -