基于单片机的信号发生器的设计课程设计Word文档格式.docx

上传人:b****6 文档编号:18104260 上传时间:2022-12-13 格式:DOCX 页数:26 大小:1.15MB
下载 相关 举报
基于单片机的信号发生器的设计课程设计Word文档格式.docx_第1页
第1页 / 共26页
基于单片机的信号发生器的设计课程设计Word文档格式.docx_第2页
第2页 / 共26页
基于单片机的信号发生器的设计课程设计Word文档格式.docx_第3页
第3页 / 共26页
基于单片机的信号发生器的设计课程设计Word文档格式.docx_第4页
第4页 / 共26页
基于单片机的信号发生器的设计课程设计Word文档格式.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

基于单片机的信号发生器的设计课程设计Word文档格式.docx

《基于单片机的信号发生器的设计课程设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机的信号发生器的设计课程设计Word文档格式.docx(26页珍藏版)》请在冰豆网上搜索。

基于单片机的信号发生器的设计课程设计Word文档格式.docx

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)

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

当前位置:首页 > PPT模板 > 其它模板

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

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