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

📄 max038main.asm

📁 自己制作的MAX038信号发生器程序
💻 ASM
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;--------------------------------波形发生器主程序文件------------------------------------
;;主芯片MAX038
;;控制电路,DA芯片+89C51
;;显示:字符型液晶显示器
;;按键:直接端口按键,共5个
;;设计要求:能产生正弦波,三角波和方波,输出信号频率范围为10~1MHZ,输出信号在10HZ~1KHZ范围内
;;步进10HZ,在1KHZ~1MHZ范围内步进为1KHZ;;输出正弦波信号的电压峰值在0~5V可调,步进为0.1V;;
;;实时显示信号类型,幅度,频率和频率步进值.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
		ORG		0000H
		AJMP	START
		ORG		0003H
		RETI
		ORG		0013H
		RETI
		ORG		000BH
		RETI
		ORG		001BH
		RETI
		ORG		0023H
		RETI
		
;;;;;;;;;;;;外部端口定义;;;;;;;;;;;;
;----显示----
RS		BIT		P3.2		;寄存器选择信号
;1-->数据寄存器
;0-->命令寄存器
RW    	BIT   	P3.1		;读/写选择信号
;1-->读操作
;0-->写操作
E     	BIT   	P3.0		;启动命令信号
;1-->0跳变执行命令

;----按键----
SETKEY	BIT		P2.0		;模式设置键
DKEY1	BIT		P2.1		;多功能键1
DKEY2	BIT		P2.2		;多功能键2
DKEY3	BIT		P2.3		;多功能键3
DKEY4	BIT		P2.4		;多功能键4
;----DA接口----

;----波形选择----
AO		BIT		P3.0		;波形模式选择A0
A1		BIT		P3.1		;波形模式选择A1
;*1-->正弦波
;00-->三角波
;10-->方波
;默认情况为正弦波

;----量程切换----
HI_LOW	BIT		P3.4
;1-->低频段(10HZ~1000HZ)
;0-->高频段(1KHZ~1000KHZ)
;----其他----

;;;;;;;;;;;;环境变量定义;;;;;;;;;;;;
;----显示变量----

;振幅************
AMPL_G		DATA	30H			;振幅电压显示小数位
AMPL_S		DATA	31H			;振幅电压显示整数位

;频率************
FREQ_G		DATA	32H			;频率显示值个位
FREQ_S		DATA	33H			;频率显示值十位
FREQ_B		DATA	34H			;频率显示值百位
FREQ_Q		DATA	35H			;频率显示值千位

;频率步进值******
SETP_L		DATA	36H			;频率步进值显示低位
SETP_H		DATA	37H			;频率步进值显示高位

;----系统变量----
;波形************
WAVE_TYPE	DATA	38H			;波形类型
;1-->正弦波
;2-->三角波
;3-->方波
;默认情况为正弦波

;振幅************
AMPL		DATA	39H			;振幅电压值(0~5V,*.*)

;频率************
FREQ_L		DATA	3AH			;频率值低位(10HZ~1KHZ,1KHZ~1000KHZ)
FREQ_H		DATA	3BH			;频率值高位

;频率步进值******
SETP		DATA	3CH			;频率步进值(10HZ/1KHZ)

;系统工作模式****
SYSMODE		DATA	3DH			;决定系统的工作模式
;1-->波形模式选择
;2-->频率调整模式
;3-->振幅调整模式

;按键码**********
KEYCODE		DATA	3EH			;按键扫描码
;其他************

;;;;;;;;;;;;;;系统初始化;;;;;;;;;;;;;
START:	MOV		SP,#70H		;设置堆栈70H~80H共16个字节
		MOV		SYSMODE,#1	;设置系统初始工作模式为波形选择模式
		;--------设置波形--------
		MOV		WAVE_TYPE,#1;默认波形为正弦波
		CLR		A0
		SETB	A1			;
		;------------------------
		MOV		FREQ_H,#1FH	;初始频率值500HZ	
		MOV		FREQ_L,#04H
		MOV		SETP,#10	;初始频率步进值为10HZ
		;;液晶屏幕初始化
		LCALL     YS;	      	;去掉这几行回出现多余的字符
        LCALL     TEST;
        LCALL     F_BUSY;
        MOV       P1,#00000001B
        LCALL     WCOMMAND		;清屏并置AC为0
        MOV       P1,#3CH		;功能设置,8位接口,2 行显示,5X7点阵
        LCALL     WCOMMAND		;等待直至LCM不忙
        MOV       P1,#0CH		;开显示及光标,不闪烁
        LCALL     WCOMMAND
        MOV       P1,#06H		;显示不移位,AC为增量方式
        LCALL      WCOMMAND
        ;MOV       P1,#80H		;写入显示起始地址,第一行第一个位置
        ;LCALL      WCOMMAND
		

MIAN:	JB		SETKEY,KEYS1
		LCALL	YS				;等待5MS
		JB		SETKEY,KEYS1	;判断是否真的按下
		MOV		KEYCODE,#01H
		SJMP	KEYSEND
KEYS1:	JB		DKEY1,KEYS2
		LCALL	YS				;等待5MS
		MOV		KEYCODE,#02H	;判断是否真的按下
		SJMP	KEYSEND
KEYS2:	JB		DKEY2,KEYS3
		LCALL	YS				;等待5MS
		MOV		KEYCODE,#03H	;判断是否真的按下
		SJMP	KEYSEND
KEYS3:	JB		DKEY3,KEYS4
		LCALL	YS				;等待5MS
		MOV		KEYCODE,#04H	;判断是否真的按下
		SJMP	KEYSEND
KEYS4:	JB		DKEY4,MAIN
		LCALL	YS				;等待5MS
		MOV		KEYCODE,#05H	;判断是否真的按下
		
KEYSEND:MOV		R0,#08FH		;(适应4M晶震,12M晶震情况下该值为FF)
DEALOP1:MOV		A,P2			;判断按键是否抬起
		ANL		A,#00111111B
		CPL		A
		JNZ	    DEALOP2	 	    ;按键没有抬起,等待抬起
		SJMP	KEYSGO			;如果抬起则接着走
DEALOP2:MOV		R1,#0FFH
		DJNZ	R1,$
		DJNZ	R0,DEALOP1		;如果在指定的时间内还没有抬起则执行该按键功能
KEYSGO:	LCALL	KEYDEAL
		SJMP	MAIN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;按键处理程序
;;SYSMODE:系统工作模式
;;1-->波形模式选择
;;2-->频率调整模式
;;3-->振幅调整模式
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEYDEAL:MOV		R0,SYSMODE		;判断系统工作模式
		CJNE	R0,#1,CMODE1	;是否为波形选择模式
		LCALL	WAVEDEAL		;是波形选择,转到波形选择处理
		SJMP	KEYDRET
CMODE1:	CJNE	R0,#2,CMODE2	;是否为频率调整模式
		LCALL	FREQDEAL		;是频率调整模式,转到频率调整处理
		SJMP	KEYDRET
CMODE2:	CJNE	R0,#3,KEYDRET	;是否为振幅调整模式
		LCALL	AMDEAL			;是调幅模式,转到调幅处理
KEYDRET:RET	

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;波形选择处理程序
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WAVEDEAL:	MOV		R0,KEYCODE	;判断按键码
			CJNE	R0,#02H,WAVEKEY1
			;;
WAVEKEY1:	CJNE	R0,#03H,WAVEKEY2
			;;
WAVEKEY2:	CJNE	R0,#04H,WAVEKEY3
			;;
WAVEKEY3:	CJNE	R0,#05H,WAVEEND
			;;
WAVEREFE:	LCALL	REDISWAVE		;刷新波形显示

WAVEEND:	RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;频率调整处理程序
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
FREQDEAL:	MOV		R0,KEYCODE	;判断按键码
			CJNE	R0,#02H,FREQKEY1
			;;
FREQKEY1:	CJNE	R0,#03H,FREQKEY2
			;;
FREQKEY2:	CJNE	R0,#04H,FREQKEY3
			;;
FREQKEY3:	CJNE	R0,#05H,FREQEND	
			;;
FREQREFE:	LCALL	REDISFREQ	;刷新频率显示		

FREQEND:	RET	

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;振幅调整处理程序
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AMDEAL:		MOV		R0,KEYCODE	;判断按键码
			CJNE	R0,#02H,AMKEY1
			;;
AMKEY1:		CJNE	R0,#03H,AMKEY2
			;;
AMKEY2:		CJNE	R0,#04H,AMKEY3
			;;
AMKEY3:		CJNE	R0,#05H,AMEND	
			;;
AMREFE:		LCALL	REDISAM		;刷新振幅显示		

AMEND:		RET	

;;------------------------------显示程序------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;波形刷新显示程序
;;1-->正弦波
;;2-->三角波
;;3-->方波
;;默认情况为正弦波
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
REDISWAVE:	MOV     P1,#80H			;设置波形显示起始地址,第一行第一个位置
         	LCALL   WCOMMAND
         	MOV     P1,#01010111B	;'W'			
         	LCALL   WDATA			;显示第一位'W'
         	MOV     P1,#00111010B	;':'			
         	LCALL   WDATA			;显示第二位':'
         	
         	MOV		R0,WAVE_TYPE
			CJNE	R0,#1,DISW1
			MOV     P1,#01110011B	;s'			
         	LCALL   WDATA			;显示第三位's'
         	MOV     P1,#01101001B	;i'			
         	LCALL   WDATA			;显示第四位'i'
         	MOV     P1,#01101110B	;n'			
         	LCALL   WDATA			;显示第五位'n'
			;;
DISW1:		CJNE	R0,#2,DISW2
			MOV     P1,#01110011B	;s'			
         	LCALL   WDATA			;显示第三位's'
         	MOV     P1,#01110001B	;q'			
         	LCALL   WDATA			;显示第四位'q'
         	MOV     P1,#01110110B	;v'			
         	LCALL   WDATA			;显示第五位'v'
			;;
DISW2:		CJNE	R0,#3,DISWEND
			MOV     P1,#01110100B	;'t'			
         	LCALL   WDATA			;显示第三位't'
         	MOV     P1,#01110010B	;r'			
         	LCALL   WDATA			;显示第四位'r'
         	MOV     P1,#01101001B	;i'			
         	LCALL   WDATA			;显示第无位'i'
			;;
DISWEND:	RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;频率值刷新显示程序
;;FREQ_G;频率显示值个位
;;FREQ_S;频率显示值十位
;;FREQ_B;频率显示值百位
;;FREQ_Q;频率显示值千位
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
REDISFREQ:	MOV     P1,#C0H			;设置波形显示起始地址,第二行第一个位置
         	LCALL   WCOMMAND
         	MOV     P1,#01000110B	;'F'			
         	LCALL   WDATA			;显示第一位'F'
         	MOV     P1,#00111010B	;':'			
         	LCALL   WDATA			;显示第二位':'
         	
         	
;;-------------------------液晶屏幕驱动程序---------------------------
;***********写入控制命令字子程序**********************
WCOMMAND:  	CLR       RS;
         	CLR       RW;
         	CLR       E;
         	CALL      F_BUSY;
         	SETB      E;
         	RET

;***********写入数据寄存器***************************
WDATA: 		SETB      RS;
         	CLR       RW;
         	CLR       E;
         	CALL      F_BUSY;
         	SETB      E;
         	RET
;***********查"忙"标志子程序*************************
F_BUSY:  	PUSH      PSW		;
         	PUSH      ACC		;
         	PUSH      0B0H		;P3口进栈保护
         	PUSH      90H		;P1口进栈保护
LOOP:    	MOV       P1,#0FFH 	;判断液晶显示器是否忙的子程序
         	CLR       RS
         	SETB      RW
         	CLR       E
         	NOP
         	SETB      E
         	JB        P1.7,LOOP ;如果P1.7为高电平表示忙就循环等待
         	POP       90H		
         	POP       0B0H		
         	POP       ACC		;不忙,恢复现场返回
         	POP       PSW;
         	RET
;****************延时子程序(5ms)*************************
YS:      	PUSH    01H;
         	PUSH    02H;
         	MOV     R1,#25;
DL5_PA:  	MOV     R2,#100;
         	DJNZ    R2,$;
         	DJNZ    R1,DL5_PA;
         	POP     02H;
         	POP     01H;
         	RET
;**********************测试子程序***************************
TEST:    	MOV       P1,#38H;
         	CLR       RS;
         	CLR       RW;
         	CLR       E;
         	NOP
         	SETB      E;
         	RET
;;-------------------------运算子程序----------------------------------

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;标号:BCDH 功能:单字节BCD码整数转换成单字节十六进制整数
;入口条件:待转换的单字节BCD码整数在累加器A中。
;出口信息:转换后的单字节十六进制整数仍在累加器A中。
;影响资源:PSW、A、B、R4 堆栈需求: 2字节
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BCDH: MOV B,#10H ;分离十位和个位
DIV AB
MOV R4,B ;暂存个位
MOV B,#10 ;将十位转换成十六进制
MUL AB
ADD A,R4 ;按十六进制加上个位
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;标号:BH2 功能:双字节BCD码整数转换成双字节十六进制整数
;入口条件:待转换的双字节BCD码整数在R2、R3中。
;出口信息:转换后的双字节十六进制整数仍在R2、R3中。
;影响资源:PSW、A、B、R2、R3、R4 堆栈需求: 4字节
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BH2: MOV A,R3 ;将低字节转换成十六进制
LCALL BCDH
MOV R3,A
MOV A,R2 ;将高字节转换成十六进制
LCALL BCDH
MOV B,#100 ;扩大一百倍
MUL AB
ADD A,R3 ;和低字节按十六进制相加
MOV R3,A
CLR A
ADDC A,B
MOV R2,A
RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;标号:INCUP
;;功能:二进制频率值加一
;;影响资源:PSW、A、 堆栈需求: 2字节
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

INCUP:
	CLR C			
	MOV A,SECUPL
	ADD A,#01H
	MOV SECUPL,A
	MOV A,SECUPH
	ADDC A,#0H
	MOV SECUPH,A
	RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;标号:DECUP
;;功能:二进制频率值减一
;;影响资源:PSW、A、堆栈需求: 2字节
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DECUP:
	CLR C			
	MOV A,SECUPL
	SUBB A,#01
	MOV SECUPL,A
	MOV A,SECUPH
	SUBB A,#00H
	MOV SECUPH,A
	RET



END
	

⌨️ 快捷键说明

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