STC89C52RC DA0832 方波 锯齿波 三角波 正弦波 Proteus仿真 波形发生器 查表法 按键切换

一 项目综述

本文介绍一种使用基于51单片机汇编语言编程生成矩形波、锯齿波,三角波,正弦波的方案。文末提供keil4汇编程序,prouteus仿真电路。

设计思路:

生成的矩形波有详细的周期计算方法(使用时钟定时),另外三种波形的周期,都是由一些寄存器自加来产生单个数据间的延时。具体周期计算方法,查阅课本根据指令周期结合波形单个周期中数据个数进行计算。

(1)矩形波生产思路

使用时钟定时,并配置时钟中断,当中断触发的时候,反转电平生成矩形波。

(2)锯齿波生成思路

借助51单片机寄存器自加功能,在8位寄存器加到255时清零,重新自加,以此类推,每次自加结束形成锯齿波数据送给DAC,输出对应的模拟量。

(3) 三角波生成思路

具体思路借鉴锯齿波思路,不同的是,在寄存器自加到255后再自减,操作完同样送至DAC芯片。

(4)正弦波生成思路

使用查表的方式生成正弦吧,通过python生成16进制的正弦码表,在程序中隔一段时间给DAC0832送一个值,最后生成正弦波,波形的周期跟送值的间隔时间有关。
正弦波码表生成(python和matlab):
链接: https://blog.csdn.net/jjjjjj12345678/article/details/121762923.

二 DAC0832介绍

1.芯片主要性能:

8位分辨率
电流建立时间1us
数据输入可以采用双缓冲、单缓冲或直通方式
输出电流线性度可在满量程下调节
逻辑电平输入与TTL兼容
单一电源供电(+5V~+15V)
低功耗,20mW

2.该芯片为20引脚双列直插式,引脚定义如下

DAC0832引脚图

三 汇编代码(不完整,文末下载)

代码组织思路:
在主函数中设置死循环,判断四个按键哪个按下,判断按下按键跳到对应波形生成函数。
进入各个波形子函数前先进行按键判断,如果对应标志不符合该函数则跳转到对应的波形生成函数,以此实现按键波形切换。

	Main:	
		MOV		TMOD,#01H
		MOV		TH0,#3CH
		MOV		TL0,#0B0H		;3CB0H,65536-15536=50000us=50ms
		SETB	ET0				;time0
		CLR		TR0				;默认不打开定时器,等方波按钮触发后打开
		SETB 	EA				;总中断打开
		MOV		Count,#00H
        
	While:	;JNB 寻址为0转移					
		JNB  	P1.0,P10		;如果按键P1.0=0,则跳转到P10,一下类似
		JNB  	P1.1,P11		;按键切换波形
		JNB  	P1.2,P12
		JNB  	P1.3,P13
		SJMP	While			;While循环		

	Timer0:
		MOV		TH0,#3CH	;定时器赋值
		MOV		TL0,#0B0H
		MOV		A,Count
		CPL		A			;翻转A,即让变量count翻转构成高低电平,也就是方波
		MOV		Count,A
		RETI

	P10:                    ;R7中的值表示不同的波形,0为方波,1为锯齿,2为三角波,3为正弦
		MOV   	R7,#00H		;根据不同按键跳转到不同的波形生成函数
		LCALL 	SQU			;调用方波函数
		LJMP  	While
	P11:  
		MOV   	R7,#01H
		CLR		TR0			;关闭定时器
		LCALL 	SAW			;调用锯齿波
		LJMP  	While
	P12:  
		MOV   	R7,#02H
		CLR		TR0			;关闭定时器
		LCALL 	TRI			;调用三角波
		LJMP  	While
	P13:  
		MOV   	R7,#03H
		CLR		TR0			;关闭定时器
		LCALL 	SIN			;调用正弦波
		LJMP  	While
		
	SQU:  ;方波子函数
		JNB  	P1.1,N1		;方波,并在此判断按键是否切换,不切换执行方波
		JNB  	P1.2,N2
		JNB  	P1.3,N3
		LJMP 	SSQU
	N1:   
		MOV  	R7,#01H		;否则给R7赋值,并跳转结束
		LJMP 	TC0
	N2:   
		MOV  	R7,#02H
		LJMP 	TC0
	N3:   
		MOV  	R7,#03H
		LJMP 	TC0
		  
	SSQU: 
		CJNE 	R7,#00H,TC0	;比较R7内的值是否为0,不是则跳转TC0
		SETB	TR0 		;方波定时器使能
		MOV  	P0,Count		;给P0=Count,由定时器反转Count
		LJMP 	SQU
	TC0:  
		RET


	SAW:   ;锯齿波子函数
		JNB  	P1.0,N4		;锯齿波,同理继续判断是否有其他按键切换
		JNB  	P1.2,N5
		JNB  	P1.3,N6
		LJMP 	SSAW
	N4:   
		MOV  	R7,#00H		
		LJMP 	TC1
	N5:   
		MOV  	R7,#02H
		LJMP 	TC1
	N6:   
		MOV  	R7,#03H
		LJMP 	TC1
        
	SSAW: 
		CJNE 	R7,#01H,TC1	;不相等转移
		MOV  	R0,#00H
	K10: 
		MOV  	P0,R0		;将寄存器R0中数值变换0-255给P0输出,R3延时
		MOV  	R3,#00H
	L10:  
		INC  	R3
		CJNE 	R3,#255,L10
		INC  	R0			;R0自加
		CJNE 	R0,#255,K10	;如果R0!=255,则跳转K10,如果等于继续执行
		LJMP 	SAW
	TC1:  
		RET

	TRI:     ;三角波子函数
		JNB  	P1.0,N7		;三角波,同理继续判断是否有其他按键切换
		JNB  	P1.1,N8
		JNB  	P1.3,N9
		LJMP 	TTRI
	N8:   
		MOV  	R7,#01H
		LJMP 	TC2
	N9:   
		MOV  	R7,#03H
		LJMP 	TC2	
        
	TTRI: 
		CJNE 	R7,#02H,TC2	;R0的数值先从0-255,然后在从255-0,R3用于延时
		MOV  	R0,#00H
	K20:  
		MOV  	P0,R0
		MOV  	R3,#00H
	K21:  
		MOV  	P0,R0		;R0赋值给P0
		MOV  	R3,#0FFH
	L21:  
		DEC  	R3
		CJNE 	R3,#0,L21
		DEC  	R0			;R0的数值先从255-0,R3用于延时	
		CJNE 	R0,#0,K21
		LJMP 	TRI
	TC2:  
		RET

;延时由R3决定,256个INC指令,大概256个指令周期
	SIN:     ;正弦波子函数
		JNB  	P1.0,N10		;正弦波,同理继续判断是否有其他按键切换
		JNB  	P1.1,N11
		JNB  	P1.2,N12
		LJMP 	SSIN
	N10:  
		MOV  	R7,#00H
		LJMP 	TC3
	N11:  
		MOV  	R7,#01H
		LJMP 	TC3
	N12:  
		MOV  	R7,#02H
		LJMP 	TC3
        
	SSIN: 
		CJNE 	R7,#03H,TC3	 
		MOV 	R0,#00H
	K30:  
		MOV  	A,R0
		MOV 	DPTR,#TAB  	;查表显示sin函数,R3用于延时
		MOVC 	A,@A+DPTR   ;寄存器间接寻址,
		MOV  	P0,A        ;寄存器寻址
		INC  	R0
		MOV  	R3,#00H
	TC3:  
		RET

;256 位离散正弦函数码表
	TAB:  
DB 080H,083H,086H,089H,08CH,090H,093H,096H,099H,09CH,09FH,0A2H,0A5H,0A8H,0ABH,0AEH
DB 0B1H,0B3H,0B6H,0B9H,0BCH,0BFH,0C1H,0C4H,0C7H,0C9H,0CCH,0CEH,0D1H,0D3H,0D5H,0D8H
DB 0DAH,0DCH,0DEH,0E0H,0E2H,0E4H,0E6H,0E8H,0EAH,0EBH,0EDH,0EFH,0F0H,0F1H,0F3H,0F4H
DB 0F5H,0F6H,0F8H,0F9H,0FAH,0FAH,0FBH,0FCH,0FDH,0FDH,0FEH,0FEH,0FEH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FEH,0FEH,0FEH,0FDH,0FDH,0FCH,0FBH,0FAH,0FAH,0F9H,0F8H,0F6H
DB 0F5H,0F4H,0F3H,0F1H,0F0H,0EFH,0EDH,0EBH,0EAH,0E8H,0E6H,0E4H,0E2H,0E0H,0DEH,0DCH
DB 0DAH,0D8H,0D5H,0D3H,0D1H,0CEH,0CCH,0C9H,0C7H,0C4H,0C1H,0BFH,0BCH,0B9H,0B6H,0B3H
DB 0B1H,0AEH,0ABH,0A8H,0A5H,0A2H,09FH,09CH,099H,096H,093H,090H,08CH,089H,086H,083H
DB 080H,07DH,07AH,077H,074H,070H,06DH,06AH,067H,064H,061H,05EH,05BH,058H,055H,052H
DB 04FH,04DH,04AH,047H,044H,041H,03FH,03CH,039H,037H,034H,032H,02FH,02DH,02BH,028H
DB 026H,024H,022H,020H,01EH,01CH,01AH,018H,016H,015H,013H,011H,010H,0FH,0DH,0CH
DB 0BH,0AH,08H,07H,06H,06H,05H,04H,03H,03H,02H,02H,02H,01H,01H,01H
DB 01H,01H,01H,01H,02H,02H,02H,03H,03H,04H,05H,06H,06H,07H,08H,0AH
DB 0BH,0CH,0DH,0FH,010H,011H,013H,015H,016H,018H,01AH,01CH,01EH,020H,022H,024H
DB 026H,028H,02BH,02DH,02FH,032H,034H,037H,039H,03CH,03FH,041H,044H,047H,04AH,04DH
DB 04FH,052H,055H,058H,05BH,05EH,061H,064H,067H,06AH,06DH,070H,074H,077H,07AH,07DH
      END

四 仿真图

在这里插入图片描述

五 结果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六 下载

STC89C52RC_汇编_DAC_矩形、锯齿、三角、正弦(谢谢大家支持!)
链接: https://download.csdn.net/download/jjjjjj12345678/57680552.

版权声明:本文为CSDN博主「悄悄。」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jjjjjj12345678/article/details/121766752

生成海报
点赞 0

悄悄。

我还没有学会写个人说明!

暂无评论

相关推荐

RT-Thread Studio移植LAN8720A驱动

RTT网络协议栈驱动移植(霸天虎) 1、新建工程 ​ 工程路径不含中文路径名,工程名用纯英文不含任何符号。 2、用CubeMx配置板子外设 2.1、配置时钟 ​ 按照自己板子配置相应时钟。

【STM32Cube笔记】12-配置外部中断

【STM32Cube笔记】系列文章目录 1-基于STM32的VSCode入门级教程前言 2-STM32Cube安装教程 3-STM32CubeIDE汉化 4-STM32Cube配置时钟设置 5-跑马灯引脚配置 6-Cortex-M7内核基本配

stm32cubemx+HAL+串口接收中断

stm32cubemxHAL串口接收中断 在cubemx配置完串口和global interrupt后需要在keil中添加如下代码。 第一步:在main函数中添加接收中断标志位开启函数 HAL_UART_Receive_IT