基于DA转换模块的单片机仿真和C语言开发.docx
《基于DA转换模块的单片机仿真和C语言开发.docx》由会员分享,可在线阅读,更多相关《基于DA转换模块的单片机仿真和C语言开发.docx(26页珍藏版)》请在冰豆网上搜索。
基于DA转换模块的单片机仿真和C语言开发
基于DA转换模块的单片机仿真和C语言开发
1、系统设计
经过考虑,我们确定方案如下:
利用AT89S52单片机采用程序设计方法产生锯齿波、正弦波、矩形波三种波形,再通过D/A转换器DAC0832将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,通过键盘来控制三种波形的类型选择、频率变化,最终输出显示其各自的类型以及数值。
1.1设计要求
设计一种采用D/A转换的波形发生器,比如产生矩形波、三角波、锯齿波、梯形波或正弦波及余弦波。
要求进行电路仿真实验,并使用C语言进行程序的开发。
1.1.1课题的来源与技术背景
不论是在生产还是在科研与教学上,信号发生器都是电子工程师仿真实验的最佳工具。
随着我国经济和科技的发展,对相应的测试仪器和测试手段也提出了更高的要求,信号发生器己成为测试仪器中至关重要的一类,因此开发信号发生器具有重大意义。
传统的信号发生器采用专用芯片,成本高,控制方式不灵活。
本设计充分利用单片机灵活的控制、丰富的外设处理能力,采用DDS技术,实现频率、幅值可调的函数波形的输出,同时可以根据需要方便地实现各种比较复杂的调频、调相和调幅功能,具有良好的实用性。
根据其频率发生方法又可分为谐振法和合成法两种。
一般的传统发生器都是采用的谐振法,即用具有频率选择性的回路来产生正弦振荡,来获得所需频率,也可以根据频率合成技术来获得所需频率。
利用频率合成技术制成的合成波形发生器,通常被称为频率合成器或频率综合器。
频率综合器是指利用频率合成技术合成的频率源,它常常是没有调制的,也没有足够宽的和足够准确的输出电平调节,其工作范围往往也不宽,最小频率间隔也比较大,一般做专用设备使用,或做某一个系统中的一个组成部分。
1.1.2研究信号发生器的目的及意义
波形发生器是信号源的一种,主要给被测电路提供所需要的己知信号(各种波形),然后用其它仪表测量感兴趣的参数。
可见信号源在各种实验应用和试验测试处理中,它的应用非常广泛。
它不是测量仪器,而是根据使用者的要求,作为激励源,仿真各种测试信号,提供给被测电路,以满足测量或各种实际需要。
目前我国己经开始研制波形发生器,并取得了可喜的成果。
但总的来说,我国波形发生器还没有形成真正的产业。
就目前国内的成熟产品来看,多为一些PC仪器插卡,独立的仪器和VXI系统的模块很少,并且我国目前在波形发生器的种类和性能都与国外同类产品存在较大的差距,因此加紧对这类产品的研制显得迫在眉睫。
函数波形发生器发展很快近几年来,国际上波形发生器技术发展主要体现在以下几个方面:
(1)过去由于频率很低应用的范围比较狭小,输出波形频率的提高,使得波形发生器能应用于越来越广的领域。
波形发生器软件的开发正使波形数据的输入变得更加方便和容易。
波形发生器通常允许用一系列的点、直线和固定的函数段把波形数据存入存储器。
同时可以利用一种强有力的数学方程输入方式,复杂的波形可以由几个比较简单的公式复合成v=f(t)形式的波形方程的数学表达式产生。
从而促进了波形发生器向任意波形发生器的发展,各种计算机语言的飞速发展也对任意波形发生器软件技术起到了推动作用。
目前可以利用可视化编程语言(如VisualBasic,VisualC等等)编写任意波形发生器的软面板,这样允许从计算机显示屏上输入任意波形,来实现波形的输入。
(2)与VXI资源结合。
目前,波形发生器由独立的台式仪器和适用于个人计算机的插卡以及新近开发的VXI模块。
由于VXI总线的逐渐成熟和对测量仪器的高要求,在很多领域需要使用VXI系统测量产生复杂的波形,VXI的系统资源提供了明显的优越性,但由于开发VXI模块的周期长,而且需要专门的VXI机箱的配套使用,使得波形发生器VXI模块仅限于航空、军事及国防等大型领域。
在民用方面,VXI模块远远不如台式仪器更为方便。
(3)随着信息技术蓬勃发展,台式仪器在走了一段下坡路之后,又重新繁荣起来。
不过现在新的台式仪器的形态,和几年前的己有很大的不同。
这些新一代台式仪器具有多种特性,可以执行多种功能。
而且外形尺寸与价格,都比过去的类似产品减少了一半。
1.1.3主要研究内容
(1)理论基础分析。
了解波形发生器的相关理论,包括几种常用波形,如正弦波、方波等,然后介绍了波形发生器的主要方案及原理。
(2)硬件系统设计。
主要包括以下几个模块:
键盘、LED显示电路;单片机系统;DAC芯片和放大电路设计。
(3)软件系统设计。
主要有:
系统总体流程设计;单片机程序设计;键盘响应程序设计;LED显示程序设计;DAC控制程序设计。
(4)系统仿真调试。
通过计算机进行模拟仿真调试。
1.2信号发生器的理论分析与设计方案
常用波形介绍
函数波形的一般表达式可以表示为
,下面来介绍几种常用的函数波形[3]:
1.2.1正弦函数
正弦信号与余弦信号,两者只是在相位上相差2π,可以统称为正弦信号。
其一般形式为
f(t)=Asin(ωt+θ)
(1)
式中,A为振幅,ω是角频率,θ为初相位。
上述三量是正弦信号的三要素。
它的波形见图1。
正弦信号是周期信号,其周期T与频率f及角频率ω之间的关系为:
(2)
图1正弦波形
在实际应用中经常遇到单边指数衰减的正弦信号,其波形如图2所示,表达式为:
(3)
图2指数衰减的正弦信号波形
1.2.2方波波形函数
方波函数是一种常用的波形函数,其表达式为:
(4)
方波的波形如图2-3所示:
图3方波波形
1.3设计方案
目前信号发生的主要实现方法由直接模拟法、直接数字法两种。
1.3.1直接模拟法
图4直接模拟法框图
这是传统函数发生器的简化基本结构,一般都是由自由振荡器产生原始波形,然后经过转换电路将原始波形转换成其他波形,在上图中三角波是由振荡器产生的,方波是三角波通过比较器转变而成的,正弦波是三角波通过一个波形整形电路(正弦波整形器)演变而来的,所需要波形经过放大和衰减输出,显然这种方式产生的波形种类有限,每增加一种波形,都要增加相应的转换电路,整个电路变得很复杂,最重要的是要产生用户所需要的任意波形复杂的波形几乎不可能[5]。
1.3.2直接数字法
直接数字法是采用直接数字合成(DirectDigitalSynthesis)的方法实现信号产生。
该技术具有频率转换速度快、频率分辨率高、易于控制的突出特点。
直接数字合成技术近年来发展得很快,而要产生任意波形就必须采用直接数字很成技术。
随着DDS技术的发展,出现了各种各样的直接数字合成的结构,但基本上可以发成两种:
(1)基于地址计数器的数字频率合成法;
(2)基于相位累加器的数字频率合成法。
由于直接数字法在设计上的的优点,本课题设计采用的是基于地址计数器的直接数字合成法。
1.4方案设计与论证
1.4.1信号发生电路方案论证
方案一:
通过单片机控制D/A,输出三种波形。
此方案输出的波形不够稳定,抗干扰能力弱,不易调节。
但此方案电路简单、成本低。
方案二:
使用传统的锁相频率合成方法。
通过芯片IC145152,压控振荡器搭接的锁相环电路输出稳定性极好的正弦波,再利用过零比较器转换成方波,积分电路转换成三角波。
此方案,电路复杂,干扰因素多,不易实现。
方案三:
利用ADC9851芯片组成的电路输出波形。
ADC9851是精密高频波形产生电路,能够产生准确的三角波、方波和正弦波三种周期性波形。
但此方案成本高,程序复杂度高。
以上三种方案综合考虑,选择方案一。
1.4.2单片机的选择论证
方案一:
AT89S52单片机是一种高性能8位单片微型计算机。
它把构成计算机的中央处理器CPU、存储器、寄存器、I/O接口制作在一块集成电路芯片中,从而构成较为完整的计算机、而且其价格便宜。
方案二:
C8051F005单片机是完全集成的混合信号系统级芯片,具有与8051兼容的微控制器内核,与MCS-51指令集完全兼容。
除了具有标准8052的数字外设部件,片内还集成了数据采集和控制系统中常用的模拟部件和其他数字外设及功能部件,而且执行速度快。
但其价格较贵
以上两种方案综合考虑,选择方案一
1.4.3显示方案论证
方案一:
采用LED数码管。
LED数码管由8个发光二极管组成,每只数码管轮流显示各自的字符。
由于人眼具有视觉暂留特性,当每只数码管显示的时间间隔小于1/16s时人眼感觉不到闪动,看到的是每只数码管常亮。
使用数码管显示编程较易,但要显示内容多,而且数码管不能显示字母。
方案二:
采用LCD液晶显示器1602。
其功率小,效果明显,显示编程容易控制,可以显示字母。
以上两种方案综合考虑,选择方案二。
1.4.4键盘方案论证
方案一:
矩阵式键盘。
矩阵式键盘的按键触点接于由行、列母线构成的矩阵电路的交叉处。
当键盘上没有键闭合时,所有的行和列线都断开,行线都呈高电平。
当某一个键闭合时,该键所对应的行线和列线被短路。
方案二:
独立式键盘。
独立式键盘有一个电源和上拉电阻和按键构成。
当按键按下时,利用单片机查询方式来进行相应的波形显示及频率值。
以上两种方案综合考虑,选择方案二。
1.5总体系统设计
该系统采用单片机作为数据处理及控制核心,由单片机完成人机界面、系统控制、信号的采集分析以及信号的处理和变换,采用按键输入,利用液晶显示电路输出数字显示的方案。
将设计任务分解为按键电路、液晶显示电路等模块。
图
(1)为系统的总体框图
图5总体方框图
1.6硬件实现及单元电路设计
1.6.1单片机最小系统的设计
89C51是片内有ROM/EPROM的单片机,因此,这种芯片构成的最小系统简单﹑可靠。
用80C51单片机构成最小应用系统时,只要将单片机接上时钟电路和复位电路即可,如图
(2)89C51单片机最小系统所示。
由于集成度的限制,最小应用系统只能用作一些小型的控制单元。
其应用特点:
(1)有可供用户使用的大量I/O口线。
(2)内部存储器容量有限。
(3)应用系统开发具有特殊性。
图689C51单片机最小系统
1.6.2波形产生模块设计
由单片机采用编程方法产生三种波形、通过DA转换模块DAC0832在进过滤波放大之后输出。
其电路图如下:
图7波形产生电路
如上图所示,单片机的P0口连接DAC0832的八位数据输入端,DAC0832的输出端接放大器,经过放大后输出所要的波形。
DAC0832的为八位数据并行输入的,其结构图如下:
图8DAC0832的内部结构
1.6.3显示模块的设计
通过液晶1602显示输出的波形、频率,其电路图如下:
图9液晶显示
如上图所示,1602的八位数据端接单片机的P1口,其三个使能端RS、RW、E分别接单片机的P3.2—P3.4。
通过软件控制液晶屏可以显示波形的种类以及波形的频率。
1.6.4键盘显示模块的设计
本系统采用独立键盘,其连接电路图如下:
图10键盘
图中键盘独立键盘引出的八跟线分别接单片机的P2口,只用其第四列,因此在程序初始化时P2.7脚给低电平。
如图开关3用来切换输出波形、开关7和8用来调节频率的加减。
当按开关7时输出波形的频率增加,按开关8时输出波形的频率减小。
1.6.5总体原理设计图
图11总体原理设计图
1.7软件设计流程
本系统采用AT89S52单片机,用编程的方法来产生三种波形,并通过编程
来切换三种波形以及波形频率的改变。
具体功能有:
(1)各个波形的切换;
(2)各种参数的设定;(3)频率增减等。
软件调通后,通过编程器下载到AT89S52芯片中,然后插到系统中即可独立完成所有的控制。
软件的流程图如下:
图12程序流程图
1.8源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitlcdrw=P3^3;
sbitlcdrs=P3^2;
sbitlcde=P3^4;
sbitd=P2^7;
sbits1=P2^0;
sbits2=P2^1;
sbits3=P2^2;
sbitcs=P3^5;
sbitwr=P3^6;
uchars1num,a,ys,j;
uintfre;
ucharcodetosin[256]={
0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,
0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,
0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,
0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,
0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,
0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,
0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,
0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,
0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,
0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,
0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,
0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,
0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,
0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,
0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,
0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,
0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,
0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,
0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66,0x69,0x6c,0x6f,0x72,
0x76,0x79,0x7c,0x80};/*正弦波码*/
voiddelay(uintz)//延时子程序
{
uchari,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
voiddelay1(uinty)
{
uinti;
for(i=y;i>0;i--);
}
voidwrite_com(ucharcom)//1602写指令
{
lcdrs=0;
P1=com;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
voidwrite_data(uchardate)//1602数据
{
lcdrs=1;
P1=date;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
voidinit()//初始化
{
lcdrw=0;
lcde=0;
wr=0;
cs=0;
write_com(0x38);//显示模式设置
write_com(0x08);//显示关闭
write_com(0x01);//显示清屏
write_com(0x06);//写字符时整体不移动
write_com(0x0c);//显示开,不开游标,不闪烁
write_com(0x80+0x00);
write_data(0x77);//写wave:
write_data(0x61);
write_data(0x76);
write_data(0x65);
write_data(0x3a);
write_com(0x80+0x40);//写f:
write_data(0x66);
write_data(0x3a);
}
voidwrite_f(uintdate)//写频率
{
ucharqian,bai,shi,ge;
qian=date/1000;
bai=date/100%10;
shi=date/10%10;
ge=date%10;
write_com(0x80+0x42);
write_data(0x30+qian);
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
write_data(0x48);
write_data(0x5a);
}
voidxsf()//显示频率
{
if(s1num==1)
{
fre=(1000/(9+3*ys));
write_f(fre);
}
if(s1num==2)
{
fre=(100000/(3*ys));
write_f(fre);
}
if(s1num==3)
{
fre=(1000/(15+3*ys));
write_f(fre);
}
}
voidkeyscanf()
{
d=0;
if(s1==0)
{
delay(5);
if(s1==0)
{
while(!
s1);
s1num++;
if(s1num==1)
{
ys=0;
write_com(0x80+0x05);
write_data(0x73);//写sine:
write_data(0x69);
write_data(0x6e);
write_data(0x65);
write_data(0x20);
write_data(0x20);
}
if(s1num==2)
{
ys=10;
write_com(0x80+0x05);
write_data(0x73);//写squrae
write_data(0x71);
write_data(0x75);
write_data(0x61);
write_data(0x72);
write_data(0x65);
}
if(s1num==3)
{
ys=0;
write_com(0x80+0x05);//train
write_data(0x74);
write_data(0x72);
write_data(0x61);
write_data(0x69);
write_data(0x6e);
write_data(0x20);
}
if(s1num==4)
{
s1num=0;
P1=0;
write_com(0x80+0x05);
write_data(0x20);
write_data(0x20);
write_data(0x20);
write_data(0x20);
write_data(0x20);
write_data(0x20);
write_com(0x80+0x42);
write_data(0x20);
write_data(0x20);
write_data(0x20);
write_data(0x20);
write_data(0x20);
write_data(0x20);
}
}
}
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!
s2);
ys++;
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!
s3);
ys--;
}
}
}
voidmain()
{
init();
while
(1)
{
keyscanf();
if(s1num==1)//正弦波//
{
for(j=0;j<255;j++)
{
P0=tosin[j];
delay1(ys);
}
}
if(s1num==2)//方波//
{
P0=0xff;
delay1(ys);
P0=0;
delay1(ys);
}
if(s1num==3)//三角波//
{
if(a<128)
{
P0=a;
delay1(ys);
}
else
{
P0=255-a;
delay1(ys);
}
a++;
}
if(!
(s1&s2&s3))
{
xsf();
}
}
}
2、输出波形的种类与频率的测试
2.1、测量仪器及测试说明
测量仪器:
稳压电源、示波器、数字万用表。
测量说明:
正弦波、矩形波、三角波信号的输出,通过对独立键盘来实现其的不同波形的输出以及其频率的改变。
2.2测试过程
当程序下进去时经过初始化,液晶屏的上只显示“wave:
”和“f:
“,当开关三按一下是此时输出波形为正弦波,按两下时输出为方波,按三下时输出为三角波。
另外两个开关可以调节频率,三种波形的频率可调范围不同,分别如下:
正弦波:
1—180HZ
方波:
1——3.3KHZ
三角波:
1——180HZ
根据示波器的波形频率的显示计算出三种波形的频率计算公式如下:
正弦波:
f=(1000/(9+3*ys))
方波:
f=(100000/(3*ys))
三角波:
f=(1000/(15+3*ys)
其中ys为延时的变量。
三种波形的仿真波形图如下:
图13