




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要波形发生器是一种常用的信号源,广泛地应用于电子电路、自动控制系统和教学实验等领域。本多功能波形发生器设计使用的AT89C51单片机作为核心控制,DAC0832控制输出波形参考幅值构成的发生器可产生锯齿波、三角波、正弦波等多种波形。波形的频率、幅值根据内部程序设定的参考值,利用按钮控制输出相应的波形,具有线路简单、结构紧凑等优点。关键字:波形发生器,AT89C51,DAC0832,C语言编程1.概述随着单片机功能的不断完善,单片机在越来越多的领域得以应用。按照传统的模式,在单片机应用系统整个项目开发过程中,先根据系统要求设计原理图,绘制PCB电路图,制作电路板,焊接元器件,然后进行软件编程,通过仿真器对系统硬件和软件调试,最后将调试成功的程序固化到单片机的程序存储器中。无论是从硬件成本上,还是从调试周期上,传统开发模式的效率都有待提高。基于Proteus和Keil接口仿真平台是可以进行仿真、调试、制板并最大限度的软件模拟单片机的开发平台,可极大的提高单片机应用系统的开发过程。波形发生器是一种常用的信号源,广泛的应用于科学研究,生产实践和教学实验等领域。本次能力拓展训练是基于D/A转换模块的单片机仿真和C语言开发。要求设计一种采用D/A转换的波形发生器,比如产生矩形波,三角波,锯齿波,正弦波或余弦波并进行电路仿真,使用C语言进行程序的开发。本设计采用了AT89C51单片机和8位的D/A转换器DAC0832组成的电路,以及用C语言开发的程序,用Proteus进行仿真成功实现了波形发生器的功能并输出了方波、锯齿波、正弦波和三角波。2.设计思路及总体电路2.1方案论证和比较 方案一:采用函数信号发生器ICL8038集成模拟芯片,它是一种可以同时产生方波、三角波、正弦波的专用集成电路。但是这种模块产生的波形都不是纯净的波形,会寄生一些高次谐波分量,采用其他的措施虽可滤除一些,但不能完全滤除掉。方案二:采用AT89C51单片机和DAC0832数模转换器生成波形,由于是软件滤波,所以不会有寄生的高次谐波分量,生成的波形比较纯净。它的特点是价格低、性能高,在低频范围内稳定性好、操作方便、体积小、耗电少。经比较,方案二既可满足课程设计的基本要求又能充分发挥其优势,电路简单,易控制,性价比高,所以采用该方案。2.2设计思路本次能力拓展训练我的题目是基于D/A模块的单片机仿真和C语言开发,要求设计一种采用D/A转换的波形发生器,比如产生矩形波,三角波,锯齿波,正弦波或余弦波并用Proteus进行电路仿真,使用C语言进行程序的开发。2.3总体电路根据单片机原理与应用这门课程的所学,我决定采用常用的AT89C51单片机以及8为D/A转换器DAC0832来实现这一设计。总体电路如下图1所示。图1.波形发生器总体电路AT89C51的P2口和DAC0832数据输入线DI0DI7相连接,向DAC0832输入数字信号。P3口的P3.2引脚接一弹性按钮,弹性按钮的另一端接数字地。按下按钮时,INT0向CPU发出中断请求。DAC0832工作于单缓冲工作方式。WR2,XFER,WR1接数字地,ILE接高电平,CS接AT89C51单片机的P3口的P3.7引脚,此时DAC0832的8位输入寄存器工作于受控锁存状态,8位D/A寄存器工作于直通状态。DAC0832的电源输入端Vcc接+5V电源,参考电压端VREF接+5V电源,GND接数字地。DAC0832的两个模拟电流输出端IOUT1接到运放的反相输入端上,IOUT2接数字地,反馈信号Rfb接运放的输出口。运放的同相输入端接地,输出端接数字示波器。数字示波器用来显示输出的各种波形。3芯片介绍3.1AT89C51AT89C51是一种带4K字节闪存可编程可擦除只读存储器的低电压、高性能CMOS 8位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器.。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。外形及引脚排列如图2所示。AT89C51单片机内包含如下几个部件:l 一个8位CPU;l 一个片内振荡器及时钟电路;l 4KB ROM程序存储器;l 128B RAM数据存储器;l 可寻址64KB外部数据存储器和64KB外部程序存储空间的控制电路;l 32条可编程的I/O线(4个8位并行I/O端口);l 两个16位的定时/计数器;l 一个可编程全双工串行口;l 5个中断源、两个优先级嵌套中断结构。图2.AT89C51引脚图3.2DAC0832DAC0832是8分辨率的D/A转换集成芯片。与微处理器完全兼容。这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。DAC0832 D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。外形及引脚排列如图3所示。图3.DAC0832引脚图DAC0832有20根引脚,各引脚的功能如下:l D0D7:8位数据输入线,TTL电平,有效时间应大于90ns(否则锁存器的数据会出错);l ILE:数据锁存允许控制信号输入线,高电平有效;l CS:片选信号输入线(选通数据锁存器),低电平有效;l WR1:数据锁存器写选通输入线,负脉冲(脉宽应大于500ns)有效。由ILE、CS、WR1的逻辑组合产生LE1,当LE1为高电平时,数据锁存器状态随输入数据线变换,LE1的负跳变时将输入数据锁存;l XFER:数据传输控制信号输入线,低电平有效,负脉冲(脉宽应大于500ns)有效;l WR2:DAC寄存器选通输入线,负脉冲(脉宽应大于500ns)有效。由WR2、XFER的逻辑组合产生LE2,当LE2为高电平时,DAC寄存器的输出随寄存器的输入而变化,LE2的负跳变时将数据锁存器的内容打入DAC寄存器并开始D/A转换。l IOUT1:电流输出端1,其值随DAC寄存器的内容线性变化;l IOUT2:电流输出端2,其值与IOUT1值之和为一常数;l Rfb:反馈信号输入线,改变Rfb端外接电阻值可调整转换满量程精度;l Vcc:电源输入端,Vcc的范围为+5V+15V;l VREF:基准电压输入线,VREF的范围为-10V+10V;l AGND:模拟信号地l DGND:数字信号地DAC0832有如下3种工作方式。(1) 直通工作方式将CS,WR1,WR2和XFER引脚直接接数字地,ILE引脚接高电平,芯片处于直通状态。此时,8位数字量只要输入到DI0DI7端,就立即进行D/A转换。但在此种方式下,DAC0832不能直接与单片机的数据总线相连接,故很少采用。(2) 单缓冲工作方式此方式是使两个寄存器中的一个处于直通状态,另一个工作于受控锁存状态。一般使DAC寄存器处于直通状态,即把WR2,和XFFER端接数字地,或者将两个寄存器的控制信号并接,使之同时选通。此时,数据只要写入DAC芯片,就立刻进行转换。此种工作方式接线简单,并可减少一条输出指令。(3) 双缓冲工作方式双缓冲工作方式下,单片机要对两个寄存器分别控制,要进行两步写操作:先将数据写入输入寄存器;再将输入寄存器的内容写入DAC寄存器并启动转换。双缓冲工作方式可以使数据接收和启动转换异步进行,在D/A转换的同时接收下一个转换数据,因而提高了通道的转换速率。再要求多个通道同时进行D/A转换时使用双缓冲工作方式。4.程序设计4.1程序设计思路程序设计的目的是控制AT89C51单片机的P2口输出数字信号,使得输出的数字信号被DAC0832转换后能够得到我们所要产生的各种波形。另外程序还要能够响应外部中断,使得本波形发生器能够通过按钮切换波形。因此本程序设计的重点就是各个波形发生程序的设计和中断程序的设计。4.2方波发生程序方波的产生就是周期性的产生高低电平。当输入数字全“1”时,IOUT1最大,此时运放输出的电压+5V,当输入的数字全“0”时,IOUT1最小,此时运放输出的电压为0V。方波发生程序的功能就是控制单片机的P2口在半个周期内输出0XFF,在半个周期内输出0X00。频率为500HZ、幅值为5V的方波信号发生程序如下:Void square()Unsigned char i,j;P2=0XFF;for(i=0;i=125;i+);P2=0X00;for(j=0;j,=125;j+);4.3锯齿波发生程序锯齿波的产生就是周期性的将电压由0V沿直线线增长到+5V。设P2口的输出为X,则运放的输出端的电压为Y=5/255*X。P2口周期性的从小到大输出0到255的所有整数即可以得到锯齿波。用C语言编写的锯齿波信号发生程序如下:#include#include#define da0832 XBYTE0X7fffmain()unsigned char i,j ;while(1)for(i=0;i=255;i+)da0832=i;for(j=0;j=255;j+);4.4三角波发生程序三角波的发生就是每个周期中前半周期将电压由0V沿直线增长到+5V,在后半周期将电压由+5V沿直线减少到0V. 设P2口的输出为X,则运放的输出端的电压为Y=5/255*X。P2口周期性的从小到大输出0到255的所有整数再从大到小输出0到255的所有整数就可以得到三角波。用C语言编写的三角波发生函数如下:#includevoid main(void) /三角波 unsigned char i,j; while(1) for(i=0;i=255;i+) P2=i; for(j=0;j0;i-) P2=i; for(j=0;j=255;j+); 4.5正弦波发生程序运放的输出电压V=5/255*X(X是P2口的输出)。要使得运放输出正弦波,只要X满足X=sin(-/2+/255*n)+1/2*255(n属于0255)即可。用MATLAB运行如下代码即可得到正弦波数据表。代码为:x=linspace(-pi/2,pi/2,255);y=(sin(x)+1)/2.0*255;z=round(y)用MATALB运行上述代码得到数组Z。P2口逐个输出Z中的数即可得到半个周期的正弦波。再将P2口倒着输出数组Z,又可以得到生下的半个周期的正弦波。正弦波产生的函数如下:bit flag=0;unsigned char code sin_num= 0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,3,3,4,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,12,12,13,14,15,15,16,17,18,18,19,20,21,22,23,24,25,25,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,44,45,46,47,49,50,51,52,54,55,56,57,59,60,61,63,64,66,67,68,70,71,73,74,75,77,78,80,81,83,84,86,87,89,90,92,93,95,96,98,99,101,102,104,106,107,109,110,112,113,115,116,118,120,121,123,124,126,128,129,131,132,134,135,137,139,140,142,143,145,146,148,149,151,153,154,156,157,159,160,162,163,165,166,168,169,171,172,174,175,177,178,180,181,182,184,185,187,188,189,191,192,194,195,196,198,199,200,201,203,204,205,206,208,209,210,211,213,214,215,216,217,218,219,220,221,223,224,225,226,227,228,229,230,230,231,232,233,234,235,236,237,237,238,239,240,240,241,242,243,243,244,245,245,246,246,247,247,248,248,249,249,250,250,251,251,251,252,252,253,253,253,253,254,254,254,254,254,255,255,255,255,255,255,255,255,255;void sin( ) /正弦波 unsigned int i,j; for (i=0;i=255;i+) P2=sin_numi;for(j=0;j=255;i-) P2=sin_numi;for(j=0;j=255;j+); 4.6中断程序的设计中断处理程序的功能是按钮未按下时输出正弦波,以后每按一次分别输出方波、锯齿波、三角波,当按下第四次时又输出正弦波,如此循环。中断处理程序如下:unsigned char cho=0; /0:正弦波。1:方波。2:三角波。3:锯齿波。/按键中断处理程序void it0() interrupt 0 if(chg=0) if(+cho=4) cho=0;num=0; else ;/定时器中断处理程序void intt0() interrupt 1 switch(cho) case 0:TH0=TIME0_H;TL0=TIME0_L;sint() ;break; case 1:TH0=TIME0_H;TL0=TIME0_L;square(); break;case 2:TH0=TIME0_H;TL0=TIME0_L;triangle();break; case 3:TH0=TIME0_H;TL0=TIME0_L;stw(); break;default: ; void main() TMOD=0X01; TH0=0xff; TL0=0xd9; IT0=1; /设置中断触发方式,下降沿 EA=1; EX0=1; ET0=1; IP=0X01; /键盘中断级别高 TR0=1; while(1);4.7波形发生器程序流程图开始等待中断外部中断0,每中断一次计数器加1,中断4次计数器清零定时/计数器0溢出中断判断计数器的值是否为0执行正弦波发生程序执行方波发生程序执行三角波波发生程序执行锯齿波发生程序是否为1是否为2YYYYNNN中断返回中断返回中断返回中断返回图4.程序流程图4.8波形发生器源程序#includeunsigned char i,sqar_num=128; /最大值100,默认值50unsigned char cho=0; /0:正弦波。1:方波。2:三角波。3:锯齿波unsigned char num=0;unsigned char TIME0_H=0xff,TIME0_L=0xd9; /定时器0的初值设置;全局变量.对应正弦波,锯齿波50HZsbit chg=P32; /三角波100Hz.sbit cs=P37;bit flag=0;unsigned char code sin_num= 0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,3,3,4,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,12,12,13,14,15,15,16,17,18,18,19,20,21,22,23,24,25,25,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,44,45,46,47,49,50,51,52,54,55,56,57,59,60,61,63,64,66,67,68,70,71,73,74,75,77,78,80,81,83,84,86,87,89,90,92,93,95,96,98,99,101,102,104,106,107,109,110,112,113,115,116,118,120,121,123,124,126,128,129,131,132,134,135,137,139,140,142,143,145,146,148,149,151,153,154,156,157,159,160,162,163,165,166,168,169,171,172,174,175,177,178,180,181,182,184,185,187,188,189,191,192,194,195,196,198,199,200,201,203,204,205,206,208,209,210,211,213,214,215,216,217,218,219,220,221,223,224,225,226,227,228,229,230,230,231,232,233,234,235,236,237,237,238,239,240,240,241,242,243,243,244,245,245,246,246,247,247,248,248,249,249,250,250,251,251,251,252,252,253,253,253,253,254,254,254,254,254,255,255,255,255,255,255,255,255,255;void sin(void) if(!flag) cs=0;P2=sin_numnum+;cs=1;if(num=0)num=255;flag=1; else if(flag) cs=0;P2=sin_numnum-;cs=1; if(num=255)num=0;flag=0; void square(void) if(i+sqar_num) cs=0;P2=0XFF;cs=1;elsecs=0;P2=0X00;cs=1;void triangle(void) cs=0;P2=num+;cs=1;void stw(void) if(flag) cs=0;P2=num+;cs=1;if(num=0)num=255;flag=1; else if(flag) cs=0;P2=num-;cs=1; if(num=255)num=1;flag=0; /按键中断处理程序。void it0() interrupt 0 if(chg=0) if(+cho=4) cho=0;num=0; /num=0;所有数据从新开始,保证波形的完整性 else ;/定时器中断处理程序。void intt0() interrupt 1 /TH0=0x00;TL0=0x00;sinx(); switch(cho) case 0:TH0=TIME0_H;TL0=TIME0_L;sin();break; /正弦波/每半周期256取样。case 1:TH0=TIME0_H;TL0=TIME0_L;square();break;/方波 /为了提高方波的最高频率,只有牺牲占空比的最小可调值。分100份 每次1%。case 2:TH0=TIME0_H;TL0=TIME0_L;triangle();break;/三角波 case 3:TH0=TIME0_H;TL0=TIME0_L;stw();break;/锯齿波default: ; void main() TMOD=0X01; TH0=0xff; TL0=0xd9; IT0=1; /设置中断触发方式,下降沿 EA=1; EX0=1; ET0=1; IP=0X01; /键盘中断级别高 TR0=1; while(1);5.仿真打开Keil uVision3,选择project新建工程并保存,在出现的CPU对话框中选择ATMEL中的AT89C51芯片,点击确定生成工程,在file菜单中选择新建,新建一个文件,在里面输入自己写的程序代码,并保存。在左面的工程上右击选择add files to group ,将刚开的文件添加的工程,然后同样右键target选择options for target,打开设置,在output选项中选择create hex fil这一项。点击编译,将在工程目录下生成hex文件。用Proteus绘制电路,载入hex文件。点击窗口左下角的开始,对电路进行仿真。得到的仿真波形如下。图5.正弦波图6.方波
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人教六年级下册期末数学试题(比较难)及解析
- 小学六年级上册期中英语模拟综合试卷测试题
- 初三中考英语宾语从句的语序练习题含答案及解析
- 2025-2026学年安徽省阜阳市临泉县二中高一上学期开学考地理试题及答案
- 粉尘涉爆培训题库及答案
- 2025国际汉语教师证书考试教学评估与反馈试卷及答案
- 2025年注册会计师财务成本管理考试真题及答案
- 2025年历年二建市政实务案例题及答案
- 2025年护理文件书写规范试题及答案
- 2025年各省银行招聘考试题库及答案
- 高速公路改扩建工程监理投标方案(技术方案)
- 突发性耳聋的中医辩证及护理方案
- T-SZEIA 001-2024 温室气体产品碳足迹量化方法与要求 变电站电气设备
- 2025年湖南省安全员-B证考试题库及答案
- 北师大版六年级下册数学全册同步分层作业设计含答案解析
- 简易钢结构雨棚施工承包合同范本
- 苏州市前期物业管理委托合同范本
- 2022年冀教版七年级上册数学第一次月考试卷
- 《气管支架临床应用》课件
- 8·12天津滨海新区爆炸事故调查报告分析及反思
- 2024新指南:中国阿尔茨海默病早期预防指南解读课件
评论
0/150
提交评论