基于51单片机的多功能信号发生器.docx
《基于51单片机的多功能信号发生器.docx》由会员分享,可在线阅读,更多相关《基于51单片机的多功能信号发生器.docx(18页珍藏版)》请在冰豆网上搜索。
基于51单片机的多功能信号发生器
河南理工大学
《微机原理与单片机接口技术》
课程设计报告
多功能信号发生器设计
2021年1月10日
摘要
本次设计是一个多功能信号发生器,能够产生、方波、锯齿波和三角波。
函数信号发生器的设计方式有多种,利用单片机设计的函数信号发生器具有编程灵活,功能更以扩充等实际的优势。
设计原理图如以下图所示,其中单片机通过软件对键盘输入的频率数值进行处置,处置结果送与D/A转换部份实现数/模转换,输出的电流再通过电流/电压转换环节,进而形成模拟电压波形,最后通过过载爱惜电路输出。
同时在数码管内显示该频率数值。
波形的切换能够通过按键直接实现。
在编程语言上,咱们选择自身比较熟悉的C语言,如此在后期波形的调试及与硬件衔接方面更易发挥出自身优势。
依照设计的要求,对各类波形的频率和幅度进行程序的编写,并将所写程序装入单片机的程序存储器中。
在程序运行中,当接收到来自外界的命令,需要输出某种波形时再挪用相应的中断效劳子程序和波形发生程序,经电路的数/模转换器和运算放大器处置后,从信号发生器的输出端口输出。
通过设计及后期长时刻的调试,设计的所有功能均已实现:
(1)具有产生方波、锯齿波、三角波三种周期性波形的功能。
(2)输出波形的频率范围为100Hz~1kHz;频率步进距离≤100Hz。
(3)输出波形幅度范围0~5V,可按步进(峰-峰值)调整。
(4)具有显示输出波形的类型、周期和幅度的功能。
关键词:
单片机,函数发生器,共阴极数码管
第一章绪论
选题背景及其意义
信号发生器又称信号源或振荡器,在生产实践和科技领域中有着普遍的应用。
各类波形曲线均能够用三角函数方程式来表示。
能够产生多种波形,如方波、锯齿波、三角波、正弦波的电路被称为函数信号发生器。
在通信、广播、电视系统,在工业、农业、生物医学领域内,函数信号发生器在实验室和设备检测中具有十分普遍的用途。
单片机概述
随着大规模集成电路技术的进展,中央处置器(CPU)、随机存取存储(RAM)、只读存储器(ROM)、(I/O)接口、按时器/计数器和串行通信接口,和其他一些运算机外围电路等都可集成在一块芯片上组成单片微型运算机,简称为单片机。
单片机具有体积小、本钱低,性能稳固、利用寿命长等特点。
信号发生器的分类
信号发生器应用普遍,种类繁多,性能各异,分类也不尽一致。
依照频率范围分类能够分为:
超低频信号发生器、低频信号发生器、视频信号发生器、高频波形发生器、甚高频波形发生器和超高频信号发生器。
依照输出波形分类能够分为:
正弦信号发生器和非正弦信号发生器,非正弦信号发生器又包括:
脉冲信号发生器,函数信号发生器、扫频信号发生器、数字序列波形发生器、图形信号发生器、噪声信号发生器等。
依照信号发生器性能指标能够分为一样信号发生器和标准信号发生器。
前者指对输出信号的频率、幅度的准确度和稳固度和波形失真等要求不高的一类信号发生器。
后者是指其输出信号的频率、幅度、调制系数等在必然范围内持续可调,而且读数准确、稳固、屏蔽良好的中、高级信号发生器。
研究内容
本文是做基于单片机的信号发生器的设计,将采纳编程的方式来实现三角波、锯齿波、矩形波、正弦波的发生。
依照设计的要求,对各类波形的频率和幅度进行程序的编写,并将所写程序装入单片机的程序存储器中。
在程序运行中,当接收到来自外界的命令,需要输出某种波形时再挪用相应的中断效劳子程序和波形发生程序,经电路的数/模转换器和运算放大器处置后,从信号发生器的输出端口输出。
第二章方案的设计与选择
方案的比较
方案一:
采纳单片函数发生器(如8038),8038可同时产生正弦波、方波等,而且方式简单易行,用D/A转换器的输出来改变调制电压,也能够实现数控调整频率,但产生信号的频率稳固度不高。
方案二:
采纳锁相式频率合成器,利用锁相环,将压控振荡器的输出频率锁定在所需频率上,该方案性能良好,但难以达到输出频率覆盖系数的要求,且电路复杂。
方案三:
采纳单片机编程的方式来实现。
该方式能够通过编程的方式来操纵信号波形的频率和幅度,而且在硬件电路不变的情形下,通过改变程序来实现频率的变换。
另外,由于通过编程方式产生的是数字信号,因此信号的精度能够做的很高。
鉴于方案一的信号频率不够稳固和方案二的电路复杂,频率覆盖系数难以达标等缺点,因此决定采纳方案三的设计方式。
它不仅采纳软硬件结合,软件操纵硬件的方式来实现,使得信号频率的稳固性和精度的准确性得以保证,而且它利用的几种元器件都是经常使用的元器件,容易患到,且价钱廉价,使得硬件的开销达到最省。
设计原理
数字信号能够通过数/模转换器转换成模拟信号,因此可通过产生数字信号再转换成模拟信号的方式来取得所需要的波形。
89C51单片机本身确实是一个完整的微型运算机,具有组成微型运算机的各部份部件:
中央处置器CPU、随机存取存储器RAM、只读存储器ROM、I/O接口电路、按时器/计数器和串行通信接口等,只要将89C51再配置键盘及其接口、显示器及其接口、数模转换及波形输出、指示灯及其接口等四部份,即可组成所需的波形发生器。
89C51是整个波形发生器的核心部份,通进程序的编写和执行,产生各类各样的信号,并从键盘接收数据,进行各类功能的转换和信号幅度的调剂。
当数字信号通过接口电路抵达转换电路,将其转换成模拟信号也确实是所需要的输出波形。
设计思想
该设计设计一个低频信号发生器,咱们采纳的是AT89C51单片机用软件实现信号的输出。
该单片机是一个微型运算机,包括中央处置器CPU,RAM,ROM、I/O接口电路、按时计数器、串行通信等,是波形设计的核心。
整体原理为:
利用AT89C51单片机构造低频信号发生器,可产生正弦波,方波,三角波,锯齿波四种波形,通过C语言对单片机的编程即可产生相应的波形信号,并能够通过键盘进行各类功能的转换和信号频率的操纵,当输出的数字信号通过数模转换成模拟信号也就取得所需要的信号波形,通过运算放大器的放大输出波形,同时让显示器显示输出的波形信息。
本方案其要紧模块包括复位电路、时钟信号、键盘操纵、D/A转化及LED显示。
其各个模块的工作原理如下:
(1)复位电路是为单片机复位利用,使单片机接口初始化;89C51等CMOS51系列单片机的复位引脚RET是施密特触发输入脚,内部有一个上拉低电阻,当振荡器起振以后,在RST引脚上输出2个机械周期以上的高电平,器件变进入复位状态开始,现在ALE、PSEN、P0、P一、P二、P4输出高电平,RST上输入返回低电平以后,变退出复位状态开始
工作。
该方案采纳的是人工开关复位,在系统运行时,按一下开关,就在RST断显现一段高电平,使器件复位。
(2)时钟信号是产生单片机工作的时钟信号,操纵着运算机的工作节拍,能够通过提高时钟频率来提高CPU的速度。
89C51内部有一个可控的反相放大器,引脚XTAL一、XTAL2为反相放大器输入端和输出端,在XTAL一、XTAL2上外接12MHZ晶振和30pF电容便组成振荡器。
时钟信号经常使用于CPU按时和计数。
程读取闭合的键号,实现相应的信号输出。
其步骤主若是a、判定是不是有键按下;b、去抖动,延时20ms左右;c、识别被按下的键号;d、处置,实现功能。
(4)D/A转换也称为数模转换,是把数字量变换成模拟量的线性电路。
单片机产生的数字信号通过DAC0832转化成模拟信号,输出相应的电流值,通过集成运算放大器能够掏出模拟量得电压值,最后利用示波器取得输出的模拟信号的波形;衡量数模转换的性能指标有分辨率、转换时刻、精度、线性度等。
LED显示器用由假设干个发光二极管按必然的规律排列而成,是一种能够将电能转化为可见光的固态的半导体器件,它能够直接把电转化为光用于是显示相关输出波形的信息,包括信号的类型和频率。
设计功能
(1)具有产生方波、锯齿波、三角波三种周期性波形的功能。
(2)输出波形的频率范围为100Hz~1kHz;频率步进距离≤100Hz。
(3)输出波形幅度范围0~5V,可按步进(峰-峰值)调整。
(4)具有显示输出波形的类型、周期和幅度的功能。
第三章硬件设计
硬件原理框图
硬件原理方框图如下图。
图硬件原理框图
主控电路
AT89C51单处机内部设置两个16位可编程的按时器/计数器T0和T1,它们具有计数器方式和按时器方式两种工作方式及4种工作模式。
在波形发生器中,将其作按时器利用,用它来精准地确信波形的两个采样点输出之间的延迟时刻。
模式1采纳的是16位计数器,当T0或T1被许诺计数后,从初值开始加计数,最高位产生溢出时向CPU请求中断。
中断系统是使处置器具有对外界异步事件的处置能力而设置的。
当中央处置器CPU正在处置某件事的时候外界发生了紧急事件,要求CPU暂停当前的工作,转而去向理那个紧急事件。
在波形发生器中,只用到片内按时器/计数器溢出时产生的中断请求,即是在AT89C51输出一个波形采样点信号后,接着启动按时器,在按时器未产生中断之前,AT89C51等待,直到按时器计时终止,产生中断请求,AT89C51响应中断,接着输出下一个采样点信号,如此循环产生所需要的信号波形[6]。
如下图,AT89C51从P0口接收来自键盘的信号,并通过P2口输出一些操纵信号,将其输入到8155的信号操纵端,用于操纵其信号的输入、输出。
若是有键按下,那么在读操纵端会产生一个读信号,使单片机读入信号。
若是有信号输出,那么在写操纵端产生一个写信号,并将所要输出的信号通过8155的PB口输出,并在数码管上显示出来
数/模转换电路
由于单片机产生的是数字信号,要想取得所需要的波形,就要把数字信号转换成模拟信号,因此该文选用价钱低廉、接口简单、转换操纵容易并具有8位分辨率的数模转换器DAC0832。
DAC0832要紧由8位输入寄放器、8位DAC寄放器、8位D/A转换器和输入操纵电路四部份组成。
但事实上,DAC0832输出的电量也不是真正能持续可调,而是以其绝对分辨率为单位增减,是准模拟量的输出。
DAC0832是电流型输出,在应历时外接运放使之成为电压型输出。
由图可知,DAC0832的片选地址为7FFFH,当P25有效时,假设P0口向其送的数据为00H,那么U1的输出电压为0V;假设P0口向其送的数据为0FFH时,那么U1的输出电压为-5V.故当U1输出电压为0V时,由公式得:
Vout=-5V.当输出电压为-5V时,可得:
Vout=+5V,因此输出波形的电压转变范围为-5V~+5V.故可推得,当P0所送数据为80H时,Vout为0
按键接口电路
时钟电路
8051单片机有两个引脚(XTAL1,XTAL2)用于外接石英晶体和微调电容,从而组成时钟电路,其电路图如下图。
电容C一、C2对振荡频率有稳固作用,其容量的选择为30pf,振荡器选择频率为的石英晶体。
由于频率较大时,三角波、正弦波、锯齿波中每一点的延不时刻为几微秒,故延不时刻还要加上指令时刻才能取得较大的频率波形。
第四章ADC0832内部结构及配置
完成D/A转换或A/D转换的线路有多种,专门是单片大规模集成A/D、D/A问世,为实现这种转换提供了极大的方便。
借助手册提供的器件性能指标及典型应用电路,即可正确利用这些器件。
本设计将采纳大规模集成电路DAC0832实现D/A转换。
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,低电平有效。
IOUT一、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转换。
第五章实验结果
实验输出波形
第六章设计总结
制作函数信号发生器随设计思想不同,具有多种方式,本文只是一种可能实现的方式。
此法的频率操纵和幅度操纵分辨率高,且硬件集成度高,整机自动化程度高,性能优良,具有很高的有效价值。
该信号发生器在调试时,老是显现许多的错误,软件上除许多的问题,以后纠正和向教师、同窗请教慢慢的改了过来。
可是在仿真时仍然存在很多的问题,开始的时候是仿真出不了波形,以后改了改电路的一根线,显现了。
在频率的调剂问题更多,而使频率无法调剂,同时信号的频率无法在LED显示,鉴于此,我以为应该是输出中断除问题,造成所概念的频率的个位,十位,百位都没有跟从键盘的输入而赋值,使其值时钟为初始设定值。
同时该信号源设计尚存在的不足的地方,要紧有两个方面,第一为缺乏频率准确显示的手腕能够配备相应的数字频率计模块,但如何将显示的精度与信号源的频段配合有待讨论研究;第二为D/A转换时能够加一个锁存器,而且放大电路有待进一步改良使其具有更强的输出能力。
参考文献
[1]程全.基于AT89C52实现的多种波形发生器的设计[J].周口师范学院学报,(5):
57~58.
[2]周明德.微型运算机系统原理及应用[M].北京:
清华大学出版社,~364.
[3]刘乐善.微型运算机接口技术及应用[M].北京:
北京航空航天大学出版社,~264.
[4]童诗白.模拟电路技术基础[M].北京:
高等教育出版社,~202.
[5]杜华.任意波形发生器及应用[J].国外电子测量技术,:
38~40.
[6]张友德.单片微型机原理、应用与实践[M].上海:
复旦大学出版社,~44.
[7]程朗.基于8051单片机的双通道波形发生器的设计与实现[J].运算机工程与应用,:
100~103.
[8]张永瑞.电子测量技术基础[M].西安:
西安电子科技大学出版社,~101.
[9]李叶紫.MCS-51单片机应用教程[M].北京:
清华大学出版社,~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;
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);}
}
key_value=0;
}
/*********正弦波函数*********/
voidsin()
{TF0=0;
TR0=0;
P1M1=0X00;
P1M0=0XFF;//设置P1口为强推挽输出
TMOD=0x01;
TH0=(66536-ft)/256;
TL0=(66536-ft)%256;
EA=1;
ET0=1;
TR0=1;
if(d1==0)
{
for(k=0;k<64;)
{
DAC0832=sindot[k];
k++;
}
}
frq_set();
amp_set();
}
/*********锯齿波函数*********/
voidjuchi()
{TF0=0;
TR0=0;