链接:https://pan.baidu.com/s/1jUHhVUiVOdTTCy2MHmFcCg
提取码:1234
功能:
- 系统采用STC89C52作为单片机
- 采用汇编语言撰写
- 可产生三角波、方波、正弦波三种波形
- DAC芯片采用的是DAC0832,外加一个运放做波形处理
仿真电路图:
参考代码:
ORG 0000H
;定义存储标志位的地址
SEL EQU 30H ;存波形的地址 00:方波 01:三角波 02:正弦波
RANGE EQU 31H ;存幅值的地址
FREQ EQU 32H ;存频率的地址
INC_F1 EQU 35H ;三角波自加或自减标识,=幅值/255
INC_F2 EQU 36H ;三角波自加或自减标识,=幅值/255
RAN_SIN EQU 37H ;正弦波幅值
;定义按键的地址
AN_COM EQU P2.1 ;发出低电平,用于检测按键
AN_FREQ EQU P2.2 ;调节频率按键
AN_RANGE EQU P2.3 ;调节幅度按键
AN_SEL EQU P2.4 ;变换波形按键
AN_RST EQU P3.1
;定义12864的控制端
E EQU P2.0 ;数据或命令读写驱动信号,操作时应拉高,操作完拉低即可
RW EQU P2.6 ;读写控制端
RS EQU P2.5 ;选择写控制命令或数据命令
CS1 EQU P2.7 ;选屏幕
CS2 EQU P3.0
;12864存取命令的地址
L_COM EQU 33H ;
Y EQU 34H ;存列地址
X EQU 38H ;存页地址
PG EQU 39H ;存操作页数
LINE EQU 40H ;存操作列数
NUM EQU 41H ;循环次数
SNUM EQU 42H ;待显示的数字
TEMP EQU 43H ;临时数据
LJMP MAIN
ORG 0003H ;外部中断0中断入口地址
LJMP COUNT_SER ;外部中断中断服务程序
ORG 0100H
MAIN: ;数据初始化
MOV SP,#60H
CLR A
CLR C
CLR AN_COM
MOV SEL,#00H ;默认方波
MOV RANGE,#7FH ;默认中间幅值
MOV FREQ,#00 ;默认最大频率
LCALL CLEAN
MOV P1,#00H
MOV Y,#00H
MOV INC_F1,#00H
MOV INC_F2,#00H
MOV RAN_SIN,#01H
LCALL LCD_INIT
LCALL SHOW_MSG
LCALL SHOW_VH
LCALL SHOW_SQR
MOV X,#0BAH
MOV Y,#5FH
MOV SNUM,#05H
LCALL SHOW_NUM
;外部中断0初始化
SETB IT0
SETB EX0 ;允许外部中断0
SETB EA ;开总中断
;停机等待中断,到后期可以改为一些一直执行的程序,如显示,输出等
MAIN_L: MOV A,SEL
MOV DPTR,#WAVE
JMP @A+DPTR
SJMP MAIN_L
;方波,不可调频
SQUARE: MOV R5,SEL
CJNE R5,#00H,WAVE_BACK
MOV P1,RANGE ;幅值
LCALL DELAY_Xus
LCALL DELAY_100us
MOV P1,#00H
LCALL DELAY_Xus
LCALL DELAY_100us
SJMP SQUARE
;三角波,调幅,频率也会变,改 默认最大幅值,最小频率
R_SEL: MOV R5,SEL
CJNE R5,#01H,WAVE_BACK
LCALL JINC_F
RECT: DJNZ INC_F1,RECT
INC P1
MOV A,P1
; LCALL DELAY_10us
CJNE A,RANGE,RECT
MOV INC_F1,INC_F2
DOWN: DJNZ INC_F2,DOWN
DEC P1
MOV R0,P1
CJNE R0,#00H,DOWN
MOV INC_F2,INC_F1
; LCALL DELAY_10us
LJMP R_SEL
RET
;判断三角波中是一个循环加多少
JINC_F: MOV A,#0FFH
MOV B,RANGE
DIV AB
MOV INC_F1,A
MOV INC_F2,A
RET
;正弦波,用查表法,不可调频,不可调幅
SIN: MOV DPTR,#TABLE_SIN
S_SEL: MOV R5,SEL
CJNE R5,#02H,WAVE_BACK
SL: CLR A
MOVC A,@A+DPTR
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
;中断服务程序
;外部中断0中断服务程序 ,判断是哪个按键被按下
COUNT_SER: CPL P3.5
JNB AN_FREQ,FREQ_FUNC
JNB AN_RANGE,RANGE_FUNC
JNB AN_SEL,SEL_FUNC
JNB AN_RST,SEL_RST
RETI
;调节频率按钮
FREQ_FUNC: INC FREQ
RETI
;调节幅值按钮
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
CLR AN_COM
MOV SEL,#00H ;默认方波
MOV RANGE,#7FH ;默认中间幅值
MOV FREQ,#00 ;默认最大频率
MOV P1,#00H
MOV Y,#00H
MOV INC_F1,#00H
MOV INC_F2,#00H
MOV RAN_SIN,#01H
RETI
;LCD显示部分:
;1、查看LCD是否处于空闲
CHK_BUSY: MOV P0,#0FH ;必须让p0.7为低,不然一直卡在死循环
CLR RS
SETB RW
SETB E
JB P0.7,$
CLR E
RET
;2、写命令
;写左命令
WR_L_COM: CLR CS1
SETB CS2
LCALL CHK_BUSY ;判断LCD是否处于空闲
NOP
CLR RS
CLR RW
NOP
SETB E
MOV P0,L_COM
NOP
CLR E
NOP
RET
;写右命令
WR_R_COM: SETB CS1
CLR CS2
LCALL CHK_BUSY ;判断LCD是否处于空闲
NOP
CLR RS
CLR RW
NOP
SETB E
MOV P0,L_COM
NOP
CLR E
NOP
RET
;全屏写命令
.