资源描述
课程设计
课程名称: 低频信号源的设计
专业年级: 电子信息工程082班
学生姓名:
学 号: 200805070211
实习时间: 2011年6月30至7月1日
指导教师:
填写时间:2011年 7 月3日
一、设计任务及意义
本系统是基于AT89C52单片机的数字式简易低频信号发生器。用程序实现方波、锯齿波、三角波等信号,并在Protues电子设计平台上对方案进行了仿真。消除了传统信号发生器存在元器件分散性造成波形失真的弊端。系统采用AT89C52 单片机作为控制核心,外围采用数字/模拟转换电路(DAC0832)、按键电路。通过按键控制可产生方波、锯齿波、正弦波。波形的频率和幅度在一定范围内可任意改变,其设计简单、性能优良,可用于多种需要低频信号源的场所,具有一定的实用性。
二、设计方案选择及论证
系统方案比较
方案一:采用函数信号发生器ICL8038集成模拟芯片,(如图2-1)它是一种可以同时产生方波、三角波、正弦波的专用集成电路。但是这种模块产生的波形都不是纯净的波形,会寄生一些高次谐波分量,采用其他的措施虽可滤除一些,但不能完全滤除掉。
图2-1方案一方框图
D/A
键 盘
单片机
ICL8038
运算电路
显 示
D/A
输出
方案二:采用分立元件实现非稳态的多谐振振荡器,然后根据需要加入积分电路等构成正弦、矩形、三角等波形发生器。这种信号发生器输出频率范围窄,而且电路参数设定较繁琐,其频率大小的测量往往需要通过硬件电路的切换来实现,操作不方便。
方案三:采用单片机和DAC0832数模转换器生成波形,由于是软件滤波,所以不会有寄生的高次谐波分量,生成的波形比较纯净。它的特点是价格低、性能高,在低频范围内稳定性好、操作方便、体积小、耗电少。
经比较,方案三既可满足课程设计的基本要求又能充分发挥其优势,电路简单,易控制,性价比较高,所以采用该方案。
三、硬件设计
系统总体框图设计
本系统是以单片机AT89C51和8位D/A转换芯片DAC0832共同实现正弦波,方波,锯齿波这三种常见波形的产生及显示相互切换的功能。
示波器
OP1P
DAC0832
波形选择开关
单片机
PC机
下载线
图3-1 系统总体框图
3.1单片机晶振电路
对于MCS-51一般的晶振可以在1.2MHZ—12MHZ之间选择,这是电容C可以对应的选择10pf-30Pf。对于本设计的电容C用30pF,晶振选用12MHZ。晶振电路解法图3-2,一条引脚接在XTAL1,另一条接在XTAL2。电路图如图3-1-1所示:
图3-1-1
3.2单片机复位电路
复位是单片机的初始化工作,复位后中央处理器CPU和单片机内的其它功能部件都处在一定的初始状态,并从这个状态开始工作。为了防止程序执行过程中失步或运行紊乱,此处我们采用了上电复位及手动复位电路,电路图如图3-1-2所示:
图3-1-2
3.3完整电路
参照附录三
四、软件设计
单片机内部数据只有0、1之分,所产生的信号也都是离散信号。为了能够让单片机输出所需的数字信号,我们采用对信号采样、量化的方法来实现由单片机产生所需信号。在设计中,对正弦信号进行采样,通过查表来实现输出不同的幅度值。采样点越密,信号失真度也就越小。对于三角波,就是实现2次循环,通过由最小值到最大值和由最大值到最小值的循环来实现三角波的输出。方波的输出时间间隔由键盘输入,然后由软件通过定时、计数器来控制。因此,通过控制不同的计数初值就可以控制整个方波信号的频率,其计数初值=65 536-输入值。对于其他波形,程序根据输入频率值计算出波形的输出时间参数,即波形中每2点的时间间隔C。程序设定寄存器T0作定时器,T1作计数器。当计算出C≤65 536时, CPU只使用T0。当C>65 536时,CPU将T0和T1串联起来使用。T0/T1被调用后开始计数,总定时时间到,输出一个点,反复循环,从而在一个周期内输出完整波形。设计中软件分为初始化模块、显示模块、键盘扫描模块、键值处理模块和波形产生模块。
4.1 初始化子函数
初始化子函数的主要工作是设置定时器的工作模式、初值预置、开中断和打开定时器等。在这里,定时器T1工作于16位定时模式,单片机按定时时间重复的把波形送到DAC0832的寄存器。其程序流程图如下图4-2所示:
4. 2键扫描子函数
键扫描子函数的任务是检查3个键是否有键按下,若有键按下,则执行相应的功能。这里3个键分别用于频率增加、频率减小和正弦波,锯齿波和方波的选择功能。其程序流程图如图4-3所示:
T1中断允许,开定时器,开总中断
T1置初值,设为16位定时模式
开始
返回
查键开始
返回
定时值减1
波形选择
定时值加1
查键号,按键值执行功能
有键按下?
N
Y
程图
4.3波形数据产生子函数
波形数据产生函数是定时器T1的中断程序。当定时器溢出时,发生一次中断。当发生中断时,单片机按次序将波形数据表中的波形数据一一送到DAC8032,DAC8032根据输入的数据大小输出对应电压。波形数据产生子函数流程图如图4-4所示:
功能标志=1?
开中断、中断返回
查表指针加1
正弦波输出
方波输出
锯齿波输出
关中断、关定时、重装初值、开定时
中断开始
图4-4
4.4 主函数
主函数的任务是进行上电初始化,并在程序运行中不断查询按键情况执行相应的功能。
程序设计见附录五
五、系统测试及结果
硬件电路的调试比较简单,只要元器件安装无误,一般都能一次成功。软件调试主要是各子程序的调试,对于频数的增减按键,由于计数器为16位定时器,最大值为65535,在加减时用255作为减数,这样频率的调整变化较快些,但是在接近最高频率变化太快;如果加减时用一作加减数,那么在频率的高端变化平稳,而在频率的低端则变化太慢。调试时可根据应用特点选择加减数的大小。简易低频信号源输出频率指标实际测试如下:
(1)当按下K3键一下时,波形为正弦波。波形图如图5-1所示:
图5-1 正弦波波形图
(2)当按下K3键两下时,播行为三角波。仿真图如图5-2所示:
图5-2 三角波波形图
(3)由P2.0口直接可输出方波。仿真图如图5-3所示:
K1键是频率增加键,K2键是频率减小键
本次设计的信号发生器正弦波的频率范围在0.01HZ~83HZ,方波的输出频率范围在1.3~10.6KHZ。
在对系统进行波形仿真时可以在虚拟示波器上观察到锯齿波、三角波、正弦波和方波的波形。其中锯齿波、三角波以及正弦波的输出误差较大,方波波形较为理想。这一方面与电路设置的参数有关,另一方面也与使用的仿真软件有关。对于上述问题的解决办法是:改变仿真电路的参数或着换用版本较高的仿真软件。当然一般产生这种情况的原因多由于电路的参数设计不合理所制。但从仿真波形上可以看出输出波形的频率大致与程序中的设置吻合。波形的幅度与程序设置的最大值有关,而频率受机器周期的控制。当仿真时,由于存在一定的系统误差,波形效果不是很好。
简易低频信号源输出的频率不是很高,在设计时每周期波形用255个采样点合成,波形不是很光滑。如果增加采样点,则输出的频率会更低,所以在设计时应根据应用特点选择合理的采样点数。用单片机产生低频信号的最大优点是可以输出产生复杂的不规则波形,这是一般通用信号源无法做到的。
六、 实习体会
通过这次实验,熟悉了基于AT89C52单片机的数字式简易低频信号发生器,利用数模转换器DAC832来实现波形又通过按键来改变波形的频率以及波形的转换。
在这次设计中,遇到很多的问题,包括硬件的设计以及软件的设计。硬件方面,就电路而言,根据硬件的设计,该电路简单方便,实现波形并不是很困难,但是,在焊接电路过程中,由于粗心大意,第一次去测试的时候,没有任何反应,经过自己和同学的检查,最终发现是由于晶振没有焊接(由于晶振是次电路的灵魂,它提供了电路的出事震荡),所以一开始没有任何反应。第二次去测试的时候发现只有按住开关才能有波形(K1,K2,K3任何一个都行),后来经过检查发现单片机的接地线20脚没有接地,经过这次的接地,终于成功了,输出了完整而稳定的波形
在软件设计中,要熟悉整个电路的工作原理以及就具体芯片管脚的程序代码,运行过程中,调整好电路板,接好每一根导线,进行调试。若程序与电路工作原理一致,将会出现预期效果。调节K1是增加波形信号的频率,K2是减少波形信号的频率,K3是三角波以及正弦波的转换键。
总而言之,在这次实习中,收获颇多,不仅练习了焊接的工艺,而且也熟悉了电路的流程,以及单片机程序设计和单片机AT89C51的工作原理。
参考文献
[1]牛昱光,等.单片机原理及接口技术 .北京:电子工业出版社,2008.
[2]李光飞,等.单片机C程序设计实例指导. 北京:北京航空航天出版社,2005.
[3]黄仁欣,等.单片机原理及应用技术.北京:清华大学出版社,2005.
[4]张毅刚,等.MCS-51单片机应用设计.哈尔滨:哈尔滨工业大学出版社,2002.
附录一 :元器件清单
元器件名称及规格
标注
AT89C52
U1
DAC0832
U2
电阻10K
R1
上拉电阻
RP1
晶体振荡器12M
X1
瓷片电容30Pf
C1,C2
电解质电容10uF
C3
按键开关
K1,K2,K3
直流电源5V
VCC
数字示波器
附录二:芯片管脚图:
1、AT89C52
2、DAC0832
附录三:电路原理图
附录五:设计程序
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
#define key P1
#define dataout P0
/**********正弦波数据表*************/
uchar code sin_tab[256]=
{0x80,0x83,0x85,0x88,0x8A,0x8D,0x8F,0x92,
0x94,0x97,0x99,0x9B,0x9E,0xA0,0xA3,0xA5,
0xA7,0xAA,0xAC,0xAE,0xB1,0xB3,0xB5,0xB7,
0xB9,0xBB,0xBD,0xBF,0xC1,0xC3,0xC5,0xC7,
0xC9,0xCB,0xCC,0xCE,0xD0,0xD1,0xD3,0xD4,
0xD6,0xD7,0xD8,0xDA,0xDB,0xDC,0xDD,0xDE,
0xDF,0xE0,0xE1,0xE2,0xE3,0xE3,0xE4,0xE4,
0xE5,0xE5,0xE6,0xE6,0xE7,0xE7,0xE7,0xE7,
0xE7,0xE7,0xE7,0xE7,0xE6,0xE6,0xE5,0xE5,
0xE4,0xE4,0xE3,0xE3,0xE2,0xE1,0xE0,0xDF,
0xDE,0xDD,0xDC,0xDB,0xDA,0xD8,0xD7,0xD6,
0xD4,0xD3,0xD1,0xD0,0xCE,0xCC,0xCB,0xC9,
0xC7,0xC5,0xC3,0xC1,0xBF,0xBD,0xBB,0xB9,
0xB7,0xB5,0xB3,0xB1,0xAE,0xAC,0xAA,0xA7,
0xA5,0xA3,0xA0,0x9E,0x9B,0x99,0x97,0x94,
0x92,0x8F,0x8D,0x8A,0x88,0x85,0x83,0x80,
0x7D,0x7B,0x78,0x76,0x73,0x71,0x6E,0x6C,
0x69,0x67,0x65,0x62,0x60,0x5D,0x5B,0x59,
0x56,0x54,0x52,0x4F,0x4D,0x4B,0x49,0x47,
0x45,0x43,0x41,0x3F,0x3D,0x3B,0x39,0x37,
0x35,0x34,0x32,0x30,0x2F,0X2D,0x2C,0X2A,
0x29,0x28,0x26,0x25,0x24,0x23,0x22,0x21,
0x20,0x1F,0x1E,0x1D,0x1D,0x1C,0x1C,0x1B,
0x1B,0x1A,0x1A,0x1A,0x19,0x19,0x19,0x19,
0x19,0x19,0x19,0x19,0x1A,0x1A,0x1A,0x1B,
0x1B,0x1C,0x1C,0x1D,0x1D,0x1E,0x1F,0x20,
0x21,0x22,0x23,0x24,0x25,0x26,0x28,0x29,
0X2A,0x2C,0X2D,0x2F,0x30,0x32,0x34,0x35,
0x37,0x39,0x3B,0x3D,0x3F,0x41,0x43,0x45,
0x47,0x49,0x4B,0x4D,0x4F,0x52,0x54,0x56,
0x59,0x5B,0x5D,0x60,0x62,0x65,0x67,0x69,
0x6C,0x6E,0x71,0x73,0x76,0x78,0x7B,0x7D};
/*************三角波数据表*************************/
uchar code thr_tab[256]=
{
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
0x89,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,
0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,
0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,
0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,
0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,
0xBF,0xBE,0xBD,0xBC,0xBB,0xBA,0xB9,0xB8,
0xB7,0xB6,0xB5,0xB4,0xB3,0xB2,0xB1,0xB0,
0xAF,0xAE,0xAD,0xAC,0xAB,0xAA,0xA9,0xA8,
0xA7,0xA6,0xA5,0xA4,0xA3,0xA2,0xA1,0xA0,
0x9F,0x9E,0x9D,0x9C,0x9B,0x9A,0x99,0x98,
0x97,0x96,0x95,0x94,0x93,0x92,0x91,0x90,
0x8F,0x8E,0x8D,0x8C,0x8B,0x8A,0x89,0x89,
0x87,0x86,0x85,0x84,0x83,0x82,0x81,0x80,
0x7F,0x7E,0x7D,0x7C,0x7B,0x7A,0x79,0x78,
0x77,0x76,0x75,0x74,0x73,0x72,0x71,0x70,
0x6F,0x6E,0x6D,0x6C,0x6B,0x6A,0x69,0x68,
0x66,0x66,0x65,0x64,0x63,0x62,0x61,0x60,
0x5F,0x5E,0x5D,0x5C,0x5B,0x5A,0x59,0x58,
0x55,0x55,0x55,0x54,0x53,0x52,0x51,0x50,
0x4F,0x4E,0x4D,0x4C,0x4B,0x4A,0x49,0x48,
0x44,0x44,0x45,0x44,0x43,0x42,0x41,0x40,
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,
0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
0x50,0x51,0x52,0x53,0x55,0x55,0x56,0x57,
0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
0x60,0x61,0x62,0x63,0x66,0x65,0x66,0x67,
0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
0x70,0x71,0x72,0x73,0x77,0x75,0x76,0x77,
0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F
};
/******************************************/
uint data THHL=65535;
uchar data keyword,n=0;
bdata sinthr;
sbit sin_thr=sinthr^0;
sbit ww=P2^0;
/**************键扫描子函数**************************/
keyscan()
{
keyword=key&0x07;
if(keyword!=0x07)
{
while((key&0x07)!=0x07);
switch(keyword)
{
case 6:
{if(THHL>=65235)THHL=65535;else{THHL=THHL+255;}break;}
case 5:
{if(THHL<=500)THHL=0;else{THHL=THHL-255;}break;}
case 3:
{sin_thr=~sin_thr;break;}
default:{break;}
}
}
}
/**********初始化函数**************************/
void clearmen()
{
key=0xff,dataout=0x00;THHL=65535;
TH1=THHL/256;TL1=THHL&256;
TMOD=0x11;ET1=1;TR1=1;EA=1;
}
/***********主函数*************************/
main()
{
clearmen();
while(1)
{
keyscan();
}
}
/************T1中断函数*************************/
void time_intt1(void) interrupt 3
{
EA=0;TR1=0;TH1=THHL/256;TL1=THHL%256;TR1=1;
if(sin_thr){dataout=sin_tab[n];}
else {dataout=thr_tab[n];}
if(n>=255){n=0;}else{n++;}
ww=~ww;
EA=1;
}
展开阅读全文