6、DA0832(幅频可调正弦波发生器)实验

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

实验六D/A0832(幅频可调正弦波发生器)实验
1.实验目的
(1)了解D/A转换与单片机的接口方法;掌握D/A转换芯片DA0832的性能及编程方法。

(2)掌握通过DA0832数字合成正弦波形信号的方法。

(3)掌握正弦波形信号幅度、频率调节的软件处理方法。

2.实验内容
单片机P1口与4个按键连接,用于信号幅度和频率调节操作键。

单片机P0、P2.7、P3.6(-WR)与DA0832、2个741(运放)连接构成波形信号输出电路。

编程使波形信号输出电路输出正弦波信号,并且可通过操作键调节信号的幅度和频率。

幅度和频率调节级别从0~10,共11个等级。

3.实验器材
(1)Proteus仿真软件
(2)keil C51开发环境软件
4.实验原理
(1)外扩模拟输出口——利用单片机总线功能,通过单片机的P0、P2.7、P3.6(-WR)与DA0832、1个741(运放)连接,可外扩一个模拟输出口;该口在经过1个741(运放)的单到双信号变换处理,可输出双极性波形信号。

(2)通过“正弦表.exe”软件产生8位量化级数和36个采样点数的正弦波信号波表数组数据。

通过DA0832双极性波形信号电路顺序输出波表数组数据中的数据,可实现数字合成的正弦波信号。

(3)通过调节(键操作)顺序输出波表数据的时间间隔延时,可改变正弦信号的频率。

时间间隔延时控制参数TC=0~10,共有11个等级。

(4)通过调节(键操作)比例系数,将比例系数乘于波表中各个数据,可改变正弦信号的幅度。

幅度调整的计算公式解释如下:
y=x×K+(1-K)×128 公式(1)
其中:x原波表数据;y调整后的波表数据;K比例系数;(1-K)×128用于双极性信号输出位移调整。

为了提高计算速度,所有参与运算参数采用整型变量,比例系数K可变换成如下形式:K=RC÷10 公式(2)
其中:R C幅度控制参数。

R C=0~10(11个等级),K=0~1。

将公式(1)带入公式(2),求得新的幅度调整计算公式如下:
y=x×RC÷10+128-128×RC÷10 公式(3)
5.实验电路原理图
7.实验步骤
(1)按照“5.实验电路原理图”,用proteus绘制原理图。

(2)用keil C51开发环境软件,按照“6.程序流程图”,编写、调试和运行C51处理程序(提示:可参考课堂练习10_4.C和“8_3(双机通信测试)”功能程序FUNCTION.C中的按键扫描函数。

)。

(3)观察和记录幅度调节最大时,波形电压的峰峰值。

(4)观察和记录频率调节最大和最小时,波形的最小和最大周期时间。

(将绘制的原理图和编写、调试和运行的处理程序存放在自己所带的USB盘中。


9.撰写实验报告
(1)预习
(2)原始记录——“7.实验步骤”中的(2)(3)(4)内容。

(3)实验报告内容
6.程序框图
按键扫描子程序可参考课堂练习“8_3(双机通信测试)”功能程序FUNCTION.C中的按键扫描函数。

/* 【例10-2】要求在图10-3输出端输出锯齿波电压,产生频率随意,幅值为5V,见图10-5。

用C语言编程,程序如下:
*/
//用C语言编程,程序如下:
#include <regx51.h>
//#include <absacc.h>
//#define da0832 XBYTE[0x7fff]
#define uchar unsigned char
#define uint unsigned int
uchar keyscan(void); //keyscan routine
void delay_10ms(void); //10ms delay routine
void scale(uchar kk); //比例计算
uchar xdata da0832 _at_ 0x7fff;
uchar code dot1[36]={0x80,0x96,0xab,0xbf,0xd2,0xe2,0xee,0xf8,0xfe, //正弦
波数据
0xff,0xfe,0xf8,0xee,0xe2,0xd2,0xc0,0xab,0x96,
0x80,0x69,0x54,0x40,0x2d,0x1e,0x11,0x7 ,0x1 ,
0x0 ,0x1 ,0x7 ,0x10,0x1d,0x2d,0x3f,0x53,0x69};
uchar data dot[36]={0x80,0x96,0xab,0xbf,0xd2,0xe2,0xee,0xf8,0xfe, //正弦波数据
0xff,0xfe,0xf8,0xee,0xe2,0xd2,0xc0,0xab,0x96,
0x80,0x69,0x54,0x40,0x2d,0x1e,0x11,0x7 ,0x1 ,
0x0 ,0x1 ,0x7 ,0x10,0x1d,0x2d,0x3f,0x53,0x69};
uchar TC=10,RC=10;
main()
{ unsigned char i,j,temp;
P1=(RC<<4) | 0x0f;
P3=TC | 0xf0;
while(1)
{ for(i=0;i<36;i++)
{ da0832=dot[i]; /*输出数据,启动转换*/
for(j=0;j<TC+5;j++) temp=keyscan(); /*延时*/
if(temp != 0x0f) //有键按下,幅频调整。

{ if( temp == 0 && TC<10) P3=++TC | 0xf0;//TC++; //频率减,并且显示频率系数
else if(temp == 1 && TC>0 ) P3=--TC | 0xf0;//TC--; //频率增,并且显示频率系数
else if(temp == 2 && RC>0 ) scale(--RC);//幅度减,调用比例计算函
else if(temp == 3 && RC<10) scale(++RC);//幅度增,调用比例计算函
}
}
}
}
void scale(uchar kk)
{ uchar i;
for(i=0;i<36;i++) dot[i]=dot1[i]*kk/10+128-128*kk/10;
P1=(kk<<4) | 0x0f; //显示幅度系数
}
uchar keyscan() //keyscan routine
{ uchar temp,keycode = 0;
//P1 = 0xff;
temp = P1 & 0x0f;
if( temp != 0x0f)
{ delay_10ms();
temp = P1 & 0x0f;
if( temp != 0x0f)
{ if( P1_0 == 0) return 0;
else if (P1_1 == 0) return 1;
else if (P1_2 == 0) return 2;
else if (P1_3 == 0) return 3;
}
}
return 0x0f;
}
void delay_10ms() //10ms delay routine
{ uint i;
for(i = 0; i < 2500; i++);
}。

相关文档
最新文档