用c方案一个数字信号发生器.docx

上传人:b****9 文档编号:25412093 上传时间:2023-06-08 格式:DOCX 页数:22 大小:82.68KB
下载 相关 举报
用c方案一个数字信号发生器.docx_第1页
第1页 / 共22页
用c方案一个数字信号发生器.docx_第2页
第2页 / 共22页
用c方案一个数字信号发生器.docx_第3页
第3页 / 共22页
用c方案一个数字信号发生器.docx_第4页
第4页 / 共22页
用c方案一个数字信号发生器.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

用c方案一个数字信号发生器.docx

《用c方案一个数字信号发生器.docx》由会员分享,可在线阅读,更多相关《用c方案一个数字信号发生器.docx(22页珍藏版)》请在冰豆网上搜索。

用c方案一个数字信号发生器.docx

用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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1