AT89S51的简易波形发生器.docx
《AT89S51的简易波形发生器.docx》由会员分享,可在线阅读,更多相关《AT89S51的简易波形发生器.docx(17页珍藏版)》请在冰豆网上搜索。
AT89S51的简易波形发生器
四川职业技术学院
综合实验课程报告
实验名称:
单片机的简易信号发生器
实训地点:
2J415
班级:
10电技2班
学号:
XXXXXX
姓名:
XXXXXXXXXX
指导教师:
成XXXXX
时间:
2011-12-12至2011-12-16
摘要
本系统是基于AT89C51单片机的数字式低频信号发生器。
采用AT89C51单片机作为控制核心,外围采用数字/模拟转换电路(DAC0832)、运放电路(LM324)、按键和8位数码管等。
通过按键控制可产生方波、三角波、正弦波等,同时用数码管指示其对应的频率。
其设计简单、性能优好,可用于多种需要低频信号的场所,具有一定的实用性。
各种各样的信号是通信领域的重要组成部分,其中正弦波、三角波和方波等是较为常见的信号。
在科学研究及教学实验中常常需要这几种信号的发生装置。
为了实验、研究方便,研制一种灵活适用、功能齐全、使用方便的信号源是十分必要的。
本文介绍的是利用AT89C51单片机和数模转换器件DAC0832产生所需不同信号的低频信号源,其信号幅度和频率都是可以按要求控制的。
文中简要介绍了DAC0832数模转换器的结构原理和使用方法,AT89C51的基础理论,以及与设计电路有关的各种芯片。
文中着重介绍了如何利用单片机控制D/A转换器产生上述信号的硬件电路和软件编程。
信号频率幅度也按要求可调。
本次关于产生不同低频信号的信号源的设计方案,不仅在理论和实践上都能满足实验的要求,而且具有很强的可行性。
该信号源的特点是:
体积小、价格低廉、性能稳定、实现方便、功能齐全。
关键词:
AT89C51DAC0832LM3248位数码管显
1.2课题分析......................................................................................2
附录..........................................................................................................14
I源程序.........................................................................................14
II仿真电路....................................................................................18
III元器件清单..................................................................................18
前言
波形发生器也称函数发生器,作为实验信号源,是现今各种电子电路实验设计应用中必不可少的仪器设备之一。
目前,市场上常见的波形发生器多为纯硬件的搭接而成,且波形种类有限,多为锯齿波,正弦波,方波,三角波等波形。
信号发生器作为一种常见的应用电子仪器设备,传统的可以完全由硬件电路搭接而成,如采用555振荡电路发生正弦波、三角波和方波的电路便是可取的路经之一,不用依靠单片机。
但是这种电路存在波形质量差,控制难,可调范围小,电路复杂和体积大等缺点。
在科学研究和生产实践中,如工业过程控制,生物医学,地震模拟机械振动等领域常常要用到低频信号源。
而由硬件电路构成的低频信号其性能难以令人满意,而且由于低频信号源所需的RC很大;大电阻,大电容在制作上有困难,参数的精度亦难以保证;体积大,漏电,损耗显著更是致命的弱点。
一旦工作需求功能有增加,则电路复杂程度会大大增加。
1课题概述
知识点:
1.D/A转换的基本知识;
2.D/A转换器与AT89C51之间的连接方法;
3.单片机控制D/A的实例。
技能点:
1.能正确应用单片机控制D/A输出需要的信号;
2.会利用单片机输出模拟量
1.1课题目标
利用单片机和D/A转换器件组成系统,通过程序的控制,实现简易波形发生器,能输出锯齿波和方波。
通过本实训任务的完成,加深对D/A转换的认识,学会用单片机的编程控制,输出指定的波形或指定的模拟电平。
1.2课题分析
要实现方波和锯齿波输出,就是要随着时间变化不断输出模拟信号的指定电压值。
要单片机输出和输入都是数字信号,如果需要输出方波信号,通过对I/O引脚置1和清0的方式直接从单片机的引脚上输出对应的脉冲即可;
在本课题中,由于没有较多的任务和外围设备,D/AC0832与单片机连接采用直通方式,并且将运放D/AC0832输出的模拟电流变换为对应的模拟电压。
在直通方式中。
要求将D/AC0832对应的控制端ILE接高电平,~CS,~WR1,~XFER,~WR2都接地,同时将D/AC0832的数据端口接在单片机的P口上,就能用单片机通过程序控制D/AC0832输出模拟信号。
在本任务中,选择P2端口作为数据输出端口与D/AC0832相连,因此在程序中的输出数据只需要写在P2口就行了。
2硬件原理
波形的产生是通过AT89S52单片机执行某一波形发生程序,向D/A转换器的输入端按一定的规律发生数据,从而在D/A转换电路的输出端得到相应的电压波形。
AT89S52单片机的最小系统有三种联接方式。
一种是两级缓冲器型,即输入数据经过两级缓冲器型,即输入数据经过两级缓冲器后,送D/A转换电路。
第二种是单级缓冲器型,输入数据经输入寄存器直接送入DAC寄存器,然后送D/A转换电路。
第三种是两个缓冲器直通,输入数据直接送D/A转换电路进行转换。
本电路仿真的总图如下:
图3.1系统电路图
2.1单片机最小系统的设计
AT89C52是片内有ROM/EPROM的单片机,因此,这种芯片构成的最小系统简单﹑可靠。
用80C51单片机构成最小应用系统时,只要将单片机接上时钟电路和复位电路即可,如图
(2)89C51单片机最小系统所示。
由于集成度的限制,最小应用系统只能用作一些小型的控制单元。
其应用特点:
(1)有可供用户使用的大量I/O口线。
(2)内部存储器容量有限。
(3)应用系统开发具有特殊性。
2.2AT89C-51单片机的接口布局
2.2时钟电路和复位电路
单片机的时钟信号用来提供单片机内各种微操作的时间基准;复位操作则使单片机的片内电路初始化,使单片机从一种确定的状态开始运行。
2.2.1时钟电路
单片机的时钟信号通常用两种电路形式得到:
内部振荡和外部振荡方式。
图3.3时钟部分电路图
在引脚XTAL1和XTAL2外接晶体振荡器或陶瓷谐振荡器,构成了内部振荡方式。
由于单片机内部有一个高增益反相放大器,当外接晶振后,就构成了自积振荡,并产生振荡时钟脉冲。
晶振通常选用6MHZ、12MHZ、或24MHZ。
单片机的时序单位
振荡周期:
晶振的振荡周期,又称时钟周期,为最小的时序单位。
状态周期:
振荡频率经单片机内的二分频器分频后提供给片内CPU的时钟周期。
因此一个状态周期包含2个振荡周期。
机器周期:
1个机器周期由6个状态周期12个振荡周期组成,是计算机执行一种基本操作的时间单位。
指令周期:
执行一条指令所需的时间。
一个指令周期由1-4个机器周期组成,依据指令不同而不同.
2.2.2单片机的复位状态
当MCS-5l系列单片机的复位引脚RST(全称RESET)出现2个机器周期以上的高电平时,根据应用的要求,复位操作通常有两种基本形式:
上电复位和上电或开关复位。
上电复位要求接通电源后,自动实现复位操作。
上电或开关复位要求电源接通后,单片机自动复位,并且在单片机运行期间,用开关操作也能使单片机复位。
上电后,由于电容C3的充电和反相门的作用,使RST持续一段时间的高电平。
当单片机已在运行当中时,按下复位键K后松开,也能使RST为一段时间的高电平,从而实现上电或开关复位的操作。
图3.4复位电路
单片机的复位操作使单片机进入初始化状态,其中包括使程序计数器PC=0000H,这表明程序从0000H地址单元开始执行。
单片机冷启动后,片内RAM为随机值,运行中的复位操作不改变片内RAM区中的内容,21个特殊功能寄存器复位后的状态为确定值统复位是任何微机系统执行的第一步,使整个控制芯片回到默认的硬件状态下。
51单片机的复位是由RESET引脚来控制的,此引脚与高电平相接超过24个振荡周期后,51单片机即进入芯片内部复位状态,而且一直在此状态下等待,直到RESET引脚转为低电平后,才检查EA引脚是高电平或低电平,若为高电平则执行芯片内部的程序代码,若为低电平便会执行外部程序。
51单片机在系统复位时,将其内部的一些重要寄存器设置为特定的值,至于内部RAM内部的数据则不变。
2.3DAC0832的引脚及功能
1DAC0832芯片:
DAC0832是8分辨率的D/A转换集成芯片。
与微处理器完全兼容。
这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。
D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。
2DAC0832的主要特性参数如下:
分辨率为8位;
电流稳定时间1us;
可单缓冲、双缓冲或直接数字输入;
只需在满量程下调整其线性度;
单一电源供电(+5V~+15V);
低功耗,200mW。
3DAC0832结构:
D0~D7:
8位数据输入线,TTL电平,有效时间应大于90ns(否则锁存器的数据会出错);
ILE:
数据锁存允许控制信号输入线,高电平有效;
CS:
片选信号输入线(选通数据锁存器),低电平有效;
WR1:
数据锁存器写选通输入线,负脉冲(脉宽应大于500ns)有效。
由ILE、CS、WR1的逻辑组合产生LE1,当LE1为高电平时,数据锁存器状态随输入数据线变换,LE1的负跳变时将输入数据锁存;
XFER:
数据传输控制信号输入线,低电平有效,负脉冲(脉宽应大于500ns)有效;
WR2:
DAC寄存器选通输入线,负脉冲(脉宽应大于500ns)有效。
由WR1、XFER的逻辑组合产生LE2,当LE2为高电平时,DAC寄存器的输出随寄存器的输入而变化,LE2的负跳变时将数据锁存器的内容打入DAC寄存器并开始D/A转换。
IOUT1:
电流输出端1,其值随DAC寄存器的内容线性变化;
IOUT2:
电流输出端2,其值与IOUT1值之和为一常数;
Rfb:
反馈信号输入线,改变Rfb端外接电阻值可调整转换满量程精度;
Vcc:
电源输入端,Vcc的范围为+5V~+15V;
VREF:
基准电压输入线,VREF的范围为-10V~+10V;
AGND:
模拟信号地
DGND:
数字信号地
4DAC0832的工作方式:
根据对DAC0832的数据锁存器和DAC寄存器的不同的控制方式,DAC0832有三种工作方式:
直通方式、单缓冲方式和双缓冲方式
3软件原理
系统软件由主程序和产生波形的子程序组成,软件设计主要是产生各种波形的子程序的编程,通过编程可得到各种波形。
周期的改变可采用插入延时子程序的方法来实现。
主程序和几种常用波形子程序的流程图如图所示。
3.1主流程图
图4.1主程序流程图
信号的产生:
利用8位D/A转换器DAC0808,可以将8位数字量转换成模拟量输出。
数字量输入的范围为0~255,对应的模拟量输出的范围在VREF-到VREF+之间。
根据这一特性,可以利用单片机的并行口输出的数字量,产生常用的波形。
例如,要产生幅度为0~5V的锯齿波,只要将DAC0808的VREF-接地,VREF+接+5V,单片机的并行口首先输出00H,再输出01H、02H,直到输出FFH,再输出00H,依此循环,这样在图4.2所示的Vout端就可以看到在0到5V之间变化的锯齿波。
3.2锯齿波仿真图
图4.2锯齿波仿真
锯齿波产生是通过P0口将00H送入寄存器A中,DAC0832输出A中的内容,读取P2口的状态,取反后作为延时常数,当A中的内容不为0FFH时,A中的内容加1,当A中的内容等于FFH返回开始,从而输出波形。
锯齿波程序
voidjuchi()
{
uinti;
i=0;
while
(1)
{
P0=i;
delay(t);
i=i+1;
P0=i;
delay(t);
xianshiqi(t);
if(i==256)
{
i=0;
}
if(s5==0)
{
t=t+1;
}
if(s6==0)
{
t=t-1;
}
}
}
3.3方波仿真图
方波仿真
方波产生是通过P0口将00H输出给DAC0808,输出对应模拟量,然后读取P2口的状态,取反后作为延时常量,延时时间到,将FFH输出时,同样输出对应模拟量,再延时,从而得到方波。
方波程序如下:
voidfangbo()
{
while
(1)
{
P0=256;
delay(t);
P0=0;
delay(t);
xianshiqi(t);
if(s5==0)
{
t=t+1;
}
if(s6==0)
{
t=t-1;
}
}
总结
经过一周的单片机课程设计,终于完成了我的简易函数设计,基本达到设计要求,从心底里来说,还是很高兴的,毕竟这次设计把实物都做了出来。
但高兴之余不得不深思呀!
在本次设计的过程中,我发现很多的问题,虽然以前还做过这样的设计但这次设计真的让我长进了很多。
对于单片机设计,其硬件电路是比较简单的,主要是解决程序设计的问题,而程序设计是一个很灵活的东西,它反映了你解决问题的逻辑思维和创新能力,它才是一个设计的灵魂所在。
因此在整个设计过程中大部分时间是用在程序上面的。
很多子程序是可以借鉴书本上的,但怎样衔接各个子程序才是关键的问题所在,这需要对单片机的结构很熟悉。
因此可以说单片机的设计是软件和硬件的结合,二者是密不可分的。
要设计一个成功的电路,必须要有耐心,要有坚持的毅力。
在整个电路的设计过程中,花费时间最多的是各个单元电路的连接及电路的细节设计上,如在多种方案的选择中,我们仔细比较分析其原理以及可行的原因。
这就要求我们对硬件系统中各组件部分有充分透彻的理解和研究,并能对之灵活应用。
完成这次设计后,我在书本理论知识的基础上又有了更深层次的理解。
同时在本次设计的过程中,我还学会了高效率的查阅资料、运用工具书、利用网络查找资料。
我发现,在我们所使用的书籍上有一些知识在实际应用中其实并不是十分理想,各种参数都需要自己去调整。
偶而还会遇到错误的资料现象,这就要求我们应更加注重实践环节。
最后还要在此感谢各位毕业设计的指导老师们和我的组员们,他们在整个过程中都给予了我充分的帮助与支持。
附录
I源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
unsignedcharflag;
sbitP10=P0^0;//将P10位定义为P0.0
sbitP11=P0^2;//将P11位定义为P0.2
uintf=100,num;//起始频率设定为100HZ
bittime;
voidtiaopin();
//将DAC0832定义为P2口
voidDAC0832(unsignedcharx)
{
P2=x;
}
/*************************************************
函数功能:
延时约10ms(1*100*100=10000us=10ms
*************************************************/
voiddelay10ms(void)
{
unsignedchari,k;
for(i=20;i>0;i--)
for(k=250;k>0;k--);
}
/*****************************************
函数功能:
主函数
******************************************/
voidmain()
{
unsignedchari;//定义无符号变量i
TMOD=0x02;//TMOD=00000010B,使用定时器T0的模式2
TH0=256-4000/f;
ET0=1;//设定定时器工作在定时方式
IT0=1;//设定下降沿有效工作方式
EX0=1;//开外部中断
EA=1;//开总中断
TR0=1;//开定时器中断
flag=0;
i=0;//设定变量初始值为1
while
(1)
{
tiaopin();
if(time==1)//每1/f时间到
{
time=0;
if(i>=250)i=0;elsei++;//指向下一个点
switch(flag)//判断标志
{
case0:
//:
DAC0832(i);break;
case1:
//状态1:
输出锯齿波
if(i<125)DAC0832(255);
elseDAC0832(0);
break;
default:
;
}
}
}
}
/*****************************************
函数功能:
频率控制
******************************************/
voidtiaopin()
{
if(P10==0)
{
delay10ms();
if(P10==0)
{
f=f+100;
if(f>1000)f=f+100;
TH0=TL0=256-4000/f;
}
elseP10=1;
}
elseif(P11==0)
{
delay10ms();
if(P11==0)
{
f=f-100;
if(f<100)f=f-100;
TH0=TL0=256-4000/f;
}
elseP11=1;
}
}
/*****************************************
函数功能:
定时中断0
******************************************/
voidtime0(void)interrupt1//“interrupt”声明函数为中断服务函数
{
time=1;//置时间标志
}
/*****************************************
函数功能:
外部中断0波形切换
******************************************/
voidint0()interrupt0
{
if(INT0==0)//INT0是12脚p3.2
{
delay10ms();
if(INT0==0)
{
flag++;
if(flag>1)
flag=0;
}
elseINT0=1;
}
}
II仿真电路图
III元器件清单
电解电容10uf
1个
瓷片电容20pf
2个
电阻5.1K
1个
电阻10K
4个
晶振12MHz
1个
按钮开关
4个
LM324集成块
1块
DAC0832
1块
AT89S52
1块
DIP-40封装插座
1个
DIP-20封装插座
2个
导线若干
(范文素材和资料部分来自网络,供参考。
可复制、编制,期待你的好评与关注)