文章目录[隐藏]
一 项目综述
本文介绍一种使用基于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引脚双列直插式,引脚定义如下
三 汇编代码(不完整,文末下载)
代码组织思路:
在主函数中设置死循环,判断四个按键哪个按下,判断按下按键跳到对应波形生成函数。
进入各个波形子函数前先进行按键判断,如果对应标志不符合该函数则跳转到对应的波形生成函数,以此实现按键波形切换。
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
暂无评论