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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

任务书
设计内容:用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中。

最后读新表,输出波形。

程序流程图
源程序清单
ORG 0000H
SJMP MAIN
ORG 0030H
MAIN: MOV sp,#60h
JNB P1.0,N1 。

为0 跳转
LCALL FANGB 。

为1 调用相应波形的子程序
N1: JNB P1.1,N2
LCALL TIX
N2: JNB P1.2,N3
LCALL SANJ
N3: JNB P1.3,N4
LCALL JCHI
N4: JNB P1.4,N5
LCALL ZXXUAN
N5: SJMP MAIN
JCHI: LCALL LCD_ST 。

锯齿波,LCD_ST清屏子程序
MOV A,#80H 。

选中第一行
LCALL WR_COM 。

WR_COM是写命令子程序
LCALL WR_DATA 。

WR_COM是写数据子程序
MOV DPTR,#DISP3 。

显示相应的波形文字
LCALL LISTCHAR 。

显示字符串子程序
MOV A,#0C0H 。

选中第二行
LCALL WR_COM
MOV DPTR,#TABLE2
LCALL LISTCHAR
LCALL AD_CH 。

AD转换子程序,出口地址 R1,R2
LCALL VOL_DISP 。

显示当前AD结果下的电压值
MOV DPTR,#0000H
MOV R0,#00H
MOV A,#00H
CRE_JC: 。

这里开始建立新表
MOV 30H,A
MOV B,R1
MUL AB 。

将AD转换结果乘以A的值
MOV R5,A 。

乘出来的低位
MOV R4,B 。

乘出来的高位
MOV R7,#0FFH。

除以255
LCALL D457 。

除法子程序,双字节除以单字节子程序,商放入R3 MOV A,R3
MOVX @DPTR,A。

将R3放入外部存储器地址0000H,建立新表
INC DPTR 。

外部存储器地址自加1
MOV A,30H
INC A
CJNE A,#00H,CRE_JC 。

存满256个跳出来
OUT_JCS: 。

输出新表
MOV DPTR,#0000H
MOV R7,#00H
OUT_JC:
PUSH DPH
PUSH DPL
MOVX A,@DPTR 。

从外部存储器读表
MOV DPTR,#7FFFH 。

选通0832地址
MOVX @DPTR,A 。

将新表的值给0832
POP DPL
POP DPH
INC DPTR 。

调整地址指针
INC R7
MOV A,R2 。

延时程序,调频用
DJNZ R2 ,$
MOV R2,A
CJNE R7,#00H,OUT_JC。

输出256个点跳回
JNB P1.3,END_JC 。

判断是否切换了波形 JNB P1.5, AD_JC 。

判断是否要调幅调频JMP OUT_JCS
AD_JC:LJMP JCHI
END_JC:RET
FANGB: 。

输出方波
LCALL LCD_ST
MOV A,#80H
LCALL WR_COM
LCALL WR_DATA
MOV DPTR,#DISP0
LCALL LISTCHAR
MOV A,#0C0H
LCALL WR_COM
MOV DPTR,#TABLE2
LCALL LISTCHAR
LCALL AD_CH
LCALL VOL_DISP
MOV DPTR,#0000H
MOV 32H,#0FFH 。

确定末地址
MOV 31H,#00H
MOV 33H,#02H
MOV A,#00H
CRE_FB: 。

建立新表
MOV B,R1
MUL AB
MOV R5,A 。

低位
MOV A,B
MOV R4,A 。

高位
MOV R7,#0FFH
LCALL D457
MOV A,R3
MOVX @DPTR,A
MOV A ,#0FFH
MOV DPTR,#00FFH
DJNZ 33H,CRE_FB 。

循环数为2,分别从0000H和00FFH开始存入高低电平
MOV 34H,#7FH 。

确定占空比
MOVX A,@DPTR
CRE_FB1: MOV 33H,DPL
DEC 33H
MOV DPL ,33H
MOVX @DPTR,A
DJNZ 34H,CRE_FB1
MOV 34H,#7FH
MOV DPTR,#0000H
MOVX A,@DPTR
CRE_FB2: INC DPTR
MOVX @DPTR,A
DJNZ 34H,CRE_FB2
OUT_FBS: 。

输出所建的新表
MOV DPTR,#0000H
MOV R7,#00H
OUT_FB:
PUSH DPH
PUSH DPL
MOVX A,@DPTR
MOV DPTR,#7FFFH
MOVX @DPTR,A
POP DPL
POP DPH
INC DPTR
INC R7
MOV A,R2
DJNZ R2,$
MOV R2,A
CJNE R7,#00H,OUT_FB
JNB P1.0,END_FB 。

判断是否有波形切换
JNB P1.5,AD_FB
JMP OUT_FBS
AD_FB: LJMP FANGB
END_FB:RET
TIX: 。

输出梯形波
LCALL LCD_ST
MOV A,#80H
LCALL WR_COM
LCALL WR_DATA
MOV DPTR,#DISP1
LCALL LISTCHAR
MOV A,#0C0H
LCALL WR_COM
MOV DPTR,#TABLE2
LCALL LISTCHAR
LCALL AD_CH
LCALL VOL_DISP
MOV DPTR,#0000H
MOV 32H,#0FFH 。

确定存储末地址
MOV 31H,#00H
MOV A,#00H
CRE_TX: 。

建立新表
PUSH DPH
PUSH DPL
MOV 30H,A
MOV B,R1
MUL AB
MOV R5,A 。

低位
MOV A,B
MOV R4,A 。

高位
MOV R7,#0FFH
LCALL D457
MOV A,R3
POP DPL
POP DPH
MOVX @DPTR,A
PUSH DPH
PUSH DPL
MOV DPH,31H
MOV DPL,32H
MOVX @DPTR,A
DEC 32H 。

调整地址指针
POP DPL
POP DPH
INC DPTR
MOV A,DPL
MOV A,30H
INC A 。

自加3次,因为分三段存
INC A
INC A
CJNE A,#255,CRE_TX
MOV DPTR,#0054H ;从外部存储器OO54H开始的数到00ACH的值都是一样的 MOVX A,@DPTR
MOV R7,#55H 。

确定存储末地址
INC DPTR
CRE_TX2: 。

输出新表
MOVX @DPTR, A
INC DPTR
DJNZ R7 ,CRE_TX2
OUT_TXS:MOV DPTR,#0000H
MOV R7,#00H
OUT_TX:
PUSH DPH
PUSH DPL
MOV DPTR,#7FFFH
MOVX @DPTR,A
POP DPL
POP DPH
INC DPTR
INC R7
MOV A,R2
DJNZ R2,$
MOV R2,A
CJNE R7,#00H,OUT_TX
JNB P1.1,END_TX;判断是否切换了波形 JNB P1.5,AD_TX
JMP OUT_TXS
AD_TX: LJMP TIX
END_TX:RET
SANJ: 。

输出三角波
LCALL LCD_ST
MOV A,#80H
LCALL WR_COM
LCALL WR_DATA
MOV DPTR,#DISP2
LCALL LISTCHAR
MOV A,#0C0H
LCALL WR_COM
MOV DPTR,#TABLE2
LCALL LISTCHAR
LCALL AD_CH
LCALL VOL_DISP
MOV DPTR,#0000H
MOV 32H,#0FFH
MOV 31H,#00H
MOV A,#00H
CRE_SJ:
PUSH DPH
PUSH DPL
MOV 30H,A
MOV B,R1
MUL AB
MOV R5,A 。

低位
MOV A,B
MOV R4,A 。

高位MOV R7,#0FFH
LCALL D457
MOV A,R3
POP DPL
POP DPH
MOVX @DPTR,A
PUSH DPH
PUSH DPL
MOV DPL,32H
MOVX @DPTR,A
DEC 32H 。

调整地址指针
POP DPL
POP DPH
INC DPTR
MOV A,30H
INC A 。

自加2次,因为是分两段存的INC A
CJNE A,#00H,CRE_SJ
OUT_SJS:MOV DPTR,#0000H 。

输出新表
MOV R7,#00H
OUT_SJ:
PUSH DPH
PUSH DPL
MOVX A,@DPTR
MOV DPTR,#7FFFH
MOVX @DPTR,A
POP DPL
POP DPH
INC DPTR
INC R7
MOV A,R2
DJNZ R2,$
MOV R2,A
CJNE R7,#00H,OUT_SJ
JNB P1.2,END_SJ。

判断是否有波形切换
JNB P1.5,AD_SJ
JMP OUT_SJS
AD_SJ: LJMP SANJ
END_SJ:RET
ZXXUAN:LCALL LCD_ST 。

输出正弦波
MOV A,#80H
LCALL WR_COM
LCALL WR_DATA
MOV DPTR,#DISP4
LCALL LISTCHAR
MOV A,#0C0H
LCALL WR_COM
MOV DPTR,#TABLE2
LCALL LISTCHAR
LCALL AD_CH
LCALL VOL_DISP
MOV DPTR,#0000H
MOV A,#00H
CRE_ZX: 。

建立新表
PUSH DPH
PUSH DPL
MOV R7,A
MOV DPTR,#SIN 。

读取旧表
MOVC A,@A+DPTR
MOV B,R1
MUL AB 。

旧表与AD转换值做乘法
MOV R5,A 。

低位
MOV A,B
MOV R4,A 。

高位
MOV 30H,R7
MOV R7,#0FFH
LCALL D457 。

乘出的结果再除以255
MOV R7,30H
MOV A,R3
POP DPL
POP DPH
MOVX @DPTR,A
INC DPTR
MOV A,R7
INC A
CJNE A,#00H,CRE_ZX
OUT_ZXS:MOV DPTR,#0000H。

输出新表
MOV R7,#00H
OUT_ZX:
PUSH DPH
PUSH DPL
MOVX A,@DPTR
MOV DPTR,#7FFFH
MOVX @DPTR,A
POP DPL
POP DPH
INC DPTR
INC R7
MOV A,R2
DJNZ R2 ,$
MOV R2,A
CJNE R7,#00H,OUT_ZX
JNB P1.4,END_ZX 。

判断是否切换了波形
JNB P1.5,AD_ZX
JMP OUT_ZXS
AD_ZX: LJMP ZXXUAN
END_ZX:RET
;D457是双字节除以单字节十六进制数的子程序,入口除数R7,被除数高位R4,低位R5,出口商R3。

D457: CLR C
MOV A,R4
SUBB A,R7
JC DV50
SETB OV 。

;商溢出
RET
DV50: MOV R6,#8 。

求平均值<R4R5/R7-→R3)
DV51: MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DV52
MOV R4,A
DV52: CPL C
MOV A,R3
RLC A
MOV R3,A
DJNZ R6,DV51
MOV A,R4 。

四舍五入
ADD A,R4
JC DV53
SUBB A,R7
JC DV54
DV53: INC R3
DV54: CLR OV
RET
AD_CH: 。

AD转换子程序,每调用一次进行一次AD转换 MOV DPTR,#0BFF8H ;通道地址
MOVX @DPTR,A
CALL DELAY 。

利用延迟使AD转换结束
MOVX A,@DPTR
MOV R1,A
INC DPTR
MOVX @DPTR,A
CALL DELAY
MOVX A,@DPTR
MOV R2,A
RET
DELAY: ;延时子程序,延时4MS
PUSH PSW
PUSH ACC
PUSH DPL
PUSH DPH
MOV R5,#0FFH
MOV R6,#10H
SDEL: DJNZ R5,SDEL
MOV R5,#0FFH
DJNZ R6,SDEL
POP DPH
POP DPL
POP ACC
POP PSW
RET
E BIT P2.4
RS BIT P2.3
RW BIT P2.2。

LCD 写指令子函数。

A 入口参数
WR_COM:CLR E
CLR RS
CLR RW
SETB E
MOV P0,A
CLR E
LCALL DELAY_LCD
RET。

LCD 写数据子函数。

A 入口参数
WR_DATA:CLR E
SETB RS
CLR RW
SETB E
MOV P0,A
CLR E
LCALL DELAY_LCD
RET。

LCD 初始化子函数
LCD_ST: CLR E
MOV A, #01H
LCALL WR_COM
MOV A, #38H
LCALL WR_COM
MOV A, #0EH
LCALL WR_COM
MOV A, #06H
LCALL WR_COM
RET。

LCD 在指定坐标显示一串字符子程序。

入口参数 DPTR(#DISP X表地址> LISTCHAR: MOV A, #0
MOV 50H, A
MOVC A,@A+DPTR
TZH:
LCALL WR_DATA
MOV A, 50H
INC A
MOV 50H, A
MOVC A,@A+DPTR
CJNE A, #0FFH,TZH
RET
DELAY_LCD: 。

显示延迟子程序
MOV R6, #3 。

DEL: MOV R7, #250
DJNZ R7, $
DJNZ R6, DEL
RET。

双字节十六进制整数转换为三字节BCD码整数子程序。

入口条件:待转换的双字节十六进制整数在R6、R7中。

出口信息:转换后的三字节BCD码整数在R3、R4、R5中。

影响资源:PSW、A、R2~R7 堆栈需求:2字节
HB2: CLR A 。

BCD码初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H 。

转换双字节十六进制整数
HB3:MOV A,R7 。

从高端移出待转换数的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 。

BCD码带进位自身相加,相当于乘2ADDCA,R5
DA A 。

十进制调整
MOV R5 ,A
MOV A,R4
ADDCA,R4
DA A
MOV R4,A
MOV A,R3
ADDCA,R3
MOV R3,A 。

双字节十六进制数的万位数不超过6,不用调整DJNZ R2,HB3 。

处理完16BIT
RET。

入口R1,使用资源R3,R4,R5,R6,R7,41H,42H,43H
;赋值跟随显示子程序
VOL_DISP:
MOV A,#64H 。

最大电压值对应64H
MOV B,A
MOV A,R1
MUL AB。

相关文档
最新文档