基于单片机的信号发生器的设计课程设计Word文档格式.docx
《基于单片机的信号发生器的设计课程设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机的信号发生器的设计课程设计Word文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
3.2方案论证
经过比较,方案二采用软硬件结合,软件控制硬件的方法来实现,使得信号频率的稳定性和精度的准确性得以保证,而且它使用的几种元器件都是常用的元器件,容易得到,且价格便宜,使得硬件的开销达到最省。
以STC89C51单片机为核心设计了一个低频函数信号发生器。
信号发生器采用数字波形合成技术,由单片机,按键电路、数模转换电路、放大电路、时钟电路以及复位电路组成。
通过硬件电路和软件程序相结合,可输出自定义波形,如正弦波、方波、三角波、锯齿波等波形,波形的频率和幅度在一定范围内可任意改变。
波形和频率的改变通过软件控制,幅度的改变通过硬件实现。
该系统采用单片机作为数据处理及控制核心,由单片机完成人机界面、系统控制、信号的采集分析以及信号的处理和变换,采用按键输入,利用液晶显示电路输出数字显示的方案。
总体电路框图如图3-1所示:
图3-1总体电路框图
4硬件电路设计
4.1单片机最小系统
MCS-51是INTEL公司在成功推广的MCS-48单片机基础上加以改进而成的8位单片机。
这种单片机大约是上世纪70年代末推出的,内部程序可重写的为8751,外扩程序的是8031,一次性生产,不可改变程序的是8051。
图4-1为STC89C51单片机最小系统功能图。
图4-1STC89C51单片机引脚图
STC89C51单处机内部设置两个16位可编程的定时器/计数器T0和T1,它们具有计数器方式和定时器方式两种工作方式及4种工作模式。
在波形发生器中,将其作定时器使用,用它来精确地确定波形的两个采样点输出之间的延迟时间。
模式1采用的是16位计数器,当T0或T1被允许计数后,从初值开始加计数,最高位产生溢出时向CPU请求中断。
中断系统是使处理器具有对外界异步事件的处理能力而设置的。
当中央处理器CPU正在处理某件事的时候外界发生了紧急事件,要求CPU暂停当前的工作,转而去处理这个紧急事件。
在波形发生器中,只用到片内定时器/计数器溢出时产生的中断请求,即是在STC89C51输出一个波形采样点信号后,接着启动定时器,在定时器未产生中断之前,STC89C51等待,直到定时器计时结束,产生中断请求,STC89C51响应中断,接着输出下一个采样点信号,如此循环产生所需要的信号波形。
STC89C51单片机有两个引脚(XTAL1,XTAL2)用于外接石英晶体和微调电容,从而构成时钟电路,电容C1、C2对振荡频率有稳定作用,其容量的选择为30pf,振荡器选择频率为12MHz的石英晶体。
由于频率较大时,三角波、正弦波、锯齿波中每一点的延时时间为几微秒,故延时时间还要加上指令时间才能获得较大的频率波形。
为确保微机系统中电路稳定可靠工作,复位电路是必不可少的一部分。
所以,在本设计中加入了复位电路来保证单片机的持续稳定工作。
4.2D/A数模转换电路
数模转换就是将离散的数字量转换为连接变化的模拟量。
DAC0832是双列直插式8位D/A转换器。
能完成数字量输入到模拟量(电流)输出的转换。
图4-2为DAC0832数模转换电路图。
图4-2数模转换电路图
图4-3为DAC0832为数模转换的最要元件引脚结构图。
图4-3DAC0832的引脚图
DAC0832是采样频率为八位的D/A转换芯片,集成电路内有两级输入寄存器,使DAC0832芯片具备双缓冲、单缓冲和直通三种输入方式,以便适于各种电路的需要(如要求多路D/A异步输入、同步转换等)。
图4-3为DAC0832的引脚图。
其主要参数如下:
分辨率为8位,转换时间为1μs,满量程误差为±
1LSB,参考电压(+10/span>
-10)V,供电电源为(+5~+15)V,逻辑电平输入与TTL兼容。
在DAC0832中有两级锁存器,第一级锁存器称为输入寄存器,它的允许锁存信号为ILE,第二级锁存器称为DAC寄存器,它的锁存信号也称为通道控制信号/XFER。
当ILE为高电平,片选信号/CS和写信号/WR1为低电平时,输入寄存器控制信号为1,这种情况下,输入寄存器的输出随输入而变化。
此后,当/WR1由低电平变高时,控制信号成为低电平,此时,数据被锁存到输入寄存器中,这样输入寄存器的输出端不再随外部数据DB的变化而变化。
对第二级锁存来说,传送控制信号/XFER和写信号/WR2同时为低电平时,二级锁存控制信号为高电平,8位的DAC寄存器的输出随输入而变化,此后,当/WR2由低电平变高时,控制信号变为低电平,于是将输入寄存器的信息锁存到DAC寄存器中。
图4-3中其余各引脚的功能定义如下:
DAC0832引脚功能说明:
DI0~DI7:
数据输入线,TLL电平。
ILE:
数据锁存允许控制信号输入线,高电平有效。
CS:
片选信号输入线,低电平有效。
WR1:
为输入寄存器的写选通信号。
XFER:
数据传送控制信号输入线,低电平有效。
WR2:
为DAC寄存器写选通输入线。
Iout1:
电流输出线。
当输入全为1时Iout1最大。
Iout2:
电流输出线。
其值与Iout1之和为一常数。
Rfb:
反馈信号输入线,芯片内部有反馈电阻.
Vcc:
电源输入线
(+5v~+15v)
Vref:
基准电压输入线
(-10v~+10v)
AGND:
模拟地,摸拟信号和基准电源的参考地.
DGND:
数字地,两种地线在基准电源处共地
4.3按键电路
图4-4为键盘接口电路的电路图,本系统采用独立键盘开关,其中按键“KEY1”可以来调节切换波形的输出,按键“KEY4”用来调节调节波形频率的步进值。
按键“KEY2”;
“KEY3”可以调节波形频率的加和减。
图4-4按键电路
4.4放大电路
LM358里面包括有两个高增益、独立的、内部频率补偿的双运放,适用于电压范围很宽的单电源,而且也适用于双电源工作方式,它的应用范围包括传感放大器、直流增益模块和其他所有可用单电源供电的使用运放的地方。
电路图如图图4-5所示:
图4-5放大电路
如图4-6所示的LM358功能引脚图所示,LM358的5管脚与DAC0832的(IOUT2)12管脚相连,LM358的6管脚与DAC0832的(IOUT1)11管脚相连,LM324的7管脚与DAC0832的REF(9)管脚相连.
图4-6LM358功能引脚图
其中4引脚为正电源;
11引脚为负电源;
1,7,8,14引脚为输出;
3,5,10,12位正输出;
2,6,9,13引脚为负输出。
第一级运算放大器的作用是将DAC0832输出的电流信号转化为电压信号V1,第二级运算放大器的作用是将V1通过反向放大电路的(R2/R1)倍。
5系统软件设计
本文中设计是通过按键的选择来实现,在相应按键按下后,采用STC89C51单片机,用编程的方法来产生三种波形,并通过编程来切换三种波形以及波形频率的改变。
软件调通后,通过编程器下载到STC89C51芯片中,然后插到系统中即可独立完成所有的控制。
软件的流程图中通过选择K1是否有按下,如果没有则重新开始,如果有则通过K1来选择波形,第一次按下出现正弦波,第二次按下出现方波,第三次按下出现三角波,第四次按下出现锯齿波,依次循环。
按下K2、K3、K4依次进行频率加减和步进值的加减,最终输出波形。
如图5-1所示:
图5-1程序流程图
6系统调试
6.1硬件调试
为了准确发现系统存在的问题,需要进行系统调试,调试的顺序按照先硬件后软件,先局部后整体的顺序来完成。
首先介绍系统的硬件安装过程及针对各单元模块的硬件电路调试,检验其是否符合设计初衷,能否达到相应指标。
硬件调试主要包括电源系统的调试、单片机小系统的调试、D/A转换电路的调试、示波器的调试几部分。
为保证整个系统能够正常工作,首先要保证电源系统正常工作并且保证输出为+5V。
通过测量输出口的电压值不断修改电路设计,完成电源系统的调试。
6.2软件调试
主要进行了单片机STC89C51的软件调试过程,检验其是否符合设计初衷,能否达到相应的指标。
主要是示波器的调试,通过编写程序实现波形的显示,按键的不同,对应的示波器的显示波形一样。
正弦波波形如下图6-1所示:
图6-1正弦波
矩形波波形如下图6-2所示:
图6-2矩形波
三角波形如下图6-3所示:
图6-3三角波
锯齿波形如下图6-4所示:
图6-4锯齿波
7总结
通过这次课程设计使我对课程所学理论知识的深化和提高。
并且通过本次课程设计,使我了解和掌握单片机应用系统的软硬件设计过程、方法及实现,培养了我分析问题和解决问题的能力,为以后设计和实现更难的应用系统打下良好基础。
同时培养了我撰写设计说明书的能力。
在本次设计的过程中,我发现很多的问题,虽然以前还做过这样的设计但这次设计真的让我长进了很多。
对于单片机设计,其硬件电路是比较简单的,主要是解决程序设计的问题,而程序设计是一个很灵活的东西,它反映了你解决问题的逻辑思维和创新能力,它才是一个设计的灵魂所在。
因此在整个设计过程中大部分时间是用在程序上面的。
对理论在实践中应用的深刻理解,通过把波形在计算机上实现,知道和理解该理论在计算机中怎样执行的,对该理论在实践中的应用更深刻的理解,激发了我的学习积极性,在这次课程设计中,
参考文献
[1]周明德.微型计算机系统原理及应用[M].北京:
清华大学出版社,2002
[2]刘乐善.微型计算机接口技术及应用[M].北京:
北京航空航天大学出版社,2001
[3]童诗白.模拟电路技术基础[M].北京:
高等教育出版社,2000
[4]张友德.单片微型机原理、应用与实践[M].上海:
复旦大学出版社,2004
[5]张永瑞.电子测量技术基础[M].西安:
西安电子科技大学出版社,2006
[6]李叶紫.MCS-51单片机应用教程[M].北京:
清华大学出版社,2004
、
总体电路原理图
元器件清单
序号
名称
规格
数量
1
单片机
STC89C51
2
运放芯片
LM358
3
数模转换芯片
DAC0832
4
电位器
103
5
电阻
10K
6
电解电容
10pf
7
瓷片电容
30pf
8
LED
5mm
9
晶振
12M
10
2.2K
11
100
12
220
13
1K
14
按键
实物图
源程序
#include<
reg52.h>
//包含头文件
intrins.h>
#defineucharunsignedchar//宏定义
#defineuintunsignedint
sbits1=P3^5;
//定义按键的接口
sbits2=P3^6;
sbits3=P3^7;
sbits4=P3^4;
sbitled0=P3^0;
sbitled1=P3^1;
sbitled2=P3^2;
sbitled3=P3^3;
sbitlcdrs=P2^7;
//液晶控制位
sbitlcden=P2^6;
charnum,boxing,u;
//定义全局变量
intpinlv=100,bujin=1,bujin1=1;
ucharcodetable[]="
0123456789"
;
//定义显示的数组
ucharcodetable1[]="
Fout=Waveform:
"
unsignedlongintm;
inta,b,h,num1;
//自定义字符
ucharcodezifu[]={
0x0e,0x11,0x11,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x11,0x11,0x0e,0x00,//正弦波01
0x00,0x07,0x04,0x04,0x04,0x04,0x1c,0x00,
0x00,0x1c,0x04,0x04,0x04,0x04,0x07,0x00,//矩形波23
0x00,0x01,0x02,0x04,0x08,0x10,0x00,0x00,
0x00,0x10,0x08,0x04,0x02,0x01,0x00,0x00,//三角波45
0x00,0x01,0x03,0x05,0x09,0x11,0x00,0x00,//锯齿波6
};
ucharcodesin[64]={
135,145,158,167,176,188,199,209,218,226,234,240,245,249,252,254,254,253,251,247,243,237,230,222,213,204,193,182,170,158,
146,133,121,108,96,84,72,61,50,41,32,24,17,11,7,3,1,0,0,2,5,9,14,20,28,36,45,55,66,78,90,102,114,128
//正弦波取码
ucharcodejuxing[64]={
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
//矩形波取码
ucharcodesanjiao[64]={
0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,
248,240,232,224,216,208,200,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0
//三角波取码
ucharcodejuchi[64]={
0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,130,134,138,142,
146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,215,219,223,227,231,235,239,243,247,251,255
//锯齿波取码
voiddelay(uintxms)//延时函数
{
inta,b;
for(a=xms;
a>
0;
a--)
for(b=110;
b>
b--);
}
voidwrite_com(ucharcom)//写命令函数
lcdrs=0;
P0=com;
delay
(1);
lcden=1;
lcden=0;
voidwrite_date(uchardate)//写数据函数
lcdrs=1;
P0=date;
//自定义字符集
voidLcd_ram()
{
uinti,j,k=0,temp=0x40;
for(i=0;
i<
7;
i++)
{
for(j=0;
j<
8;
j++)
write_com(temp+j);
write_date(zifu[k]);
k++;
}
temp=temp+8;
voidinit_lcd()//初始化函数
uchari;
//默认开始状态为关使能端,见时序图
Lcd_ram();
write_com(0x0f);
write_com(0x38);
//显示模式设置,默认为0x38,不用变。
write_com(0x01);
//显示清屏,将上次的内容清除,默认为0x01.
write_com(0x0c);
//显示功能设置0x0f为开显示,显示光标,光标闪烁;
0x0c为开显示,不显光标,光标不闪
write_com(0x06);
//设置光标状态默认0x06,为读一个字符光标加1.
write_com(0x80);
//设置初始化数据指针,是在读指令的操作里进行的
for(i=10;
20;
i++)//显示初始化
write_date(table1[i]);
write_com(0x80+0x40);
9;
write_com(0x80+10);
write_date(0);
write_date
(1);
write_com(0x80+0x40+0x09);
write_date('
'
);
1'
0'
.'
H'
z'
voidinitclock()//时钟初始化
TMOD=0x01;
TH0=a;
TL0=b;
EA=1;
ET0=1;
TR0=1;
voiddisplay()//显示函数
ucharqian,bai,shi,ge;
qian=pinlv/1000;
bai=pinlv%1000/100;
shi=pinlv%1000%100/10;
ge=pinlv%1000%100%10;
if(qian==0)
else
write_date(table[qian]);
if(qian==0&
&
bai==0)
write_date(table[bai]);
write_date(table[shi]);
write_date(table[ge]);
if(boxing==0)
write_com(0x80+10);
write_date(0);
write_date
(1);
led3=1;
led0=0;
if(boxing==1)
write_date
(2);
write_date(3);
led0=1;
led1=0;
if(boxing==2)
write_date(4);
write_date(5);
led1=1;
led2=0;
if(boxing==3)
write_date(6);
led2=1;
led3=0;
voidkeyscan()//键盘检测函数
if(s1==0)
{
EA=0;
delay
(2);
if(s1==0)
{
while(!
s1);
pinlv+=bujin;
if(pinlv>
1000)
{
pinlv=100;
}
display();
m=65536-(150000/pinlv);
a=m/256;
b=m%256;
EA=1;
}
if(s2==0)