函数信号发生器的设计与实现1资料Word格式.docx
- 文档编号:16196687
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:31
- 大小:1.58MB
函数信号发生器的设计与实现1资料Word格式.docx
《函数信号发生器的设计与实现1资料Word格式.docx》由会员分享,可在线阅读,更多相关《函数信号发生器的设计与实现1资料Word格式.docx(31页珍藏版)》请在冰豆网上搜索。
由于人眼具有视觉暂留特性,当每只数码管显示的时间间隔小于1/16s时人眼感觉不到闪动,看到的是每只数码管常亮。
使用数码管显示编程较易,但要显示内容多,而且数码管不能显示字母。
采用LCD液晶显示器12864,显示波形以及它的幅度和频率。
12864其功率小,效果明显,显示编程容易控制,可以显示波形。
(4).按键方案:
独立按键,当没有键闭合时,呈高电平。
当某一个键闭合时,该键所对应的线被短路。
系统的总体框图:
图
(1)系统的总体框图
四.系统(算法)设计实现
硬件实现及单元电路设计:
AT89C51是片内有ROM/EPROM的单片机,因此,这种芯片构成的最小系统简单﹑可靠。
用AT89C51单片机构成最小应用系统时,只要将单片机接上时钟电路和复位电路即可,如图
(2)AT89C51单片机最小系统所示。
由于集成度的限制,最小应用系统只能用作一些小型的控制单元。
其应用特点:
(1)有可供用户使用的大量I/O口线。
(2)内部存储器容量有限。
(3)应用系统开发具有特殊性。
图
(2)AT89C51单片机最小系统
芯片的引脚描述如下:
1、主电源引脚VCC和VSS
VCC——(40脚)接+5V电压;
VSS——(20脚)接地。
2、外接晶体引脚XTAL1和XTAL2
XTAL1(19脚)接外部晶体的一个引脚。
在单片机内部,它是一个反相放大器的输入端,这个放大器构成了片内振荡器。
当采用外部振荡器时,对HMOS单片机,此引脚应接地;
对CHMOS单片机,此引脚作为驱动端。
XTAL2(18脚)接外晶体的另一端。
在单片机内部,接至上述振荡器的反相放大器的输出端。
采用外部振荡器时,对HMOS单片机,该引脚接外部振荡器的信号,即把外部振荡器的信号直接接到内部时钟发生器的输入端;
对XHMOS,此引脚应悬浮。
3、控制或与其它电源复用引脚RST/VPD、ALE/PROG、PSEN和EA/VPP
①RST/VPD(9脚)当振荡器运行时,在此脚上出现两个机器周期的高电平将使单片机复位。
推荐在此引脚与VSS引脚之间连接一个约8.2k的下拉电阻,与VCC引脚之间连接一个约10μF的电容,以保证可靠地复位。
VCC掉电期间,此引脚可接上备用电源,以保证内部RAM的数据不丢失。
当VCC主电源下掉到低于规定的电平,而VPD在其规定的电压范围(5±
0.5V)内,VPD就向内部RAM提供备用电源。
②ALE/PROG(30脚):
当访问外部存贮器时,ALE(允许地址锁存)的输出用于锁存地址的低位字节。
即使不访问外部存储器,ALE端仍以不变的频率周期性地出现正脉冲信号,此频率为振荡器频率的1/6。
因此,它可用作对外输出的时钟,或用于定时目的。
然而要注意的是,每当访问外部数据存储器时,将跳过一个ALE脉冲。
ALE端可以驱动(吸收或输出电流)8个LS型的TTL输入电路。
对于EPROM单片机(如8751),在EPROM编程期间,此引脚用于输入编程脉冲(PROG)。
③PSEN(29脚):
此脚的输出是外部程序存储器的读选通信号。
在从外部程序存储器取指令(或常数)期间,每个机器周期两次PSEN有效。
但在此期间,每当访问外部数据存储器时,这两次有效的PSEN信号将不出现。
PSEN同样可以驱动(吸收或输出)8个LS型的TTL输入。
④EA/VPP(引脚):
当EA端保持高电平时,访问内部程序存储器,但在PC(程序计数器)值超过0FFFH(对851/8751/80C51)或1FFFH(对8052)时,将自动转向执行外部程序存储器内的程序。
当EA保持低电平时,则只访问外部程序存储器,不管是否有内部程序存储器。
对于常用的8031来说,无内部程序存储器,所以EA脚必须常接地,这样才能只选择外部程序存储器。
对于EPROM型的单片机(如8751),在EPROM编程期间,此引脚也用于施加21V的编程电源(VPP)。
4、输入/输出(I/O)引脚P0、P1、P2、P3(共32根)
①P0口(39脚至32脚):
是双向8位三态I/O口,在外接存储器时,与地址总线的低8位及数据总线复用,能以吸收电流的方式驱动8个LS型的TTL负载。
②P1口(1脚至8脚):
是准双向8位I/O口。
由于这种接口输出没有高阻状态,输入也不能锁存,故不是真正的双向I/O口。
P1口能驱动(吸收或输出电流)4个LS型的TTL负载。
对8052、8032,P1.0引脚的第二功能为T2定时/计数器的外部输入,P1.1引脚的第二功能为T2EX捕捉、重装触发,即T2的外部控制端。
对EPROM编程和程序验证时,它接收低8位地址。
③P2口(21脚至28脚):
在访问外部存储器时,它可以作为扩展电路高8位地址总线送出高8位地址。
在对EPROM编程和程序验证期间,它接收高8位地址。
P2可以驱动(吸收或输出电流)4个LS型的TTL负载。
④P3口(10脚至17脚):
是准双向8位I/O口,在MCS-51中,这8个引脚还用于专门功能,是复用双功能口。
P3能驱动(吸收或输出电流)4个LS型的TTL负载。
作为第一功能使用时,就作为普通I/O口用,功能和操作方法与P1口相同。
作为第二功能使用时,各引脚的定义如表所示。
值得强调的是,P3口的每一条引脚均可独立定义为第一功能的输入输出或第二功能。
第二功能描述如下:
P3.010RXD(串行输入口)
P3.111TXD(串行输出口)
P3.212INT0(外部中断0)
P3.313INT1(外部中断1)
P3.414T0(定时器0外部输入)
P3.515T1(定时器1外部输入)
P3.616WR(外部数据存储器写脉冲)
P3.717RD(外部数据存储器读脉冲)
(1)波形产生模块设计
由单片机采用编程方法产生三种波形、通过DA转换模块PCF8591之后输出。
其电路图如下:
图(3)PCF8591芯片
在与CPU的信息传输过程中仅靠时钟线SCL和数据线SDA就可以实现。
PCF8591是具有I2C总线接口的8位A/D及D/A转换器。
有4路A/D转换输入,1路D/A模拟输出。
这就是说,它既可以作A/D转换也可以作D/A转换。
A/D转换为逐次比较型。
AIN0~AIN3:
模拟信号输入端。
A0~A3:
引脚地址端。
SDA、SCL:
I2C总线的数据线、时钟线。
OSC:
外部时钟输入端,内部时钟输出端。
EXT:
内部、外部时钟选择线,使用内部时钟时EXT接地。
AGND:
模拟信号地。
AOUT:
D/A转换输出端。
VREF:
基准电源端。
PCF8591采用典型的I2C总线接口器件寻址方法,即总线地址由器件地址、引脚地址和方向位组成。
飞利蒲公司规定A/D器件地址为1001。
引脚地址为A2A1A0,其值由用户选择,因此I2C系统中最多可接23=8个具有I2C总线接口的A/D器件。
地址的最后一位为方向位R/
,当主控器对A/D器件进行读操作时为1,进行写操作时为0。
总线操作时,由器件地址、引脚地址和方向位组成的从地址为主控器发送的第一字节。
控制字节用于实现器件的各种功能,如模拟信号由哪几个通道输入等。
控制字节存放在控制寄存器中。
总线操作时为主控器发送的第二字节。
其格式如下所示:
其中:
D1、D0两位是A/D通道编号:
00通道0,01通道1,10通道2,11通道3
D2
自动增益选择(有效位为1)
D5、D4模拟量输入选择:
00为四路单数入、01为三路差分输入、10为单端与差分配合输入、11为模拟输出允许有效
当系统为A/D转换时,模拟输出允许为0。
模拟量输入选择位取值由输入方式决定:
四路单端输入时取00,三路差分输入时取01,单端与差分输入时取10,二路差分输入时取11。
最低两位时通道编号位,当对0通道的模拟信号进行A/D转换时取00,当对1通道的模拟信号进行A/D转换时取01,当对2通道的模拟信号进行A/D转换时取10,当对3通道的模拟信号进行A/D转换时取11。
在进行数据操作时,首先是主控器发出起始信号,然后发出读寻址字节,被控器做出应答后,主控器从被控器读出第一个数据字节,主控器发出应答,主控器从被控器读出第二个数据字节,主控器发出应答…一直到主控器从被控器中读出第n个数据字节,主控器发出非应答信号,最后主控器发出停止信号。
(2)显示模块的设计
通过液晶12864显示输出的波形以及波形的频率和幅度频率,其电路图如下:
图(4)液晶显示模块
如上图所示,12864的八位数据端接单片机的P0口,其三个使能端RS、RW、E分别接单片机的P2.2—P2.4。
通过软件控制液晶屏可以显示波形以及波形的幅度和频率。
带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;
其显示分辨率为128×
64,
内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。
可以显示8×
4行16×
16点阵的汉字.
也可完成图形显示.低电压低功耗是其又一显著特点。
LCD12864基本特性:
(1)、低电源电压(VDD:
+3.0--+5.5V)
(2)、显示分辨率:
128×
64点
(3)、内置汉字字库,提供8192个16×
16点阵汉字(简繁体可选)
(4)、内置
128个16×
8点阵字符
(5)、2MHZ时钟频率
(6)、显示方式:
STN、半透、正显
(7)、驱动方式:
1/32DUTY,1/5BIAS
(8)、视角方向:
6点
(9)、背光方式:
侧部高亮白色LED,功耗仅为普通LED的1/5—1/10
(10)、通讯方式:
串行、并口可选
(11)、内置DC-DC转换电路,无需外加负压
(12)、无需片选信号,简化软件设计(13)、工作温度:
0℃
-
+55℃
存储温度:
-20℃-+60℃
图(5)数码管显示模块
通过一位数码管显示波形类型(1-3).
(3)按键显示模块的设计
本系统采用独立按键,其连接电路图如下:
图(6)按键显示模块
图中四个按键引出的四个线分别接单片机的P3.2—P3.6口,如图KEY1用来切换输出波形、KEY2和KEY3用来调节频率的加减,KEY4和KEY5用来调节幅度的加减。
当按KEY2时输出波形的频率增加,按KEY3时输出波形的频率减小。
当按KEY4时输出波形的幅度增加,按KEY5时输出波形的幅度减小。
软件设计流程:
本系统采用AT89C51单片机,用编程的方法来产生三种波形,并通过编程
来切换三种波形以及波形频率的改变。
具体功能有:
(1)各个波形的切换;
(2)各种参数的设定;
(3)频率增减等。
软件调通后,通过编程器下载到AT89C51芯片中,然后插到系统中即可独立完成所有的控制。
软件的流程图如下:
图(7)软件的流程图
部分程序代码:
hnh.c文件:
#include<
reg51.h>
intrins.h>
#include"
LCD12864.h"
#defineucharunsignedchar
#defineuintunsignedint
#define_Nop()_nop_()
#defineAddW0x90
#defineAddR0x91
sbitSDA=P2^0;
sbitSCL=P2^1;
sbitkey1=P3^2;
sbitkey2=P3^3;
sbitkey3=P3^4;
sbitkey4=P3^5;
sbitkey5=P3^6;
bitback;
ucharwave=0;
ucharf=1;
ucharA1=10;
ucharA2=1;
uintnum=0;
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,};
//共阴
unsignedcharcodefangbo[]=
{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,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,};
unsignedcharcodesanjiao[]
={0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,
60,64,68,72,76,80,84,88,92,96,100,104,
108,112,116,120,124,128,124,120,116,112,
108,104,100,96,92,88,84,80,76,72,68,64,
60,56,52,48,44,40,36,32,28,24,20,16,12,8,4,0,};
unsignedcharcodesin[]
={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};
voiddelay1(uintz)
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=60;
y>
y--);
}
voidStart_I2c()
SDA=1;
_Nop();
SCL=1;
SDA=0;
SCL=0;
}//结束总线
voidStop_I2c()
SDA=0;
SDA=1;
voidSendByte(ucharc)//发送字节函数
unsignedcharBit;
for(Bit=0;
Bit<
8;
Bit++)//要传送的数据长度为8位
if((c<
<
Bit)&
0x80)//判断发送位
SDA=1;
else
SDA=0;
_Nop();
SCL=1;
//置时钟线为高,通知被控器开始接收数据位
SCL=0;
if(SDA==1)
back=0;
back=1;
bitWriteDAC(uchardat,ucharnum)
unsignedchari;
Start_I2c();
SendByte(AddW);
if(back==0)
return(0);
SendByte(0x40);
for(i=0;
i<
num;
i++)
SendByte(dat);
if(back==0)
return(0);
Stop_I2c();
voidkeys()
{
if(key1==0)
delay1(10);
if(key1==0)
{
num++;
while(!
key1);
wave++;
if(wave==4)
{
wave=1;
num=1;
}
P1=table[num];
}
}
}
voidkeys1()
if(key2==0)
if(key2==0)
key2);
f++;
if(f>
500)
f=500;
if(key3==0)
if(key3==0)
key3);
1)
f--;
if(key4==0)
if(key4==0)
key4);
A1++;
if(A1>
15)
A1=15;
}
if(key5==0)
if(key5==0)
key5);
A1--;
}
voidkeys2()
100)
f=100;
}
A2++;
if(A2>
5)
A2=5;
A2--;
}
voidmain()
unsignedchari,temp,Atemp,Ftemp;
LcdInit();
P1=table[0];
while
(1)
temp=wave;
keys();
if(temp!
=wave)
ClrGDRAM();
if(wave==1)
Atemp=A1;
Ftemp=f;
keys1();
if(Atemp!
=A1)
ClrGDRAM();
if(Ftemp!
=f)
for(i=0;
65;
WriteDAC(1.0*sanjiao[i]*A1/20,21-f);
drawTri(A1,f);
//绘制三角波图像.
delayms(10);
elseif(wave==2)
for(i=0;
64;
WriteDAC(1.0*sin[i]*A1/40,21-f);
drawSin(A1,f);
//绘制正弦波图像.
elseif(wave==3)
Atemp=A2;
keys2();
=A2)
WriteDAC(1.0*fa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 信号发生器 设计 实现 资料
![提示](https://static.bdocx.com/images/bang_tan.gif)