用c方案一个数字信号发生器.docx
《用c方案一个数字信号发生器.docx》由会员分享,可在线阅读,更多相关《用c方案一个数字信号发生器.docx(22页珍藏版)》请在冰豆网上搜索。
![用c方案一个数字信号发生器.docx](https://file1.bdocx.com/fileroot1/2023-6/8/89038fdd-5807-4780-b0cb-85490223df4b/89038fdd-5807-4780-b0cb-85490223df4b1.gif)
用c方案一个数字信号发生器
任务书
设计内容:
用MCS51和DAC设计一个信号发生器
设计要求:
1.用8031设计一个数字信号发生器
2.波形种类:
方波、三角波、梯形波、锯齿波、正弦波。
3.波形幅值在-5V~+5V之间连续可调。
4.波形频率可调
5.可方便地改变波形的各个参数并有相应的显示。
硬件设计
图1实际电路接线图
总体方案
幅值可调:
本方案里就只有正弦波建了表,表中有256个点。
正弦波通过读取旧表其他四种波形通过自加,后利用ADC0809芯片将滑动变阻器上的电压转化成数字量然后通过软件,对AD取出的值乘以原表<或自加值)再除以FFH建立一张新表来实现调幅输出。
频率可调:
也是通过DAC0832芯片,在AD采样中获取一个值放入入口地址R2中,利用R2做出一个延时程序,来调整波形周期,从而调整了频率。
波形输出:
本实验台的DAC0832芯片的工作模式为双极性模式,即可实现-5V~+5V可调。
数值显示:
利用LCD1602模块来进行动态输出,思路为利用AD值乘以一个峰值<5V)32H,再除以FFH,所得的商做进行BCD处理,再加上30H变成ASCII码便可以输出所调整的数字了。
软件设计
软件设计方案
锯齿波:
A自加1,每次与AD转换结果作处理,处理后的数值建立一张新表,放入外部存储器0000H~00FFH中。
最后读新表,输出波形。
三角波:
A自加2直至00H,每次与AD转换结果作处理,处理后的数值建立一张新表,放于外部存储器0000H~00FFH中。
最后读新表,输出波形。
梯形波:
A每次自加3直至FFH,每次与AD转换结果作处理,结果存入外部存储器0000H~0055H和00AA~00FFH中,后将峰值存入0055H~00FFH中。
最后读新表,输出波形。
方波:
0000H~007FH输出高电平,007FH~00FFH输出低电平,处理后的数值建立一张新表,放入外部存储器0000H~00FFH中。
最后读新表,输出波形。
正弦波:
由于有在内部存储器建表,因此建新表只需要把原表值乘以AD转换值,除以255,输出的商存入外部存储器的0000H~00FFH中。
最后读新表,输出波形。
程序流程图
源程序清单
ORG0000H
SJMPMAIN
ORG0030H
MAIN:
MOVsp,#60h
JNBP1.0,N1。
为0跳转
LCALLFANGB。
为1调用相应波形的子程序
N1:
JNBP1.1,N2
LCALLTIX
N2:
JNBP1.2,N3
LCALLSANJ
N3:
JNBP1.3,N4
LCALLJCHI
N4:
JNBP1.4,N5
LCALLZXXUAN
N5:
SJMPMAIN
JCHI:
LCALLLCD_ST。
锯齿波,LCD_ST清屏子程序
MOVA,#80H。
选中第一行
LCALLWR_COM。
WR_COM是写命令子程序
LCALLWR_DATA。
WR_COM是写数据子程序
MOVDPTR,#DISP3。
显示相应的波形文字
LCALLLISTCHAR。
显示字符串子程序
MOVA,#0C0H。
选中第二行
LCALLWR_COM
MOVDPTR,#TABLE2
LCALLLISTCHAR
LCALLAD_CH。
AD转换子程序,出口地址R1,R2
LCALLVOL_DISP。
显示当前AD结果下的电压值
MOVDPTR,#0000H
MOVR0,#00H
MOVA,#00H
CRE_JC:
。
这里开始建立新表
MOV30H,A
MOVB,R1
MULAB。
将AD转换结果乘以A的值
MOVR5,A。
乘出来的低位
MOVR4,B。
乘出来的高位
MOVR7,#0FFH。
除以255
LCALLD457。
除法子程序,双字节除以单字节子程序,商放入R3
MOVA,R3
MOVX@DPTR,A。
将R3放入外部存储器地址0000H,建立新表
INCDPTR。
外部存储器地址自加1
MOVA,30H
INCA
CJNEA,#00H,CRE_JC。
存满256个跳出来
OUT_JCS:
。
输出新表
MOVDPTR,#0000H
MOVR7,#00H
OUT_JC:
PUSHDPH
PUSHDPL
MOVXA,@DPTR。
从外部存储器读表
MOVDPTR,#7FFFH。
选通0832地址
MOVX@DPTR,A。
将新表的值给0832
POPDPL
POPDPH
INCDPTR。
调整地址指针
INCR7
MOVA,R2。
延时程序,调频用
DJNZR2,$
MOVR2,A
CJNER7,#00H,OUT_JC。
输出256个点跳回
JNBP1.3,END_JC。
判断是否切换了波形
JNBP1.5,AD_JC。
判断是否要调幅调频
JMPOUT_JCS
AD_JC:
LJMPJCHI
END_JC:
RET
FANGB:
。
输出方波
LCALLLCD_ST
MOVA,#80H
LCALLWR_COM
LCALLWR_DATA
MOVDPTR,#DISP0
LCALLLISTCHAR
MOVA,#0C0H
LCALLWR_COM
MOVDPTR,#TABLE2
LCALLLISTCHAR
LCALLAD_CH
LCALLVOL_DISP
MOVDPTR,#0000H
MOV32H,#0FFH。
确定末地址
MOV31H,#00H
MOV33H,#02H
MOVA,#00H
CRE_FB:
。
建立新表
MOVB,R1
MULAB
MOVR5,A。
低位
MOVA,B
MOVR4,A。
高位
MOVR7,#0FFH
LCALLD457
MOVA,R3
MOVX@DPTR,A
MOVA,#0FFH
MOVDPTR,#00FFH
DJNZ33H,CRE_FB。
循环数为2,分别从0000H和00FFH开始存入高低电平
MOV34H,#7FH。
确定占空比
MOVXA,@DPTR
CRE_FB1:
MOV33H,DPL
DEC33H
MOVDPL,33H
MOVX@DPTR,A
DJNZ34H,CRE_FB1
MOV34H,#7FH
MOVDPTR,#0000H
MOVXA,@DPTR
CRE_FB2:
INCDPTR
MOVX@DPTR,A
DJNZ34H,CRE_FB2
OUT_FBS:
。
输出所建的新表
MOVDPTR,#0000H
MOVR7,#00H
OUT_FB:
PUSHDPH
PUSHDPL
MOVXA,@DPTR
MOVDPTR,#7FFFH
MOVX@DPTR,A
POPDPL
POPDPH
INCDPTR
INCR7
MOVA,R2
DJNZR2,$
MOVR2,A
CJNER7,#00H,OUT_FB
JNBP1.0,END_FB。
判断是否有波形切换
JNBP1.5,AD_FB
JMPOUT_FBS
AD_FB:
LJMPFANGB
END_FB:
RET
TIX:
。
输出梯形波
LCALLLCD_ST
MOVA,#80H
LCALLWR_COM
LCALLWR_DATA
MOVDPTR,#DISP1
LCALLLISTCHAR
MOVA,#0C0H
LCALLWR_COM
MOVDPTR,#TABLE2
LCALLLISTCHAR
LCALLAD_CH
LCALLVOL_DISP
MOVDPTR,#0000H
MOV32H,#0FFH。
确定存储末地址
MOV31H,#00H
MOVA,#00H
CRE_TX:
。
建立新表
PUSHDPH
PUSHDPL
MOV30H,A
MOVB,R1
MULAB
MOVR5,A。
低位
MOVA,B
MOVR4,A。
高位
MOVR7,#0FFH
LCALLD457
MOVA,R3
POPDPL
POPDPH
MOVX@DPTR,A
PUSHDPH
PUSHDPL
MOVDPH,31H
MOVDPL,32H
MOVX@DPTR,A
DEC32H。
调整地址指针
POPDPL
POPDPH
INCDPTR
MOVA,DPL
MOVA,30H
INCA。
自加3次,因为分三段存
INCA
INCA
CJNEA,#255,CRE_TX
MOVDPTR,#0054H;从外部存储器OO54H开始的数到00ACH的值都是一样的
MOVXA,@DPTR
MOVR7,#55H。
确定存储末地址
INCDPTR
CRE_TX2:
。
输出新表
MOVX@DPTR,A
INCDPTR
DJNZR7,CRE_TX2
OUT_TXS:
MOVDPTR,#0000H
MOVR7,#00H
OUT_TX:
PUSHDPH
PUSHDPL
MOVXA,@DPTR
MOVDPTR,#7FFFH
MOVX@DPTR,A
POPDPL
POPDPH
INCDPTR
INCR7
MOVA,R2
DJNZR2,$
MOVR2,A
CJNER7,#00H,OUT_TX
JNBP1.1,END_TX;判断是否切换了波形
JNBP1.5,AD_TX
JMPOUT_TXS
AD_TX:
LJMPTIX
END_TX:
RET
SANJ:
。
输出三角波
LCALLLCD_ST
MOVA,#80H
LCALLWR_COM
LCALLWR_DATA
MOVDPTR,#DISP2
LCALLLISTCHAR
MOVA,#0C0H
LCALLWR_COM
MOVDPTR,#TABLE2
LCALLLISTCHAR
LCALLAD_CH
LCALLVOL_DISP
MOVDPTR,#0000H
MOV32H,#0FFH
MOV31H,#00H
MOVA,#00H
CRE_SJ:
PUSHDPH
PUSHDPL
MOV30H,A
MOVB,R1
MULAB
MOVR5,A。
低位
MOVA,B
MOVR4,A。
高位
MOVR7,#0FFH
LCALLD457
MOVA,R3
POPDPL
POPDPH
MOVX@DPTR,A
PUSHDPH
PUSHDPL
MOVDPH,31H
MOVDPL,32H
MOVX@DPTR,A
DEC32H。
调整地址指针
POPDPL
POPDPH
INCDPTR
MOVA,30H
INCA。
自加2次,因为是分两段存的
INCA
CJNEA,#00H,CRE_SJ
OUT_SJS:
MOVDPTR,#0000H。
输出新表
MOVR7,#00H
OUT_SJ:
PUSHDPH
PUSHDPL
MOVXA,@DPTR
MOVDPTR,#7FFFH
MOVX@DPTR,A
POPDPL
POPDPH
INCDPTR
INCR7
MOVA,R2
DJNZR2,$
MOVR2,A
CJNER7,#00H,OUT_SJ
JNBP1.2,END_SJ。
判断是否有波形切换
JNBP1.5,AD_SJ
JMPOUT_SJS
AD_SJ:
LJMPSANJ
END_SJ:
RET
ZXXUAN:
LCALLLCD_ST。
输出正弦波
MOVA,#80H
LCALLWR_COM
LCALLWR_DATA
MOVDPTR,#DISP4
LCALLLISTCHAR
MOVA,#0C0H
LCALLWR_COM
MOVDPTR,#TABLE2
LCALLLISTCHAR
LCALLAD_CH
LCALLVOL_DISP
MOVDPTR,#0000H
MOVA,#00H
CRE_ZX:
。
建立新表
PUSHDPH
PUSHDPL
MOVR7,A
MOVDPTR,#SIN。
读取旧表
MOVCA,@A+DPTR
MOVB,R1
MULAB。
旧表与AD转换值做乘法
MOVR5,A。
低位
MOVA,B
MOVR4,A。
高位
MOV30H,R7
MOVR7,#0FFH
LCALLD457。
乘出的结果再除以255
MOVR7,30H
MOVA,R3
POPDPL
POPDPH
MOVX@DPTR,A
INCDPTR
MOVA,R7
INCA
CJNEA,#00H,CRE_ZX
OUT_ZXS:
MOVDPTR,#0000H。
输出新表
MOVR7,#00H
OUT_ZX:
PUSHDPH
PUSHDPL
MOVXA,@DPTR
MOVDPTR,#7FFFH
MOVX@DPTR,A
POPDPL
POPDPH
INCDPTR
INCR7
MOVA,R2
DJNZR2,$
MOVR2,A
CJNER7,#00H,OUT_ZX
JNBP1.4,END_ZX。
判断是否切换了波形
JNBP1.5,AD_ZX
JMPOUT_ZXS
AD_ZX:
LJMPZXXUAN
END_ZX:
RET
;D457是双字节除以单字节十六进制数的子程序,入口除数R7,被除数高位R4,低位R5,出口商R3。
D457:
CLRC
MOVA,R4
SUBBA,R7
JCDV50
SETBOV。
;商溢出
RET
DV50:
MOVR6,#8。
求平均值DV51:
MOVA,R5
RLCA
MOVR5,A
MOVA,R4
RLCA
MOVR4,A
MOVF0,C
CLRC
SUBBA,R7
ANLC,/F0
JCDV52
MOVR4,A
DV52:
CPLC
MOVA,R3
RLCA
MOVR3,A
DJNZR6,DV51
MOVA,R4。
四舍五入
ADDA,R4
JCDV53
SUBBA,R7
JCDV54
DV53:
INCR3
DV54:
CLROV
RET
AD_CH:
。
AD转换子程序,每调用一次进行一次AD转换
MOVDPTR,#0BFF8H;通道地址
MOVX@DPTR,A
CALLDELAY。
利用延迟使AD转换结束
MOVXA,@DPTR
MOVR1,A
INCDPTR
MOVX@DPTR,A
CALLDELAY
MOVXA,@DPTR
MOVR2,A
RET
DELAY:
;延时子程序,延时4MS
PUSHPSW
PUSHACC
PUSHDPL
PUSHDPH
MOVR5,#0FFH
MOVR6,#10H
SDEL:
DJNZR5,SDEL
MOVR5,#0FFH
DJNZR6,SDEL
POPDPH
POPDPL
POPACC
POPPSW
RET
EBITP2.4
RSBITP2.3
RWBITP2.2
。
LCD写指令子函数
。
A入口参数
WR_COM:
CLRE
CLRRS
CLRRW
SETBE
MOVP0,A
CLRE
LCALLDELAY_LCD
RET
。
LCD写数据子函数
。
A入口参数
WR_DATA:
CLRE
SETBRS
CLRRW
SETBE
MOVP0,A
CLRE
LCALLDELAY_LCD
RET
。
LCD初始化子函数
LCD_ST:
CLRE
MOVA,#01H
LCALLWR_COM
MOVA,#38H
LCALLWR_COM
MOVA,#0EH
LCALLWR_COM
MOVA,#06H
LCALLWR_COM
RET
。
LCD在指定坐标显示一串字符子程序
。
入口参数DPTR(#DISPX表地址>
LISTCHAR:
MOVA,#0
MOV50H,A
MOVCA,@A+DPTR
TZH:
LCALLWR_DATA
MOVA,50H
INCA
MOV50H,A
MOVCA,@A+DPTR
CJNEA,#0FFH,TZH
RET
DELAY_LCD:
。
显示延迟子程序
MOVR6,#3。
DEL:
MOVR7,#250
DJNZR7,$
DJNZR6,DEL
RET
。
双字节十六进制整数转换为三字节BCD码整数子程序。
。
入口条件:
待转换的双字节十六进制整数在R6、R7中。
。
出口信息:
转换后的三字节BCD码整数在R3、R4、R5中。
。
影响资源:
PSW、A、R2~R7堆栈需求:
2字节
HB2:
CLRA。
BCD码初始化
MOVR3,A
MOVR4,A
MOVR5,A
MOVR2,#10H。
转换双字节十六进制整数
HB3:
MOVA,R7。
从高端移出待转换数的一位到CY中
RLCA
MOVR7,A
MOVA,R6
RLCA
MOVR6,A
MOVA,R5。
BCD码带进位自身相加,相当于乘2
ADDCA,R5
DAA。
十进制调整
MOVR5,A
MOVA,R4
ADDCA,R4
DAA
MOVR4,A
MOVA,R3
ADDCA,R3
MOVR3,A。
双字节十六进制数的万位数不超过6,不用调整
DJNZR2,HB3。
处理完16BIT
RET
。
入口R1,使用资源R3,R4,R5,R6,R7,41H,42H,43H
;赋值跟随显示子程序
VOL_DISP:
MOVA,#64H。
最大电压值对应64H
MOVB,A
MOVA,R1
MULAB