第2章 设计方案比较方案一:使用单片机内部定时器,通过编程实现发出不同频率方波,产生音阶。
方案二:使用8253作为外部定时器,通过编程实现产生所需频率的方波。
通过对方案一和方案二的比较可以知道,方案一是通过使用单片机内部定时器,以编程实现方波输出,优点在于外部电路简单,程序结构简单,缺点在于消耗单片机资源过多,不利于优化升级;方案二是利用8253来产生方波,相对来说这种方案外部电路较为复杂,程序结构也更为复杂,优点在于占用单片机资源少,输出稳定,利于扩展;故而选择方案二较好。
巩固和运用所学课程,理论联系实际,提高分析、解决计算机技术实际问题的独立工作能力,通过对电子琴的设计,进一步加深对计算机原理以及数字电路应用技术方面的了解与认识,进一步熟悉数字电路系统设计、制作与调试的方法和步骤。巩固所学课堂知识,理论联系实际,提高分析、解决计算机技术实际问题的独立工作能力。为了进一步了解计算机组成原理与系统结构。
随着基于技术的发展和应用领域的扩大与深入,单片机技术在电子信息、通信、自动控制用计算机等领域的重要性日益突出。作为一个学电子信息专业的学生,我们必须不断地了解更多的新产品信息,这就更加要求我们对其有个全面的认识。本程序设计的是简易电子琴的设计。可以大大降低了硬件数字系统设计的入门级别,让人感觉就是C语言的近亲。通过老师的指导和自己的学习完成了预想的功能。
第3章 硬件电路设计3.1单片机最小系统ATC89C51主要特性: 与MCS-51 兼容\8K字节可编程闪烁存储器寿命:1000写/擦循环数据保留时间:10年全静态工作:三级程序存储器锁定\512内部RAM\32可编程I/O线两个16位定时器/计数器\5个中断源可编程串行通道低功耗的闲置和掉电模式片内振荡器和时钟电路 管脚说明: VCC:供电电压。 GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由拉的缘故。P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚 备选功能
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口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。振荡器特性: XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
图3.1 ATC89C51结构图
单片机最小系统主要由时钟电路和复位电路组成。
此系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。MCS-51内部有一个用于构成振荡器的高增益反相放大器。引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。外接晶体谐振器以及电容CX1和CX2构成并联谐振电路,接在放大器的反馈回路中。,此系统电路的晶体振荡器的值为12MHz,电容值约为30μF。
图3.2 时钟电路
复位电路是由外部的复位电路来实现的。片内复位电路是复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,它的输出在每个机器周期的S5P2,由复位电路采样一次。
图3.3 单片机最小系统原理图
3.2键盘模块HD7279是一片具串行接口的,可同时驱动8位共阴式数码管(或64只独立LED)的智能显示驱动芯片,该芯片同时还可以连接多达64键的键盘矩阵,10 单片即可完成LED显示、键盘接口的全部功能。 HD7279内不含有译码器,可直接接收BCD码或16进制码,并同时具有2种译码方式,此外,还具有多种控制指令,如消隐、闪烁、左移、右移、段寻址等。 HD7279具有片选信号,可方便地实现多于8位的显示或多于64键的键盘接口。
1主要特性:
(1) 串行接口,无需外围元件可直接驱动LED。
(2) 各位独立控制译码/不译码及消隐和闪烁属性。
(3) (循环)左移/(循环)右移指令
(4) 具有段寻址指令,方便控制独立LED
(5) 64键键盘控制器,内含去抖动电路
(6) 有DIP和SOIC两种封装形式供选择
2 引脚说明:
表3.17279引脚说明
| | |
| | |
| | |
| | |
| | 片选输入端,此引脚为低电平时,可向芯片 发送指令及读取键盘数据 |
| | 同步时钟输入端向芯片发送数据及读取数据时,此引脚电平上升沿表示数据有效 |
| | 串行数据输入、输出端,当芯片接收指令时,此引脚为输入端,当读取键盘数据时,此引脚在读指令最后一个时钟的下降沿变为输出端 |
| | 按键有效输出端,平时为高电平,当检测到有效按键时,此引脚变为低电平 |
| | |
| | |
| | |
| | |
| | |
| | |
键盘模块主要由键盘串行接口芯片7279扩展组成。键盘采用4*4矩阵式,按键检查使用行列扫描方式,行设置低电平,同时读入列状态,如果列状态不是全为1,则此列与行为0相交的键就是所按下的键。在应用过程中,只需要将7279的CS、CLK、DATA和KEY四个端口分别连接至单片机的P1.0、P1.1、P1.2和P1.3即可。当全部硬件电路连接好后,按下键盘的按键,单片机将获得该按键的键值,通过软件编程即可确定所需要的方波频率值,使8253产生该频率的方波,经由功放电路输出至喇叭发声。
3.3 方波发生模块方波发生模块主要由ATC89C51、74LS373、74LS138和8253组成。其中,74LS138的A、B、C口分别连接至AT89C51的P2.5、P2.6和P2.7,E1、E2、E3分别连接至P2.2、P2.3和P2.4口,由译码器74LS138的Y5口输出。由硬件连接可确定端口地址为:0A000H、0A001H、0A002H和0A003H。锁存器74LS373的D0和D1口分别连接至P0.0和P0.1,Q0和Q1口分别连接至8253的A0和A1口,用于地址锁存。8253的D0到D7口分别连接至ATC89C52的P0.0至P0.7口,GATE0口持续接高电平,CLK2处的时钟信号经由分频电路连接至单片机的读和写,使8253有稳定的2MHZ的时钟信号输入,最后在OUT2口便可产生持续的方波输出,频率则由软件编程决定。其原理图如图3.4所示:
图3.4 方波发生模块原理图
3.4功率放大发声模块 功放模块主要由扬声器和LM386构成,OUT2信号输出至LM386信号输入端,经由放大电路放大后输出至扬声器发声。其原理图如图3.5所示:
图3.5 喇叭发声模块原理图
第4章 软件设计4.1软件结构功能设计软件部分主要包含:主程序、8253方波发生子程序、7279初始化子程序、接收发送字节子程序、延时子程序等。 主程序:判断所读取的键值,并根据键值赋值do、re、mi、fa、sol、la、si、do八个音节的频率。运用switch语句,让所选用的8个键值分别与8个音阶的频率所对应。8253方波发生子程序:设定好8253的控制字,且为方式3工作方式(方波发生器)。将8个音节的8个不同频率转换成16进制数后赋值给8253的输出端口地址后相减,即可。 7279初始化子程序:使片选信号的上升沿时刻复位,使芯片处于上电复位状态。 接收发送字节子程序:通过移位将所需要传送的字节存于A中,以便于其它程序进行调用 延时子程序:通过for循环得到延时子程序。
4.2主程序设计主程序先对7279进行初始化,调用键值读取子程序,对读取的键值进行判断是否为预设的键值,若不是则返回,若是怎进入switch语句进行赋值。其主框图
如图4.1所示:
N
Y
图4.1 主程序流程框图
4.3子程序设计方波发生子程序:对8253进行初始化,控制字赋值,确定工作在方式3,初值送至入口地址。其子程序流程框图如图4.2所示: 判断是否有键按下,若有,则发送读键盘数据指令,并保存键值。其子程序流程框图如图4.2所示。
N
Y
图4.2 读键值子程序流程框图
7279初始化子程序:发送复位指令,子程序返回。其子程序流程框图如图4.3所示:发送一字节子程序:将所需发送的字节带进位左移一位,循环八次后将所需发送的字符保存于A中,子程序返回。其子程序流程框图如图4.4所示:
N
Y
图4.3 7279初始化子程序流程框图 图4.4 发送一字节子程序流程框
第5章 系统调试5.1 软件调试本次课程设计—简易电子琴的软件设计我并没有运用汇编语言,而是运用了并没有在课程中学习的C语言,故在设计的时候遇到较大的困难。主要是对于初始化方面不熟悉,后通过上网学习及日立电子钟的设计对单片机的C程序设计运用较为熟练。 首先对于一些需要使用的数据类型进行定义,如#define uint unsigned int;后用XBYTE命令对8253进行初始化,用sbit指令对7279进行初始化。 然后编写各子程序,最后编写主程序。 开始时用的是if(!key=**)语句来进行键值的判断,后进行单独赋值的办法,但是后来发现这样的语句对于只有几个音阶的简易电子琴来说还具有可行性,但是对于音阶较多的就显得太为繁杂了,故后建立数组,编写了频率对照表,运用switch语句进行键值判断并查表赋值。这样的设计使得此程序的可扩展性较强。 运用TR0来控制发声。 当硬件连接好后,我们把程序烧录进单片机进行初步调试,发现没有任何反应,排查后排除了硬件问题,然后进行了软件排查。单独编写了方波发生程序,发现能发出方波,但是幅度及频率均与理论值相差巨大。由于硬件排查时认为单片机及功放两部分工作正常,为了验证这个结论的正确性,我们先在硬件电路上绕过8253,单片机输出直接连接功放模块,然后改写程序,使用单片机内部中断,发现一切工作正常,且可在7279键盘上弹奏音乐。此结果直接证明之前问题出在8253的论断完全正确,也间接证明程序的编写基本没有问题。后为了证明程序编写的正确性,我们把自己程序里的一些初始化数值进行了更改,达到与别组硬件匹配后,把自己的程序烧录进别组的硬件中,发现可以工作。
5.2 系统联调经硬件检测,程序调试后,将程序下载到单片机,按下所设置的键,与设计要求相比对,扬声器可正常发出中音8音阶,运用示波器检查,8音阶频率稍有误差,基本与理论值相同,达到要求,结果在误差范围之内。根据乐谱弹奏,可弹奏出正常乐曲。 后期,对程序进行了升级,加入了节奏控制(以按键时间长短来控制延时长短),建立了乐曲频率数组,可播放数组中所存乐曲。此次简易电子琴设计完成。系统调试图5.1所示。
图5.1 系统调试图
结论在方案一的调试中遇到以下几个问题: 1. 发声频率有误差:运用示波器观察,对根据公式更改参数达到要求。 2. 按键与设定音阶不符:检查程序为switch语句case设置偏差。 经调试后,程序运行正确,达到设计要求。 后期课程设计结束后自己增加了锁定功能,自动播放功能。
总的来说,本次的简易电子琴设计不是很成功,因为时间关系,最终没能找出预先设计中的问题,最后只能通过更改设计来实现目的。但是也收获颇多;首先我主要负责软件的编写,使我对单片机的C程序设计从无到有,从不会到会,深入的了解了单片机程序设计中汇编与C两种语言的优劣点,使我以后设计程序时对语言的选择有了一个清醒的认识。进而发现问题就要解决问题,在这次解决问题中发现了自己很多不懂得知识,为了解决问题自己去找资料学习,并且在老师的指导下学会了如何有条理的去排查问题以及如何去验证自己的猜测。 特别是在我所主要负责的程序方面,在一次次的验证中不断编写各种功能的程序,从刚开始的什么都不懂,经常要自己上网找资料学习,都后来在编写程序中总能有各种奇思妙想,经常能有一些让自己都经不住感叹的构思,对C语言有一种得心应手的感觉。自己在这之中编写了很多各种功能的程序,如对电子琴进行锁定,录制等功能。 最后,虽说这次的课程设计结果不是很成功,但是过程中的收获却是相当多的。
致谢我做课程设计的每个阶段,从选题到查阅资料,设计要求的确定,中期报告的修改,后期格式调整等各个环节中都给予了我悉心的指导。这两个周以来,董老师不仅在学业上给我以精心指导,同时还在思想给我以无微不至的关怀,在此谨向董老师致以诚挚的谢意和崇高的敬意。
同时,本篇课程设计的写作也得到了王雪珂、孙元龙等同学的热情帮助。感谢在整个课程设计期间和我密切合作的同学,和曾经在各个方面给予过我帮助的伙伴们,在此,我再一次真诚地向帮助过我的老师和同学便是感谢!