电子技术课程设计与实践
题目:基于单片机的简易智能信号源发生器设计 ——波形频率的调节 学院:电气电子工程学院 专业:通信工程
摘要 本文所设计的系统是利用STC89C52单片机和数模转换器件DAC0832产生所需不同信号的低频信号源,即采用STC89C52单片机作为控制核心,而在外围采用数字/模拟转换电路(DAC0832)、运放电路(LM358)、按键和LCD液晶显示电路等,通过按键可控制产生方波、锯齿波、三角波、正弦波,同时用LCD液晶显示对应的波形输出。 文中简要介绍了信号发生器频率改变的原理,通过硬件电路和软件程序相结合,可输出自定义波形,如正弦波、方波、三角波、锯齿波等波形,波形的频率和幅度在一定范围内可任意改变。波形和频率的改变通过软件控制,幅度的改变通过硬件实现。该系统采用单片机作为数据处理及控制核心,由单片机完成人机界面、系统控制、信号的采集分析以及信号的处理和变换,采用按键输入,利用液晶显示电路输出数字显示的方案。 本文所设计的系统设计简单、性能优良、性价比高,可用于多种需要低频信号源的场所,具有一定的实用性。
目录 第一章 绪论 1 1.1信号发生器背景 1 1.2信号发生器发展趋势 1 1.3信号发生器的应用 1 第二章 信号发生器的结构和设计 3 2.1 信号发生器的基本结构 3 2.2 电路设计 3 2.2.1 单片机基本结构 3 2.2.2 复位电路 5 2.2.3 键盘电路 5 2.2.4 LCD显示电路 7 2.2.5 5DAC0832芯片 8 2.2.6 LM358 11 2.3 程序设计 12 2.3.1 主程序流程图 13 2.3.2 频率调节 13 2.3.3 正弦波产生 14 2.3.4 方波产生 15 2.3.5 三角波产生 16 2.3.6 锯齿波波产生 17 第三章 系统调试 18 3.1 硬件调试 18 3.2 软件调试 18 3.3 实际调试 26 第四章 总结与展望 26 4.1总结问题 26 4.2展望未来 22 参考文献 27 附 录 28 附录1 实物图 28 附录2 仿真图 29 附录3 程序代码 30 附录4 原件清单 37 致 谢 38
1.1 信号发生器背景
信号发生器,作为实验用信号源,是现今各种电子电路实验设计应用中必不可少的仪器设备之一。目前,市场上常见的信号发生器多为纯硬件的搭接而成,且波形种类有限,多为锯齿、正弦、方波、三角等波形。 信号发生器是能够产生大量的标准信号和用户定义信号,并保证高精度、高稳定性、可重复性和易操作性的电子仪器。信号发生器具有连续的相位变换和频率稳定性高等优点,不仅可以模拟各种复杂信号,还可对频率、幅值、相移、波形进行动态、及时的控制,并能够与其它仪器进行通讯,组成自动测试系统,因此被广泛用于自动控制系统、震动激励、通讯和仪器仪表领域。 在 70 年代前,信号发生器主要有两类:正弦波和脉冲波,而函数发生器介于两类之间,能够提供正弦波、余弦波、方波、三角波、上弦波等几种常用标准波形,产生其它波形时,需要采用较复杂的电路和机电结合的方法。这个时期的信号发生器多采用模拟电子技术,而且模拟器件构成的电路存在着尺寸大、价格贵、功耗大等缺点。 在 70 年代前,信号发生器主要有两类:正弦波和脉冲波,而函数发生器介于两类之间,能够提供正弦波、余弦波、方波、三角波、上弦波等几种常用标准波形,产生其它波形时,需要采用较复杂的电路和机电结合的方法。这个时期的波形发生器多采用模拟电子技术,而且模拟器件构成的电路存在着尺寸大、价格贵、功耗大等缺点。 在 70 年代后,微处理器的出现,可以利用处理器、A/D/和 D/A,硬件和软件使信号发生器的功能扩大,产生更加复杂的波形。这时期的信号发生器多以软件为主,实质是采用微处理器对 DAC的程序控制,就可以得到各种简单的波形。 1.2 信号发生器发展趋势
当今是科学技术及仪器设备高度智能化飞速发展的信息社会,电子技术的进步,给人们带来了根本性的转变,在现代电子领域中,单片机的应用正在不断的走向深入,这必将带来一场仪器设备高度智能化的全面革命。随着集成电路的迅速发展,用集成电路可很方便地构成各种信号发生器,而用集成电路实现的信号发生器与其它信号发生器相比,其波形质量、幅度和频率稳定性等性能指标,都有了很大的提高,特别是单片机应用技术的不断成熟,导致传统控制与检测技术的快速革新。单片机构成的仪器具有高可靠性、高性能价格比,在智能仪表系统和办公自动化等诸多领域中得以极为广泛的应用,特别是在电子工程、通信工程、自动控制、遥测控制、测量仪器、仪表和计算机等技术领域处处可以看见它的应用。 一块单片机芯片就是一台微型计算机,在某些应用领域中,它能够承担大中型计算机和通用微型计算机无法完成的一些工作。单片机之所以能够在各个领域中都得到如此迅猛的发展,主要是因为它具有很多显著的优点和特点,归纳起来有以下几方面: 1. 具有优异的性能价格比:单片机尽可能地把应用所需的存储器,各种功能的I/O 接口集成在一块芯片内,因而其性能很高,而价格却相对较低廉,即性能价格比很高。 2. 集成度高、体积小、可靠性高:单片机把各种功能部件集成在一块芯片上,因而集成度高,均为大规模或超大规模集成电路。又内部采用总线结构,减少了芯片之间的连线,这大大提高了单片机的可靠性与抗干扰能力。同时,其体积小,对于强磁场环境易于采取屏蔽措施,适合于在恶劣环境下工作。 3. 控制功能强:单片机体积虽小,但“五脏俱全”,它非常适用于专门的控制用途。为了满足工业控制要求,一般单片机的指令系统中有极丰富的转移指令,I/O口的逻辑操作指令以及位操作指令。其逻辑控制功能及运行速度均高于同一档次的微机。 4. 低电压、低功耗:单片机大量用于携带式产品和家用消费类产品,低电压和低功耗尤为重要。目前,许多单片机已可在2.2V电压下运行,有的已能在1.2V或0.9V下工作,功耗降至μA级,一粒钮扣电池就可长期使用。 利用单片机采用程序设计方法来产生低频信号,其下限频率很低。具有线路相对简单,结构紧凑,价格低廉,频率稳定度高,抗干扰能力强,用途广泛等优点,并且能够对波形进行细微调整,改良波形,使其满足系统的要求。只要对电路稍加修改,调整程序,即可完成功能升级。 1.3 信号发生器的应用 信号发生器的作用——信号调制功能:信号调制是指被调制信号中,幅度、相位或频率变化把低频信息嵌入到高频的载波信号中,得到的信号可以传送从语音、到数据、到视频的任何信号。信号调制可分为模拟调制和数字调制两种,其中模拟调制,如幅度调制(AM)和频率调制(FM)最常用于广播通信中,而数字调制基于两种状态,允许信号表示二进制数据。例如在通信、广播、电视系统中,都需要射频(高频)发射,这里的射频波就是载波,把音频(低频)、视频信号或脉冲信号运载出去,就需要能够产生高频的振荡器。在工业、农业、生物医学等领域内,如高频感应加热、熔炼、淬火、超声诊断、核磁共振成像等,都需要功率或大或小、频率或高或低的振荡器。信号发生器在生产实践和科技领域中有着广泛的应用。例如在通信、广播、电视系统中,都需要射频(高频)发射,这里的射频波就是载波,把音频(低频)、视频信号或脉冲信号运载出去,就需要能够产生高频的振荡器。在工业、农业、生物医学等领域内,如高频感应加热、熔炼、淬火?、超声诊断、核磁共振成像等,都需要功率或大或小、频率或高或低的振荡器。 1
天津理工大学2015级电子技术课程设计与实践 第二章 信号发生器的结构和设计 2.1 信号发生器的基本结构 低频信号发生器系统主要由CPU、D/A转换电路、电流/电压转换电路、按键和波形指示电路、电源等电路组成。 其工作原理为当分别按下四个按键中的一个按键就会分别切换出方波、锯齿波、三角波、正弦波,并且有四个发光二极管分别作为不同的波形指示灯。 
图2.1 信号发生器电路框图 2.2电路设计 2.2.1 单片机的基本结构 STC89C52 是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统 可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 STC89C52具有以下标准功能:8k字节Flash,256字节RAM,32 位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,STC89C52可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。 P0口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。 P1口:P1口是一个具有内部上拉电阻的8位双向I/O口,p1输出缓冲器能驱动4个TTL逻辑电平。对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。 P2口:P2口是一个具有内部上拉电阻的8位双向I/O口,对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。 P3口:P3口是一个具有内部上拉电阻的8 位双向I/O口,p3 输出缓冲器能驱动4个TTL逻辑电平。 RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将是单片机复位。 ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。 PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当STC89C52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次PSEN信号。 EA/VPP:外部访问允许,欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。 XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。 XTAL2:振荡器反相放大器的输出端。 对于 STC89C52,如果EA接VCC,程序读写先从内部存储器(地址为0000H~1FFFH)开始,接着从外部寻址,寻址地址为:2000H~FFFFH。 数据存储器:STC89C52有256字节片内数据存储器。高128字节与特殊功能寄存器重叠。也就是说高128字节与特殊功能寄存器有相同的地址,而物理上是分开的。 STC89C52具有如下特点:40个引脚,8k Bytes Flash 片内程序储存器,256 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/0)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。此外,STC89C52设计和配置了振荡频率可为0HZ并通过软件设置省电模式。空闲模式,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电式冻结振荡器而保存RAM的数据,停止芯片其他功能直至外中断激活或硬件复位[1][2][3]。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求, STC89C52引脚如图2.2所示。 
图2.2 STC89C52引脚示意图 主要功能特性: ·兼容Mcs-51指令系统 ·8K可反复擦写ISP Flash ROM ·32个双向I/O口 ·4.5~5.5v工作电压 ·3个16位可编程定时计数器 ·时钟频率0-33MHz ·全双工作UART穿行中断口线·256bit内部RAM ·2个外部中断源 ·低功耗空闲和省电模式 ·中断唤醒省电模式 ·3级加密位 ·看门狗(WDT)电路 ·软件设置空闲和省电功能 ·灵活的ISP字节和分页编程 ·双数据寄存器指针 2.2.2 复位电路 复位是单片机的初始化操作,其主要的作用是把PC初始化为0000H,使单片机从0000H单元开始执行程序。除了进入系统的正常初始化之外,当由于程序运行出错或操作失误使系统处于死锁状态时,为摆脱困境,也需要按复位键以重新启动。除使PC归零外,复位操作还对其他一些专用寄存器有影响,它们的复位状态如表所示: 表2-1 复位后的内部寄存器状态 另外,复位操作还对单片机的个别引脚有影响,例如会把ALE和/PSEN变成无效状态,即使ALE=0,/PSEN=1。RST变成低电平后,退出复位状态,CPU从初始状态开始工作。 89C51复位操作有3种方式:上电复位、上电按钮复位和系统复位。上电复位电路如图2.3所示。对于CMOS型单片机因RST引脚的内部有一个拉低电阻,故电阻R可不接。单片机在上电瞬间,RC电路充电,RST引脚端出现正脉冲,只要RST端保持两个机器周期以上的高电平,就能使单片机有效地复位。当晶体振荡频率为12MHz时,RC的典型值为C=10uF,R=8.2K欧姆。简单复位电路中,干扰信号易串入复位端,可能会引起内部某些寄存器错误复位,这时可在RST引脚上接一去耦电容。 通常因为系统运行等的需要,常常需要人工按钮复位,复位电路如图2.4所示,其中R2>>R1,只需将一个常开按钮开关并联于上电复位电路,按下开关一定时间就能使RST引脚端为高电平,从而使单片机复位。 
图2-3上电复位电路图2-4上电按钮复位电路
2.2.3 键盘电路 根据设计的电路特点,只需要用到4个按钮来选择波形,实现的功能也比较简单,所以采用独立式未编码键盘结构。键盘原理图如图2.5所示。本系统采用独立键盘开关,其中按键“K1”可以来调节切换波形的输出,按键“K4”用来调节调节波形频率的步进值。按键“K2”,“K3”可以调节波形频率的加和减。 
图2.5 键盘原理图 2.2.4 LCD显示电路 液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用。在本设计采用的字符型液晶模块是一种用5x7点阵图形来显示字符的液晶显示器,根据显示的容量可以分为1行16个字、2行16个字、2行20个字等等,这里以常用的2行16个字的1602液晶模块来介绍它的编程方法。1602采用标准的16脚接口,其中: 第3脚:VEE为液晶显示器对比度调整端; 第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器; 第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据; 第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令; 第7~14脚:D0~D7为8位双向数据线; 第15~16脚:空脚。 液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,表2-2是DM-162的内部显示地址。 表2.2 1602的内部显示地址
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码。在软件中设置温度的代码是:30.0℃(00110011B,00110000B,00101110B, 00110000B,01000011B);37.0℃(00110011B,00110111B,00101110B,00110000B,01000011B);60℃(00110110B,00110000B,01000011B)。 在液显电路连接上,LCD1602显示模块可以直接和单片机STC89C51直接接口,液晶显示的D0~D7八个双向端口接STC89C51单片机的P0口的P0.0~P0.7,单片机的P0口可以作为通用的输入,输出端口使用,此时,若要驱动NMOS或其他拉电流负载时,需外接上拉电阻,才能使该位高电平有效,所以中间接10K的排阻,决定显示器高低点位,是否要显示。 由于VEE端接电源时接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,对比度过低会使屏幕模糊不清,所以使用时可以通过一个10K的电位器来调整它的对比度。LCD1602的RS寄存器选择端口接单片机的P2.5口,通过软件程序中对此端口的设置来决定选择的寄存器。液显的RW端口直接接单片机的P2.6口,高电平时进行对输入的数字信号进行读数。使能E端接单片机的P2.7口,使能端由高电平到低电平时开始执行命令,把读数显示出来。 LCD显示电路原理图如图2.6: 
图2.6 LCD现显示电路 2.2.5 DAC0832芯片 DAC0832是8分辨率的D/A转换集成芯片。与微处理器完全兼容。这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。 DAC0832的主要特性参数如下: 分辨率为8位; 电流稳定时间1us; 可单缓冲、双缓冲或直接数字输入; 只需在满量程下调整其线性度; 单一电源供电(+5V~+15V); 低功耗,仅需要200mW。 DI7~DI0:8位的数据输入端,DI7为最高位。 ILE:数据锁存允许控制信号输入线,高电平有效。 /CS:选片信号输入线(选通数据锁存器),低电平有效。 /WR1:数据锁存器写选选通输入线,负脉冲有效,由ILE、/CS、/WR1的逻辑组合产生/LE1,当/LE1为高电平时,数据锁存器状态随输入数据线变化,/LE1的负跳变时将输入数据锁存。 /XFER:数据传输控制信号输入线,低电平有效,负脉冲有效。 /WR2:DAC寄存器选通输入线,负脉冲有效,由/WR2、/XFER的逻辑组合产生/LE2,当/LE2为高电平时,DAC寄存器的输出随寄存器的输入而变化,/LE2的负跳变时将数据锁存器的内容打入DAC寄存器并开始D/A转换。 Iout1:模拟电流输出端1,当DAC寄存器中数据全为1时,输出电流最大,当 DAC寄存器中数据全为0时,输出电流为0。 Iout2:模拟电流输出端2,Iout1与Iout2的和为一个常数,即Iout1+Iout2=常数。 RFB:反馈电阻引出端,DAC0832内部已经有反馈电阻,所以 RFB端可以直接接到外部运算放大器的输出端,这样相当于将一个反馈电阻接在运算放大器的输出端和输入端之间。 VREF:参考电压输入端,此端可接一个正电压,也可接一个负电压,它决定0至255的数字量转化出来的模拟量电压值的幅度,VREF范围为(+10~-10)V。VREF端与D/A内部T形电阻网络相连。 Vcc:芯片供电电压,范围为(+5~+15)V。 AGND:模拟量地,即模拟电路接地端。 DGND:数字量地。 DAC0832主要由8位输入寄存器、8位DAC寄存器、8位D/A转换器以及输入控制电路四部分组成。8 位输入寄存器用于存放主机送来的数字量,使输入数字量得到缓冲和锁存,由加以控制;8位DAC寄存器用于存放待转换的数字量,由加以控制;8位D/A转换器输出与数字量成正比的模拟电流;由与门、非与门组成的输入控制电路来控制2个寄存器的选通或锁存状态。原理框图如图2.7所示: 
图2.7 DAC0832原理框图 当/WR2和/XFER同时有效时,8位DAC寄存器端为高电平“1”,此时DAC寄存器的输出端Q跟随输入端D也就是输入寄存器Q端的电平变化;反之,当端为低电平“0”时,第一级8位输入寄存器Q端的状态则锁存到第二级8位DAC寄存器中,以便第三级8位DAC转换器进行D/A转换。 一般情况下为了简化接口电路,可以把/WR2和/XFER直接接地,使第二级8位DAC寄存器的输入端到输出端直通,只有第一级8位输入寄存器置成可选通、可锁存的单缓冲输入方式。特殊情况下可采用双缓冲输入方式,即把两个寄存器都分别接成受控方式。 DAC0832与反相比例放大器相连,实现电流到电压的转换,因此输出模拟信号的极性与参考电压的极性相反,数字量与模拟量的转换关系为 Vout1=-Vref×(数字码/256) (2-1) DAC0832内部的8位D/A转换电路由8位T型电阻网络和电子开关组成,电子开关受8位DAC寄存器输出的数字量控制,T型电阻网络能输出和数字量成正比的模拟电流。因此,DAC0832通常需要外接运算放大器,进行电流电压转换,才能得到模拟输出电压。 当输入到DAC0832的数字量最高位为1时,则输出的模拟电压为正;当输入到DAC0832的数字量最高位为0时,则输出的模拟电压为负,从而实现了模拟电压的双极性输出。 2.2.6 LM358工作原理 LM358管脚排列如下图所示: 
图2.8 LM358管脚图 LM358是双运放集成电路 ,它采用8脚双列直插塑料封袋,外形如上图所示。它的内部包含两组形式完全相同的运算放大器,除电源共用外,两组运放相互独立。每一组运算放大器可用图中所示的符号来表示,它有5个引出脚,其中“+”、“-”为两个信号输入端,“V+”、“V-”为正、负电源端,“OUT”为输出端。两个信号输入端中,“-”为反相输入端,表示运放输出端OUT的信号与该输入端的为相反;“+”为同相输入端,表示运放输出端OUT的信号与输入端的相位相同。由于LM358双运放电路具有电源电压范围宽,静态功耗小,可单电源使用,价格低廉等优点,因此被广泛应用在各种电路中。 特性: 低输入偏流 内部频率补偿 直流电压增益高(约100dB) 单位增益频带宽(约1MHz) 电源电压范围宽:单电源(3—30V);双电源(±1.5 一±15V) 低功耗电流,适合于电池供电 低输入失调电压和失调电流 共模输入电压范围宽,包括接地 差模输入电压范围宽,等于电源电压范围 输出电压摆幅大(0 至Vcc-1.5V) 
图2.9 LM358原理图 2.3 程序设计 2.3.1 主程序流程图 主程序流程图如图所示: 
图2.10 主程序框图 2.3.2 频率调节程序 通过改变定时器的周期达到改变频率的目的
图2.11 频率改变程序框图(见附件) 2.3.3 正弦波产生程序 正弦波程序流程图如图2.12所示 
图2.12 正弦波程序流程图 2.3.4 方波产生程序 方波程序流程图如图2.13所示 
图2.13 方波程序流程图 方波产生是当A中的内容为0时,输出对应模拟量,然后延时,当A中的内容为0FFH时,同样输出对应模拟量,再延时,从而得到方波。 延时子程序流程图如图2.14所示 
图2-14 延时子程序流程图 2.3.5 三角波产生程序 三角波流程图如图2.15所示 
图2.15 三角波产生流程图 三角波产生通过A中数值的加一递升,当A中的内容加到为0时, A中的内容减一递减,从而循环产生三角波。 2.3.5 锯齿波产生程序 锯齿波流程图如图2.15所示。 
图2.15 锯齿波流程图 锯齿波产生将00H送入寄存器A中,DAC0832输出A中的内容,当A中的内容等于FFH返回开始,当A中的内容不为FFH时,A中的内容累加,从而输出波形。 1
天津理工大学2015级电子技术课程设计与实践 第三章 系统测试 3.1 硬件调试 为了准确发现系统存在的问题,需要进行系统调试,调试的顺序按照先硬件后软件,先局部后整体的顺序来完成。首先介绍系统的硬件安装过程及针对各单元模块的硬件电路调试,检验其是否符合设计初衷,能否达到相应指标。硬件调试主要包括电源系统的调试、单片机小系统的调试、D/A转换电路的调试、示波器的调试几部分。 为保证整个系统能够正常工作,首先要保证电源系统正常工作并且保证输出为+5V。通过测量输出口的电压值不断修改电路设计,完成电源系统的调试。 3.2 软件调试 主要进行了单片机STC89C52的软件调试过程,检验其是否符合设计初衷,能否达到相应的指标。主要是示波器的调试,通过编写程序实现波形的显示,按键的不同,对应的示波器的显示波形一样。 正弦波波形如图3.1所示: 
图3.1 10Hz正弦波 改变频率后波形如图3.2所示 
图3.2 30Hz正弦波 矩形波波形如图3.3所示: 
图3.3 10Hz方波 改变频率后波形如图3.4所示 
图3.4 30Hz方波 三角波形如图3.5所示: 
图3.5 10Hz三角波 改变频率后波形如图3.6所示 
图3.6 30Hz三角波 锯齿波形如下图3.7所示: 
图3.7 10Hz锯齿波 改变频率后波形如图3.8所示 
图3.8 30Hz锯齿波 3.3 实际调试 a.正弦波 
图3.9 20Hz正弦波 
图3.10 25Hz正弦波 b.方波 
图3.11 30Hz方波 
图3.12 25Hz方波 c.三角波 
图3.13 25Hz三角波 图3.14 30Hz三角波
b.锯齿波 
图3.15 25Hz锯齿波 
图3.16 30Hz锯齿波 第四章 未来与展望 4.1 总结问题 对于本次课程设计的结束,我真切感觉到自己知识能力的匮乏,很多东西都只是知道一些浅显的知识,真正搞懂会应用的东西很少。或许一个人的进步需要一个缓慢的过程。在过程中需要不断地借鉴,学习,汲取别人的东西。同别人的成果中攫取知识和营养,然后它变成自己的东西。通过这次课程设计。我学到了很多东西,首先,通过这次课程设计,我熟练地掌握了单片机的程序设计以及信号源发生器的制作。其次,我觉得学习理论和实践是两个层次,理论指导实践,而实践验证理论,理论往往是在理想的条件下得出的,而实践是在现实生活中进行的,所以,实践得出的结论往往与理论的结论有一定的差别,这是很正常的。另外团结协作,互助共赢是时代的主流。在这次课设的制作中,交流合作的精神在我们体现的可谓是淋漓尽致。相互探讨,学习交流,优势互补,这样才最终处成了这课设。争论与交流是解决问题很好的方法,问题也总是在思想与意见的碰撞中得到解决而这也是我们对理论理解的更为深刻。通过图书馆,搜索引擎查阅资料的能力也得到了相应的提升。总之,在这次课程设计的制作的过程中学到了很多东西,能力也有相应的提升。在此还要感谢指导老师的辛勤教导,感谢老师在此次课程设计中给以孜孜不倦的解惑。 4.2展望未来 课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。对于单片机设计,其硬件电路是比较简单的,主要是解决程序设计的问题,而程序设计是一个很灵活的东西,它反映了你解决问题的逻辑思维和创新能力,它才是一个设计的灵魂所在。因此在整个设计过程中大部分时间是用在程序上面的。通过这次电子技术课程设计锻炼我们的能力,将理论和实践结合到一起,提高了我们的动手能力,为我们以后单片机设计打下了基础。 参考文献 [1] 周明德.微型计算机系统原理及应用[M].北京:清华大学出版社,2002 [2] 刘乐善.微型计算机接口技术及应用[M].北京:北京航空航天大学出版社,2001 [3] 童诗白.模拟电路技术基础[M].北京:高等教育出版社,2000 [4] 张友德.单片微型机原理、应用与实践[M].上海:复旦大学出版社,2004 [5] 张永瑞.电子测量技术基础[M].西安:西安电子科技大学出版社,2006 [6] 李叶紫. MCS-51单片机应用教程[M].北京:清华大学出版社,2004 附录 附录1 实物图 

附录2 仿真图 
附录4 原件清单
1)9*15万用板
2)STC89C52单片机
3)DAC0832芯片
4)LM358芯片
5)8脚IC座
6)20脚IC座
7)40脚IC座
8)1602液晶
9)16p母座
10)16p排针
11)4p排针
12)103电位器
13)10k电阻*2
14)2.2k电阻*3
15)100欧姆电阻*2
16)220欧姆电阻
17)1k电阻*2
18)103排阻(10k)
19)按键*5
20)5mmLED(红、黄、绿、白)*4
21)10uf电解电容
22)30pf瓷片电容*2
23)12M晶振
24)104独石电容*2
25)自锁开关
26)DC电源插口
27)导线若干
28)焊锡若干
29)USB电源线或电池盒
致 谢
很高兴这次能能够完成这次的电子课程设计。尤其是与老师和同学给予我的帮助是分不开的,老师们的悉心指导让我们很快找到了入手的方向,小组成员之间的团结协作让组内工作非常高效和有序,这次的实践让我学到了很多,无论是知识,还是友谊,都将会是我人生中一笔宝贵的财富,在此向大家表达一下我由衷地感谢,希望在接下来的工作和学习中,我们一起共同进步!
单片机源程序如下:
- #include<reg52.h> //包含头文件
- #include<intrins.h>
- #define uchar unsigned char //宏定义
- #define uint unsigned int
- sbit s1=P3^5; //定义按键的接口
- sbit s2=P3^6;
- sbit s3=P3^7;
- sbit s4=P3^4;
- sbit led0=P3^0;
- sbit led1=P3^1;
- sbit led2=P3^2;
- sbit led3=P3^3;
- sbit lcdrs=P2^7; //液晶控制位
- sbit lcden=P2^6;
- char num,boxing,u; //定义全局变量
- int pinlv=100,bujin=1,bujin1=1;
- uchar code table[]="0123456789"; //定义显示的数组
- uchar code table1[]="Fout= Wave form:";
- unsigned long int m;
- int a,b,h,num1;//自定义字符
- uchar code zifu[]={
- 0x0e,0x11,0x11,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x11,0x11,0x0e,0x00,
- 0x00,0x07,0x04,0x04,0x04,0x04,0x1c,0x00,
- 0x00,0x1c,0x04,0x04,0x04,0x04,0x07,0x00,
- 0x00,0x01,0x02,0x04,0x08,0x10,0x00,0x00,
- 0x00,0x10,0x08,0x04,0x02,0x01,0x00,0x00,
- 0x00,0x01,0x03,0x05,0x09,0x11,0x00,0x00, };
- uchar code sin[64]={
- 135,145,158,167,176,188,199,209,218,226,234,240,245,249,252,254,254,253,251,247,243,237,230,222,213,204,193,182,170,158,
- 146,133,121,108,96,84,72,61,50,41,32,24,17,11,7,3,1,0,0,2,5,9,14,20,28,36,45,55,66,78,90,102,114,128
- };
- uchar code juxing[64]={
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- }; //矩形波取码
- uchar code sanjiao[64]={
- 0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,
- 248,240,232,224,216,208,200,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0
- }; //三角波取码
- uchar code juchi[64]={
- 0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,130,134,138,142,
- 146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,215,219,223,227,231,235,239,243,247,251,255
- }; //锯齿波取码
- void delay(uint xms) //延时函数
- {
- int a,b;
- for(a=xms;a>0;a--)
- for(b=110;b>0;b--);
- }
- void write_com(uchar com) //写命令函数
- {
- lcdrs=0;
- P0=com;
- delay(1);
- lcden=1;
- delay(1);
- lcden=0;
- }
- void write_date(uchar date) //写数据函数
- {
- lcdrs=1;
- P0=date;
- delay(1);
- lcden=1;
- delay(1);
- lcden=0;
- }//自定义字符集
- void Lcd_ram()
- {
- uint i,j,k=0,temp=0x40;
- for(i=0;i<7;i++)
- {
- for(j=0;j<8;j++)
- {
- write_com(temp+j);
- write_date(zifu[k]);
- k++;
- }
- temp=temp+8;
- }
- }
- void init_lcd() //初始化函数
- {
- uchar i;
- lcden=0; //默认开始状态为关使能端,见时序图
- Lcd_ram();
- write_com(0x0f);
- write_com(0x38); //显示模式设置,默认为0x38,不用变。
- write_com(0x01); //显示清屏,将上次的内容清除,默认为0x01.
- write_com(0x0c); //显示功能设置0x0f为开显示,显示光标,光标闪烁;0x0c为开显示,不显光标,光标不闪
- write_com(0x06); //设置光标状态默认0x06,为读一个字符光标加1.
- write_com(0x80); //设置初始化数据指针,是在读指令的操作里进行的
- for(i=10;i<20;i++) //显示初始化
- {
- write_date(table1[i]);
- }
- write_com(0x80+0x40);
- for(i=0;i<9;i++)
- {
- write_date(table1[i]);
- }
- write_com(0x80+10);
- write_date(0);
- write_date(1);
- write_date(0);
- write_date(1);
- write_date(0);
- write_date(1);
- write_com(0x80+0x40+0x09);
- write_date(' ');
- write_date('1');
- write_date('0');
- write_date('.');
- write_date('0');
- write_date('H');
- write_date('z');
- }
- void initclock() //时钟初始化
- {
- TMOD=0x01;
- TH0=a;
- TL0=b;
- EA=1;
- ET0=1;
- TR0=1;
- }
- void display() //显示函数
- {
- uchar qian,bai,shi,ge;
- qian=pinlv/1000;
- bai=pinlv%1000/100;
- shi=pinlv%1000%100/10;
- ge=pinlv%1000%100%10;
- write_com(0x80+0x40+0x09);
- if(qian==0)
- write_date(' ');
- else
- write_date(table[qian]);
- if(qian==0&&bai==0)
- write_date(' ');
- else
- write_date(table[bai]);
- write_date(table[shi]);
- write_date('.');
- write_date(table[ge]);
- write_date('H');
- write_date('z');
- if(boxing==0)
- {
- write_com(0x80+10);
- write_date(0);
- write_date(1);
- write_date(0);
- write_date(1);
- write_date(0);
- write_date(1);
- led3=1;
- led0=0;
- }
- if(boxing==1)
- {
- write_com(0x80+10);
- write_date(2);
- write_date(3);
- write_date(2);
- write_date(3);
- write_date(2);
- write_date(3);
- led0=1;
- led1=0;
- }
- if(boxing==2)
- {
- write_com(0x80+10);
- write_date(4);
- write_date(5);
- write_date(4);
- write_date(5);
- write_date(4);
- write_date(5);
- led1=1;
- led2=0;
- }
- if(boxing==3)
- {
- write_com(0x80+10);
- write_date(6);
- write_date(6);
- write_date(6);
- write_date(6);
- write_date(6);
- write_date(6);
- led2=1;
- led3=0;
- }
-
- }
- void keyscan() //键盘检测函数
- {
- if(s1==0)
- {
- EA=0;
- delay(2);
- if(s1==0)
- {
- while(!s1);
- pinlv+=bujin;
- if(pinlv>1000)
- {
- pinlv=100;
- }
- display();
- m=65536-(150000/pinlv);
- a=m/256;
- b=m%256;
- EA=1;
- }
- }
- if(s2==0)
- {
- delay(5);
- if(s2==0)
- {
- EA=0;
- while(!s2);
- pinlv-=bujin;
- if(pinlv<100)
- {
- pinlv=1000;
- }
- display();
- m=65536-(150000/pinlv);
- a=m/256;
- b=m%256;
- EA=1;
- }
- }
- if(s3==0)
- {
- delay(5);
- if(s3==0)
- {
- EA=0;
- while(!s3);
- boxing++;
- if(boxing>=4)
- {
- boxing=0;
- }
- display();
- EA=1;
- }
- }
- }
- void bujindisplay()
- {
- uint bai,shi,ge;
- bai=bujin1/100;
- shi=bujin1%100/10;
- ge=bujin1%100%10;
- write_com(0x80+11);
- if(bai==0)
- write_date(' ');
- else
- write_date(table[bai]);
- write_date(table[shi]);
- write_date('.');
- write_date(table[ge]);
- }
- void bujinjiance()
- {
- if(s4==0)
- {
- delay(5);
- if(s4==0)
- {
- while(!s4);
- h++;
- if(h==1)
- {
- write_com(0x01);
- write_com(0x80);
- write_date('S');delay(1); //step value
- write_date('t');delay(1);
- write_date('e');delay(1);
- write_date('p');delay(1);
- write_date(' ');delay(1);
- write_date('v');delay(1);
- write_date('a');delay(1);
- write_date('l');delay(1);
- write_date('u');delay(1);
- write_date('e');delay(1);
- write_date(':');delay(1);
- bujin1=bujin;
- bujindisplay();
- }
- if(h==2)
- {
- h=0;
- bujin=bujin1;
- init_lcd();
- initclock();
- display();
- }
- }
- }
- if(h==1)
- {
- if(s1==0)
- {
- delay(5);
- if(s1==0)
- {
- while(!s1);
- bujin1++;
- if(bujin1>=101)
- {
- bujin1=1;
- }
- bujindisplay();
- }
- }
- if(s2==0)
- {
- delay(5);
- if(s2==0)
- {
- while(!s2);
- bujin1--;
- if(bujin1<=0)
- {
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码 完整的Word格式文档51黑下载地址:
基于单片机的简易智能源信号发生器.docx
(19.79 MB, 下载次数: 118)
|