毕业设计
题 目 基于单片机控制的函数信号发生器
英文题目 microcontroller-based function signal generator
二零一二 年 月
摘 要
信号发生器,它是一种用于产生标准信号的电子仪器,随着科学技术的发展,对它的要求越来越高。在工业生产和科研中利用信号发生器输出的信号,可以对元器件的性能及参数进行测量,还可以对电工和电子产品进行指数验证、参数调整及性能鉴定。常用的信号发生器绝大部分都是由模拟电路构成的,当这种模拟信号发生器用于低频信号输出往往需要的RC值很大,这样不但参数准确度难于保证,而且体积和功耗都很大,而由数字电路构成的低频信号发生器,虽然其低频性能好但体积较大,价格较贵,因此,高精度,宽调幅,低价格将成为数字量信号发生器的发展趋势。
本设计核心任务是:以89C51为核心,结合DAC0832实现程序控制产生正弦波、锯齿波及方波等常用的低频信号。可以通过键盘选择波形及增减频率。
关键词:波形发生器; 单片机80C51;数模转换器件DAC0832
ABSTRACT
Signal generator, it is a widely used sourse, with the scientific and the technological development,increasing its demands. industrial production and scientific research in the use of signal generator output signal generator output signal, the performance of components and parameters measured, but also the electrical and electronic products for authentication, and adjust parameters of identificatiaon. The signal generator used by the vast majority of Analog circuit components, such as analog signal generator for the low-frequency signals often require output value of the RC great, it will not only difficult to ensure the accuracy of parameters, but also have great size and power consumption. Digital components of low-frequency signal generator, although the low-frequency performance good but larger, more expensive price, therefore, high accuracy, wide-AM, will become a low-cost digital signal generator trend of development.
The graduation project core task is to design:89c51 as the microcontroller, unifies DAC0832 to realize the programmed control to have the sine wave, the sawtooth wave and the square wave three commonly used low-frequency signals. Can choose the waveform and frequency by the keyboard.
Key word: 89C51; DAC0832; signal generator
目 录
绪论 1
1.1本课题的目的及意义 1
1.2 本课题的研究现状 1
1.3 设计的基本要求 2
1.4 本课题研究内容 2
2. 方案的设计与选择 4
2.1 总体设计方案 4
2.2 方案的比较 4
2.3 单片机的选择 5
2.4 显示方案选择 5
2.5 键盘方案选择 5
3. 硬件设计 6
3.1 ATC89C51单片机 6
3.2数模转换器件DAC0832 10
3.3 显示模块 1602液晶器件 14
4. 软件系统设计 15
4.1主程序流程图 15
4.2定时中断程序流程图 16
4.3外部中断按键子程序流程图 17
4.4正弦波子程序流程图 18
4.5三角波子主程序流程图 19
4.6方波子程序流程图 20
4.7初始显示子程序流程图 20
5. 仿真 21
结 论 25
致 谢 26
参考资料 27
附录 28
附录1:程序 28
附录2:硬件原理图 36
附录3:仿真用图 37
绪论
1.1 本课题的目的及意义
信号发生器是一种经常使用的设备,有纯粹物理器件构成的传统的设计方法存在许多弊端,如体积较大、重量较沉、移动不方便、信号失真较大、波形种类过于单一、波形形状调节过于死板,无法满足用户对精度、便捷性、稳定性等要求,研究设计出一种具有频率稳定、准确、波形质量好、输出频率范围宽、便捷性好等特点的波形发生器具有较好的市场前景,以满足军事和民用领域对信号源的要求。
本次设计的主要目标 是学习和运用单片机的C语言和汇编语言,实现利用单片机89c51和8位D/A转换芯片DAC0832共同实现正弦波,方波,锯齿波这三种常见波形的发生,并可以显示波形种类和频率大小。本次设计准备在成本较低廉的前提下完成,主要单片机89C51和8位D/A转换芯片DAC0832,性能指数都不是很高。通过该课题的设计掌握函数发生器系统的设计流程;培养我们综合运用所学的基本知识、基本理论和基本技能的能力,学习解决一般工程技术和有关专业问题的能力,学习工程设计和科学研究的基本方法,完成对所学的知识的综合训练。
1.2 本课题的研究现状
信号发生器既可以构成独立的信号源,也可以是高性能网络分析仪、频谱仪及其它自动测试设备的组成部分。美国生产的33250A型函数/任意波形发生器,可以产生稳定、精确和低失真的任意波形,其输出频率范围为1μHZ ~80MHZ,而输出幅度为10mVpp~10Vpp;该公司生产的8648D射频信号发生器的频率覆盖范围更可高达9kHz~4GHz。国产SG1060数字合成信号发生器能双通道同时输出高分辨率、高精度、高可靠性的各种波形,频率覆盖范围为1μHZ ~60MHZ;国产S1000型数字合成扫频信号发生器通过采用新技术、新器件实现高精度、宽频带的扫频源,同时应用DDS和锁相技术,使频率范围从1MHZ ~1024MHZ能精确地分辨到100hz,它既是一台高精度的扫频源,同时也是一台高精度的标准信号发生器。还有很多其他类型的信号发生器,他们各有各的优点,但是信号发生器总的趋势将向着款频率覆盖、高精度、多功能、多用途、自动化和智能化方向发展。
目前,市场上的信号发生器多种多样,一般按频率带分为以下几种;
超高频:频率范围1MHz以上,可达几十兆赫兹。
高频:几百赫兹到几赫兹。
低频:频率范围为几十赫兹到几百赫兹。
超低频:频率范围为零点几赫兹到几百赫兹。
超高频信号发生器,产生波形一般为用LC振荡电路。
高频、低频和超低频信号发生器,大多使用文氏桥振荡电路,即RC振荡电路,通过改变电容和电阻值,改变频率。
用以上原理设计的信号发生器,其输出波形一般只有两种,即正弦波和脉冲波,其零点不可调,而且价格也比较贵,一般在几百元左右。在实际应用中,超低频波和高频波一般是不用的,一般用中频,即几十赫兹到几十千赫兹。用单片机AT89C51,加上一片DAC0832,就可以做成一个简单的信号发生器,其频率受单片机运行的程序控制。我们可以把产生各种波形的程序烧写进单片机ROM中,用户可以通过键盘和液晶显示,按照自己的意愿选择波形频率可调的多功能信号发生器,这样的系统价格便宜,耗电少,频率适中,便于携带。
1.3 设计的基本要求
本设计采用单片机控制技术了,开发、设计函数发生器。在条件许可情况下模拟调试成功。设计要求:
(1)系统能产生方波、锯齿及正弦信号
(2)能提供信号的频率的显示
(3)系统硬件电路设计
(4)有必要的数据计算及元器件的选择
(5)软件系统设计
1.4 本课题研究内容
本文是做基于单片机的信号发生器的设计,将采用编程的方法来实现锯齿波、方波、正弦波的发生。根据设计的要求,对各种波形的频率显示,并将所写程序装入单片机的程序存储器中。在程序运行中,当接收到来自外界的命令,需要输出某种波形时再调用相应的波形发生程序,经电路的D/A转换器和运算放大器处理后,从信号发生器的输出端口输出。本设计采用89C51单片机机及其外围扩展系统,软件方面主要是应用c语言程序。系统以89C51为核心,配置相应的外设及接口电路,运用c语言开发,组成一个多功能信号发生系统。该系统的软件可运行于window环境下,硬件电路系统设计具有典型性。同时,本系统中任何一部分模块均可移植实用开发系统设计中,电路设计具有实用性。
2. 方案的设计与选择
2.1 总体设计方案
数字信号可以通过数/模转换器转换成模拟信号,因此可通过产生数字信号再转换成模拟信号的方法来获得所需要的波形。89C51单片机本身就是一个完整的微型计算机,具有组成微型计算机的各部分部件:中央处理器CPU、随机存取存储器RAM、只读存储器ROM、I/O接口电路、定时器/计数器以及串行通讯接口等,只要将89C51再配置键盘及其接口、显示器及其接口、数模转换及波形输出、指示灯及其接口等四部分,即可构成所需的波形发生器,其信号发生器构成原理框图如图2-1所示。
图2-1 硬件原理框图
2.2 方案的比较
方案一:采用单片机函数发生器(如8038),8038可同时产生正弦波、方波等,而且方法简单易行,用D/A转换器的输出来改变调制电压,也可以实现数控调整频率,但产生信号的频率稳定度不高。
方案二:采用锁相式频率合成器,利用锁相环,将压控振荡器(VCO)的输出频率定在所需频率上,该方案性能良好,但难以达到输出频率覆盖系数的要求,且电路复杂。
方案三:采用单片机编程的方法来实现。该方案可以通过编程的方法来控制信号波形的频率,而且在硬件电路不变的情况下,通过改变程序来实现频率的变换。此外,由于通过编程的方法产生数字信号,所以信号的精度可以做的较高。
2.3 单片机的选择
方案一:AT89C51单片机是一种高性能的8位单片微型计算机。它把构成计算机的中央处理器CPU、存储器、寄存器、I/O接口制作在一块集成电路芯片中,从而构成较为完整的计算机,而且价格便宜。
方案二:C8051F005单片机是完全集成混合信号系统及芯片,具有与8051兼容的微控制器内核,与MCS-51指令集完全兼容,除了具有标准8052的数字外设部件,片内还集成了数据采集和控制系统中常用的模拟部件和其他数字外设及功能部件,而且执行速度较快,但其价格较贵。
综合考虑价格和性能决定选用AT89C51单片机
2.4 显示方案选择
方案一:采用LED数码管。LED数码管由8个发光二极管组成,每只数码管轮流显示各自的字符。由于人眼具有视觉特性,当每只数码管显示的时间间隔小于1/16时人眼感觉不到闪动,看到的是每只数码管常亮。使用数码管显示编程较易,但本系统中要显示的内容较多,而且数码管只能显示少数几个字母。
方案二:采用LCD液晶显示器1602.。其功率小,效果明显,显示变成容易控制,可以分行显示,能够很方面的显示波形种类和频率。
以上两种方案综合考虑,选择LCD液晶显示器作为系统显示终端。
2.5 键盘方案选择
方案一:矩阵式键盘。矩阵式键盘的按键触点接于由行、列母线构成的矩阵电路的交叉处。当键盘上没有键闭合时,所有的行线和列线都断开,行线都呈高电平。当某一个键闭合时,该键所对应的行线和列线被短路。
方案二:编码式键盘。编码式键盘的按键触点接于74ls148输出。当键盘上没有闭合时,所有键都断开,当某一键闭合时,该键对应的编码由74ls148输出。
方案三:独立式键盘。独立式键盘指各个按键的输入相互独立,每一个按键都单独接一根输入数据线。
经过比较以上三种方案,鉴于本系统所用键盘比较少,所以选择独立式键盘。
3. 硬件设计
3.1 ATC89C51单片机
AT89C51 是美国 ATMEL 公司生产的低电压,高性能 CMOS8 位单片机,片内含 4k bytes 的可反复擦写的只读程序存储器(PEROM)和 128 bytes 的随机存取数据存储器(RAM),器件采用 ATMEL 公司的高密度、非易失性存储技术生产,兼容标准 MCS-51 指令系统,片内置通用 8 位中央处理器(CPU)和 Flash 存储单元,功能强大 AT89C51 单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。AT89C51 提供以下标准功能:4k 字节 Flash 闪速存储器,128 字节内部 RAM,32 个 I/O 口线,两个 16 位定时/计数器,一个 5 向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51 可降至 0Hz 的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止 CPU 的工作,但允许 RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存 RAM 中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
图3-1 proteus中的ATC89C51
图3-2 ATC89C51方框图
引脚功能说明:
Vcc:电源电压
GND:地
P0 口:P0 口是一组 8 位漏极开路型双向 I/O 口,也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动 8 个 TTL 逻辑门电路,对端口写“1”可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低 8 位)和数据总线复用,在访问期间激活内部上拉电阻。在 FIash 编程时,P0 口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P1 口:P1 是一个带内部上拉电阻的 8 位双向 I/O 口,P1 的输出缓冲级可驱动(吸收或输出电流)4 个 TTL 逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。FIash 编程和程序校验期间,P1 接收低 8 位地址。
P2 口:P2 是一个带有内部上拉电阻的 8 位双向 I/O 口,P2 的输出缓冲级可驱动(吸收或输出电流)4 个 TTL 逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。在访问外部程序存储器或 16 位地址的外部数据存储器(例如执行 MOVX@DPTR 指令)时,P2 口送出高 8 位地址数据。在访问 8 位地址的外部数据存储器(如执行 MOVX@RI 指令)时,P2 口线上的内容(也即特殊功能寄存器(SFR)区中 R2 寄存器的内容),在整个访问期间不改变。Flash 编程或校验时,P2 亦接收高位地址和其它控制信号。
P3 口:P3 口是一组带有内部上拉电阻的 8 位双向 I/O 口。P3 口输出缓冲级可驱动(吸收或输出电流)4 个 TTL逻辑门电路。对 P3 口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。作输入端时,被外部拉低的 P3 口将用上拉电阻输出电流(IIL)。
P3 口除了作为一般的 I/O 口线外,更重要的用途是它的第二功能,如下表所示:
表3-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(外部数据存储器写选通)
P3.7 /RD(外部数据存储器读选通)
P3 口还接收一些用于 Flash 闪速存储器编程和程序校验的控制信号。
RST:复位输入。当振荡器工作时,RST 引脚出现两个机器周期以上高电平将使单片机复位。
ALE/PROG: 当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低 8 位字节。即使不访问外部存储器,ALE 仍以时钟振荡频率的 1/6 输出固定的正脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个 ALE 脉冲。对 Flash 存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有必要,可通过对特殊功能寄存器(SFR)区中的 8EH 单元的 DO 位置位,可禁止 ALE 操作。该位置位后,只有一条 MOVX 和 MOVC 指令 ALE 才会被激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置 ALE 无效。PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当 AT89C51 由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。在此期间,当访问外部数据存储器,这两次有效的PSEN信号不出现。
/EA/VPP:外部访问允许。欲使 CPU 仅访问外部程序存储器(地址为 0000H—FFFFH),EA 端必须保持低电平(接地)。需注意的是:如果加密位 LB1 被编程,复位时内部会锁存 EA 端状态。如 EA 端为高电平(接 VCC 端),CPU 则执行内部程序存储器中的指令。Flash 存储器编程时,该引脚加上+12V 的编程允许电源 Vpp,当然这必须是该器件是使用 12V 编程电压 Vpp。
XTAL1:振荡器反相放大器的及内部时钟发生器的输入端。
XTAL2:振荡器反相放大器的输出端。
时钟振荡器:AT89C5l 中有一个用于构成内部振荡器的高增益反相放大器,引脚 XTAL1 和 XTAL2 分别是该放大器的输入端和输出端。这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成自激振荡器,振荡电路参见图3-3。外接石英晶体(或陶瓷谐振器)及电容 C1、C2 接在放大器的反馈回路中构成并联振荡电路。对外接电容 C1、C2 虽然没有十分严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程序及温度稳定性,如果使用石英晶体,我们推荐电容使用 30pF±10pF,而如使用陶瓷谐振器建议选择 40pF±10F。用户也可以采用外部时钟。采用外部时钟的电路如图 3-3所示。这种情况下,外部时钟脉冲接到 XTAL1 端,即内部时钟发生器的输入端,XTAL2 则悬空。
图3-3 晶振电路
3.2数模转换器件DAC0832
DAC0832是8分辨率的D/A转换集成芯片。与微处理器完全兼容。这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。
图3-4 DAC0832数模转换器件
管脚说明:
DI0~DI7:数据输入线,TLL电平。
ILE:数据锁存允许控制信号输入线,高电平有效。
CS:片选信号输入线,低电平有效。
WR1:为输入寄存器的写选通信号。
XFER:数据传送控制信号输入线,低电平有效。
WR2:为DAC寄存器写选通输入线。
Iout1:电流输出线。当输入全为1时Iout1最大。
Iout2: 电流输出线。其值与Iout1之和为一常数。
Rfb:反馈信号输入线,芯片内部有反馈电阻.
Vcc:电源输入线 (+5v~+15v)
Vref:基准电压输入线 (-10v~+10v)
AGND:模拟地,摸拟信号和基准电源的参考地.
DGND:数字地,两种地线在基准电源处共地比较好.
图3-5 DAC0832部分内部结构
D/A转换器DAC0832是采用CMOS工艺制成的单片直流输出型8位数/模转换器。如图3-6所示,它由倒T型R-2R电阻网络、模拟开关、运算放大器和参考电压VREF四大部分组成。运算放大器输出的模拟量V0为
(3-1)
由上式可见,输出的模拟量与输入的数字量成正比,这就实现了从数字量到模拟量的转换。 一个8位D/A转换器有8个输入端(其中每个输入端是8位二进制数的一位),有一个模拟输出端。输入可有28=256个不同的二进制组态,输出为256个电压之一,即输出电压不是整个电压范围内任意值,而只能是256个可能值。
DAC0832的工作方式:
DAC0832引脚功能电路应用原理图DAC0832是采样频率为八位的D/A转换芯片,集成电路内有两级输入寄存器,使DAC0832芯片具备双缓冲、单缓冲和直通三种输入方式,以便适于各种电路的需要(如要求多路D/A异步输入、同步转换等)。D/A转换结果采用电流形式输出。若需要相应的模拟电压信号,可通过一个高输入阻抗的线性运算放大器实现。运放的反馈电阻可通过RFB端引用片内固有电阻,也可外接。DAC0832逻辑输入满足TTL电平,可直接与TTL电路或微机电路连接。
根据对DAC0832的输入锁存器和DAC寄存器的不同的控制方式,DAC0832有三种工作方式:直通方式、单缓冲方式和双缓冲方式。本方案采用单缓冲方式,即使DAC寄存器处于直通状态,输入寄存器处于锁存状态。
放大电路:
放大电路由TL082双运算放大器组成,其特点有:较低的输入偏置电压和偏移电流;输出设有短路保护;输入级具有较高的输入阻抗;内建频率补偿电路;较高的压摆率。最大工作电压:VCCmax=+18V。
TL082引脚功能如下表3-2:
表3-2 TL082引脚功能图
脚号 脚名 功能 脚号 脚名 功能
1 Output 1 输出1 5 Non-inverting input 2 反向输入2
2 Inverting input 1 反向输入1 6 Inverting input 2 正向输入2
3 Non-inverting input 1 正向输入2 7 Output 2 输出2
4 VCC 电源 8 VCC+ 电源+
图3-6 放大电路
DAC0832与反相比例放大器相连,实现电流到电压的转换,因此输出模拟信号的极性与参考电压的极性相反,数字量与模拟量的转换关系为
(3-2)
若D/A转换器输出为双极性,如图3-6所示。运算放大器B的作用是把运算放大器A的单向输出电压转换成双向输出电压。其原理是将B的反向输入端通过电阻R2与参考电压VREF相连,VREF经R2向B提供一个偏流I1,其电流方向与I2相反,因此运算放大器B的输入电流为I1、I2的代数和。则D/A转换器的总输出电压为:
(3-3)
因R5= R6=2 R7,所以
(3-4)
3.3 显示模块 1602液晶器件
引脚功能:
表3-3 LM1602液晶显示各引脚功能
编号 符号 引脚说明 编号 符号 引脚说明
1 VSS 电源地 9 D2 Date I/O
2 VDD 电源正极 10 D3 Date I/O
3 VL 液晶显示偏压信号 11 D4 Date I/O
4 R5 数据/命令选择端 12 D5 Date I/O
5 R/W 读/写选择端 13 D6 Date I/O
6 E 使能信号 14 D7 Date I/O
7 D0 Date I/O 15 BLA 背光源正极
8 D1 Date I/O 16 BLK 背光源负极
图3-8显示仿真
4. 软件系统设计
本设计方案采用 C51程序语言编写,整个程序包含主程序、延时、液晶显示模块、定时中断、外部中断及三种波形输出函数组成。
4.1 主程序流程图
主程序主要设置了D/A转换器件DAC0832的工作模式,定义了DAC0832数据端口。调用了显示初始子程序,设置了定时器工作模式及定时中断和外部中断。
4.2 定时中断程序流程图
否
是
否
是
图4-2 定时器中断子程序
定时中断的作用是用来改变相应波形的频率,通过改变TH,TL的值就可以改变定时时间,从而改变相应波形的频率。Waveform的值代表不同的波形,Waveform=0代表正弦波,Waveform=1代表锯齿波,Waveform=2代表方波,根据Waveform值调用对应的波形输出子程序。
4.3 外部中断按键子程序流程图
否
是 否
是
是
图4-3按键外部中断子程序
外部中断是由按键引起的P3.2引脚下降沿触发的,波形切换、频率增减都是通过外部中断和定时中断相结合完成的,外部中断程序中只是改变了相应的参数或中间值(如波形形式waveform及相应波形频率wavefreq[waveform]和定时器0的定时初值寄存器的中间值T_temp)另外外部中断程序还对波形的频率做了数据处理并送到液晶屏显示。
4.4 正弦波子程序流程图
否
是
图4-5正弦波子程序
正弦波主要是通过单片机向D/A转换器DAC0832输送8位二进制数产生的,本方案选取的256个8位二进制数存放在数组sine_tab[],中wavecount的作用就是抽点计数范围是0~255,本方案中DAC0832工作在单缓冲状态,DAC寄存器处于直通状态,只要在相应的时间打开和关闭输入寄存器就能完成数据输送。
4.5 三角波子主程序流程图
否
是
图4-5 三角波子程序
三角波的产生方法以正弦波类似都是通过取点来产生的,本方案取了64个点,全部存放在sawtooth_tab[Wavecount]中。
4.6 方波子程序流程图
否
是
图4-6 方波子程序
4.7 初始显示子程序流程图
图4-7初始显示子程序
5. 仿真
图5.1液晶显示图
图5.2锯齿波
图5.3方波
图5.4正弦波
图5.5 200Hz方波
系统可以改变频率的大小,方波的频率区间为200Hz至2000Hz,锯齿波的频率区间是10Hz至100Hz,正弦波的频率区间为10Hz至100Hz,利用定时中断并改变相应的定时时间即可改变频率的大小。
图5.6 10Hz锯齿波
图5.4 20Hz锯齿波
图5.4 10Hz正弦波
结 论
通过半年的研究设计和调试,实现系统的正常工作并且基本上达到了预期的设计目标这样一个过程,使我学到了很多知识,积累了许多宝贵的经验,锻炼了自己的独立思考能力和实际动手能力,学会了如何综合实施一个工程项目的研究与设计。
毕业论文课题是基于单片机控制函数信号发生器。在这次设计过程中我与邱寒同学共同完成此课题,由于我们专业知识不是很扎实,我们遇到很多问题,还好在涂绪坚老师的多次指导下我们才能完成这次毕业论文。在这过程中我深刻体会到专业知识的欠缺和知识的重要性。
虽然本方案设计的系统基本上符合课题的要求但是还有一些不足之处如下
(1)锯齿波的产生是根据数组表产生的而不是通过自增或者自减产生。
(2)正弦波的频率不够精准误差较大等等
致 谢
为此要感谢教研室的诸位老师四年来对我细心的培养,教给了我专业知识为我们学生进入社会打下坚实的基础。
做毕业设计的过程中老师给出了不少指导意见,让我少走了不少的弯路,比如说在画程序流程图的时候,开始我没掌握正确的规律,后来在老师的指导下才顺利的完成了。感谢这篇论文所涉及到的各位学者。本文引用了数位学者的研究文献,如果没有各位学者的研究成果的帮助和启发,我将很难完成本篇论文的写作。
感谢我的同学和朋友,在我写论文的过程中给予我了很多你问素材,还在论文的撰写和排版等过程中提供热情的帮助。
参考资料
[1]朱兆优、陈坚、王海涛、邓文娟. 《单片机原理与应用》. 电子工业出版社. 2010
[2]徐慧民 . 《微机原理与接口技术》 .高等教育出版社.2007
[3]余修武. 《单片机原理与应用》. 电子科技大学出版社.2008
[4]刘文涛. 《单片机培训教程:(C51版)》.电子工业出版社.2005
[5]阎石 . 《数字电子技术基础》.高等教育出版社.2009
[6]童诗白. 《模拟电子技术基础》.高等教育出版社.2009
[7] AT89C51 DATA SHEEP Philips Semiconductors 1999.dec
[8]Yang. Y., Yi. J., Woo, Y.Y., and Kim. B.: ‘Optimum design for linearityand efficiency of microwave Doherty amplifier using a new loadmatching technique’, Microw. J., 2001, 44, (12), pp. 20–36
[9] Vizimuller, P.: ‘RF design guide-systems, circuits, and equations’ (ArtechHouse, Boston, MA, 1995)
附录
附录1:程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define DAdata P0
sbit DA_S1= P2^0;
sbit DA_S2= P2^1;
sbit key= P3^2;
uchar wavecount;
uchar THtemp,TLtemp;
uchar judge=1;
uchar waveform;
uchar code freq_unit[3]={10,50,200};
uchar idata wavefreq[3]={1,1,1};
uchar code lcd_hang1[]={"Sine Wave " "sawtooth Wave " "Square Wave " "Select Wave: " "press No.1 key! "};
uchar idata lcd_hang2[16]={"f= Hz "};
uchar code waveTH[]={
0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xf9,0xfc,0xfd,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff,
0xf6,0xfb,0xfd,0xfb,0xfe,0xff,0xff,0xff,0xff,0xff};
uchar code waveTL[]={
0x79,0x3d,0x7e,0x9e,0xbe,0xbf,0xc8,0xcf,0xd4,0xd9, //正弦波频率调整中间值
0xe8,0xf4,0xf8,0x7a,0xc7,0xfc,0x23,0x3d,0x53,0x64, //锯齿波频率调整中间值
0x3c,0x1e,0x8f,0x32,0xc7,0x63,0xb1,0xd8,0xec,0xf6}; //方波频率调整中间值
uchar code sawtooth_tab[]={
0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1c,0x20,0x24,0x28,0x2c,0x30,0x34,0x38,0x3c,0x40,
0x44,0x48,0x4c,0x50,0x54,0x58,0x5c,0x60,0x64,0x68,0x6c,0x70,0x74,0x78,0x7c,
0x80,0x84,0x88,0x8c,0x90,0x94,0x98,0x9c,0xa0,0xa4,0xa8,0xac,0xb0,0xb4,0xb8,0xbc,0xc0,
0xc4,0xc8,0xcc,0xd0,0xd4,0xd8,0xdc,0xe0,0xe4,0xe8,0xec,0xf0,0xf4,0xf8,0xfc,
};
uchar code sine_tab[256]={
0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,
0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,
0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,
0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,
0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99 ,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,
0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,
0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16 ,0x15,0x13,
0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,
0x11,0x13,0x15 ,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,
0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80};
void delay(uchar z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*void sawtooth_out()
{ uchar i;
for(i=255;i>0;i--)
{DAdata=i;
DA_S1=0;
DA_S1=1;
}
}*/
void sawtooth_out()
{
DAdata=sawtooth_tab[wavecount++];
if(wavecount>64) wavecount=0;
DA_S1=0;
DA_S1=1; }
void sine_out()
{
DAdata=sine_tab[wavecount++];
DA_S1=0;
DA_S1=1;
}
void square_out()
{
judge=~judge;
if(judge==1) DAdata=0xff;
else DAdata=0x00;
DA_S1=0;
DA_S1=1;
}
/************1602液晶的相关函数*************/
#define lcd_ports P1
sbit rs=P2^2;
sbit rw=P2^3;
sbit lcden=P2^4;
void write_com(uchar com)
{
rs=0; //置零,表示写指令
lcden=0;
lcd_ports=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
rs=1; //置1,表示写数据(在指令所指的地方写数据)
lcden=0;
lcd_ports=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void disp_lcd(uchar addr,uchar *temp1)
{
uchar num;
write_com(addr);
delay(1); //延时一会儿???
for(num=0;num<16;num++)
{
write_date(temp1[num]);//或者这样写write_date(*(temp1+num));
delay(1);
}
}
void init_lcd()
{
lcden=0;
rw=0; //初始化一定要设置为零,表示写数据
write_com(0x38); //使液晶显示点阵,为下面做准备
write_com(0x0c); //初始设置
write_com(0x06); //初始设置
write_com(0x01); //清零
write_com(0x80); //使指针指向第一行第一格
disp_lcd(0x80,&lcd_hang1[3*16]); //在第一行显示
disp_lcd(0xc0,&lcd_hang1[4*16]); //在第二行显示
}
/********************1602液晶函数声明结束*********************/
void main()
{
DA_S2=0;
DAdata=0;
DA_S1=1;
init_lcd();
waveform=0;
TMOD=0x01; //设置定时器0方式1为16位工作方式
IT0=1; //设置外部中断0为下降沿触发
ET0=1; //开定时器中断
EX0=1;
EA=1;
while(1)
{
}
}
void timer0() interrupt 1
{
TH0=THtemp;
TL0=TLtemp;
if(waveform==0) sine_out();
else if(waveform==1) sawtooth_out();
else if(waveform==2) square_out();
}
void key_int0() interrupt 0
{
uchar keytemp;
uint total_freq; //总频率
EA=0; TR0=0; //关总中断与定时器
delay(10); //延时够吗???
if(key==0) //确实有按键按下而引发中断
{
keytemp=P3&0xf0; //获取P3口高四位的值
switch(keytemp)
{
case 0xe0: //选择波形
waveform++;
if(waveform>2) waveform=0;
break;
case 0xd0: //频率按规定单位依次增加
wavefreq[waveform]++;
if(wavefreq[waveform]>10) wavefreq[waveform]=1; // /*这边要用">10",因为它比"=11"可靠
break; // 性更高,使加数有个上限,不会一直加下去*/
case 0xb0: //频率按规定单位依次衰减
wavefreq[waveform]--;
if(wavefreq[waveform]<1) wavefreq[waveform]=10; //这边要用"<1",因为它比"=0"可靠性更高
break;
}
THtemp=waveTH[waveform*10+(wavefreq[waveform]-1)]; //方括号中选取第几个数后,并把该值赋给T_temp
TLtemp=waveTL[waveform*10+(wavefreq[waveform]-1)];
total_freq= wavefreq[waveform] * freq_unit[waveform]; //求输出频率(个数*单位)
lcd_hang2[5]=total_freq%10+0x30; //在液晶中显示个位,(0x30 在液晶显示中表示数字0)
total_freq/=10; lcd_hang2[4]=total_freq%10+0x30; //在液晶中显示时十位
total_freq/=10; lcd_hang2[3]=total_freq%10+0x30; //在液晶中显示时百位
total_freq/=10; lcd_hang2[2]=total_freq%10+0x30; //在液晶中显示时千位
disp_lcd(0x80,&lcd_hang1[waveform*16]); //在第一行显示
disp_lcd(0xc0,lcd_hang2); //在第二行显示
}
EA=1; TR0=1; //开启总中断与定时器
}
附录2:硬件原理图
附录3:仿真用图
|