找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5913|回复: 3
打印 上一主题 下一主题
收起左侧

一个波形发生器的单片机课程设计 附带仿真源码和课设报告

[复制链接]
跳转到指定楼层
楼主
课程设计(论文)任务书
专业班级:电子1302  
学生姓名:
指导教师(签名):
一、课程设计(论文)题目
正弦波信号发生器设计
二、本次课程设计(论文)应达到的目的
本次课程设计是自动化专业学生在学习了《单片机原理及应用》课程及《模拟电子线路》、《数字电子线路》等专业基础课程之后进行的一次综合训练,其主要目的是加深学生对单片机软硬件技术和相关理论知识的理解,进一步熟悉51单片机系统设计的基本理论、方法和技能;掌握工程应用的基本内容和要求,力争做到理论与实际的统一;同时培养学生分析问题、解决问题的能力和独立完成系统设计的能力,并按要求编写相关的技术文档和设计报告等。
三、本次课程设计(论文)任务的主要内容和要求(包括原始数据、技术参数、设计要求等)
1.设计内容
(1)选择51单片机,晶振采用12MHz。
(2)设计一个能产生0至50HZ正弦波信号。通过0832D/A芯片完成数模转换。
(3)频率值由键盘输入。
(4)将频率值由LED数码管上显示(两位)。
2.设计要求
(1)按照任务书的要个求完成系统分析及方案设计。
(2)完成硬件原理图的设计,并选择相关元器件。
(3)完成控制软件流程图的设计,编写相应的单片机控制程序。
(4)撰写设计报告。
3. 成果要求
(1)在proteus中实现仿真。
(2)提交课程设计报告。

信号发生器是一种常用的信号源,广泛地应用于电子电路、自动控制系统和教学实验等领域。 本设计采用AT89C51单片机作为控制核心,外围采用数字/模拟转换电路(DAC0832)、运放电路(LM324)、按键和LCD液晶显示电路。电路采用单片机和一片DAC0832数模转换器组成数字式低频信号发生器,可产生正弦波、矩形波、锯齿波和三角波四种波形。系统通过单片机产生数字信号,通过DAC0832转换为模拟信号,再通过放大器LM324就可以得到双极性的各种波形,最终由示波器显示出来。通过键盘来控制四种波形的类型选择、频率变化,并通过液晶1602显示其各自的波形类型以及频率数值。

本设计硬件电路简单,软件功能完善,控制系统可靠,性价比较高,具有一定的实用价值和参考价值。



1 系统总体设计              1

1.1 系统基本模块设计与论证              1

1.1.1 信号发生模块              1

1.1.2 键盘模块              1

1.1.3 电路设计最终方案              2

1.2 系统原理及总体结构图              2

1.2.1 系统总体结构图              2

1.2.2 系统工作原理              2

2 系统硬件设计              3

2.1 系统硬件仿真原理图              3

2.2 系统主要单元电路设计              4

2.2.1 主控制器AT89C51              4

2.2.2 数/模转换电路              7

2.2.3 电流/电压转换放大电路

2.2.4 键盘电路

3 系统软件设计

3.1 系统主程序流程框图

3.2 信号产生子程序

3.2.1 正弦波发生子程序

3.2.2 矩形波发生子程序              18

3.2.3 三角波发生子程序              18

3.2.4 锯齿波发生子程序              20

3.3按键处理子程序              20

3.4 INT0中断子程序              1

4 系统调试

4.1 系统调试过程

4.2 调试中的问题及解决方法

4.3 系统仿真结果

5 结论              28

5.1 结论              28

参考文献8

1



1 系统总体设计
1.1 系统基本模块设计与论证
1.1.1 信号发生模块

采用单片机和DAC0832数模转换器生成波形。通过编程的方法来控制输入到数模转换电路的数字量,从而控制输出信号的波形和频率。它的特点是价格低、设计简单,在低频范围内稳定性好、操作方便、体积小、耗电少。

该既可满足毕业设计的基本要求又能充分发挥其优势,电路简单,易控制,性价比较高,所以采用该方案。

1.1.2 键盘模块

采用矩阵式键盘,键盘为4*4矩阵式行列扫描,优点是当按键较多时可降低占用单片机的I/O口数目。

1.1.3 电路设计最终方案

本系统包括主控模块,显示模块,信号发生模块,键盘模块,运放模块,综上各方案所述,确定最终设计方案为:采用AT89C51作为主控制系统,独立式按键作为键盘模块,数模转换芯片DAC0832作为信号发生模块,LM324作为电流/电压转换放大模块。

1.2 系统原理及总体结构图1.2.1 系统总体结构图

根据上述电路设计的最终方案,系统总体设计结构如图1所示。

图1  系统总体结构图
1.2.2系统工作原理

数字信号可以通过数/模转换器转换成模拟信号,因此可通过产生数字信号再转换成模拟信号的方法来获得所需要的波形。在本设计中,AT89C51是整个波形发生器的核心部分,外围电路包括数字/模拟转换电路、电流/电压转换放大电路、按键电路和晶振电路。外接12MHz晶振电路为单片机提供工作脉冲。P0口接数模转换芯片DAC0832的DI0~DI7,为数模转换芯片提供数字信号;P2.0~P2.4外接独立键盘,以控制信号的类型、频率等。

通过对单片机编写程序,控制从P0口输出的数字信号类型,P0口的数字信号再输入到数模转换芯片DAC0832中,从而转换为模拟信号输出。DAC0832输出的模拟信号为电流信号,所以用电流/电压运算放大器LM324将电流信号再转换成电压信号输出。用两片LM324可以得到输出波形的双极性输出,将输出的波形与示波器相连即可观察输出波形的特征。独立式键盘可以控制从P0口输出的数字信号,按下不同的键可以使此输出信号改变,从而使输出的波形实现正弦波、矩形波、锯齿波和三角波之间的转变,并能够改变波形输出频率的大小。

2 系统硬件设计2.1系统硬件仿真原理图

硬件设计是系统设计的重点之一,选择合适的元器件尤为重要。在本设计中,根据设计的总体方案,选择AT89C51作为主控制器、DAC0832为数模转换芯片、LM324为电流/电压转换元件、5个独立式按键为按键模块元件。本设计在Proteus软件中绘制的硬件电路图如图2所示。

图2  硬件仿真原理图
2.2 系统主要单元电路设计2.2.1 主控制器AT89C51

AT89C51是美国ATMEL公司生产的低电压、高性能CMOS 8位单片机,片内含4KB的可反复擦除的只读程序存储器(PEROM)和128B随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和FLASH存储单元,功能强大AT89C51单片机可为您提供许多高性价比的应用场合。

主要性能参数:

①与MCS-51产品指令系统完全兼容

②4K字节可重擦写FLASH闪速存储器

③1000次擦写周期

④全静态操作:0HZ-24MHZ

⑤三级加密程序存储器

⑥1288字节内部RAM

⑦32个可编程I/O口线

⑧2个16位定时/计数器

⑨6个中断源

⑩可编程串行UART通道

                     

                       图3   AT89C51 引脚封装图

AT89C51引脚封装如图3所示,其芯片引脚介绍如下:

(1)主电源引脚

VCC:+5 V电源   VSS:地线。

(2)时钟电路引脚

XTAL1和XTAL2:外接晶体引线端。当使用芯片内部时钟时,此二引线端用于外接石英晶体和微调电容;当使用外部时钟时,用于接外部时钟脉冲信号。

(3)控制信号引脚

RST/VPD:复位信号。当输入的复位信号延续两个机器周期以上的高电平时即为有效,用以完成单片机的复位初始化操作;当单片机掉电时,此引脚上可接备用电源,由VPD向片内RAM提供备用电源,以保持片内RAM中的数据不丢失。

ALE/PROG:地址锁存控制信号。在系统扩展时,ALE用于控制把P0口输出的低8位地址锁存起来,以实现低位地址和数据的隔离。此外,由于ALE是以晶振1/6的固定频率输出的正脉冲,因此,可作为外部时钟或外部定时脉冲使用。

PSEN:片外程序存储器读选通信号输出端。

EA/VPP:访问程序存储控制信号。当EA信号为低电平时,对ROM的读操作限定在外部程序存储器;当EA信号为高电平时,对ROM的读操作是从内部程序存储器开始,并可延至外部程序存储器。

              (4)I/O引脚

P0.0 ~ P0.7 :P0口8位双向口线;P1.0 ~ P1.7 :P1口8位双向口线;

P2.0 ~ P2.7 :P2口8位双向口线;P3.0 ~ P3.7 :P3口8位双向口线。

P3口线的第二功能。P3的8条口线都定义有第二功能,详见表1。

表1  P3口各引脚与第二功能表

引脚

第二功能

信号名称

P3.0

RXD

串行数据接收

P3.1

TXD

串行数据发送

P3.2

INT0

外部中断0申请

P3.3

INT1

外部中断1申请

P3.4

T0

定时/计数器0的外部输入

P3.5

T1

定时/计数器1的外部输入

P3.6

WR

外部RAM写选通

P3.7

RD

外部RAM读选通

以上把8051单片机的全部信号引脚分别以第一功能和第二功能的形式列出。对于各种型号的芯片,其引脚的第一功能信号是相同的,所不同的只在引脚的第二功能信号。对于9、30和31三个引脚,由于第一功能信号与第二功能信号是单片机在不同工作方式下的信号,因此不会发生使用上的矛盾。但是P3口的情况却有所不同,它的第二功能信号都是单片机的重要控制信号。因此,在实际使用时,都是先按需要选用第二功能信号,剩下的才以第一功能的身份作数据位的输入/输出使用。

如图4所示,本设计中单片机资源的分配情况如下:

(1)单片机使用外部电路来提供时钟脉冲。引脚XTAL1和XTAL2之间接12MHz的石英晶体,使单片机的一个机器周期为1us。

(2)P0口与DAC0832的DI0-DI7数据输入口相连,因为P0口内部没有上拉电阻,不能输出高电平,所以要接上拉电阻RESPACK-8; P2口的P2^0-P2^4分别与5个独立按键相连。

图4  单片机控制模块

2.2.2 数模转换电路

数模转换电路是本设计的关键电路,它决定着将数字信号转变为模拟信号,从而得到各种所需要的波形。

1. 数模转换器的工作原理

数模转换器可将数字量信号转换成与此数值成正比的模拟量信号。需要转换的数字量由一个二进制数字表示,每位二进制数字都有一定的权,在转换中,应将二进制数的每一位按照权的大小转换成相应的模拟量输出分量,然后将各个输出分量叠加,总和就是与数字量成正比的模拟量数值。

上述的D/A转换,常用如图5所示的倒T形解码网络加以实现。

                                                                                   图5  倒T形电阻网络D/A转换器

电路设计如图5所示,包括由R-2R组成的电阻网络、模拟电子开关和集成运算放大器。

对于电阻网络,无论从哪个R-2R节点看,等效电阻都是R,因此,从参考电压端输入的电流为: IR=VREF/R

根据分流公式,各支路电流为:

I7=I/21I6 =I/22I5 =I/23I4 =I/24I3 =I/25I2 =I/26I1 =I/27I0 =I/28

于是,经过运算放大器输出的模拟电压VO为:

VO = - RF∑Ii= -Rfb VREF/R×28(D7×27 +D6×26 +D5×25+

D4×24+D3×23+D2×22+D1×21+D0×20)

其中VREF是进行D/A转换的系统提供的参考电压,Rfb为集成运算放大器的反馈电阻,D7 ~ D0取值为0或1,0表示切换开关与地相连,1表示与参考电压相连。通过上述电路,即完成了二进制数字信号到模拟电压信号的转换。

2.数模转换器的主要技术指标

  • 分辨率

分辨率指输入给D/A转换器的单位数字量引起的模拟量输出的变化,通常定义为输出满刻度值与2n之比(n为D/A转换器的二进制位数)。显然,二进制位数越多,分辨率越高,即D/A转换器对输入量变化的敏感程度越高。例如,8位的D/A转换器,若满量程输出为10V,根据分辨率定义,则分辨率为10V/2n,分辨率为10V/256=39.1mV,即输入的二进制最低位的变化可引起输出的模拟电压变化39.1mV,该值占满量程的0.391%,常用1LSB表示。使用时,应根据对D/A转换器分辨率的需要来选定D/A转换器的位数。

  • 相对精度

相对精度是指在满刻度已经校准的前提下,在整个刻度范围内,对应于任一数码的模拟量输出与它的理论值之差。通常用偏差几个LSB来表示。

  • 建立时间

建立时间是描述D/A转换器转换快慢的一个参数,用于表明转换时间或转换速度。其值为从输入数字量到输出达到总值误差±(1/2)LSB(最低有效位)时所需的时间。电流输出的转换时间较短,而电压输出的转换器,由于要加上完成I-V转换的运算放大器的延迟时间,因此转换时间要长一些。快速D/A转换器的转换时间可控制在1us以下。

  • 线性度

通常用非线性误差的大小表示D/A转换器的线性度,输入输出特性的偏差与满刻度输出之比的百分数表示非线性误差。一定温度下的最大非线性误差一般为0.01%~0.03%。

3. DAC0832数模转换芯片主要特性与结构

DAC0832系列为美国国家半导体公司生产的具有2个数据寄存器的8位分辨率的D/A转换芯片。此芯片与微处理器完全兼容,并且价格低廉,接口简单,转换控制容易,在单片机应用系统中得到了广泛的应用。

1.DAC0832的主要特性

  • 分辨率为8位;
  • 转换时间为1us
  • 可单缓冲、双缓冲或者直接数字转换;
  • 只需在满量程下调整其线性度;
  • 逻辑电平输入与TTL兼容;
  • 单一电源供电(+5V+15V);
  • 基准电压的范围为±10V

2.DAC0832的内部结构

DAC0832的内部结构框图如图6所示。它由8位输入锁存器、8位DAC寄存器、8位D/A转换器及转换控制电路构成,通过两个输入寄存器构成两级数据输入锁存。

                                                                                                  图 6   DAC0832内部逻辑框图

              使用时,数据输入可以采用两级锁存(双锁存)、单级锁存(一级锁存,一级直通方式)或直接输入(两级直通)形式。上图中,2个与门电路组成寄存器输出控制逻辑电路,该逻辑电路的功能是进行数据锁存控制。

3.DAC0832的引脚功能

              DI0~DI7:8位数据输入线。

              :片选信号输入,低电平有效。

              ILE:数据锁存允许控制信号,高电平有效。

1:输入寄存器写选通输入信号,低

平有效。                                                                                                                                                                        图 7  DAC0832的引脚                                            

              2:DAC寄存器写选通输入信号,低电平有效。

              :数据传送控制信号,低电平有效。上述两个信号控制DAC寄存器是否为数据直通方式。当2=0和=0时,为DAC寄存器直通方式;当2=1或=1时,为DAC寄存器锁存方式。

              IOUT1、IOUT2:电流输出,IOUT1+IOUT2=常数。

Rfb:反馈电阻输入端。内部接反馈电阻,外部通过该引脚接运放输出端。为了取得电压输出,需要在输出端接运算放大器,Rfb即为运算放大器的反馈电阻端。

              Vref:基准电压,其值为-10V~+10V。

              AGND:模拟信号地。

              DGND:数字信号地,为工作电源地和数字逻辑地,可在基准电源处进行单点共地。

              VCC:电源输入端,其值为+5V~+15V。

4.DAC0832芯片与单片机的接口

DAC0832根据控制信号的接法可分为三种工作方式:直通方式、单缓冲方式、双缓冲方式。

  • 单缓冲方式

此时输入锁存器和DAC寄存器相应的控制信号引脚分别连在一起,使数据直接写入DAC寄存器,立即进行D/A转换(这种情况下,输入锁存器不起锁存作用)。此方式适用于只有一路模拟量输出,或有几路模拟量输出但是并不要求同步的系统。            

2. 双缓冲方式

对于多路D/A转换输出,如果要求同步进行,可以采用双缓冲同步方式。DAC0832工作于双缓冲工作方式时,数字量的输入锁存和D/A转换是分两步完成的。首先CPU的数据总线分时向各路D/A转换器输入要转换的数字量,并将其锁存在各自的输入锁存器中,然后CPU对所有的DAC发出控制信号,使各个DAC输入锁存器中的数据打入DAC寄存器,实现同步转换输出。

              3. 直通工作方式

当DAC0832芯片的片选信号、写信号1、2及传送控制信号的引脚全部接地,允许输入锁存信号ILE引脚+5V时,DAC0832芯片就处于直通工作方式,数字量一旦输入,就直接进入DAC寄存器,进行D/A转换,从输出端得到转换的模拟量。

本设计中,为了降低数模转换建立的时间,数模转换芯片DAC0832采用直通的工作方式。

2.2.3 电流/电压转换放大电路

由于从DAC0832转换出来的模拟信号为电流信号,为了方便观测输出信号的特征,特将DAC0832输出的信号经过电流/电压转换放大电路转变为电压信号。本设计中使用的运放为LM324。LM324运算放大器是价格便宜的带差动输入功能的四运算放大器。其引脚图如图8所示。

   LM324的特点:

1.短路保护输出

2.真差动输入级            

3.可单电源工作:3V-32V

4.低偏置电流:最大100nA(LM324A)

5.每封装含四个运算放大器。

6.具有内部补偿的功能。

7.共模范围扩展到负电源

8.行业标准的引脚排列

9.输入端具有静电保护功能                   图8  LM324引脚


DAC0832输出信号经运放电路转变为电压后有两种输出方式。一种为单极性输出方式。此方式中,DAC0832通过使用一片LM324运算放大器将从单片机输入的数字量Din转换为电压输出,其输出电压为Uout=Din/28 *(-VREF)。当VREF=5V时,Uout的输出范围为-5V~0V。另一种为双极性输出方式。本设计中采用双极性输出方式,如图9所示。其双极性输出原理为:因为U1为-5V~0V,根据电流环路定理有

即:Uout=-VREF-2U1

所以当VREF=5V,而U1为-5V~ 0V输出时,Uout的输出为-5~+5V,即实现了双极性输出。

图9  DAC0832和两片LM324实现双极性输出

2.2.4键盘电路

该子系统是5个独立键盘和一个2输入与门组成,其中与门输出端连接单片机的P3.2口以便形成外部中断。5个按键分别连接单片机的P2.0~P2.4口。2输入与门一引脚与K1按键相连,另一引脚接高电平。当K1按下时,INT0为低电平,可知外部中断到了,系统执行中断程序。当K2~K5按键某一个按下时,对应的P2.1~P2.4口中某个为低电平,系统可以感知此按键按下,从而执行相应的程序。每个按键的功能如表2所示。

表2 按键功能表

按键

功能

属性

K1

波形选择

自动复位

K2

频率升高

自动复位

K3

频率降低

自动复位

K4

占空比升高

自动复位

K5

占空比降低

自动复位

按键电路的电路图如图15所示。

图15 按键电路图
3 系统软件设计

系统软件主要是用来控制信号发生器系统按照设计的逻辑进行运行。在软件设计上,根据功能分成了多个模块编程,主要包括:主程序模块、四种不同的波形产生模块、按键处理模块、外部中断模块等。

3.1 系统主程序流程框图

系统主程序流程图如图16所示,源程序见附件。











图16  系统主程序流程图

3.2 信号产生子程序

本系统采用编程的方法,来输出四种不同的波形即正弦波、矩形波、三角波、锯齿波。各种波形的产生方法如下。

3.2.1 正弦波发生子程序

正弦波的产生比较特殊,它不能由单片机直接产生,只能由如图17所示的阶梯波来向正弦波逼近。很显然,在一个周期内阶梯波的阶梯数目越多,单片机输出的波形也就越接近正弦波。

图17 正弦波信号的产生

先假定正弦波的振幅是2.56 V,则波谷对应的数字量为最小值00H,波峰对应的数字量为最大值FFH。将正弦波的第一个周期的波形按角度均分为若干等份,并计算出各点对应的电压值,电压值计算方法:Vx=2.5·(1+sinθ),因为00H~FFH对应的数字量为0~255,所以根据算出的电压就可直接写出各点所对应的数字量。单片机将一个周期的数字量存入一定的存储区域中,然后依次循环取出这些数字量,并送D/A电路转换成阶梯波,即近似的正弦波输出。图18为正弦波产生的流程图。

图18 正弦波产生的流程图
3.2.2 矩形波发生子程序

如图19所示,矩形波的实现比较简单。首先定义一个无符号字符型变量i=0,使自变量i不断的自动加1,若i的值小于squa_num,将P0口赋值为0xFF;若i的值大于squa_num,则将P0口赋值为0x00。当i自加到256后又自动变为0,以此循环,即可得到矩形波。当squa_num=128时,此时输出的为方波。调节squa_num的大小,即可实现矩形波占空比的调节;调节延时时间的大小,即可实现矩形波频率的改变。

图19 矩形波产生流程图
3.2.3 三角波发生子程序

三角波中的斜线用一个个小台阶来逼近,当台阶间隔很小时,波形基本上近似一直线。首先定义一个无符号字符型变量i=0,使自变量i不断的自动加1,若i的值小于128,将P0口赋值为i;若i的值大于128,则将P0口赋值为256-i。当i自加到256后又自动变为0,以此循环,从而P0口实现了周期性的数字量变换,在经过数模转换后转变成模拟信号,经运算放大电路后就得到了周期性的三角波。三角波产生流程图如图20所示。

图20 三角波发生流程图
3.2.4 锯齿波发生子程序

锯齿波的实现过程与三角波类似,也是定义一个变量i=0,并使P0=i,自变量i不断的自动加1,直到加到255,然后i又可以自动归为0,再不断的重复上过程。在此过程中,P0口的值也随着i一样变化,经数模转换DAC0832后,周期性逐一变化的数字量就转换为锯齿波输出了。通过调节P0口每相邻两个值之间的延迟时间,就可以改变锯齿波的频率。图21为锯齿波发生流程图。

图21 锯齿波发生流程图
3.3按键处理子程序

在本设计中,主要是通过按键来调节输出波形的类型、频率的大小及矩形波的占空比,采用程序控制扫描方式,时刻监视着有无按键按下。为了能够更准确的判断按键的情况,一旦有按键按下时,先延时去除按键的抖动,再判断是哪个按键按下,从而单片机对应的执行相应的程序。图22为按键处理流程图。

图22 按键处理流程图
3.4 INT0中断子程序

中断子程序是用来控制输出波形的选择。当波形选择按键K1按下时,进入中断程序中,此时波形选择标识WaveChoice加1,中断结束后,主程序中根据WaveChoice的值输出相应的波形。图24为INT0中断流程图。

图24 INT0中断流程图

4 系统调试
4.1
系统调试过程

1.编译、连接项目,形成目标文件

打开Keil新建工程文件,然后添加源程序文件,保存时把文件后缀名改成“.c”,再直接导入新建的工程中。

把源程序全部录入后,先粗略的检查一遍,主要改正明显的各种错误,这样可以减少之后的修改工作量。接着Options for Target “Target 1”,点击Output ,勾选Create Hex 那个选项,生成可执行的文件。然后点击Project菜单下的Built Target命令然后再进行编译、连接,形成目标文件。编译、连接用Project菜单下的Built Target命令(或快捷键F7),也可以直接点击工具栏中相对应的图标。

编译、连接时,如果程序存在语法有错,则不会通过编译,并在下面的信息窗口给出相应的出错提示信息,其中错误是一定得改正的,警告可以忽略。双击下面显示错误信息的那一行,可以直接定位错误所在的行,用户可以方便的对程序进行修改。修改后再编译、连接,继续进行调试,这个过程可能会重复多次。如果没有任何语法上的错误,则编译、连接成功,并且信息窗口给出提示信息。

2.运行调试

在Proteus软件中先从元件库中加载要使用的那些元件,然后把元件放在图纸上一个一个的接线,尽量不让线交错,便于查看、分析,有必要时,使用接线标号法。完成所有元器件的接线后,在单片机上右击选Edit Properties,在Program file 那一行右侧点击,然后选择前面生成的以“.hex”为后缀名的文件,为单片机AT89C51添加可执行文件。然后点击左下角的相关按键,开始进行仿真。

4.2 调试中的问题及解决方法

在设计方案确定后,为了更好的调试,可以先分别对不同模块进行调试,最后在进行整体调试。在整个调试的过程中,遇到了不少的问题,经自己查阅资料,并向老师、同学请教后,这些问题基本已解决。调试中遇到的问题及解决方法如下:

(1) 在调试波形产生过程中,波形选择按键按下时,没有波形输出或只输出一种波形。

解决方法:若无波形输出,则要先检查硬件原理图是否连接好,再检查程序是否出现问题。若仅有一种波形输出,则要检查程序中是否出现了死循环,还应检查按键控制程序是否符合逻辑要求。

(2) 当个个模块的功能都可以实现时,就可以进行总体的调试。在总体的调试中,发现波形选择按键按下时,液晶显示波形类型变化和输出波形的变化并不能同时实现。

解决方法:当波形选择按键按下时,液晶上的显示只要做一次就可以,而信号波形的输出则是连续着的。所以使用外部中断INT0,当有按键按下时,先响应中断程序,然后再回到主程序中,输出对应的波形。

(4) 系统使用的是控制延时的方法来改变输出信号的频率,故频率值的大小不好计算。

解决方法:设定不同的延时时间,从示波器显示的输出波形来计算其对应的频率,并记录下来。再根据每条指令大约的执行时间,来粗略的估计出输出信号的频率与延时时间的函数关系。当然,这种方法所测得的频率与实际频率的误差还是很大的,此问题并没得到完美的解决。

4.3 系统仿真结果

经以上调试,确认程序没有问题时,加载到Proteus软件中进行仿真,所得仿真结果如下。

(1)刚开始运行程序,没有按键操作时,仿真结果如图25所示。




图25 仿真初始化结果
(2)当K1键按下进行波形四种波形选择时,每种波形的仿真结果如下。





图26 正弦波



图27 方波

图28 三角波

图29 锯齿波

(3)波形为正弦波,K2键按下时,输出波形的频率增大仿真如图30 所示。

图30 正弦波频率增加仿真


(4)当波形为矩形波且K4键按下后,矩形波的占空比增加。其仿真结果如图31所示。

图31 矩形波占空比增加仿真
5 结论

(1)通过查阅大量资料使自己对信号发生器的研究现状、原理、工作方式等的基本概念及技术发展有了更好的理解。

(2)针对设计的任务和要求,确定信号发生器的设计方案,并逐步来实现。

(3)本系统使用了单片机作为主控制器,直接由软件产生不同波形信号的输出,因此在如何编写程序方面下了很大的功夫,也收获了很多知识。

(4)在Keil中编写仿真程序,在Proteus中绘制硬件仿真图,并实现联调仿真。从仿真的结果来看,基本完成了设计的要求。

经过此次设计学会了很多关于电子方面的软件:如Proteus、Keil51等。了解到了一个模型从项目选择、方案选择和论证电路设计、元器件选择等到软硬件的设计及实现,再到最终的整机测试和调试整个工作过程,为以后工作打下了坚实的基础。其次,经过这次毕业设计,使我深刻地认识到学好专业知识的重要性,也理解了理论联系实际的含义,提升了我对电子设计和制作的兴趣。




  1. #include <reg51.h>
  2. #include<string.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5.   uchar code tosin[256]=
  6. {0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,
  7. 0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,
  8. 0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,
  9. 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
  10. 0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,
  11. 0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,
  12. 0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,
  13. 0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,
  14. 0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,
  15. 0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,
  16. 0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,0x15,0x13,0x11,0x10,0x0e,
  17. 0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,
  18. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,
  19. 0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,0x16,0x18,
  20. 0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,
  21. 0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e ,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,
  22. 0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80 }; //正弦波码

  23. //--按键
  24. sbit K1=P2^0;
  25. sbit K2=P2^1;
  26. sbit K3=P2^2;
  27. sbit K4=P2^3;
  28. sbit K5=P2^4;

  29. uchar WaveChoice=0;
  30. uchar ys=30;
  31. uchar i,a=0;
  32. uchar sqar_num=128;


  33. //--延时MS          输入一个确切的值用于键盘输入时消除按键抖动
  34. void DelayMS(uchar ms)
  35. {
  36.         uchar i;
  37.         while(ms--) for(i=0;i<120;i++);
  38. }
  39. //--延时y*9us    改变ys的值进而利用该函数达到调频率的目的
  40. void Delay1(uint y)
  41. {
  42.         uint i;
  43.         for(i=y;i>0;i--);
  44. }


  45. //---输出波形
  46. void Out_Wave(uchar i)
  47. {         uchar j;       
  48.         switch(i)
  49.         {
  50.                 case 0:        P0=0x00;break;
  51.                 case 1:
  52.                                 //---正弦波
  53.                                 for (j=0;j<255;j++)
  54.                                 {
  55.                                         P0=tosin[j];
  56.                                         Delay1(ys);
  57.                                 }
  58.                                  break;
  59.                 case 2:
  60.                                 //----矩形波
  61.                                 {
  62.                                         if(a<sqar_num)
  63.                                                 {
  64.                                                         P0=0xff;
  65.                                                         Delay1(ys);
  66.                                                 }
  67.                                         else  
  68.                                                 {
  69.                                                         P0=0x00;
  70.                                                         Delay1(ys);
  71.                                                 }
  72.                                                 a++;
  73.                                 }  break;
  74.                 case 3:
  75.                                 //----三角波
  76.                                 {
  77.                                         if(a<128)
  78.                                                 {
  79.                                                         P0=a;
  80.                                                         Delay1(ys);
  81.                                                 }
  82.                                         else  
  83.                                                 {
  84.                                                         P0=255-a;
  85.                                                         Delay1(ys);
  86.                                                 }
  87.                                                 a++;
  88.                                 }   break;
  89.                 case 4:
  90.                            //----锯齿波
  91.                                 {
  92.                                          if(a<255)
  93.                                         {
  94.                                                 P0=a;
  95.                                                 Delay1(ys);
  96.                                         }
  97.                                
  98.                                 a++;
  99.                         if(a==255)
  100.                                 {
  101.                                         a=0;
  102.                                 }   break;
  103.                 }
  104.         }
  105. }
  106. //----按键扫描
  107. void keyscanf()
  108. {       
  109.         if(K2==0)
  110.         {
  111.                 DelayMS(5);
  112.                 if(K2==0)
  113.                 {
  114.                         while(!K2);
  115.                         ys--;
  116.                         if(ys==0)
  117.                         ys=30;
  118.                 }
  119.         }
  120.         if(K3==0)
  121.         {
  122.                 DelayMS(5);
  123.                 if(K3==0)
  124.                 {
  125.                         while(!K3);
  126.                         ys++;
  127.                         if(ys>60)
  128.                         ys=30;
  129.                 }
  130.         }
  131.         if(K4==0)
  132.         {
  133.                 DelayMS(5);
  134.                 if(K4==0)
  135.                 {
  136.                         while(!K4);
  137.                         if(WaveChoice==2)
  138.                         sqar_num=sqar_num+2;
  139.                         if(sqar_num==238)
  140.                                 sqar_num=128;
  141.                 }
  142.         }
  143.         if(K5==0)
  144.         {
  145.                 DelayMS(5);
  146.                 if(K5==0)
  147.                 {
  148.                         while(!K5);
  149.                         if(WaveChoice==2)
  150.                         sqar_num=sqar_num-2;
  151.                         if(sqar_num==18)
  152.                                 sqar_num=128;                       
  153.                 }
  154.         }
  155. }

  156. //----主程序---
  157. void main()
  158. {

  159. ……………………

  160. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

全部资料51hei下载地址:

单片机课程设计波形发生器.rar (1.45 MB, 下载次数: 160)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:369328 发表于 2018-7-11 11:19 | 只看该作者
好啊  真的很好
回复

使用道具 举报

板凳
ID:671160 发表于 2019-12-23 12:13 | 只看该作者
很好 不错
回复

使用道具 举报

地板
ID:695998 发表于 2020-5-30 16:08 | 只看该作者
点赞,谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表