基于51单片机的多功能信号发生器.docx
《基于51单片机的多功能信号发生器.docx》由会员分享,可在线阅读,更多相关《基于51单片机的多功能信号发生器.docx(18页珍藏版)》请在冰豆网上搜索。
![基于51单片机的多功能信号发生器.docx](https://file1.bdocx.com/fileroot1/2023-1/25/b460fdb9-56dc-40f4-86ba-b63bc3b171d1/b460fdb9-56dc-40f4-86ba-b63bc3b171d11.gif)
基于51单片机的多功能信号发生器
河南理工大学
《微机原理与单片机接口技术》
课程设计报告
多功能信号发生器设计
2013年1月10日
摘要
本次设计是一个多功能信号发生器,可以产生、方波、锯齿波和三角波。
函数信号发生器的设计方法有多种,利用单片机设计的函数信号发生器具有编程灵活,功能更以扩充等实际的优点。
设计原理图如下图所示,其中单片机通过软件对键盘输入的频率数值进行处理,处理结果送与D/A转换部分实现数/模转换,输出的电流再经过电流/电压转换环节,进而形成模拟电压波形,最后经过过载保护电路输出。
同时在数码管内显示该频率数值。
波形的切换可以通过按键直接实现。
在编程语言上,我们选择自身比较熟悉的C语言,这样在后期波形的调试及与硬件衔接方面更容易发挥出自身优势。
根据设计的要求,对各种波形的频率和幅度进行程序的编写,并将所写程序装入单片机的程序存储器中。
在程序运行中,当接收到来自外界的命令,需要输出某种波形时再调用相应的中断服务子程序和波形发生程序,经电路的数/模转换器和运算放大器处理后,从信号发生器的输出端口输出。
经过设计及后期长时间的调试,设计的所有功能均已实现:
(1)具有产生方波、锯齿波、三角波三种周期性波形的功能。
(2)输出波形的频率范围为100Hz~1kHz;频率步进间隔≤100Hz。
(3)输出波形幅度范围0~5V,可按步进0.1V(峰-峰值)调整。
(4)具有显示输出波形的类型、周期和幅度的功能。
关键词:
单片机,函数发生器,共阴极数码管
第一章绪论
1.1选题背景及其意义
信号发生器又称信号源或振荡器,在生产实践和科技领域中有着广泛的应用。
各种波形曲线均可以用三角函数方程式来表示。
能够产生多种波形,如方波、锯齿波、三角波、正弦波的电路被称为函数信号发生器。
在通信、广播、电视系统,在工业、农业、生物医学领域内,函数信号发生器在实验室和设备检测中具有十分广泛的用途。
1.2单片机概述
随着大规模集成电路技术的发展,中央处理器(CPU)、随机存取存储(RAM)、只读存储器(ROM)、(I/O)接口、定时器/计数器和串行通信接口,以及其他一些计算机外围电路等均可集成在一块芯片上构成单片微型计算机,简称为单片机。
单片机具有体积小、成本低,性能稳定、使用寿命长等特点。
1.3信号发生器的分类
信号发生器应用广泛,种类繁多,性能各异,分类也不尽一致。
按照频率范围分类可以分为:
超低频信号发生器、低频信号发生器、视频信号发生器、高频波形发生器、甚高频波形发生器和超高频信号发生器。
按照输出波形分类可以分为:
正弦信号发生器和非正弦信号发生器,非正弦信号发生器又包括:
脉冲信号发生器,函数信号发生器、扫频信号发生器、数字序列波形发生器、图形信号发生器、噪声信号发生器等。
按照信号发生器性能指标可以分为一般信号发生器和标准信号发生器。
前者指对输出信号的频率、幅度的准确度和稳定度以及波形失真等要求不高的一类信号发生器。
后者是指其输出信号的频率、幅度、调制系数等在一定范围内连续可调,并且读数准确、稳定、屏蔽良好的中、高档信号发生器。
1.4研究内容
本文是做基于单片机的信号发生器的设计,将采用编程的方法来实现三角波、锯齿波、矩形波、正弦波的发生。
根据设计的要求,对各种波形的频率和幅度进行程序的编写,并将所写程序装入单片机的程序存储器中。
在程序运行中,当接收到来自外界的命令,需要输出某种波形时再调用相应的中断服务子程序和波形发生程序,经电路的数/模转换器和运算放大器处理后,从信号发生器的输出端口输出。
第二章方案的设计与选择
2.1方案的比较
方案一:
采用单片函数发生器(如8038),8038可同时产生正弦波、方波等,而且方法简单易行,用D/A转换器的输出来改变调制电压,也可以实现数控调整频率,但产生信号的频率稳定度不高。
方案二:
采用锁相式频率合成器,利用锁相环,将压控振荡器的输出频率锁定在所需频率上,该方案性能良好,但难以达到输出频率覆盖系数的要求,且电路复杂。
方案三:
采用单片机编程的方法来实现。
该方法可以通过编程的方法来控制信号波形的频率和幅度,而且在硬件电路不变的情况下,通过改变程序来实现频率的变换。
此外,由于通过编程方法产生的是数字信号,所以信号的精度可以做的很高。
鉴于方案一的信号频率不够稳定和方案二的电路复杂,频率覆盖系数难以达标等缺点,所以决定采用方案三的设计方法。
它不仅采用软硬件结合,软件控制硬件的方法来实现,使得信号频率的稳定性和精度的准确性得以保证,而且它使用的几种元器件都是常用的元器件,容易得到,且价格便宜,使得硬件的开销达到最省。
2.2设计原理
数字信号可以通过数/模转换器转换成模拟信号,因此可通过产生数字信号再转换成模拟信号的方法来获得所需要的波形。
89C51单片机本身就是一个完整的微型计算机,具有组成微型计算机的各部分部件:
中央处理器CPU、随机存取存储器RAM、只读存储器ROM、I/O接口电路、定时器/计数器以及串行通讯接口等,只要将89C51再配置键盘及其接口、显示器及其接口、数模转换及波形输出、指示灯及其接口等四部分,即可构成所需的波形发生器。
89C51是整个波形发生器的核心部分,通过程序的编写和执行,产生各种各样的信号,并从键盘接收数据,进行各种功能的转换和信号幅度的调节。
当数字信号经过接口电路到达转换电路,将其转换成模拟信号也就是所需要的输出波形。
2.3设计思想
该设计设计一个低频信号发生器,我们采用的是AT89C51单片机用软件实现信号的输出。
该单片机是一个微型计算机,包括中央处理器CPU,RAM,ROM、I/O接口电路、定时计数器、串行通讯等,是波形设计的核心。
总体原理为:
利用AT89C51单片机构造低频信号发生器,可产生正弦波,方波,三角波,锯齿波四种波形,通过C语言对单片机的编程即可产生相应的波形信号,并可以通过键盘进行各种功能的转换和信号频率的控制,当输出的数字信号通过数模转换成模拟信号也就得到所需要的信号波形,通过运算放大器的放大输出波形,同时让显示器显示输出的波形信息。
本方案其主要模块包括复位电路、时钟信号、键盘控制、D/A转化及LED显示。
其各个模块的工作原理如下:
(1)复位电路是为单片机复位使用,使单片机接口初始化;89C51等CMOS51系列单片机的复位引脚RET是施密特触发输入脚,内部有一个上拉低电阻,当振荡器起振以后,在RST引脚上输出2个机械周期以上的高电平,器件变进入复位状态开始,此时ALE、PSEN、P0、P1、P2、P4输出高电平,RST上输入返回低电平以后,变退出复位状态开始
工作。
该方案采用的是人工开关复位,在系统运行时,按一下开关,就在RST断出现一段高电平,使器件复位。
(2)时钟信号是产生单片机工作的时钟信号,控制着计算机的工作节奏,可以通过提高时钟频率来提高CPU的速度。
89C51内部有一个可控的反相放大器,引脚XTAL1、XTAL2为反相放大器输入端和输出端,在XTAL1、XTAL2上外接12MHZ晶振和30pF电容便组成振荡器。
时钟信号常用于CPU定时和计数。
程读取闭合的键号,实现相应的信号输出。
其步骤主要是a、判断是否有键按下;b、去抖动,延时20ms左右;c、识别被按下的键号;d、处理,实现功能。
(4)D/A转换也称为数模转换,是把数字量变换成模拟量的线性电路。
单片机产生的数字信号通过DAC0832转化成模拟信号,输出相应的电流值,通过集成运算放大器可以取出模拟量得电压值,最后利用示波器获得输出的模拟信号的波形;衡量数模转换的性能指标有分辨率、转换时间、精度、线性度等。
LED显示器用由若干个发光二极管按一定的规律排列而成,是一种能够将电能转化为可见光的固态的半导体器件,它可以直接把电转化为光用于是显示相关输出波形的信息,包括信号的类型和频率。
2.4设计功能
(1)具有产生方波、锯齿波、三角波三种周期性波形的功能。
(2)输出波形的频率范围为100Hz~1kHz;频率步进间隔≤100Hz。
(3)输出波形幅度范围0~5V,可按步进0.1V(峰-峰值)调整。
(4)具有显示输出波形的类型、周期和幅度的功能。
第三章硬件设计
3.1硬件原理框图
硬件原理方框图如图3.1所示。
图3.1硬件原理框图
3.2主控电路
AT89C51单处机内部设置两个16位可编程的定时器/计数器T0和T1,它们具有计数器方式和定时器方式两种工作方式及4种工作模式。
在波形发生器中,将其作定时器使用,用它来精确地确定波形的两个采样点输出之间的延迟时间。
模式1采用的是16位计数器,当T0或T1被允许计数后,从初值开始加计数,最高位产生溢出时向CPU请求中断。
中断系统是使处理器具有对外界异步事件的处理能力而设置的。
当中央处理器CPU正在处理某件事的时候外界发生了紧急事件,要求CPU暂停当前的工作,转而去处理这个紧急事件。
在波形发生器中,只用到片内定时器/计数器溢出时产生的中断请求,即是在AT89C51输出一个波形采样点信号后,接着启动定时器,在定时器未产生中断之前,AT89C51等待,直到定时器计时结束,产生中断请求,AT89C51响应中断,接着输出下一个采样点信号,如此循环产生所需要的信号波形[6]。
如图3.2所示,AT89C51从P0口接收来自键盘的信号,并通过P2口输出一些控制信号,将其输入到8155的信号控制端,用于控制其信号的输入、输出。
如果有键按下,则在读控制端会产生一个读信号,使单片机读入信号。
如果有信号输出,则在写控制端产生一个写信号,并将所要输出的信号通过8155的PB口输出,并在数码管上显示出来
3.3数/模转换电路
由于单片机产生的是数字信号,要想得到所需要的波形,就要把数字信号转换成模拟信号,所以该文选用价格低廉、接口简单、转换控制容易并具有8位分辨率的数模转换器DAC0832。
DAC0832主要由8位输入寄存器、8位DAC寄存器、8位D/A转换器以及输入控制电路四部分组成。
但实际上,DAC0832输出的电量也不是真正能连续可调,而是以其绝对分辨率为单位增减,是准模拟量的输出。
DAC0832是电流型输出,在应用时外接运放使之成为电压型输出。
由图3.3可知,DAC0832的片选地址为7FFFH,当P25有效时,若P0口向其送的数据为00H,则U1的输出电压为0V;若P0口向其送的数据为0FFH时,则U1的输出电压为-5V.故当U1输出电压为0V时,由公式得:
Vout=-5V.当输出电压为-5V时,可得:
Vout=+5V,所以输出波形的电压变化范围为-5V~+5V.故可推得,当P0所送数据为80H时,Vout为0
3.4按键接口电路
3.5时钟电路
8051单片机有两个引脚(XTAL1,XTAL2)用于外接石英晶体和微调电容,从而构成时钟电路,其电路图如图3.5所示。
电容C1、C2对振荡频率有稳定作用,其容量的选择为30pf,振荡器选择频率为11.0592MHz的石英晶体。
由于频率较大时,三角波、正弦波、锯齿波中每一点的延时时间为几微秒,故延时时间还要加上指令时间才能获得较大的频率波形。
第四章ADC0832内部结构及配置
完成D/A转换或A/D转换的线路有多种,特别是单片大规模集成A/D、D/A问世,为实现这种转换提供了极大的方便。
借助手册提供的器件性能指标及典型应用电路,即可正确使用这些器件。
本设计将采用大规模集成电路DAC0832实现D/A转换。
4.1D/A转换器DAC0832
DAC0832是采用CMOS工艺制成的单片直流输出型8位数/模转换器。
如图6所示,它由倒T型R-2R电阻网络、模拟开关、运算放大器和参考电压VREF四大部分组成。
一个8位D/A转换器有8个输入端(其中每个输入端是8位二进制数的一位),有一个模拟输出端。
输入可有28=256个不同的二进制组态,输出为256个电压之一,即输出电压不是整个电压范围内任意值,而只能是256个可能值。
图7是DAC0832的逻辑框图和引脚排列。
D0-D7:
数字信号输入端。
ILE:
输入寄存器允许,高电平有效。
CS:
片选信号,低电平有效。
WR1:
写信号1,低电平有效
XFER:
传送控制信号,低电平有效。
WR2:
写信号2,低电平有效。
IOUT1、IOUT2:
DAC电流输出端。
Rfb:
是集成在片内的外接运放的反馈电阻
DAC0832的逻辑框图和引脚排列
Vref:
基准电压(-10-+10V)。
Vcc:
是源电压(+5-+15V)。
AGND:
模拟地NGND:
数字地,可与AGND接在一起使用。
DAC0832输出的是电流,一般要求输出是电压,所以还必须经过一个外接的运算放大器转换成电压。
IN0-IN7:
8路模拟信号输入端。
A1、A2、A0:
地址输入端。
ALE地址锁存允许输入信号,在此脚施加正脉冲,上升沿有效,此时锁存地址码,从而选通相应的模拟信号通道,以便进行A/D转换。
START:
启动信号输入端,应在此脚施加正脉冲,当上升沿到达时,内部逐次逼近寄存器复位,在下降沿到达后,开始A/D转换过程。
EOC:
转换结束输出信号(转换接受标志),高电平有效。
OE:
输入允许信号,高电平有效。
CLOCK(CP):
时钟信号输入端,外接时钟频率一般为640kHz。
Vcc:
+5V单电源供电。
Vref(+),Vref(-):
基准电压的正极、负极。
一般Vref(+)接+5V电源,Vref(-)接地。
D7-D0:
数字信号输出端。
由A2、A1、A0三地址输入端选通8路模拟信号中的任何一路进行A/D转换。
第五章实验结果
5.1实验输出波形
第六章设计总结
制作函数信号发生器随设计思想不同,具有多种方法,本文只是一种可能实现的方法。
此法的频率控制和幅度控制分辨率高,且硬件集成度高,整机自动化程度高,性能优良,具有很高的实用价值。
该信号发生器在调试时,总是出现许多的错误,软件上除了许多的问题,之后纠正和向老师、同学请教慢慢的改了过来。
可是在仿真时依然存在很多的问题,开始的时候是仿真出不了波形,之后改了改电路的一根线,出现了。
在频率的调节问题更多,而使频率无法调节,同时信号的频率无法在LED显示,鉴于此,我认为应该是输出中断除了问题,造成所定义的频率的个位,十位,百位都没有跟随键盘的输入而赋值,使其值时钟为初始设定值。
同时该信号源设计尚存在的不足之处,主要有两个方面,第一为缺乏频率准确显示的手段可以配备相应的数字频率计模块,但如何将显示的精度与信号源的频段配合有待讨论研究;第二为D/A转换时可以加一个锁存器,并且放大电路有待进一步改进使其具有更强的输出能力。
参考文献
[1]程全.基于AT89C52实现的多种波形发生器的设计[J].周口师范学院学报,2005.22(5):
57~58.
[2]周明德.微型计算机系统原理及应用[M].北京:
清华大学出版社,2002.341~364.
[3]刘乐善.微型计算机接口技术及应用[M].北京:
北京航空航天大学出版社,2001.258~264.
[4]童诗白.模拟电路技术基础[M].北京:
高等教育出版社,2000.171~202.
[5]杜华.任意波形发生器及应用[J].国外电子测量技术,2005.1:
38~40.
[6]张友德.单片微型机原理、应用与实践[M].上海:
复旦大学出版社,2004.40~44.
[7]程朗.基于8051单片机的双通道波形发生器的设计与实现[J].计算机工程与应用,2004.8:
100~103.
[8]张永瑞.电子测量技术基础[M].西安:
西安电子科技大学出版社,2006.61~101.
[9]李叶紫.MCS-51单片机应用教程[M].北京:
清华大学出版社,2004.232~238
附录
1元件清单
杜邦线
一打
万用表
一块
7805
一个
7812
一个
DACA0832
一个
LM324
一个
14PIC座
一个
变压器
一个
端子2P
一个
电位器
一个
DB107整流桥
一个
1000uF电容
一个
7912
一个
20PIC座
一个
100uF电容
一个
瓷片电容
3个
单排针
10个
2源程序
#include
#defineucharunsignedchar
#definestep4
#definefosc110592
#defineftfosc/100/12
ucharpdataDAC0832;
ucharcodesindot[64]={0x80,0x8c,0x98,0xa5,0xb0,0xbc,0xc7,0xd1,
0xda,0xe2,0xea,0xf0,0xf6,0xfa,0xfd,0xff,0xff,0xff,0xfd,0xfa,
0xf6,0xf0,0xea,0xe3,0xda,0xd1,0xc7,0xbc,0xb1,0xa5,0x99,
0x8c,0x80,0x73,0x67,0x5b,0x4f,0x43,0x39,0x2e,0x25,0x1d,
0x15,0xf,0x9,0x5,0x2,0x0,0x0,0x0,0x2,0x5,0x9,0xe,0x15,0x1c,
0x25,0x2e,0x38,0x43,0x4e,0x5a,0x66,0x73};
ucharcodesanjiao[64]={0x80,0x88,0x90,0x98,0xA0,0xA8,0xB0,0xB8,0xC0,0xC8,0xD0,0xD8,0xE0,0xE8,0xF0,0xF8,
0xFF,0xF8,0xF0,0xE8,0xE0,0xD8,0xD0,0xC8,0xC0,0xB8,0xB0,0xA8,0xA0,0x98,0x90,0x88,
0x80,0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x30,0x28,0x20,0x18,0x10,0x08,
0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78
};
sbitd1=P2^0;
sbitd2=P2^1;
sbitd3=P2^2;
sbitd4=P2^3;
sbitd5=P2^4;
sbitd6=P2^5;
uchari,k,j=12,keyzhi,h0,h1,l0,l1,l2;
/****************延迟函数**********************/
voiddelay(ucharm)
{
for(i=0;i}
/*********键盘扫描函数***********/
voidscankey()
{
h0=1;h1=1;l0=0;l1=0;l2=0;
if(h0==0)
{delay(500);
if(h0==0)
{l0=0;l1=1;l2=1;
if(h0==0)
{
keyzhi=0;
while(h0==0);
}l1=0;l0=1;l2=1;
if(h0==0)
{
keyzhi=1;
while(h0==0);
}l0=1;l1=1;l2=0;
if(h0==0)
{
keyzhi=2;
while(h0==0);
}
}
}if(h1==0)
{delay(500);
if(h1==0)
{h0=1;l0=0;l1=1;l2=1;
if(h1==0)
{
keyzhi=3;
while(h1==0);
}h0=1;l0=1;l1=0;l2=1;
if(h1==0)
{
keyzhi=4;
while(h1==0);
}h0=1;l0=1;l1=1;l2=0;
if(h1==0)
{
keyzhi=5;
while(h1==0);
}
}
}
}
/*****************幅度设置*********************/
voidamp_set()
{
bitset=1;
change=1;
key_value=0;
while(key_value!
=6)
{
if(!
key_flag)key_flag=key_up();//按键未弹起时需检测弹起
if(key_flag){key_scan();if(key_value!
=0)key_flag=0;}//前次按键弹起后才能再次扫描按键
if(key_value==2){set=~set;key_value=0;}
else
{
if(set)
{
if(key_value==4){vpp+=10;if(vpp>99)vpp=(90+vpp%10);key_value=0;}
if(key_value==5){vpp-=10;if(vpp>99)vpp=2;key_value=0;}
elseif(key_value!
=6)key_value=0;
}
if(!
set)
{
if(key_value==4){vpp=(vpp/10*10)+((vpp%10)+1)%10;key_value=0;}
if(key_value==5){vpp=(vpp/10*10)+((vpp%10)-1)%10;key_value=0;}
elseif(key_value!
=6)key_value=0;
}
}
dis1(vpp/10,1);delay
(1);
dis(vpp%10,2);delay
(1);
}
key_value=0;
}
/*****************频率设置*********************/
voidfrq_set()
{
change=1;
XX文库-让每个人平等地提升自我key_value=0;
while(key_value!
=6)
{
if(!
key_flag)key_flag=key_up();//按键未弹起时需检测弹起
if(key_flag){key_scan();if(key_value!
=0)key_flag=0;}//前次按键弹起后才能再次扫描按键
if(key_value==4){frq=frq+10;key_value=0;if(frq>100)frq=100;}
elseif(key_value==5){frq=frq-10;key_value=0;if(frq==0)frq=10;}
elseif(key_value!
=6){key_value=0;}
dis(0,4);delay
(1);
dis(0,3);delay
(1);
dis(frq/10%10,2);delay
(1);
if(frq/100){dis(1,1);delay(1