基于51单片机的波形发生器汇编语言proteus仿真

链接:https://pan.baidu.com/s/1jUHhVUiVOdTTCy2MHmFcCg
提取码:1234

功能:

  1. 系统采用STC89C52作为单片机
  2. 采用汇编语言撰写
  3. 可产生三角波、方波、正弦波三种波形
  4. 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
;全屏写命令

.

  • 6
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值