基于单片机的函数信号发生器课程设计毕业设计完整版.docx
- 文档编号:27086643
- 上传时间:2023-06-26
- 格式:DOCX
- 页数:31
- 大小:52.31KB
基于单片机的函数信号发生器课程设计毕业设计完整版.docx
《基于单片机的函数信号发生器课程设计毕业设计完整版.docx》由会员分享,可在线阅读,更多相关《基于单片机的函数信号发生器课程设计毕业设计完整版.docx(31页珍藏版)》请在冰豆网上搜索。
基于单片机的函数信号发生器课程设计毕业设计完整版
综合实验课程报告
课题名称基于单片机的函数信号发生器
摘要
本文介绍一种用AT89C51单片机构成的波形发生器,可产生方波、三角波、正弦波、锯齿波等多种波形,波形的周期可用程序改变,并可根据需要选择单极性输出或双极性输出,具有线路简单、结构紧凑、性能优越等特点。
文章给出了源代码,通过仿真测试,其性能指标达到了设计要求。
关键词:
单片机;DAC;信号发生器
摘要...............................................................目录...............................................................
第一章绪论..........................................................
1.1单片机概述......................................................
1.2信号发生器的分类................................................
1.3研究内容........................................................
第二章方案的设计与选择..............................................
2.1方案的比较......................................................
2.2设计原理........................................................
2.3设计思想........................................................
2.4设计功能........................................................
第三章硬件设计......................................................
3.1硬件原理框图....................................................
3.2主控电路........................................................
3.3数、模转换电路..................................................
3.4按键接口电路....................................................
3.5时钟电路........................................................
3.6显示电路........................................................
第四章软件设计......................................................
4.1程序流程图......................................................
第五章总结与展望....................................................致谢...............................................................参考文献.............................................................附录1电路原理图.....................................................附录2源程序.........................................................附录3器件清单......................................................
第一章绪论
1.1单片机概述
随着大规模集成电路技术的发展,中央处理器(CPU、随机存取存储器(RAM、只读存储器(ROM、(I/O接口、定时器/计数器和串行通信接口,以及其他一些计算机外围电路等均可集成在一块芯片上构成单片微型计算机,简称为单片机。
单片机具有体积小、成本低,性能稳定、使用寿命长等特点。
其最明显的优势就是可以嵌入到各种仪器、设备中,这是其他计算机和网络都无法做到的[9,10]。
1.2信号发生器的分类
信号发生器应用广泛,种类繁多,性能各异,分类也不尽一致。
按照频率范围分类可以分为:
超低频信号发生器、低频信号发生器、视频信号发生器、高频波形发生器、甚高频波形发生器和超高频信号发生器。
按照输出波形分类可以分为:
正弦信号发生器和非正弦信号发生器,非正弦信号发生器又包括:
脉冲信号发生器,函数信号发生器、扫频信号发生器、数字序列波形发生器、图形信号发生器、噪声信号发生器等。
按照信号发生器性能指标可以分为一般信号发生器和标准信号发生器。
前者指对输出信号的频率、幅度的准确度和稳定度以及波形失真等要求不高的一类信号发生器。
后者是指其输出信号的频率、幅度、调制系数等在一定范围内连续可调,并且读数准确、稳定、屏蔽良好的中、高档信号发生器。
1.3研究内容
本文是做基于单片机的信号发生器的设计,将采用编程的方法来实现三角波、锯齿波、矩形波、正弦波的发生。
根据设计的要求,对各种波形的频率和幅度进行程序的编写,并将所写程序装入单片机的程序存储器中。
在程序运行中,当接收到来自外界的命令,需要输出某种波形时再调用相应的中断服务子程序和波形发生程序,经电路的数/模转换器和运算放大器处理后,从信号发生器的输出端口输出。
第二章方案的设计与选择
2.1方案的比较
方案一:
采用单片函数发生器(如8038),8038可同时产生正弦波、方波等,而且方法简单易行,用D/A转换器的输出来改变调制电压,也可以实现数控调整频率,但产生信号的频率稳定度不高。
方案二:
采用锁相式频率合成器,利用锁相环,将压控振荡器(VCO)的输出频率锁定在所需频率上,该方案性能良好,但难以达到输出频率覆盖系数的要求,且电路复杂。
方案三:
采用单片机编程的方法来实现。
该方法可以通过编程的方法来控制信号波形的频率和幅度,而且在硬件电路不变的情况下,通过改变程序来实现频率的变换。
此外,由于通过编程方法产生的是数字信号,所以信号的精度可以做的很高。
鉴于方案一的信号频率不够稳定和方案二的电路复杂,频率覆盖系数难以达标等缺点,所以决定采用方案三的设计方法。
它不仅采用软硬件结合,软件控制硬件的方法来实现,使得信号频率的稳定性和精度的准确性得以保证,而且它使用的几种元器件都是常用的元器件,容易得到,且价格便宜,使得硬件的开销达到最省。
2.2设计原理
数字信号可以通过数/模转换器转换成模拟信号,因此可通过产生数字信号再转换成模拟信号的方法来获得所需要的波形。
89C51单片机本身就是一个完整的微型计算机,具有组成微型计算机的各部分部件:
中央处理器CPU、随机存取存储器RAM、只读存储器ROM、I/O接口电路、定时器/计数器以及串行通讯接口等,只要将89C51再配置键盘及其接口、显示器及其接口、数模转换及波形输出、指示灯及其接口等四部分,即可构成所需的波形发生器,其信号发生器构成原理框图如图2.1所示。
图2.1信号发生器原理框图89C51是整个波形发生器的核心部分,通过程序的编写和执行,产生各种各样的信号,并从键盘接收数据,进行各种功能的转换和信号幅度的调节。
当数字信号经过接口电路到达转换电路,将其转换成模拟信号也就是所需要的输出波形。
2.3设计思想
(1)利用单片机产生方波、正弦波、三角波和锯齿波等信号波形,信号的频率和幅度可变。
(2)将一个周期的信号分离成256个点(按X轴等分),每两点之间的时间间隔为∆T,用单片机的定时器产生,其表示式为:
∆T=T/256。
如果单片机的晶振为12MHz,采用定时器方式0,则定时器的初值为:
X=213—∆T/Tmec(2.1
定时时间常数为:
TL=(8192—∆T)/MOD256(2.2
TH=(8192∆T/256(2.3
MOD32表示除32取余数
(3)正弦波的模拟信号是D/A转换器的模拟量输出,其计算公式为:
Y=(A/2sin∆t)+A/2(其中A=VREF(2.4(2.5
∆
t=N
∆
T(N=1~256
那么对应着存放在计算机里的这一点的数据为:
Di=(Y⨯255/A=
(sin∆t+1⨯255
2
(2.6)
(4)一个周期被分离成256个点,对应的四种波形的256个数据存放在以TAB
1--TAB4为起始地址的存储器中。
2.4设计功能
(1)本方案利用8155扩展8个独立式按键,6个LED显示器。
其中“S0”号键代表方波输出,“S1”号键代表正弦波输出,“S2”号键代表三角波输出,“S3”号键代表锯齿波输出。
(2)“S4”号键为10Hz的频率信号,“S5”号键为100Hz的频率信号,“S6”号键为500Hz的频率信号,“S7”号键为1KHz的频率信号,6个LED显示器输出信号的频率值,选用共阳极LED。
(3)利用两片DAC0832实现幅度可调的信号源,(其中一片用来调节幅度,另外一片用来实现信号源的输出)。
(4)频率范围:
10~1000Hz。
(5)输出波形幅度为0~5V。
第三章硬件设计
3.1硬件原理框图
硬件原理方框图如图3.1所示。
图3.1硬件原理框图
3.2主控电路
AT89C51单处机内部设置两个16位可编程的定时器/计数器T0和T1,它们具有计数器方式和定时器方式两种工作方式及4种工作模式。
在波形发生器中,将其作定时器使用,用它来精确地确定波形的两个采样点输出之间的延迟时间。
模式1采用的是16位计数器,当T0或T1被允许计数后,从初值开始加计数,最高位产生溢出时向CPU请求中断。
中断系统是使处理器具有对外界异步事件的处理能力而设置的。
当中央处理器CPU正在处理某件事的时候外界发生了紧急事件,要求CPU暂停当前的工作,转而去处理这个紧急事件。
在波形发生器中,只用到片内定时器/计数器溢出时产生的中断请求,即是在AT89C51输出一个波形采样点信号后,接着启动定时器,在定时器未产生中断之前,AT89C51等待,直到定时器计时结束,产生中断请求,AT89C51响应中断,接着输出下一个采样点信号,如此循环产生所需要的信号波形[6]。
如图3.2所示,AT89C51从P0口接收来自键盘的信号,并通过P2口输出一些控制信号,将其输入到8155的信号控制端,用于控制其信号的输入、输出。
如果有键按下,则在读控制端会产生一个读信号,使单片机读入信号。
如果有信号输出,则在写控制端产生一个写信号,并将所要输出的信号通过8155的PB口输出,并在数码管上显示出来。
图3.2主控电路图
3.3数/模转换电路
由于单片机产生的是数字信号,要想得到所需要的波形,就要把数字信号转换成模拟信号,所以该文选用价格低廉、接口简单、转换控制容易并具有8位分辨率的数模转换器DAC0832。
DAC0832主要由8位输入寄存器、8位DAC寄存器、8位D/A转换器以及输入控制电路四部分组成。
但实际上,DAC0832输出的电量也不是真正能连续可调,而是以其绝对分辨率为单位增减,是准模拟量的输出。
DAC0832是电流型输出,在应用时外接运放使之成为电压型输出。
由图3.3可知,DAC0832的片选地址为7FFFH,当P25有效时,若P0口向其送的数据为00H,则U1的输出电压为0V;若P0口向其送的数据为0FFH时,则U1
++
=0得:
的输出电压为-5V.故当U1输出电压为0V时,由公式Vout
R1R2R3
=-5V.当输出电压为-5V时,可得:
Vout=+5V,所以输出波形的电压变化范围为-
U1U2U3
5V~+5V.故可推得,当P0所送数据为80H时,Vout为0V[4]。
图3.3数模转换电路
3.4按键接口电路
图3.4为键盘接口电路的原理图,图中键盘和8155的PA口相连,AT89C51的P0口和8155的D0口相连,AT89C51不断的扫描键盘,看是否有键按下,如有,则根据相应按键作出反应。
其中“S0”号键代表方波输出,“S1”号键代表正弦波输出,“S2”号键代表三角波输出。
“S3”号键代表锯齿波输出,“S4”号键为10Hz的频率信号,“S5”号键为100Hz的频率信号,“S6”号键为500Hz的频率信号,“S7”号键为1KHz的频率信号[3]。
图3.4按键接口
3.5时钟电路
8051单片机有两个引脚(XTAL1,XTAL2)用于外接石英晶体和微调电容,从而构成时钟电路,其电路图如图3.5所示。
电容C1、C2对振荡频率有稳定作用,其容量的选择为30pf,振荡器选择频率为12MHz的石英晶体。
由于频率较大时,三角波、正弦波、锯齿波中每一点的延时时间为几微秒,故延时时间还要加上指令时间才能获得较大的频率波形[9]。
图3.5时钟电路
3.6显示电路
显示电路是用来显示波形信号的频率,使得整个系统更加合理,从经济的角度出发,所以显示器件采用LED数码管显示器。
而且LED数码管是采用共阳极接法,当主控端口输出一个低电平后,与其相对应的数码管即变亮,显示所需数据。
其器件模型如图3.6所示。
图3.6LED显示电路
166、启动一个线程是用run(还是start(?
答:
启动一个线程是调用start(方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。
这并不意味着线程就会立即运行。
run(方法可以产生必须退出的标志来停止一个线程。
167、接口是否可继承接口?
抽象类是否可实现(implements接口?
抽象类是否可继承实体类(concreteclass?
答:
接口可以继承接口。
抽象类可以实现(implements接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。
168、构造器Constructor是否可被override?
答:
构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。
169、是否可以继承String类?
答:
String类是final类故不可以继承。
170、try{}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后?
答:
会执行,在return前执行。
171、两个对象值相同(x.equals(y==true,但却可有不同的hashcode,这句话对不对?
答:
不对,有相同的hashcode。
172、swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
答:
switch(expr1)中,expr1是一个整数表达式。
因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。
long,string 都不能作用于swtich。
173、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
不能,一个对象的一个synchronized方法只能由一个线程访问。
174、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
答:
都不能。
175、List,Set,Map是否继承自Collection接口?
答:
List,Set是Map不是
176、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
是用==还是equals(?
它们有何区别?
答:
Set里的元素是不能重复的,那么用iterator(方法来区分重复与否。
equals(是判读两个Set是否相等。
equals(和==方法决定引用值是否指向同一对象equals(在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。
177、数组有没有length(这个方法?
String有没有length(这个方法?
答:
数组没有length(这个方法,有length的属性。
String有有length(这个方法。
ava.lang.StringBuffer线程安全的可变字符序列。
一个类似于 String 的字符串缓冲区,但不能修改。
虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
178、StringStringbuffer和StringBuilder的区别?
要谈它们的区别,首先先说说它们之间的相同的地方,首先他们都是存储字符的集合,他们的最大长度是2G,他们在存储字符串数据结构都采用了字符数组,也就是说他们内部都定义了一个字符型数组,用于存储字符串的值。
它们的不同点有以下几点:
1) 字符型数组固定长度和可变长度的区别:
String型内部定义的数组是固定长度的,一旦使用者给字符串数组对象赋值后,它内部的字符型数组的长度就固定了;
StringBuff型数组内部数组也是固定长度的,但是在运行状态下,它能够自己动态的扩充字符型数组的容量。
2) 效率的区别:
String型数组在所有自身操作,都会比StringBuff效率高。
但是如果做多字符串合并的操作时,StringBuff会比String效率高很多。
其原因就是Stirng每次都是重新创建新的String对象然后进行全字符串拷贝。
而StringBuff在没有达到他的容量极限时,它之后进行部分字符串拷贝工作。
例如:
Stringstr1=”1234”;
Str1=str1+”5678”;
它要作的工作是,首先重新创建一个str1对象,它的长度是8,然后把”1234”拷贝到新的str1中,然后再把”5678”拷贝到新的str1中,这种对于大字符串操作时效率是非常的底,同时还会出现内存溢出的情况,应为原来的str1垃圾回收器可能没有及时的回收进行内存释放。
例如:
StringBuffbuff1
Buff1.append(“11111”;
它的操作是,首先判断内部字符型数组对象value的容量是否能装载要合并的字符串,如果能直接将新的字符串“11111”,直接拷贝过来,如果不能也要创建一个新的字符型数组对象,这个字符型数组对象是原来字符型数组对象value长度的两倍,然后把value内容拷贝过来,然后把新的字符串拷贝过来,最后把这个扩容的字符型数组对象赋值给value。
在大容量字符串数组操作时,这个要比String效率高很多。
3)线程安全的。
在多线程环境下,对StringBuff对象的操作都是线程安全的,也就是说每一时刻只有一个线程能够处理StringBuff对象。
179、你在写复杂web界面的时候遇到的最大困难是哪些方面
其实,复杂页面最大的困难并非如何画出此界面,而是如何让此界面清晰有条理.我们做页面,并非仅显示数据,而是要准确/清晰地显示数据,想想看,如果用户要在此页面中查找一个数据,却杂乱无章,难以查看,你说用户会满意吗?
180、NET里面的datagrid翻页大多是先把数据读全部取到dataset里面,但是遇到10W条数据以上,这样的翻页事件开销会很大,页面执行起来反映很慢,你有什么好方法解决?
在数据量大的时候,有两个解决办法
1.使用存储过程.并且,并非因为存储过程比较快的原因.由于在数据库内部的存储过程,能够实现一些特殊的功能,比如说,可以直接根据当前的排序结果,仅仅取需要的几条数据,如此,无论数据是多少,它仅仅取需要的几条.
2.在实际的操作中,取出的数据,并非你有10万条,它就会把10万条全部取出来,而是受限于服务器的缓存,其实一次一般仅取1000条左右的记录,无论你数据多少,它仅会一次取这么多出来.所以,配合分页控件,再配合.NET提供的加载N条数据的方法,数据量大的情况下,不见得就会慢.
据我测试,真正慢的,是在取数据总共多少条这个步骤上.此操作在数据少时,没有影响,但在百万条记录以上时,求取数据总数,耗时就会大量增加.所以,大数据量条件下,即不应再显示"共几条/当前第几条"这样的信息.
181、权限控制方面问题:
从面向对象的角度讲,如果一个程序中,没有应用角色及角色组的话,那么这个程序是不合格的.一般来说,权限是由权限及流程角色组合而来的,如果仅有权限而没有角色,那么这个控制不灵活;如果仅有角色没有权限,那么这个控制不细致.
当然,用SESSION肯定是要的,但这个SESSION,应当只记录当前用户的个人信息,比如他的用户名.在需要判断的时候,根据他的用户名(唯一,至数据库中去取他的权限,或在类中编写权限/角色,根据此用户的用户号及当前模块号,计算当前用户是否对当前页面有操作权限.不过,如果把用户的权限也取出来放在SESSION中的话,这种做法一般仅在很小的网站中使用,稍大一点的系统,基本不允许这么做,而且也做不到
1.重载(Overload和覆写(override的区别
答:
方法重载:
当类包含两个名称相同但签名不同(方法名相同,参数列表不相同的方法时发生方法重载。
用方法重载来提供在语义上完成相同而功能不同的方法。
覆写:
在类的继承中使用,通过覆写子类方法可以改变父类虚方法的实现。
2.接口与继承的区别?
什么时候使用接口,什么时候使用继承?
答:
(1)接口定义一个类型需要实现的方法,属性,索引和事件,包括可能的参数类型和返回值类型,而把具体的实现交由相应的类或结构来做,从而为组件提供多态能力。
(2)继承常用于在一个现有父类的基础上的功能扩展,往往是我们将几个类中相同的成员提取出来放在父类中实现,然后在各自的子类中加以继承。
(3)接口可以实现多接口继重,而继承只能实现单继承。
(4)实现继承可继承父类型的实现,由于接口中没有定义方法的实现,因此必须实现继承后该接口的所有方法。
(5)为父类型添加方法可能不影响使用继承自该类型实现的用户,而为接口添加方法导致用户必须为新方法添加实现。
(6)当派生类和基类是is-a的关系是使用"继承",典型案例"苹果is-a水果",存在can-do的关系时使用"接口"
3.ado,的区别
答:
您可以通过将ADO.NET的各项功能与ActiveX数据对象(ADO的特定功能进行比较来理解ADO.NET的功能。
数据的内存中表示形式
在ADO
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 函数 信号发生器 课程设计 毕业设计 完整版