用c方案一个数字信号发生器.docx
- 文档编号:25412093
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:22
- 大小:82.68KB
用c方案一个数字信号发生器.docx
《用c方案一个数字信号发生器.docx》由会员分享,可在线阅读,更多相关《用c方案一个数字信号发生器.docx(22页珍藏版)》请在冰豆网上搜索。
用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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 方案 一个 数字信号 发生器