ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:784.85KB ,
资源ID:21292316      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/21292316.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(单片机课程设计波形发生器剖析Word格式文档下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

单片机课程设计波形发生器剖析Word格式文档下载.docx

1、也使用查表法。将三角波的一个周期(360度)分为256个点,相邻点等差,生成数组。反复输出前128个数据到DAC0832,就可以在系统输出端得到想要的锯齿波。(3)三角波:将(3)中的数组256个数据全部输出到DAC0832,循环,就可以在系统输出端得到想要的三角波。2、通过P1口和轻触开关S1-S4相连接来切换波形输出(如按S1键输出正弦波,按S2键产生方波,按S3键产生锯齿波,按S4键产生三角波)。用P0口控制数码管静态显示波形代号。用P2口向DAC0832发送数据,经DAC0832转换后,再把信号放大,最后接到示波器上显示。3.2元件选型单片机AT89C51系统,DAC0832一片,PC

2、机一台,运算放大器。3.3功能原理图 P0 P1 P2 P3四、方案论证任务要求实现波发生器产生正弦波、锯齿波、三角波,由于正弦波的存在,采用单片机直接运算是不合理的,故采取按时将存储的数字量送出的方法实现;为简化编程,锯齿波与三角波也采取按时送数字量的方式实现。将一个周期分为256份,幅值0至255,取数据后分别存入数组。 利用定时器中断函数实现数据按时送出,改变定时器的初值设置即可改变频率。 送出的数据由指针循环指向相应数组的值,改变指针的地址,指向不同的数组首地址即可改变波形。 幅值的改变由DAC的参考电压和反馈电阻改变。采用AT89C51单片机和DAC0832芯片,直接连接键盘和显示。

3、该种方案主要对AT89C51单片机的各个I/O口充分利用。 P3口是连接键盘, P2口接显示电路,P0口连接DAC0832输出波形。这样总体来说,能对单片机各个接口都利用上,而不在多用其它芯片,从而减小了系统的成本。也对按照系统便携式低频信号发生器的要求所完成。占用空间小,使用芯片少,低功耗。五、硬件电路设计5.1 电路连线图通过P1.0-P1.5口和轻触开关相连接来切换波形输出(如按S1键输出锯齿波,按S2键产生三角波,按S3键产生正弦波),P1.4、P1.5接波形频率调节开关,如图所示。用P0口控制数码管静态显示波形代号,如图所示。用P0口向DAC0832发送数据,经DAC0832转换后,

4、再把信号放大,最后接到示波器上显示如图所示。 图1 总电路图5.2主要芯片介绍(1)51单片机的内部结构基本组成部分:1 一个8位的CPU2 128B或256B单元内数据存储器(RAM)3 4KB或8KB片内程序存储器(ROM或EPROM)4 4个8位并行I/O接口P0P3。5 两个定时/计数器。6 5个中断源的中断管理控制系统。7 一个全双工串行I/O口UART(通用异步接收、发送器) 8 一个片内振荡器和时钟产生电路。图7 51单片机引脚管脚说明:VCC:供电电压。GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻

5、输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为

6、输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。RST:复位输入。当振荡器复位器件时,要保持RST脚两

7、个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。 /PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周

8、期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。 /EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。(2)DAC0832芯片DAC0832是采样频率为八位的D/A转换芯片,集成电路内有两级输入寄存器。DAC0832输出的是电流,一般要求输出是电压,所

9、以还必须经过一个外接的运算放大器转换成电压。DAC0832芯片具备双缓冲、单缓冲和直通三种输入方式,以便适于各种电路的需要(如要求多路D/A异步输入、同步转换等)。所以这个芯片的应用很广泛,关于DAC0832的引脚功能如下:D0D7:数字信号输入端。ILE:输入寄存器允许,高电平有效。CS:片选信号,低电平有效。WR1:写信号1,低电平有效。XFER:传送控制信号,低电平有效。WR2:写信号2,低电平有效。IOUT1、IOUT2:DAC电流输出端。RfB:是集成在片内的外接运放的反馈电阻。VREF:基准电压(-1010V)。是源电压(+5+15V)。地。图8 DAC0832芯片图(3)1602

10、液晶显示器引脚功能如下: 第1脚:VSS为电源地 第2脚:VDD接5V电源正极 第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会 产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。 第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。第6脚:E(或EN)端为使能(enable)端。第714脚:D0D7为8位双向数据端。第1516脚:空脚或背灯电源。15脚背光正极,16脚背光负极。(4)DAC0832说明:DAC0832选用直通方式,所

11、以CS,XFER,WR1和WR2接地;D0D7是数据量数据输入线,接收P0口输出的数据;VREF接基准电压,其中串接一个滑动电阻器,通过改变阻值,从而改变电压,达到改变幅值的目的;芯片内已有反馈电阻,所以RFB接到运算放大器输出端;GND接地;VCC接工作电源;IOUT1和IOUT2输出电流接运算放大器。(5)按键工作说明:采用独立式按键输入的处理,软件查询方式,也就是说,先逐位查询每根I0口线输入为低电平,则可确认该I0口线所对应的按键已按下,再转向该按键的功能处理程序。六、软件设计6.1正弦波的产生过程 通过手动的方法计算出输出各点的电压值,形成数组sin_tab256,反复顺序输出这组数

12、据到DAC0832,就在系统输出端得到正弦波。6.2锯齿波的产生过程将一个周期(360度)分为128个点,递增,生成数组saw_tab256,反复顺序输出这组数据到DAC0832,就在系统输出端得到锯齿波。6.3三角波的产生过程将三角波的一个周期(360度)分为256个点,相邻点等差,前128个点递增,后128个点递减,生成数组tri_tab256,反复顺序输出这组数据到DAC0832,就在系统输出端得到三角波。6.4通过开关实现波形切换和调频轻触开关S1-S4切换波形输出(S1键输出正弦波,按S2键产生方波,按S3键产生锯齿波,按S4键产生三角波),S5、S6调节方波占空比,S7、S8调节波

13、形频率。七、调试与仿真6.1正弦波的仿真结果 使用有源低通滤波器,输出波形变得更平滑了,但会出现畸变。这是符合实际情况的。如下图分析。图11 调频前波形 图12 调频后波形6.2锯齿波的仿真结果图13 调频前波形 图14 调频后波形6.3三角波的仿真结果图15调频前波形 图16调频前波形 八、总结本次的设计中利用AT89C51和DAC0832以及放大器完成电路的设计,用开关来控制各种波形的转换和波形频率,用单片机输出后,经过数模转换器生成波形,最终可以通过示波器观察。在这次的软件设计中,程序设计采用的是C语言。C语言简洁高效,是最贴近硬件的高级编程语言,经过多年的发展,现在已成熟为专业水平的高

14、级语言。因此,在大型程序的设计中,多采用C语言进行程序编译。而且,现在单片机产品推出时纷纷配套了C语言编译器,应用广泛。由于真正意义上的程序设计还不多,因此还不是很得心应手,所以在设计中遇到一些问题和一些难点。比如:在程序设计中如何实现程序结构的最优化,以达到较高的质量。这是以后设计中要注意的问题。 通过这次课程设计,我进一步了解了波形发生器的原理,在实际动手操作过程中,使我接触了许多我以前没接触过的元件,而且重新温习了刚学不久的C语言,使我学得了许多知识,使我获益匪浅。这次课程设计,使我的动手能力得到了很大的提高,更使我们懂得理论知识的重要性,没有理论的指导一切实际行动都是盲目的,且实际操作

15、是我们得到的理论知识得到验证,更能增加对理论知识的理解。九、参考文献1 汪贵平,李登峰,龚贤武,雷旭 新编单片机原理及应用 机械工业出版社,2012年1月第三次印刷。2 赵文博,刘文涛单片机语言C51程序设计人民邮电出版社,2005年10月北京第一次印刷。3附录附录一:硬件图main函数中断函数附录二:流程图附录三:程序清单/* main.c 文件 */* 含有 */* 定时器初始化函数 */* main函数 */* 定时器1中断函数 */*/#include head.H /包含函数、变量声明lcd.c /lcd1602液晶显示器的函数fun.c / 包含键盘扫描、延时等功能函数/*初始化函

16、数*/void ini() table=tri_tab; /给予初值 THHL=65535; / TH1=THHL/256; /定时器1高八位赋值 TL1=THHL%256; / 定时器1第八位赋值 TMOD=0x10; /定时器1模式设置 方式1,十六位不自动重装 EA=1; / 开总中断 ET1=1; /开定时器1中断 TR1=1; /启动定时器1/*主函数*/main() lcdini(); /lcd初始化程序 writdatas(0x80,lcdtable); /调用显示字符串函数显示选项 writdatas(0x80+0x41,select); ini();/初始化程序 while(

17、1) keyplay(); /键盘扫描函数 /*T1中断函数*/void time() interrupt 3 TR1=0; DataOut=*(table+n); n+;/加一,满255自动溢出/* fun.c 文件 */* 含有 */* 延时函数 */* 键盘扫描函数 */* 键盘功能函数 */*延时函数 */ void delays(uint8 x) uint8 i; for(;x0;x-) for(i=110;ii-);/* 键盘扫描函数 */void keyplay() uint8 temp;/定义一个变量 Key=0xff; /赋初值 temp=Key; /key的值赋予temp

18、if(temp!=0xff) /判断temp中的值是否等于Oxff delays(2); /推迟2ms temp=Key; /key中的值赋予temp if(temp! while(Key!=0xff);/程序等待释放。 switch(temp) /选择按键 case 0xfe: KeySaw(); /按键1锯齿波 break; case 0xfd: KeyTri(); /按键2三角波 case 0xfb: KeySin(); /按键3正弦波 case 0xf7: KeyPinUp(); /频率增加 case 0xef: KeyPinDow(); /频率降低 default: /*键盘功能函数

19、*/ void KeySaw() lcdclear(); writdatas(0x80,str_saw); table=saw_tab;void KeyTri() writdatas(0x80,str_tri);void KeySin() table=sin_tab; lcdclear();writdatas(0x80,str_sin);void KeyPinUp() if(THHL=500) THHL=THHL-LEV; / P2_0=P2_0; THHL=500;/* lcd.c 文件 */* 写命令函数 */* 写数据函数 */* 写字符串 */* 初始化 */#include reg5

20、1.h#define LCDATA P2 /p2口sbit rs= P35;/sbit rw= P36;sbit lcde=P34;uint8 code lcdtable=start,saw-k1;/定义字符串uint8 code select=tri-k2,sin-k3uint8 code str_sin=sine /正弦波uint8 code str_tri=triangular /三角波uint8 code str_saw=sawtooth /锯齿波/*写命令函数*/void writcom(uint8 com) rs=0;/选择写命令模式 LCDATA=com;/将要写的命令字送到数据

21、总线上 lcde=1;/使能端给一高脉冲,因为初始化函数中已经将lcden置为0 delays(1);/稍作延时 lcde=0;/将使能端置0以完成高脉冲void writdat(uint8 dat) /while(lcdzt(); rs=1;/选择写数据模式 /delays(5); LCDATA=dat;/将要写的数据传到数据总线上 /delays(1); delays(5);/ rw=1;void lcdini() rw=0; / 低电平为写模式 /使能端置低 writcom(0x38); /显示模式设置 /延时1秒 writcom(0x0c); /设置开显示,不显示光标 delays(1); /延时1秒 writcom(0x06); /写一个字符后地址指针加1 writcom(0x01); /显示清0,数据指针清0/lcd清屏 void lcdclear()/*字符串函数*/void writdatas(uint8 posi,uint8 *ldate) writcom(posi); /调用写命令函数定义位置 while(*ldate!=0) /依次送字符 writdat(*ldate+);/*lcd*/*测试主函数* void main() writdatas(0x80,lcdtabl); writdatas(0x80+0x

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1