单片机频率可控的正弦波.doc
课程
任务书
学生姓名: 李 旭 专业班级: 电信0806班 指导教师: 胡君萍 工作单位: 信息工程学院 题 目: 单片机原理与应用课程设计——设计并实现频率可控的正弦波信号发生器
初始条件:
(1)Proteus、伟福、KEIL仿真软件,XL1000综合仿真试验仪一台;
(2)先修课程:微机原理与接口技术、单片机原理。
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 利用DAC0832输出正弦波信号(用示波器观察输出波形),初始频率为50Hz,变频采用“,”、“,”
键 控制,实时测量输出信号的频率值,并
和实测输出信号的频率范围。具体完成以下任务: 1. 完成系统的
设计,给出系统框图。
2. 完成系统的硬件设计,给出硬件电路图和系统资源分配表。
3. 完成系统的软件设计,给出程序流程图和程序清单。
4. 运用Proteus(或伟福、KEIL)仿真软件对所设计的系统进行调试和仿真,直到预定的功能全
部仿真通过,给出仿真结果;
5. 将程序下载到XL1000综合仿真试验仪,验证系统功能;或者自己制作出系统。 6. 对所设计的系统进行性能分析(精度、实用性、成本等)。
7. 完成课程设计报告。
时间安排:
总体设计和硬件设计 二天
软件设计 一天
调试 一天
写报告,答辩 一天
参考书目:
[1] 李群芳、 张士军,单片微型计算机与接口技术, 电子工业出版社,2008 [2] 张毅刚、彭喜元、董继成,单片机原理及应用,高等教育出版社,2004 [3] 赵晓安,MCS-51单片机原理及应用,天津大学出版社,2001
指导教师签名: 年 月 日 系主任(或责任教师)签名: 年 月 日
武汉理工大学《单片机原理与应用》课程设计说明书
摘 要
正弦交流信号是一种应用极为广泛的信号。在许多测试仪中需要用
的正弦信号
一些物理量。正弦信号用作标准信号时,要求正弦信号必须有较高的精度、稳定度及较低的失真率。传统的正弦信号发生器的频率变动由机械驱动可变元件完成,当这种信号发生器用于低频信号输出往往需要的RC值很大,这样不但参数准确度难以保证,而且体积和功耗都很大。而基于单片机技术和D/A转换电路构成的正弦信号发生器就可以解决这些问题。
本文主要介绍了数字式正弦信号发生器的波形产生原理和单片机控制原理。本次设计以单片机技术为基础,通过AT89C52芯片在一定时间内输出一系列的离散数字样点信号,然后通过D/A转换器转换成平滑的正弦波信号,最后通过运算放大器输出。本次设计采用模块化设计的方法,软硬件相结合,硬件设计包括:数码管频率2显示电路、D/A转换正弦信号输出电路、时钟复位电路、键盘频率2输入电路,正弦波转方波的电路,频率测量电路;软件设计包括:显示子程序、D/A转换子程序以及数据计算处理子程序、键盘频率输入子程序。通过软、硬件的结合,既可以实现波形参数的独立连续变化,又具有良好的人机对话界面,原理简单,使用方便。软硬件设计完成后利用KeilμVision2集成开发环境编译该最小系统的程序,利用Proteus仿真软件设计该系统的电路原理图,最后通过两个工具的完美结合对该课题进行系统的软件模拟仿真,结果满足设计要求。本次设计的数字式正弦信号发生器的参数可调,输出波形平滑规则、频率稳定、有较强的实用性。
关键词: 单片机 正弦波 信号发生器
1
武汉理工大学《单片机原理与应用》课程设计说明书
目 录
摘 要 ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 1
1 总体结构设计 ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 4 1.1 设计任务 ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 4 1.2 方法论证 ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 4
1.2.1 单片机的选择论证 ??????????????????????????????????????????????????????????????????????????????????????????? 4
1.2.2 正弦波发生方案论证 ??????????????????????????????????????????????????????????????????????????????????????? 5
1.2.3 显示方案论证 ??????????????????????????????????????????????????????????????????????????????????????????????????? 5
1.2.4 键盘方案论证 ??????????????????????????????????????????????????????????????????????????????????????????????????? 5 1.3 设计实现方案 ????????????????????????????????????????????????????????????????????????????????????????????????????????????? 6 1.4 系统总体设计框图 ?????????????????????????????????????????????????????????????????????????????????????????????????????? 6 1.5 波形发生和频率变换的方法 ?????????????????????????????????????????????????????????????????????????????????????? 6
1.5.1 波形发生的方法 ??????????????????????????????????????????????????????????????????????????????????????????????? 6
1.5.2 频率测量的方法 ??????????????????????????????????????????????????????????????????????????????????????????????? 7 2 系统硬件设计 ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 7 2.1 硬件电路芯片的选择 ?????????????????????????????????????????????????????????????????????????????????????????????????? 8
2.1.1 CPU芯片—AT89C51 ?????????????????????????????????????????????????????????????????????????????????????????? 8
2.1.2 D/A转换芯片DAC0832 ????????????????????????????????????????????????????????????????????????????????????? 9
2.1.3 显示器的选择 ??????????????????????????????????????????????????????????????????????????????????????????????????? 9
2.1.4 运算放大器HA17741 ?????????????????????????????????????????????????????????????????????????????????????? 10
2.1.5 斯密特触发器 ????????????????????????????????????????????????????????????????????????????????????????????????? 11 2.2 电路接口设计 ??????????????????????????????????????????????????????????????????????????????????????????????????????????? 11
2.2.1 最小系统设计 ????????????????????????????????????????????????????????????????????????????????????????????????? 11
2.2.2 LED数码管显示电路 ?????????????????????????????????????????????????????????????????????????????????????? 12
2.2.3 D/A转化正弦信号输出 ?????????????????????????????????????????????????????????????????????????????????? 12
2.2.4 时钟电路及复位电路 ????????????????????????????????????????????????????????????????????????????????????? 13
2.2.5 键盘频率输入电路 ????????????????????????????????????????????????????????????????????????????????????????? 14
2.2.6 正弦波转换为方波电路 ????????????????????????????????????????????????????????????????????????????????? 15 3 系统软件程序的设计 ?????????????????????????????????????????????????????????????????????????????????????????????????????????? 15
2
武汉理工大学《单片机原理与应用》课程设计说明书
3.1 主程序功能模块 ??????????????????????????????????????????????????????????????????????????????????????????????????????? 16
3.2 显示子程序模块 ??????????????????????????????????????????????????????????????????????????????????????????????????????? 17
3.3 D/A转换子程序模块 ????????????????????????????????????????????????????????????????????????????????????????????????? 18
3.4 键盘控制频率输入子程序模块 ???????????????????????????????????????????????????????????????????????????????? 18
3.5 数据计算处理子程序模块 ???????????????????????????????????????????????????????????????????????????????????????? 19 4 系统调试 ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 19
4.1 PROTEUS与KEIL uVision2介绍?????????????????????????????????????????????????????????????????????????????? 20
4.1.1 Proteus软件的介绍 ?????????????????????????????????????????????????????????????????????????????????????? 20
4.1.2 Keil软件的介绍 ???????????????????????????????????????????????????????????????????????????????????????????? 20
4.2 软硬件的调试 ??????????????????????????????????????????????????????????????????????????????????????????????????????????? 21 5 结论 ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 22
5.1 讨论分析 ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 22 6 心得体会 ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 23
7 参考文献 ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 24
8 原理图 ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 25
附录一 PROTEUS仿真图 ????????????????????????????????????????????????????????????????????????????????????????????????????????? 26 附录二 源程序 ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 27 附录三 成绩评定表 ???????????????????????????????????????????????????????????????????????????????????????????????????????????????? 36
3
武汉理工大学《单片机原理与应用》课程设计说明书
1 总体结构设计
1.1 设计任务
利用DAC0832输出正弦波信号(用示波器观察输出波形),初始频率为50Hz,变频采用“,”、“,”键 控制,实时测量输出信号的频率值,并分析和实测输出信号的频率范围。具体完成以下任务:
1. 完成系统的方案设计,给出系统框图。
2. 完成系统的硬件设计,给出硬件电路图和系统资源分配表。
3. 完成系统的软件设计,给出程序流程图和程序清单。
4. 运用Proteus仿真软件对所设计的系统进行调试和仿真,直到预定的功能全部仿
真通过,给出仿真结果;如果条件允许,将程序下载到XL1000综合仿真试验仪,
验证系统功能。
5. 对所设计的系统进行性能分析(精度、实用性、成本等)。
6. 完成课程设计报告。
1.2 方法论证
1.2.1 单片机的选择论证
方案一:AT89C52单片机是一种高性能8位单片微型计算机。它把构成计算机的中央处理器CPU、存储器、寄存器、I/O接口制作在一块集成电路芯片中,从而构成较为完整的计算机、而且其价格便宜。
方案二:C8051F005单片机是完全集成的混合信号系统级芯片,具有与8051兼容的微控制器内核,与MCS-51指令集完全兼容。除了具有标准8052的数字外设部件,片内还集成了数据采集和控制系统中常用的模拟部件和其他数字外设及功能部件,而且执行速度快。但其价格较贵
以上两种方案综合考虑,选择方案一。
4
武汉理工大学《单片机原理与应用》课程设计说明书
1.2.2 正弦波发生方案论证
方案一:通过单片机控制D/A,输出三种波形。此方案输出的波形不够稳定,抗干扰能力弱,不易调节。但此方案电路简单、成本低。
方案二:使用传统的锁相频率合成方法。通过芯片IC145152,压控振荡器搭接的锁相环电路输出稳定性极好的正弦波,再利用过零比较器转换成方波,积分电路转换成三角波。此方案,电路复杂,干扰因素多,不易实现。
方案三:利用MAX038芯片组成的电路输出波形。MAX038是精密高频波形产生电路,能够产生准确的三角波、方波和正弦波三种周期性波形。但此方案成本高,程序复杂度高。
以上三种方案综合考虑,选择方案一。
1.2.3 显示方案论证
方案一:采用LED数码管。LED数码管由8个发光二极管组成,每只数码管轮流显示各自的字符。由于人眼具有视觉暂留特性,当每只数码管显示的时间间隔小于1/16s时人眼感觉不到闪动,看到的是每只数码管常亮。使用数码管显示编程容易,价格便宜。
方案二:采用LCD液晶显示器1602。其功率小,效果明显,编程复杂,价格贵。
以上两种方案综合考虑,选择方案一。
1.2.4 键盘方案论证
方案一:矩阵式键盘。矩阵式键盘的按键触点接于由行、列母线构成的矩阵电路的交叉处。当键盘上没有键闭合时,所有的行和列线都断开,行线都呈高电平。当某一个键闭合时,该键所对应的行线和列线被短路,编程复杂。
方案二:独立式按键。当按键闭合时有效,编程简单。
以上两种方案综合考虑,选择方案二。
5
武汉理工大学《单片机原理与应用》课程设计说明书
1.3 设计实现方案
本设计是以AT89C51作为中央处理芯片,通过DAC0832芯片来获得正弦波信号,用按键和显示器来设置和读取频率和振幅。在KEIL环境下进行汇编编程,并在Proteus 中进行仿真。此设计的主要功能:
1. 使用51单片机与D/A转换芯片DAC0832实现数字式正弦波形发生器。
2. 采用51单片机在一定的时间内输出一系列的离散数字样点信号,然后通过D/A
转换器转换成平滑的正弦波信号。
3. 采用555构成的施密特触发器将正弦波转换成方波,送到51单片机中进行频率的
测量。
4. 使用LED显示输入输出的频率进行对比分析。
本次数字式正弦信号发生器的设计分为软件部分和硬件部分,按功能来划分硬件部分又可分为:数码管频率和振幅显示电路、D/A转换正弦信号输出电路、时钟复位电路、键盘频率电路;软件部分可分为:显示子程序、D/A转换子程序以及数据计算处理子程序、键盘频率输入子程序。
1.4 系统总体设计框图
单频并行 运 算 正弦片率LED I/O口 放大器 D/A 波转显示 机 测方 波 量
图1.1 系统总体设计框图
1.5 波形发生和频率变换的方法
1.5.1 波形发生的方法
近年来,随着单片机的迅速发展,用MCS-51系列单片机系统产生任意波形的发生器逐渐得到发展。根据本次设计的要求和设计原则,波形发生方法的结构图如图1.2所示。
6
武汉理工大学《单片机原理与应用》课程设计说明书
单
片
机 并行I/O D/A 输出 运算放大
器
图1.2 正弦波发生系统框图
波形数据固定在EPROM中或者由单片机直接计算输出,经并行口送出,再经D/A转换芯片和运算放大器输出。其优点是便于进行程控。
1.5.2 频率测量的方法
利用单片机内部的定时/计数器来测量频率,其方法是先运算放大器输出的正弦波转换为等频率的方波,将其输入给单片机,利用定时器1定时固定时间,用计数器0计此时间内方波的下降沿脉冲个数,由此计算出方波的频率,从而得到正弦波的频率,将此频率值输出由LED显示出来。
利用施密特触发器将边缘缓慢变化的周期性信号如正弦波、三角波或任意形状的模拟信号变换成同频率的矩形脉冲。通过MCS-51系列单片机内部的两个十六位定时,计数器测量某段时间内的外加脉冲数,经过处理并通过LED直接显示出所加信号的频率。单片机内部的T1用来定时,T0用来计数(下降沿触发)。当来一个计数脉冲则计数一次。在T1开始定时的同时,T0开始计数;T1定时1s时间到时,T0停止计数。
正方 单利用定时LED 弦 片器,计数器显示 波 波 机 测频率
图1.3 频率测量系统框图
2 系统硬件设计
本次设计的频率可控的正弦信号发生器的简单硬件电路原理框图如图2.1所示。
7
武汉理工大学《单片机原理与应用》课程设计说明书
时钟电路 单片机控制电路 D/A转换 运算放大器 AT89C51(1) DAC0832
复位电路
LED(1)显示按键 理论频率值
单片机控制电路 施密特 LED(2)显示 AT89C51(2) 触发器 实际频率值
图2.1 系统整体结构框图
2.1 硬件电路芯片的选择
2.1.1 CPU芯片—AT89C51
1(AT89C51概述
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
2. AT89C51引脚说明
AT89C51单片机引脚图如图3-2所示。它有40个引脚,其中包含2个专用于主电源的引脚,2个外接晶体的引脚,4个控制或与其它电源复用的引脚,以及32条输入输出I/O引脚。
图2.2 51单片机引脚图
8
武汉理工大学《单片机原理与应用》课程设计说明书
2.1.2 D/A转换芯片DAC0832
DAC0832为一个8位D/A转换器,单电源供电,在+5,+15V范围内均可正常工作。基准电压的范围为?10V,电流建立时间为1us,CMOS工艺,低功耗20mW。该转换器由输入寄存器和DAC寄存器构成两级数据输入锁存。使用时,数据输入可以采用两级锁存(双缓冲)形式,或单级锁存(单缓冲)形式,也可以采用直接输入(直通)形式。由3个与门电路组成寄存器输出控制电路,可直接进行数据锁存控制:当LE=0时,输入数据被锁存;当LE=1时,数据不锁存,锁存器的输出跟随输入变化。DAC0832为电流输出形式,其两个输出端的关系为I+I=常数。 out1out2
DAC0832转换器芯片为20引脚双直插式封装,其引脚排列如图2.3所示。
120CS/Vcc219WR1/ILE318AGNDWR2/417DI3XFER/516DI2DI4615DI1DI5714DI0DI6813 VrefDI7912RfbIout2图2.3 DAC0832引脚图 1011DGNDIout1
DAC0832的主要特性如下:
1. 分辨率为8位;
2. 电流输出,建立时间为1us;
3. 单一电源供电(+5V~+15V);
4. 可双缓冲输入、单缓冲输入或直接数字输入;
5. 低功耗,20mW;
考虑到芯片的性能、结构及应用特性,结合毕业设计的具体要求,才选择这个DAC0832芯片。
2.1.3 显示器的选择
目前的显示器有数码管显示器和液晶显示器。LED数码管是最常用的数字显示器,LED显示器内部是8只发光二极管,根据LED显示器内部结构的不同分为共阴极和共阳极数码管。本设计采用共阴极数码管。
9
武汉理工大学《单片机原理与应用》课程设计说明书
图2.4共阴和共阳LED显示器电路原理图
2.1.4 运算放大器HA17741
D/A转换后输出的信号是电流输出形式,为了要得到电压输出形式,可在电流输出端
接一个运算放大器。
图2.5 HA17741内部结构及引脚
运算放大器HA17741 各引脚功能如下:
1. VEE、VCC:工作电压。VCC为+5,+15V,VEE为-5,-15V;
2. ?Vin:放大器输入端;
3. Vout:信号输出端;
4. Offset Null:失调调零端;
5. NC:悬空端。
10
武汉理工大学《单片机原理与应用》课程设计说明书
2.1.5 斯密特触发器
斯密特触发器具有如下两个特点:
1. 电路具有两个阈值电压,分别称为正向阈值电压和负向阈值电压;
2. 与双稳态触发器和单稳态触发器不同,斯密特触发器属于“电平触发型”电
路,不依赖于边沿陡峭的脉冲。
3. 它是一种阈值开关电路,具有突变输入——输出特性的门电路。这种电路被
设计成阻止输入电压出现微小变化(低于某一阈值)而引起的输出电压的改
变。当输入电压由低向高增加,到达V+时,输出电压发生突变,而输入电压
Vi由高变低,到达V-时,输出电压发生突变,因而出现输出电压变化滞后的
现象,可以看出对于要求一定延迟启动的电路,它是特别适用的。
图2.6 施密特触发器
2.2 电路接口设计
2.2.1 最小系统设计
一个单片机系统能运行的最小系统包括时钟电路,复位电路和CPU。
图2.7 单片机最小系统
11
武汉理工大学《单片机原理与应用》课程设计说明书
2.2.2 LED数码管显示电路
单片机与LED数码显示器依据位选线和段选线的不同,LED显示器有静态显示和动态显示两种方式。
1. 静态显示法
采用静态显示时,位选线同时选通,每位的段选线分别与一个8位锁存器输出相连接,各位相互独立。不足之处是每一个显示都需要用一个锁存器进行驱动,占用一个具有8位的并行接口,硬件成本高。
2. 动态显示法
为克服静态显示的缺点,可以将所有位的相应段选线并在一起,位线则分时轮流选通,在同一时刻显示不同的字符,利用了人眼对视觉的残留效应,采用动态扫描显示的方法,逐个地循环点亮各位数码管。选通某一位LED使其点亮并保持
图2.8 显示电路图
一定的时间,程序上常采用的是调用延时子程序。
从图3-7中可以看出,P3口的引脚P3.2—P3.4作LED数码显示器的位扫描。当执行显示子程序时,引脚P3.2—P3.4扫描输出总是有一位为高电平,以选中相应的字位,P0口输出相应位的显示字符的段数据使该位显示出相应字符,其他位为暗。依次改变P3口P3.2—P3.4输出的高电平的位及P0口输出对应的段数据,3位LED显示器就显示出确定的字符,这样就可以进行LED显示。
2.2.3 D/A转化正弦信号输出
AT89C51单片机与DAC0832的接口一般有3种连接方式,为直通方式、单缓冲方式及
12
武汉理工大学《单片机原理与应用》课程设计说明书
双缓冲方式。直通方式不能直接与系统的数据总线相连,还需另加锁存器。单缓冲方式就是使DAC0832的两个输入寄存器中有一个处于直通方式,而另一个处于受控的锁存方式,当然也可使两个寄存器同时选通及锁存。而双缓冲方式就是把DAC0832的两个锁存器都接成受控锁存方式。因为在本次设计中需要控制输出电压的变化所以只有使用单缓冲方式。
为了得到电压输出,还应在电流输出端接一个运算放大器,如图3-8所示。还需指出的是,DAC0832运算放大器内部已有反馈电阻,其阻值为15kΩ。若需加大阻值,则可外接反馈电阻。
图 2.9 DAC0832运算放大器接法
图2.10 DAC0832和MCS-51单片机接法
2.2.4 时钟电路及复位电路
1. 时钟电路
时钟电路可以产生CPU校准时序,是单片机的控制核心,本次设计是通过外接12MHz的晶振来实现时钟电路的时序控制。在使用片内振荡器时,XTAL1和XTAL2分别为反向
13
123456
DD
CC
武汉理工大学《单片机原理与应用》课程设计说明书
放大器的输入端和输出端。外接晶体以及电容C1和C2构成并联谐振电路,接在放大器的
反馈回路中。当用外部时钟驱动时,XTAL2引脚应悬空,而由XTAL1引脚上的信号驱动,
外部振荡器通过一个2分频的触发器而成为内部时钟信号,故对外部信号的占空比没有什
么要求,但最小和最大的高电平持续时间和低电平持续时间应符合技术要求。
BB
图2.11晶振电路
2. 复位电路
VCC为了使单片机正常工作,还需要加入上电复位电路和掉电检测电路。上电复位简要原
理:在系统不需要复位时,RST端是低电平;按下按键S17,RST端变为高电平,系统则复
C9S17位。 10uF
RST
R11
10K
AA
Title
SizeNumberRevision
B
Date:3-Jun-2003 Sheet of 图2.12上电复位电路 File:C:\Documents and Settings\user\桌面\zw\ZW.ddbDrawn By:123456
2.2.5 键盘频率输入电路
为了使设计简洁、易于操作,键盘部分设计了2个按键,1个为频率的增加按键,一
个是频率的减小按键,它使频率的变化范围是1Hz,99Hz。而按键在电路中设置成高电平,
只要有键按下则变成低电平,这样的设计是为了方便软件程序的扫描。
14
武汉理工大学《单片机原理与应用》课程设计说明书
图2.13键盘接口电路图
2.2.6正弦波转换为方波电路
由于正弦波的频率不易被测量,在实际电路中先将其先转换成方波,利用方波每个周期有一个负跳变的特点,用单片机检测其下降沿的个数从而确定它的频率。
图2.14 正弦波转方波电路
3 系统软件程序的设计
软件设计是本次设计的一个重要组成部分。在单片机应用系统中,最常用的程序设计方法是模块程序设计。本次设计的软件部分可分为:主程序模块、键盘控制频率输入子程序模块、显示子程序模块、D/A转换子程序模块以及数据计算处理子程序模块等。
15
武汉理工大学《单片机原理与应用》课程设计说明书 3.1 主程序功能模块
主程序主要对数字式正弦信号发生器进行初始化设置,显示初始的正弦波频率及输出
初始的正弦波电压信号,开放中断准备响应频率的变化等。 1. 正弦波发生程序流程图如图
开始
初始化
调显示
键盘扫描
N
FLAG=1
1
Y
给定时器赋初值
调显示
结束
图3.1正弦波发生的主程序流程图
16
武汉理工大学《单片机原理与应用》课程设计说明书 2. 频率测量的主程序流程图
开始
初始化
N 中断时间到
Y
调显示
结束
图3.2 频率测量的主程序流程图
3.2 显示子程序模块
由于硬件电路的设计,显示是以动态显示的方法,硬件连接比较简单,主要是软件编
程控制LED显示。
开始
选通一位数码
管
送段码
延时并关闭上
数码管
N所有显示一遍否
Y
图3.3 显示子程序流程图 返回
17
武汉理工大学《单片机原理与应用》课程设计说明书 3.3 D/A转换子程序模块
D/A转换是本次设计的重点之一,它由两片DAC0832控制,第一片的输出做第二片的基准电压,但它不同于硬件电路的烦琐,它的软件程序是十分简单的,只要几条输出指令,就可以进行D/A转换控制。
P2=SINX[NUM];//直接将频率采样的值给P2口,随即送入DAC0832 3.4 键盘控制频率输入子程序模块
在本次设计中,键盘的处理是通过查询的方式进行扫描,而且是在主程序中进行的。当按下一个键码后,通过按键分析得到一个键码,并开始数据的处理。
开始
调显示
N UP键按下
DOWN键按下 Y
N Y
延时消抖
显示键值
FLAG=1
Y
结束
图 3.4 键盘控制频率输入程序流程图
18
武汉理工大学《单片机原理与应用》课程设计说明书 3.5 数据计算处理子程序模块
中断服务
进入中断 程序入口
关闭定时器关闭定时器0
1,计数器0
装入新的
中断计数值 计算频率值
输出正弦离散
给计数器 频率信号点
0赋初值
N 开定时器1,已输出一
计数器0 个周期
Y
返 回
启动定时器0
结 束
正弦波发生的中断 测量程序中断子程序子程序流程图 流程图
图3.5 中断子程序流程图 4 系统调试
应用系统调试是系统设计的重要环节,当完成了单片机应用系统的硬件、软件设计后,
便可进入单片机应用系统调试阶段。
19
武汉理工大学《单片机原理与应用》课程设计说明书
系统调试开始
硬件调试 软件调试
系统联调
现场调试
调试结束
图4.1系统调试的一般过程
4.1 PROTEUS与KEIL uVision2介绍
4.1.1 Proteus软件的介绍
Proteus 软件是英国Labcenter electronics公司出版的EDA工具软件。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机以及外围器材。它是目前最好的模拟单片机外围器件的工具,Proteus与其它单片机仿真软件不同的是,它不仅能仿真单片机CPU的工作情况,也能仿真单片机外围电路或没有单片机参与的其它电路的工作情况。因此在仿真和程序调试时,关心的不再是某些语句执行时单片机寄存器和存储器内容的改变,而是从工程的角度直接看程序运行和电路工作的过程和结果。对于这样的仿真实验,从某种意义上讲,是弥补了实验和工程应用间脱节的矛盾和现象。它提供了30多个元件库,数千种元件和比较丰富的测试信号用于电路的测试。
4.1.2 Keil软件的介绍
Keil uVision2是一款与51系列兼容单片机汇编和C语言的软件开发系统,该软件提供了丰富的库函数和功能强大的集成开发调试工具,全Windows界面。它的集成开发环境
20
武汉理工大学《单片机原理与应用》课程设计说明书
集成了一个项目管理器和一个功能丰富 有错误提示的编辑器,以及设置选项,生成工具,在线帮助等功能。利用Keil uVision2可以编译C、汇编、C和汇编的混合编程源程序,并把它们组织到一个能确定的目标应用的项目中去。Keil uVision2会自动编译,汇编,连接嵌入式应用,并为你的开发提供一个单一的焦点。
4.2 软硬件的调试
在Proteus环境下连接电路图,并检查是否有连接错误;在Keil uVision2环境下编写程序并运行,看是否有语句错误,然后和Proteus联调进行软硬件整体调试。
经过以上操作后,进行仿真调试,结果在示波器中并没有出现正弦信号,在LED显示器中也没有出现正弦信号的幅值和频率,于是我们进行全面的分析,得出问题出现的原因:程序上存在缺陷,电路图的引脚连接错了或者没有连接好,再就是我们操作上存在漏洞。为了解决这些问题,我们多次调试程序,程序没有错误。因此我们排除了程序错误的可能。我们又检查了电路连接图,有几处连线我们很迷惑,经过分析和老师的指导,我们正确的连接了电路图,可还是没有出现预期达到的结果,查阅资料后我们发现在操作上我们忽略了几处细节问题,纠正了以上错误后我们再次进行了调试,得到了一个不错的波形。
最后,本次设计的正弦信号发生器可以输出频率范围为1Hz,99Hz的正弦波。仿真波形如图所示。
图4.2仿真波形图
21
武汉理工大学《单片机原理与应用》课程设计说明书
5 结论
本次设计的正弦信号发生器不同于以往的模拟电路实现的信号发生器,首先其以单片机作为重要组成部分,采用D/A转换芯片,通过程序控制波形,控制灵活。其次,它是通过软硬件结合的方法,使用MCS-51单片机汇编语言编写程序,不但简化了硬件设备,实现了波形参数的连续变化,而且具有良好的人机界面,操作十分方便。整个系统采用模块化设计方法,操作方便直观,经示波器观察,输出波形规则,频率和振幅变化范围可调,在一定程度上,可以代替其他正弦波信号源。由于水平有限,在本次设计中还存在着许多不足,如在单片机系统抗干扰方面考虑的太少。在实际应用中抗干扰技术非常重要,如不注意,常会导致单片机系统运行失常。实验结果与理论数据存在着误差,准确度、精度和稳定度上还有待提高。
5.1 讨论分析
1. 误差讨论分析
实验结果与理论数据存在着误差。偏差较大的部分在频率较高的部分,经讨论分析后,认为这些误差可能由以下原因造成的:
1) 芯片精度值的影响。本次设计中所用到的元器件都是普通器件,稳定性都不算
高,精度也较低,这就导致了误差的产生。
2) 方法误差。设计方法存在着误差,设计方法中使用的计算定时时间,由于大多
数据都不能整除,只能四舍五入的方法取得数据,当然就要产生误差。
2. 最终结论
1) 键盘、显示部分功能正常,可无错的输入及显示。
2) D/A转换部分正常输出,在低频时波形稳定、失真度低。
3) 误差在低频区基本控制在? 1%的范围内,基本满足设计指标。
22
武汉理工大学《单片机原理与应用》课程设计说明书
6 心得体会
本次课程设计我的任务是利用51单片机和PROTUES软件产生频率可控的正弦波发生器。初看这个题目觉得很简单,初步的程序是很快就编译成功的,但是在精度和准确度中都存在很大的问题,因为我们设置的是采样时间每次按键自增1,于是当按键值初始由1增加到2时,设定的频率值由100减到50,导致中间的频率值无法取到。之后我们控制按键值为预设的频率值,由此算出中断的不同的计数初值,这样我们可以取到1至100间的任何频率,而且误差较小,并且在示波器上能观察到平滑的很是美观的正弦波。就在我们欣喜之余,老师却说我们理解错了题目的意思,我们需要显示的是输出波形的实际值而不是我们理论值,当下很是有点泄气,但是还是苦苦的想办法,这不是要我们在用单片机做个频率计吗,可是我们能想到的用T0做定时器,T1做计数器,然后定时一段时间计其脉冲的个数,然后不幸的是,此方法只对方波有效。于是乎,将正弦波转换成方波成了我们问题的关键,我们搜集资料,想到了施密特触发器或者与非门电路,我们做了用与非门构成的整形电路,实际的效果非常的差,频率值很是不稳定,且显示的数据不是误差,已经升级为错误的乱码了。后来我们采用施密特触发器,可是在一个单片机上定两个时间,计数,显示,程序没有成功。我们检查了又检查,觉得逻辑上很有道理,程序也没有报错就是下载了之后数码管纹丝不动。纠结了之后我们采用了两块单片机,一块发生正弦波,一块做频率计。最终,仿真终于成功了,误差也控制的很好。可是在实物上没有焊接施密特触发器,只完成了正弦波发生的部分,老师谅解了我们的难度和过程,让我们过了,在此谢谢老师,我们有自己动过脑筋了。
这次的课程设计,我几乎是和曹雄丰同学天天在实验室从早到晚的尝试各种方法和程序,经常忘了吃饭,晚上回去弄到一两点,曹同学在此期间教了我很多,也帮了我很多。
我们几乎是做了信号发生器和示波器的工作,虽然经历了纠结挣扎想要放弃,但是在同学老师资料等等的帮助下,勉强的顺利做完了,对单片机的工作原理有了更近一步的了解,对自己的实践能力有了提高。
23
武汉理工大学《单片机原理与应用》课程设计说明书
7 参考文献
[1] 李叶紫,胡辉,孙东辉.MCS-51单片机应用教程[M].北京:清华大学出版社,2004 [2] 张毅坤.单片微型计算机原理及应用[M].西安:西安电子科技大学出版社,1998 [3] 张友德.单片微机软件设计技术[M].北京:科学技术文献出版社,1998 [4] 陈伟人.MCS-51系统单片机实用子程序集锦[M].北京:清华大学出版社,1993 [5] 边春远,杜平.C51单片机典型模块设计与应用[M].北京:机械工业出版社,2008
24
武汉理工大学《单片机原理与应用》课程设计说明书
8 原理图
25
武汉理工大学《单片机原理与应用》课程设计说明书
附录一 PROTEUS仿真图
26
武汉理工大学《单片机原理与应用》课程设计说明书
附录二 源程序
正弦波发生器的程序
//---------------------------------------------------------------------
//程序功能简介:本程序产生频率可一改变的正弦波,频率改变步长为1HZ,初始化频率为50HZ;
//程序思路: 本程序用到一个定时器------定时器0,定时器0工作在定时方式下,
// 定时向DAC0832送数据打点;
//------------------------------------------------------
#include "reg52.h"//51芯片管脚定义头文件
#include "stdio.h"
#define uchar unsigned char
#define uint unsigned int
#define Fosc 8000000 //晶振频率12M;
#define ALL 65536 //定时器0处于工作方式1,最大基数长度 65536;
uint LED4_BUF,LED2_BUF,LED3_BUF;//数码管显示缓冲变量;
uint TIMER0_H,TIMER0_L; //定时器0的初值设置;
uint NUM=0; //计数变量;
uint FREQ=50; //初始频率;
bit FLAG=0; //频率调节标志;
//---------------------------------------------------------------------
// 各端口定义;
//---------------------------------------------------------------------
sbit F_UP=P1^0; //频率上调按钮;
sbit F_DOWN=P1^1; //频率下调按钮;
// sbit CS=P1^6; //片选端口;
// sbit _WR=P1^7; //写端口;
uchar code SINX[]={
0x7F,0x82,0x85,0x88,0x8B,0x8F,0x92,0x95,0x98,0x9B,0x9E,
27
武汉理工大学《单片机原理与应用》课程设计说明书
0xA1,0xA4,0xA7,0xAA,0xAD,0xB0,0xB3,0xB6,0xB8,0xBB,0xBE,0xC1,0xC3,0xC6,0xC8,0xCB,0xCD,0xD0,0xD2,0xD5,0xD7,0xD9,0xDB,0xDD,0xE0,0xE2,0xE4,0xE5,0xE7,0xE9,0xEB,0xEC,0xEE,0xEF,0xF1,0xF2,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFB,0xFC,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFD,0xFD,0xFC,0xFB,0xFB,0xFA,0xF9,0xF8,0xF7,0xF6,0xF5,0xF4,0xF2,0xF1,0xEF,0xEE,0xEC,0xEB,0xE9,0xE7,0xE5,0xE4,0xE2,0xE0,0xDD,0xDB,0xD9,0xD7,0xD5,0xD2,0xD0,0xCD,0xCB,0xC8,0xC6,0xC3,0xC1,0xBE,0xBB,0xB8,0xB6,0xB3,0xB0,0xAD,0xAA,0xA7,0xA4,0xA1,0x9E,0x9B,0x98,0x95,0x92,
0x8F,0x8B,0x88,0x85,0x82,0x7F,0x7C,0x79,0x76,0x73,0x6F,0x6C,0x69,0x66,0x63,0x60,0x5D,0x5A,0x57,0x54,0x51,0x4E,0x4B,0x48,0x46,0x43,0x40,0x3D,0x3B,0x38,0x36,0x33,0x31,0x2E,0x2C,0x29,0x27,0x25,0x23,0x21,0x1E,0x1C,0x1A,0x19,0x17,0x15,0x13,0x12,0x10,0x0F,0x0D,0x0C,0x0A,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0C,0x0D,0x0F,0x10,0x12,0x13,0x15,0x17,0x19,0x1A,0x1C,0x1E,0x21,0x23,0x25,0x27,0x29,0x2C,0x2E,0x31,0x33,0x36,0x38,0x3B,0x3D,0x40,0x43,0x46,0x48,0x4B,0x4E,0x51,0x54,0x57,0x5A,0x5D,0x60,0x63,0x66,0x69,0x6C,0x6F,0x73,0x76,0x79,0x7C }; uchar code table[]={
0x28,0x7e,0xa2,0x62,
0x74,0x61,0x21,0x7a,
0x20,0x60};
//--------------------------------------------------------------------- //函数声明;
//---------------------------------------------------------------------
void delay(uint t); //延时函数,用于按键去抖;
void display(uint FREQ); //显示函数;
void calculate_F(); //频率变化,计算定时初值;
void key_scan(); //键盘扫描函数;
void init(); //初始化函数;
void timer0(); //定时器0终端服务函数;
28
武汉理工大学《单片机原理与应用》课程设计说明书 //---------------------------------------------------------------------
//函数名称:delay();
//入口参数:uchar t;
//出口参数:无;
//函数功能:延时;
//---------------------------------------------------------------------
void delay(uint t)
{
uchar i,j;
while(t--)
{
for(i=0;i<10;i++)
for(j=0;j<10;j++);
}
}
//---------------------------------------------------------------------
//函数名称:calculate_F();
//入口参数:无;
//出口参数:无;
//函数功能:频率计算函数,当频率变化,计算出定时器0初值; //---------------------------------------------------------------------
void calculate_F()
{
float temp;
temp=ALL-Fosc/12.0/256/FREQ; //ALL-65536 Fosc-晶振频率-12MHZ FREQ-初始频率(50HZ)
TIMER0_H=(uint)temp/256;//定时器0的初始值的高8位
TIMER0_L=(uint)temp%256;//定时器0的初始值的低8位
}
29
武汉理工大学《单片机原理与应用》课程设计说明书
//---------------------------------------------------------------------
//函数名称:key_scan();
//入口参数:无;
//出口参数:无;
//函数功能:按键扫描函数;
//---------------------------------------------------------------------
void key_scan()
{
display(FREQ);
if(!F_UP)
{
while(!F_UP)
display(FREQ) ;
FREQ++;
FLAG=1;
}
else if(!F_DOWN)
{
while(!F_DOWN)
display(FREQ);
FREQ--;
FLAG=1;
}
else ;
}
//---------------------------------------------------------------------
//函数名称init();
//入口参数:无;
//出口参数:无;
30
武汉理工大学《单片机原理与应用》课程设计说明书 //函数功能:定时器初始化函数;
//---------------------------------------------------------------------
void init()
{
TMOD=0x01;//TMOD-定时/计数器方式寄存器,不能位寻址
calculate_F();//根据频率,来计算定时器初值
display(FREQ);
TH0=TIMER0_H;//设置定时器T0的初值
TL0=TIMER0_L;
ET0=1;// 中断允许寄存器IE ET0-定时器0终端允许位1时允许中断
EA=1;// 中断允许寄存器IE EA-总中断允许位,1时每个中断源是允许还是禁止由各自
的允许位决定
TR0=1;// TCON-定时器控制寄存器,可以位寻址 TR0-运行控制位,1时启动T0,此时定
时器T0开始启动计时
}
//---------------------------------------------------------------------
//函数名称display(FREQ);
//入口参数:有;
//出口参数:无;
//函数功能:数码管显示函数;
//---------------------------------------------------------------------
void display(FREQ)
{
LED2_BUF=FREQ/100;
LED3_BUF=FREQ%100/10;
LED4_BUF=FREQ%10;
P3=0xdf;
P0=table[LED2_BUF];
delay(10);
31
武汉理工大学《单片机原理与应用》课程设计说明书
P3=0xbf;
P0=table[LED3_BUF];
delay(10);
P3=0x7f;
P0=table[LED4_BUF];
delay(10);
}
//---------------------------------------------------------------------
//函数名称timer0();
//入口参数:无;
出口参数:无; //
//函数功能:定时器0中断函数;
//---------------------------------------------------------------------
void timer0() interrupt 1
{
TR0=0;//关闭定时器T0
TH0=TIMER0_H;
TL0=TIMER0_L;
P2=SINX[NUM];
NUM++;//计数变量,初始值为0
if(NUM==256)
NUM=0;
TR0=1;//启动定时器T0
}
//---------------------------------------------------------------------
//函数名称main();
//入口参数:无;
//出口参数:无;
//函数功能:主函数入口;
32
武汉理工大学《单片机原理与应用》课程设计说明书 //---------------------------------------------------------------------
main()
{
init();//初始化定时器0
while(1)
{
display(FREQ);//用数码管显示当前的频率值
key_scan();//扫描键盘是否有按键输入
if(FLAG)
{
calculate_F();
display(FREQ);
FLAG=0;
}
}
}
频率测量的源程序
#include
unsigned char t,i;
int temp;
unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90},
disp[]={0x08,0x04,0x02,0x01},dat[]={0,0,0,0};
sbit P37=P3^7;
void delay1ms(int t)
{
int i;
33
武汉理工大学《单片机原理与应用》课程设计说明书
while(t--)
{
for(i=0;i<120;i++);
}
}
void init_tx()
{
TMOD=0x15;//定时器1工作在方式1,计数器0工作在方式1
IE=0x88;//开总中断EA=1,开定时器1的中断ET1=0
TH0=TL0=0;
000 TH1=0x3c;TL1=0xb0;//定时器1的初值50
TR1=1;//开定时器
TR0=1;
}
void timer1(void) interrupt 3
{
TH1=0x3c;
TL1=0xb0;
t++;
if(t==20)//定时1S
{
t=0;
TR1=0,TR0=0;
temp=TH0*256+TL0;
dat[3]=temp/1000;
dat[2]=temp/100%10;
dat[1]=temp/10%10;
dat[0]=temp%10;
TH0=TL0=0;
34
武汉理工大学《单片机原理与应用》课程设计说明书
TR1=1;//开定时器
TR0=1;
}
}
void main()
{
init_tx();
while(1)
{
for(i=0;i<4;i++)
{ P1=0;
P2=tab[dat[i]];
P1=disp[i];
delay1ms(1);
}
}
}
35
武汉理工大学《单片机原理与应用》课程设计说明书 附录三 成绩评定表
本科生课程设计成绩评定表
姓 名 性 别 女 李 旭
专业、班级 电子信息工程0806班
课程设计题目:设计并实现频率可控的正弦波信号发生器 课程设计答辩或质疑记录:
成绩评定依据:
最终评定成绩(以优、良、中、及格、不及格评定)
指导教师签字:
年 月 日
36