毕 业 设 计 (论 文)
专 业 班 级 学生姓名 学 号 课 题 基于单片机的音乐器设计 指导教师
摘 要
目前市场上有很多种音乐芯片或音乐模块,可以直接产生各种曲子。但是这种模块价格比较贵,性价比不高。对于一些仅需要产生简单的音符或简短曲子的场合,例如智能玩具、电子贺卡等,可以使用单片机配合简单的蜂鸣器就能产生需要的音乐效果,这种方法充分发挥了单片机的优势。
本设计中,用一块AT89C52单片机给蜂鸣器不同的音频脉冲来产生不同的音调,实现演奏歌曲的功能。同时,通过按键电路来控制歌曲的播放,并在LCD1602上显示歌曲信息。
关键词:音乐;单片机;蜂鸣器;按键;LCD1602
Abstract
There are many kinds of music chips or music modules on the market at present, which can directly produce a variety of music. But these modules are expensive and low cost performance. For some only needs to generate simple notes or short tune occasions, such as intelligent toys, electronic greeting cards, the microcontroller can be used with a simple buzzer can produce the required music effect, this method makes full use of the advantages of MCU.
In this design, using a AT89C52 chip to the buzzer different audio pulse to produce different tones, realize the function of play the song. At the same time, through the key circuit to control the songs, songs and display information in the LCD1602.
Key words: music;MCU;buzzer;key;LCD1602
I
目录
摘 要.............................................................................................................................. I Abstract .......................................................................................................................... I 1绪论............................................................................................................................. 1
1.1课题背景与意义............................................................................................... 1 1.2国内外研究状况............................................................................................... 1 1.3论文研究内容概述........................................................................................... 2 2硬件电路设计............................................................................................................. 2
2.1硬件电路结构图............................................................................................... 2 2.2单片机模块....................................................................................................... 3
2.2.1单片机的引脚功能 ................................................................................. 3 2.2.2定时器 ..................................................................................................... 5 2.2.3中断 ......................................................................................................... 5 2.3单片机最小系统............................................................................................... 6
2.3.1时钟电路 ................................................................................................. 6 2.3.2复位电路 ................................................................................................. 7 2.4发声模块........................................................................................................... 7
2.4.1蜂鸣器 ..................................................................................................... 7 2.4.2驱动电路 ................................................................................................. 8 2.5按键模块........................................................................................................... 9 2.6显示模块......................................................................................................... 10 3软件设计................................................................................................................... 12
3.1软件开发平台................................................................................................. 12 3.2单片机发音原理............................................................................................. 13
3.2.1音调 ....................................................................................................... 13 3.2.2节拍 ....................................................................................................... 14 3.2.3音符码表的编制 ................................................................................... 15 3.3主程序流程图................................................................................................. 17
II
3.4发声模块程序设计......................................................................................... 18 3.5按键模块程序设计......................................................................................... 20 3.6显示模块程序设计......................................................................................... 23 4硬件仿真................................................................................................................... 24 5总结........................................................................................................................... 26 致谢.............................................................................................................................. 27 参考文献...................................................................................................................... 28 附录一 硬件电路原理图............................................................................................ 29 附录二 源程序............................................................................................................ 30 附录三 英文科技文献翻译........................................................................................ 39
III
1绪论
1.1课题背景与意义
随着人类社会的发展,人们对视觉、听觉方面的享受提出了越来越高的要求。小小的音乐播放器可以给人们带来美好的回忆,提高人们的精神文化享受。音乐一直以来都是人们生活中的重要的元素。造型时尚、小巧便携、可免费下载歌曲的MP3播放器的流行,为人类的娱乐生活提供了时尚便利的道具。
目前市场上有很多种音乐芯片或者音乐模块,可以直接产生各种曲子。但是这种模块价格比较贵,性价比不高。对于一些仅需要产生简单的音符或简短曲子的场合,可以使用单片机配合简单的蜂鸣器而产生需要的音乐效果,这种方法充分发挥了单片机的优势。单片机以其灵活的指令系统以及强大的功能,除了在测控领域中有着广泛的应用外,还经常应用于智能玩具、电子贺卡等场合。在这些产品中,使用单片机驱动蜂鸣器来发出声音,而且还可以控制其发出不同的声调,从而连接起来构成一个曲子。基于单片机的音乐播放器的特点有功能多,价格廉、外部电路简单的优点,深受音乐爱好者和音乐芯片制造商的青睐。
1.2国内外研究状况
目前中国音乐播放器行业已经具备了相当的规模,并在国际市场上已有一定的竞争力。市场上的音乐播放器品牌繁多,定位不一,充分满足了各层次消费者的需求。雅马哈、天龙、安桥、马兰仕、此类产品大多以生产专业音乐播放器为主。赛比尔(CBL)山水、飞利浦、JVC等此类厂家都致力于迷你音乐播放器的开发和推广。市场占有率极高,广为大众所接受。索尼、松下、夏普等这些品牌技术精湛、设计一流,在市场上也占有一席之地。而另外一些市场份额,则被国内的品牌步步高、金正、奇声、奥莱克等所占领。可是,据最新的调查显示大型音响的市场发展,并不是很乐观,市场价格正处于下降的趋势。而外形新颖、小巧轻便灵活的迷你音乐播放器却很受年轻人的青睐和欢迎。虽然国内的大型音响设备状况不是很好,但是迷你音乐播放器确是个例外,市场发展前景不容小觑。基于此,设计音乐播放器重点还是在于美观的外形和其吸引人的性能,迷你音乐播放器基本性能:抗干扰、音质好,小体积却可以实现相对更大的功率,新型的
1
迷你音乐播放器要有其他的附加功能,例如:可以在音乐播放器上附带笔筒、花瓶、便携的手提带以及一些漂亮的小挂饰等等,这些都是可实现的,不但容易实现,造价也不高。
1.3论文研究内容概述
设计的课题是“基于单片机的蜂鸣器音乐器设计”。硬件部分,以单片机AT89C52作为硬件核心控制部件,结合三极管作为放大器,用LCD1602构成典型的显示电路,按键作为输入部分以及其他外围设备组成音乐播放器。用Protues软件完成电路原理图的绘制。
软件部分,在了解了音高和音长知识后,将音乐中的音符和节拍变换成相应音调参数和节拍参数,并组成一个数组。在Keil软件中编写C语言程序,并调试,生成HEX文件后下载到硬件电路中执行,实现演奏歌曲的功能。
2硬件电路设计
2.1硬件电路结构图
硬件系统包括主控模块、时钟电路、复位电路、电源电路、显示模块、发声模块和按键模块。如图2-1所示。
图2-1 硬件系统结构图
电源电路 按键模块 复位电路 时钟电路 主控模块 (AT89C52) 显示模块 发声模块
2
2.2单片机模块
本设计选择单片机AT89C52作为播放器的核心控制部件,原因是AT89C52的功能全部兼容MCS-51,并且还有程序加密等功能,相对而言更加实用。
AT89C52单片机是美国ATMEL公司生产的低电压,高性能CMOS 8位微控制器,片内含8KB的可反复擦写的只读程序存储器和256字节的随机存取存储器,器件采用ATMEL公司的高密度、非易失性存储技术生产,与标准MCS-51指令系统及8051产品引脚兼容,片内置通用8位中央处理器(CPU)和Flash存储单元,其强大的功能更适合较为复杂的控制应用场合。
其主要工作特性是:片内程序存储器内含8KB的Flash程序存储器,可擦写寿命为1000次;片内数据存储器内含256字节的RAM;具有32根可编程I/O口线;具有3个可编程定时器;中断系统是具有8个中断源、6个中断矢量、2级优先权的结构;串行口是具有一个全双工的可编程串行通信口;具有一个数据指针DPTR;低功耗工作模式有空闲模式和掉电模式;具有可编程的3级程序锁定位;AT89C52工作电源电压为5(1±0.2)V,且典型值为5V;AT89C52最高工作频率为24MHZ。
2.2.1单片机的引脚功能
AT89C52的引脚排列如图2-2所示:
图2-2 AT89C52引脚排列图
3
引脚功能描述如下:
P0口:—8位、漏极开路的双向I/O口。当使用片外存储器及外扩I/O口时,P0口作为低字节地址/数据复用线。在编程时,P0口可用于接收指令代码字节;在校验时,P0口可输出指令字节(须外加上拉电阻)。P0口也可做通用I/O口使用,但需加上拉电阻,变为准双向口。当作为普通输入时,应将输出锁存器置1。P0口可驱动8个TTL负载。
P1口:—8位、准双向I/O口,具有内部上拉电阻。P1口是为用户准备的I/O口双向口。在编程和校验时,可用做输入低8位地址。用做输入时,应先将输出锁存器置1。P1口可驱动4个TTL负载。
P2口:—8位、准双向I/O口,具有内部上拉电阻。当使用片外存储器或外扩I/O口时,P2口输出高8位地址。在编程/校验时,P2口可接收高字节地址和某些控制信号。P2口也可做普通I/O口使用。用做输入时,应先将输出锁存器置1。P1口可驱动4个TTL负载。
P3口:—8位、准双向I/O口,具有内部上拉电阻。P3口可做普通I/O口使用。用作输入时,应先将输出锁存器置1。在编程/校验时,P3口接收某些控制信号。它可驱动4个TTL负载。
RST:复位输入。晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。看门狗计时完成后,RST 脚输出 96 个晶振周期的高电平。特殊寄存器 AUXR(地址 8EH)上的 DISRTO位可以使此功能无效。DISRTO默认状态下,复位高电平有效。
ALE/PROG:地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低 8 位地址的输出脉冲。在flash编程时,此引脚(PROG)也用作编程输入脉冲。在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。如果需要,通过将地址为8EH的SFR的第0位置“1”,ALE操作将无效。这一位置 “1”,ALE仅在执行MOVX或MOVC指令时有效。否则,ALE 将被微弱拉高。这个ALE使能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。
PSEN:外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。当
4
AT89S52从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。
EA/VPP:访问外部程序存储器控制信号。为使能从0000H到FFFFH的外部程序存储器读取指令,EA必须接GND。为了执行内部程序指令,EA应该接 VCC。在flash编程期间,EA也接收12伏VPP电压。
XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。 XTAL2:振荡器反相放大器的输出端。
2.2.2定时器
AT89C52内部有两个16位可编程定时/计数器T0和T1,本设计中用到定时器T0的工作方式1。
T0由8位计数器TH0和TL0构成,它们都是以加“1”的方式完成计数。特殊功能寄存器TMOD控制定时/计数器的工作方式,TCON控制定时/计数器的启动运行并记录T0的溢出标志。通过对TH0和TL0的初始化编程可以预置T0的计数初值。通过对TMOD和TCON的初始化编程可以分别置入方式字和控制字,以指定其工作方式并控制T0按规定的工作方式计数。
当定时/计数器T0被选定为定时器工作模式时,计数输入信号来自内部振荡信号,在每个机器期内定时器的计数器做一次“+1”运算。因此定时器亦可视为计算机机器周期的计数器。而每个机器周期又等于12个振荡脉冲,故定时器的计数速率为振荡频率的1/12(即12分频)。若单品级的晶振主频为12MHz,则计数周期为1μs。如果定时器的计数器“+1”产生溢出,则标志着定时时间到。
2.2.3中断
计算机工作过程中,由于系统内、外某种原因而发生的随机事件,计算机必须尽快中止正在运行的原程序,转向相应的处理程序为其服务,待处理完毕,再返回去执行被中止的原程序,这个过程就是中断。引起中断的原因或设备称为中断源。AT89C52有6个中断源:两个外部中断 (INT0 和 INT1),三个定时中断(定时器 0、1、2)和一个串行中断。
本设计中用到定时器0中断。在CPU启动定时器T0之后,就可继续执行主
5
程序,同时定时器T0也在工作。当定时器T0溢出便向CPU发中断请求,CPU响应中断转去执行定时器T0服务程序即音乐播放程序,中断服务结束后,又返回主程序继续运行。
在设置好定时器T0的工作方式后,对中断允许寄存器IE初始化编程IE=0x82,使定时器0中断被允许。
2.3单片机最小系统
单片机最小系统包括电源电路、时钟电路和复位电路,如图2-3所示。
图2-3 AT89C52单片机最小系统图
2.3.1时钟电路
时钟电路用于产生单片机工作时所必需的时钟信号。时钟是单片机的心脏,单片机各功能部件的运行都是以时钟频率为基准,有条不紊地一拍一拍地工作。因此时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。常用的时钟电路有两种方式,一种是内部时钟方式,另一种是外部时钟方式。本设计中用的是内部时钟方式。
AT89C52内部有一个用于构成振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。这个放大器与作为反馈元件的片外
6
石英晶体一起构成自激振荡器。这两个引脚跨接石英晶体振荡器和微调电容,就构成一个稳定的自激振荡器。晶体可以在1.2MHz~12MHz之间任选,电容可以在20pF~60pF之间选择。电容C1、C2的大小对振荡频率有微笑影响,可起频率微调作用。本设计中晶振频率选择的是12MHz,电容选择的是典型值30pF。
2.3.2复位电路
复位是单片机的初始化操作,只要给RESET引脚加上2个机器周期以上的高电平信号,就可使AT89C52单片机复位。本设计中采用的是最简单的上电自动复位,是通过外部复位电路的电容充电来实现的。只要Vcc的上升时间不超过1ms,就可以实现上电自动复位。
2.4发声模块
2.4.1蜂鸣器
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。图2-4所示为蜂鸣器实物图。
图2-4 蜂鸣器实物图
蜂鸣器按其结构主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。多谐振荡器由晶体管或集成电路构成。当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。
7
压电蜂鸣片由锆钛酸铅或铌镁酸铅压电陶瓷材料制成。在陶瓷片的两面镀上银电极,经极化和老化处理后,再与黄铜片或不锈钢片粘在一起。
电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
蜂鸣器按其是否带有信号源又分为有源和无源两种类型。有源蜂鸣器只需要在其供电端加上额定直流电压,其内部的震荡器就可以产生固定频率的信号,驱动蜂鸣器发出声音。无源蜂鸣器可以理解成与喇叭一样,需要在其供电端上加上高低不断变化的电信号才可以驱动发出声音。用单片机控制蜂鸣器发出不同频率的声音,最好采用无源的蜂鸣器,如果用有源蜂鸣器,可以会因为二种不同频率声音(有源蜂鸣器本身固有发音频率与单片机驱动频率)互相叠加,造成效果混乱、发音不清。
2.4.2驱动电路
蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机IO引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大电路。本设计通过一个三极管Q1来放大驱动蜂鸣器。
对于无源的蜂鸣器,驱动其发出声音就较为复杂,因为它本身不带信号源,因此,只是通上电源,是不能发出声音的,必须要不断的重复“通电-断电”,才能使其发出声音,可以通过编写程序,控制P1.7口不断的置为高电平—低电平—高电平…,这样蜂鸣器就可以不断的通、断电,从而发出声音。而通电、断电的时间不同,相当于振荡周期的不同,因此又可以得到不同频率的声音。所以三极管Q1在此同时起到开关控制的作用。驱动电路如图2-5所示。
8
图2-5 发声电路
2.5按键模块
独立按键是51单片机应用系统中最常用的人机交互通道之一,它通常用于给用户提供向51单片机输入信息的通道。
独立按键的基本工作原理是:按键按下时接通两个点,放开时则断开这两个点。按照结构可以把按键分为两类:触点式开关按键,如机械式开关、导电橡胶式开关等;无触点式开关按键,如电气式按键,磁感应按键等。
本设计的控制电路采用4个独立按键,如图2-6所示。从左至右:Key0与P1.0口相连,播放上一曲;Key1与P1.1口相连,开始播放;Key2与P1.2口相连,播放下一曲;Key3与P1.3口相连,暂停播放。当按键按下时,接口接收到低电平,从而实现对音乐器的控制。
图2-6 控制电路
9
2.6显示模块
LCD(Liquid Crystal Display)是液晶显示器的缩写,液晶显示器是一种被动式的显示器,即液晶本身并不发光,而是利用液晶经过处理后能改变光线通过方向的特性,而达到白底黑字或黑底白字显示的目的。液晶显示器具有功耗低,抗干扰能力强等优点,因此被广泛地应用在仪器仪表和控制系统中。
LCD1602液晶也叫字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块,它有若干个5×7或5×10点阵的字符位组成,每个点阵字符位都可以显示一个字符。每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能显示图形。LCD1602是指显示的内容为16×2,即可以显示两行,每行16个字符。
液晶显示器1602的特性:利用+5V电压,对比度可调;内含复位电路;提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等;有80字节显示数据存储器DDRAM;内建有192个5×7点阵的字型的字符发生器CGROM;8个可由用户自定义的5×7的字符发生器CGRAM。
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如下:
VSS:电源地信号引脚。 VDD:接+5V正电源。
VEE:液晶对比度调节引脚,接0~5V以调节液晶的显示对比度。
RS:为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 RW:为读写信号线,高电平时进行读操作,低电平时进行写操作。 E:为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 D0~D7:为8位双向数据线。 BGVCC:背光源正极。 BGGND:背光源负极。
如图2-7所示为音乐器系统的液晶显示电路,本设计采用间接控制方式使LCD1602与单片机AT89C52进行接口,这种方式通过单片机的并行I/O端口引脚实现对液晶显示模块的间接控制。1602的8位并行数据端口和单片机的P0口连接,然后使P2.0,P2.1,P2.2三根I/O口线来分别控制1602的读写和使能。
10
间接控制方式不是通过固定的接口地址,而是通过单片机I/O端口引脚来操作液晶显示模块LCD。通过调节电阻RV2的大小来调节1602显示屏的对比度,通过不断试验这里的电阻大小为1K。由于LCD1602只能显示字符,所以显示的歌曲名称为当前播放歌曲的英文名称。
图2-7 液晶显示电路
11
3软件设计
软件设计是指在硬件电路的基础上,以程序的形式实现算法,进而实现音乐播放器的功能。软件是整个控制系统设计的核心,采用模块化设计,具有充分的灵活性,在硬件结构不变的情况下,只需要改变软件就能实现一些不同的功能,满足用户多样性需求。
本系统采用模块化的编程思想,把整个软件系统化分为多个功能模块,主程序通过调用各个子程序来完成各个功能的实现。软件的程序主要由主程序、发声模块程序、控制模块程序、LCD1602显示程序组成。
本设计使用Keil μVison3软件完成程序的编写和调试。
3.1软件开发平台
Keil μVison系列是德国Keil Software公司推出的51系列兼容单片机软件开发系统。μVison3是集成的可视化Windows操作界面,其提供了丰富的库函数和各种编译工具,能够对51系列单片机以及和51系列兼容的绝大部分类型的单片机进行设计。Keil μVison系列可以支持单片机C51程序设计语言,也可以直接进行汇编语言的设计与编译。
目前,Keil公司已经被ARM公司收购,成为ARM旗下的产品。Keil μVison系列的集成开发环境最高版本是μVison3,版本号为V8.08。Keil μVison系列是一个非常优秀的编译器,受到广大单片机设计者的广泛使用。
其主要特点如有:支持汇编语言、C51语言等多种单片机设计语言;可视化的文件管理,界面友好;支持丰富的产品线,除了51及其兼容内核的单片机外,还新增加了对ARM内核产品的支持;具有完善的编译连接工具;具备丰富的仿真调试功能,可以仿真串口、并口、A/D、D/A、定时器/计数器以及中断等资源,同时也可以和外部仿真器联合进行在线调试;内嵌RTX-51实时多任务操作系统;支持在一个工作空间中进行多项目的程序设计。支持多级代码优化。
图3-1为在μVision3中编写程序时的界面。
12
图3-1 μVision3的界面
3.2单片机发音原理
声音的频谱范围约在几十到几千赫兹,利用单片机定时器的中断功能,可以从I/O口线上形成一定频率的脉冲,经过滤波和功率放,接上蜂鸣器就可以发出一定频率的声音,若再利用延时程序控制输出各个频率脉冲的时间,即可实现音乐发生器功能。使用单片机配合蜂鸣器来发音,只需弄清楚两个概念即可,也就是“音调”和“节拍”。其中,音调表示一个音符唱多高的频率;节拍表示一个音符唱多长的时间。下面分别介绍音调和节拍的相关知识,以及如何使用单片机来实现音调和节拍。
3.2.1音调
音调表示一个音符唱多高的频率,和平时所说的“音高”十分类似。这是音乐学中的名词,在音乐中常把中央C上方的A音定为标准音高,其频率f=440Hz。其余音均通过和其比较获得。
如果f1和f2两个音符的频率相差一倍时,也即f2=2×f1时,则称f2比f1高一个倍频程。音符1(低音do)与音符i(中音do),……,等之间正好相差一个倍频程,在音乐学中一般称其相差一个八度音。
音乐中规定,在一个八度音内,共有12个半音。以1—八音区为例,这12个半音分别是:1—#1、#1—2、2—#2、#2—3、3—4、4—#4,#4—5、5—
13
#5、#5—6、6—#6、#6—7、7—i。由于人耳的听觉效果是非线性的,因此这12个音阶的分度基本上是以对数关系来划分的。
要让单片机产生音频脉冲,只要计算出某一音频的周期,将此周期除以2得到半周期,利用定时器对此半周期进行定时,每当定时时间到,将P1.7口线上的电平取反,从而得到所需要的音频脉冲。产生音频的定时器初值计算公式如下:
式中,k根据单片机工作方式确定,可为13(方式0)、16(方式1)、8(方式2),
fosc为单片机工作频率,
为希望产生的音频。
例如中音DO的频率为523Hz,若单片机的工作频率为12MHz,定时器T0设置为工作方式1,按以上公式计算得定时器初值为64580;高音DO的频率为1047Hz,计算定时器初值为65058。
3.2.2节拍
节拍表示一个音符唱多长的时间,同样是音乐学中的名词。在一张完整乐谱的开头,都有如1=C 、1=G …… 等的标识。例如图3-2所示为1=C 的节拍示意图。
这里的、用来表示节拍,而1=C、1=G表示一个乐谱的曲调,简单地说就是跟音调有关系。
图3-2 节拍示意图
可以通过延时程序来产生不同的节拍。如果1拍为0.4秒,则1/4为0.1秒,只要设定延时时间就可以求得节拍时间。例如一段延时程序Delay为1/4拍,则一拍只要调用4次Delay程序,依此类推。
14
3.2.3音符码表的编制
编写一段音乐的音符码表时,先把乐谱的音符找出,按表3-1建立对应的音调码码及定时器初值表,按表3-2建立节拍码表。每个音符使用1个字节,字节的高4位存放音符的音调码,低4位存放音符的节拍码。 表3-1 与音符对应的音调码表和定时器初值表(fosc=12MHz) 简谱 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 发声 低音SO 低音LA 低音SI 中音DO 中音RE 中音ME 中音FA 中音SO 中音LA 中音SI 高音DO 高音RE 高音ME 高音FA 高音SO 不发音 音调码 1 2 3 4 5 6 7 8 9 A B C D E F 0 定时器初值 FB04 FB90 FC09 FC44 FCAC FD09 FD34 FD82 FDC8 FE06 FE22 FE56 FE85 FE9A FEC1 用C语言将音调码表和定时器初值表表示出来即为: uchar code TABLE[ ]={ //音符对应的定时器初值表
0xfb,0x04,0xfb,0x90,0xfc,0x09,0xfc,0x44, 0xfc,0xac,0xfd,0x09,0xfd,0x34,0xfd,0x82, 0xfd,0xc8,0xfe,0x06,0xfe,0x22,0xfe,0x56, 0xfe,0x85,0xfe,0x9a,0xfe,0xc1};
15
表3-2节拍码表 节拍码 1 2 3 4 5 6 8 A C F 节拍数 1/4拍 2/4拍 3/4拍 1拍 1又1/4拍 1又2/4拍 2拍 2又2/4拍 3拍 3又3/4拍 按照上述原理可以编写出“Amazing Grace”乐曲的音符码表。“Amazing Grace”的简谱如下:
5.|1 - 31 |3- 2| 1 - 6. |5.- 5.|1-31|3-2|5--|5-| 3 |5·3 53|1-5.| 6·1 16.|5.-5.|1-31|3-2|1--|1-| 对应的音符码表为:
uchar code GRACE[ ]={ //《奇异恩典》音符码表
0x14,0x48,0x62,0x42,0x68,0x54,0x48,0x24,0x18, 0x14,0x48,0x62,0x42,0x68,0x54,0x8c,0x88
0x64,0x86,0x62,0x82,0x62,0x48,0x14,0x26,0x42,0x42,0x22,0x18,
0x14,0x48,0x62,0x42,0x68,0x54,0x4c,0x48,0x00};
16
3.3主程序流程图
如图3-3所示为主程序流程图。
图3-3 主程序流程图
按键扫描 LCD1602显示 Y 播放音乐 开始键是否按下 开始 初始化 N
17
3.4发声模块程序设计
如图3-4所示为发声模块程序流程图。
图3-4 发声模块程序流程图
结束 音符码变量+1 延时 计算T0初值,装载,启动T0 停止T0 音调码是否为0 是否为结束码 开始 Y N 取音调码和 节拍码 N Y
18
以下是音乐播放子程序:
uchar beat,tl,th; //定义节拍和T0初值变量(为全局变量)
uchar m,m1,k=0; //定义临时变量 TMOD=0x01;IE=0x82;
while(GRACE [k]!=0) //判断取得的音符码是否为结束码 { }
/************************* T0中断服务函数***********************/ void timer0() interrupt 1 using 1 {
TL0=tl;TH0=th; //重装定时初值
SPEAK=~SPEAK; //蜂鸣器控制端口电平取反 }
beat=GRACE [k]&0x0f; //取节拍码 m=_crol_(GRACE [k],4)&0x0f; //取音调码 if(m!=0) { } else
//取得的音调码为0,则停止T0
//判断取得的音调码是否为0
//不是,根据取得的音调码计算T0初值
m1=--m*2+1; m=m*2;
tl=TL0=TABLE[m1]; th=TH0=TABLE[m]; TR0=1;
//启动T0
TR0=0;
Delay(beat); //按节拍延时 k++; //音符码变量+1
19
3.5按键模块程序设计
本设计中采用4个按键来控制音乐的播放:Key0 控制上一曲播放;Key1开始播放;Key2控制下一曲播放;Key3暂停播放。
主程序中放置了3首歌曲,分别是\"Amazing Grace\" ;\"Ode To Joy\" ;\"Happy Birthday\"。进入主程序后,判断开始键是否按下,若按下,则按顺序循环播放这3首歌曲。开始播放后,通过控制4个按键来控制歌曲的播放。图3-5为按键模块程序流程图
图3-5 按键模块程序流程图
音乐播放 歌曲号-1 歌曲号+1 Y 启动T0 N 开始 Y Y 停止T0 N
上一曲 N 下一曲 N 暂停 Y
20
按键模块的程序如下:
if(!Key0) //判断Key0是否按下 { Delay_1ms(5); //延时去抖 if(!Key0) { num--; if(num<0)
num=2; k=0; }
}
else if(!Key2) { Delay_1ms(5); if(!Key2) { num++; if(num>2)
num=0; k=0; }
}
else if(!Key3) { Delay_1ms(5); if(!Key3) {
TR0=0; //歌曲号变量-1 //歌曲号变量小于1时,变为2
//同时音符码变量变为0
//判断Key2是否按下 //歌曲号变量+1 //歌曲号变量大于2时,变为0
//同时音符码变量变为0
//判断Key3是否按下 //停止定时器 21
}
}
flag=1; //置位位变量 while(flag) //等待Key1被按下 { }
if(!Key1) //判断Key1是否按下 { }
Delay_1ms(5); if(!Key1) { }
flag=0; //复位位变量 TR0=1; //启动定时器
while((!Key0)||(!Key1)||(!Key2)); //等待按键按起
22
3.6显示模块程序设计
播放歌曲的同时,在LCD上显示3首歌曲的名字。以下是歌曲名字的字符串:
uchar code GRACE_Name[]=\"Amazing Grace \"; uchar code JOY_Name[]=\"Ode To Joy \"; uchar code HAPPY_Name[]=\"Happy Birthday \"; LCD1602显示程序流程图如图3-6所示。 开始 LCD初始化 LCD是否忙 Y
N 向LCD写命令 向LCD写数据 显示数据 结束
图3-6 显示程序流程图
23
4硬件仿真
Proteus软件是英国Labcenter Electronics公司出品的EDA工具软件,它可以对51单片机的应用系统进行仿真,并支持和Keil μVison进行联合调试。
本设计正是利用Proteus软件的这一功能完成音乐器系统的硬件仿真。一些仿真时截取的图片如图4-1、图4-2、图4-3和图4-4所示。
图4-1 仿真前效果图
图4-2 开始仿真后效果图
24
图4-3 按下开始键后仿真图
图4-3 按下下一曲键后仿真图
25
5总结
本设计阐述了基于单片机的蜂鸣器音乐器设计软硬件的实现过程,并完成了硬件仿真。
我非常喜欢我的毕业设计课题,因为我比较喜欢音乐,也学过一点的乐理知识,这在我编制乐谱的音符码表时,给了我很大的帮助。而且我也非常喜欢单片机这门课,对单片机的硬件结构和工作原理由衷地喜欢,还有就是C语言程序设计也是我大学中学的比较好的一门课。所以在做毕业设计之前是满心期待。
虽然完成硬件电路图的绘制只用了半天的时间,但是在编写软件的过程中,还是遇到了不少的问题。很多时候是自己的粗心大意导致的,比如,C语言中的变量是先定义再使用,我是定义一个,使用一个,结果总是调试程序时出现错误,但是又找不到问题所在,因此在这上面花费了很多时间。最后才知道是变量必须全部定义完,才能使用。这个例子反映出,C语言基础还是不扎实,知识必须在实践中巩固和完善,而且在实践中才能掌握。
通过这次的毕业设计,不仅巩固了以前所学过的知识,而且学到了很多新的知识。同时提高了自己的实际动手能力和独立思考的能力,在自己设计出的音乐器实现硬件仿真奏出简单音乐的时刻,真是满心欢喜,很有成就感,也增加了自己学习的兴趣。
当然本设计也有一些不足,例如,在播放下一首歌曲的瞬间,歌曲名字的会重复显示一次,这也是自己的程序设计能力的欠缺,有待提高。
总之,在这次的毕业设计中,收获很多,充实且快乐。
26
致谢
在本次毕业设计中,首先,感谢我的指导老师,在设计过程中,老师给我们提供了单片机的视频学习资料,这给了我很大帮助,使我复习,巩固了有关方面的知识。在论文的编写过程中,她也给我提出了许多宝贵的意见,并给与细致的指导。还有老师在整个设计和论文的完成过程中,老师的督促和认真负责的态度也使我印象深刻。
最后也要谢谢我的室友在软件的编写过程中和Word软件的使用上给了我很多帮助。最终使我顺利完成本次毕业设计。
27
参考文献
[1] 于海生.计算机控制技术[M].北京:清华大学出版社,2007 [2] 谭浩强.C程序设计.北京: 清华大学出版社,2005
[3] 徐爱钧,徐阳. Keil C51 单片机高级语言应用编程与实践. 北京:电子工
业出版社, 2013
[4] 万福君,等.单片微机原理系统设计与应用.合肥:中国科学技术大学出版
社,2001
[5] 赵建领,崔昭霞.精通51单片机开发技术与应用实例[M].北京:电子工业
出版社,2012
[6] 马忠梅.单片机的C语言应用程序设计[M].北京:北京航空航天大学出版
社,2003
[7] 李玉梅.基于MCS-51系列单片机原理的应用设计[M].北京:国防工业出版
社,2006
[8] 潘永雄.新编单片机原理与应用[M].西安:西安电子科技大学出版社,2003 [9] 阎石.数字电子技术基础[M].北京:高等教育出版社,2006
[10] 康华光.电子技术基础·模拟部分[M].北京:高等教育出版社,2006 [11] 张鑫.单片机原理及应用[M].北京:电子工业出版社,2005
[12] Lee.High-Speed Circuit Designs for Transmitter Broad-band Data Links[J].IEEE
Journal of Solid-State Circuits,2006
[13] Petal.Modeling design and characterization of a new low-jitter analog dual
tuning LC-VCOPLL architecture[J]. IEEE Journal of Solid-State Circuits,2005 [14] Carol Taylor,Paul Oman.Assessing Power Substation Network Security And
Survivability[M].Moscow:Computer Science Department
28
附录一 硬件电路原理图
29
附录二 源程序
#include sbit SPEAK=P1^7; //定义蜂鸣器输出端口 sbit Key0=P1^0; //定义独立按键 sbit Key1=P1^1; sbit Key2=P1^2; sbit Key3=P1^3; sbit RS=P2^0; //定义控制引脚 sbit RW=P2^1; sbit E=P2^2; uchar beat,tl,th; //定义节拍和T0初值变量 uchar code TABLE[]={ //音符对应的定时器初值表 uchar code GRACE[]={ //《奇异恩典》音符码表 uchar code JOY[]={ 0xfb,0x04,0xfb,0x90,0xfc,0x09,0xfc,0x44, 0xfc,0xac,0xfd,0x09,0xfd,0x34,0xfd,0x82, 0xfd,0xc8,0xfe,0x06,0xfe,0x22,0xfe,0x56, 0xfe,0x85,0xfe,0x9a,0xfe,0xc1}; 0x14,0x48,0x62,0x42,0x68,0x54,0x48,0x24,0x18, 0x14,0x48,0x62,0x42,0x68,0x54,0x8c,0x88, 0x64,0x86,0x62,0x82,0x62,0x48,0x14,0x26,0x42,0x42,0x22,0x18, 0x14,0x48,0x62,0x42,0x68,0x54,0x4c,0x48,0x00}; //《欢乐颂》音符码表 30 58, 48, 0x64,0x64,0x74,0x84,0x84,0x74,0x64,0x54,0x44,0x44,0x54,0x64,0x66,0x52,0x 0x64,0x64,0x74,0x84,0x84,0x74,0x64,0x54,0x44,0x44,0x54,0x64,0x56,0x42,0x 0x54,0x54,0x64,0x44,0x54,0x62,0x72,0x64,0x44,0x54,0x62,0x72,0x64,0x54,0x 44,0x54,0x18, 0x64,0x64,0x74,0x84,0x84,0x74,0x64,0x54,0x44,0x44,0x54,0x64,0x56,0x42,0x 48,0x00}; uchar code HAPPY[]={ //《生日快乐》音符码表 uchar code GRACE_Name[]=\"Amazing Grace \"; uchar code JOY_Name[]=\"Ode To Joy \"; uchar code HAPPY_Name[]=\"Happy Birthday \"; void Timer0_Initialize(); void Delay_1ms(uchar ms); void Delay(uchar); void Key_Scan(char *numz,uchar *kz); uchar Busy_Check(); void LCD_Write_Command(uchar cmd); 0x82,0x01,0x81,0x94,0x84,0xB4,0xA4,0x04, 0x82,0x01,0x81,0x94,0x84,0xC4,0xB4,0x04, 0x82,0x01,0x81,0xF4,0xD4,0xB4,0xA4,0x94, 0xE2,0x01,0xE1,0xD4,0xB4,0xC4,0xB4,0x04, 0x82,0x01,0x81,0x94,0x84,0xB4,0xA4,0x04, 0x82,0x01,0x81,0x94,0x84,0xC4,0xB4,0x04, 0x82,0x01,0x81,0xF4,0xD4,0xB4,0xA4,0x94, 0xE2,0x01,0xE1,0xD4,0xB4,0xC4,0xB4,0x04, 0x00}; 31 void LCD_Initialize(); void Show_String(uchar x,uchar y,uchar *str); void main() { uchar m,m1,k=0; //定义临时变量 char num=0; char *numz; uchar *kz; uchar *p[3]; uchar *q[3]; numz=# kz=&k; p[0]=GRACE;p[1]=JOY;p[2]=HAPPY; q[0]=GRACE_Name;q[1]=JOY_Name;q[2]=HAPPY_Name; Timer0_Initialize(); LCD_Initialize(); while(Key1); Delay_1ms(5); while(Key1); while(1) { while(*(p[num]+k)!=0) //判断取得的音符码是否为结束码 { beat=*(p[num]+k)&0x0f; //取节拍码 m=_crol_(*(p[num]+k),4)&0x0f; //取音调码 if(m!=0) { //判断取得的音调码是否为0 //不是,根据取得的音调码计算T0初值 m1=--m*2+1; m=m*2; 32 } } tl=TL0=TABLE[m1]; th=TH0=TABLE[m]; TR0=1; //启动T0 else //取得的音符码为0,则停止T0 TR0=0; Delay(beat); k++; Show_String(0,0,q[num]); Show_String(0,1,q[num]+16); Key_Scan(numz,kz); num++; } /************************** T0初始化函数 ****************************/ void Timer0_Initialize() { } /************************* T0中断服务函数 ***************************/ void timer0() interrupt 1 using 1 { TMOD=0x01; IE=0x82; } if(num>2) num=0; k=0; 33 TL0=tl;TH0=th; //重装定时初值 SPEAK=~SPEAK; //蜂鸣器控制端口电平取反 } /************************ 四分之一拍延时函数 ************************/ void Delay_Beat() { } /************************** 节拍延时函数 ****************************/ void Delay(uchar tt) { } /***************************1ms延时函数 ****************************/ void Delay_1ms(uchar ms) { } /**************************按键扫描函数******************************/ void Key_Scan(char *numz,uchar *kz) { uint i; for(i=0;i<20000;i++); uchar i; for(i=0;iDelay_Beat(); int i; while(ms--) for(i=125;i>0;i--); 34 bit flag; if(!Key0) { Delay_1ms(5); if(!Key0) { (*numz)--; if(*numz<0) *numz=2; *kz=0; } } else if(!Key2) { Delay_1ms(5); if(!Key2) { (*numz)++; if(*numz>2) *numz=0; *kz=0; } } else if(!Key3) { Delay_1ms(5); if(!Key3) { TR0=0; flag=1; 35 } } } while(flag) { } if(!Key1) { } Delay_1ms(5); if(!Key1) { } flag=0; TR0=1; while((!Key0)||(!Key1)||(!Key2)); /*******************检查1602是否处于忙状态函数**********************/ uchar Busy_Check() { } uchar LCD_Status; RS=0; RW=1; E=1; Delay_1ms(1); //为什么延时1ms呢? LCD_Status=P0; E=0; return LCD_Status; 36 /************************向1602写入命令函数*************************/ void LCD_Write_Command(uchar cmd) { } /************************向1602写入数据函数*************************/ void LCD_Write_Data(uchar dat) { } /*************************初始化1602液晶函数************************/ void LCD_Initialize() { while((Busy_Check()&0x80)==0x80); RS=1; RW=0; E=0; P0=dat; E=1; Delay_1ms(1); E=0; while((Busy_Check()&0x80)==0x80); //如果1602忙 RS=0; RW=0; E=0; P0=cmd; E=1; Delay_1ms(1); E=0; 37 LCD_Write_Command(0x38); //设置1602液晶功能,8位数据接口, //两行显示,5*10点阵字符 Delay_1ms(1); } /****************在坐标点X、Y上写入一个字符串函数*******************/ void Show_String(uchar x,uchar y,uchar *str) { } LCD_Write_Command(0x01); //清屏 Delay_1ms(1); LCD_Write_Command(0x06); //输入方式选择指令,数据读写后AC自动+1, //输出显示保持不变 Delay_1ms(1); LCD_Write_Command(0x0c); //开显示,关光标,关闪烁 Delay_1ms(1); uchar i=0; if(y==0) LCD_Write_Command(0x80|x); if(y==1) LCD_Write_Command(0xc0|x); for(i=0;i<16;i++) { } LCD_Write_Data(*(str+i)); 38 附录三 英文科技文献翻译 英文原文 STC89C52 processing chip First performance: With the MCS-51 single-chip product compatibility, 8K bytes in-system programmable Flash memory, a 1000 erase / write cycles, all static operation: 0Hz~33Hz, three level of encryption program memory, a 32 programmable I/O line, three of 16 timer / counter, eight interrupt sources, full duplex UART serial channel, low idle power and power-down mode, the power-down after intermittent can wake up, watchdog timer, dual numerical indicator, power-down identifier. Features description: STC89C52 is a low power, high performance CMOS8 microcontroller, with 8K in system programmable Flash memory. Trial of high density non-volatile storage technology, and industrial 80C51 product instruction and pin compatibility. On chip Flash allows the program memory in system programmable, also suitable for conventional programmer. In a single chip, with flexible 8 bit CPU and online system programmable Flash, make STC89C52 for many embedded control applications with high flexibility, super useful solution. STC89C52 has the following standard efficacy: 8K Flash RAM bytes, 256 bytes, 32 bits I/O port line, watchdog timer, 2 numerical indicator, three 16 timer / counter, a 6 vector 2 discontinuous structure, full duplex serial port on-chip oscillator and clock circuit. In addition, STC89C52 will be 0Hz static logic operations, supports two software selectable power saving mode. In idle mode, CPU stops working, allowing RAM, timer / counter, serial, discontinuous continue to work. Power off protection way, RAM contents are survival, vibrator is frozen, SCM working together to stop, know the next intermittent or hardware reset. 8 bit microcontroller 8K bytes in-system programmable Flash STC89C52. P0: P0 mouth is a 8 open drain bidirectional I/O export. As the output port, each can drive 8 TTL logic level. The P0 port write \"1\"when, as a high impedance input 39 pins. When accessing the external program and numerical memory, P0is also used as a low8 bits of the address / numerical multiplexing. In this mode, the P0features internal pull-up resistors. In flash programming, P0 is also used to absorb the instruction bytes; in the calibration procedures, the output byte instruction. Program check, the need for an external pull-up resistor. P1: P1entrance to a internal pull-up resistor8 bidirectional I/O, P1output buffer can drive four TTL logic level. For the P1port to write \"1o port pulled high, at this time can be used as input and export use. Used as input, by external low pin due to internal resistance, the output current. In addition, P1.0 and P2.0 were used as the timer / counter 2 external input count ( P1.0/T2) and the timer / counter 2 trigger input ( P1.1/T2EX ), specifically as shown in the following table. In the flash programming and verification, P1 oral absorption of low 8 address byte. Pin number second: P1.0 T2 ( timer / counter T2 external technical input ), clock output P1.1 T2EX ( timer / counter T2capture / heavy trigger signal and direction control ) P1.5MOSI ( online system programming ) P1.6MISO ( online system programming ) P1.7SCK ( online system programming ) P2: P2is an internal pull-up resistor8 bidirectional I/O, P2output buffer can drive four TTL logic level. For the P2port to write \"1\pulled high, at this time can be used as input and export use. Used as input, by external low pin due to internal resistance, the output current. During a visit to an external program memory or the16 address bits read from the external memory when numerical, P2sends the high eight bits of the address. In this application, I use P2 strong internal pull-up sent1 when using 8 bits of the address to access the external value memory, the output port P2P2 latch content. In the flash 40 programming and the check, P2also absorbs the high8 bits of the address byte and the number of control signals. P3: P3is an internal pull-up resistor8 bidirectional I/O, P3buffer can drive four TTL logic level. For the P3port to write \"1\high, at this time can be used as input to use. Used as input, by external low pin due to internal resistance, the output current. P3export as STC89C52special effects ( second efficiency), as shown in the following table. In the flash programming and the check, P3also absorbs some of the control signal. Port pin second: P3.0RXD ( serial input port ) P3.1TXD ( serial output ) P3.2INTO ( external fault0) P3.3INT1( external fault1) P3.4TO ( timer / counter 0) P3.5T1( timer / counter 1) P3.6WR ( external value memory write strobe ) P3.7RD ( external value memory read strobe ) In addition, P3also absorbed some for FLASH flash memory programming and verification process control signal. RST reset input: when the vibrators work, RST pin two collect cycle above high level will be chip reset. ALE/PROG -- when accessing the external program memory or numerical memory, ALE ( address latches allow ) output pulses are used to latch the address the low 8 bits of the byte. In general, ALE still to watch the vibration frequency of the1/6 output fixed pulse signal, so it can be for external output clocks or used for timing purposes. More important is: when accessing an external numerical memory will skip a ALE pulse. For FLASH memory during programming, the pin is used to input programming pulse ( PROG ). If necessary, can be adopted for the special function register ( SFR ) in the area of8EH unit in the D0position, may prohibit ALE operation. The position, 41 only one MOVX and MOVC instructions to ALE activation. In addition, the pin will be weak pulled high, microcontroller executing external program, should set the ALE bit is prohibited. PSEN -- program storage allowed (PSEN ) output is an external program memory read strobe signal, when STC89C52 by an external program memory instruction fetch or value, each machine cycle to two PSEN, whereby the output of two pulse, during this period, when accessing the external storage device numerical, will skip the two PSEN signal. EA/VPP -- allows for external access, to make CPU only accesses the external program memory ( address for the0000H-FFFFH ) EA end must be kept low level ( the ground ). Need to pay attention to is: if the encrypted LB1is programmed, reset internal latch EA end state. As of EA end is a high level ( VCC side), CPU performs internal program memory instruction. The FLASH programming of the memory, the pins are coupled to +12V programming allows a source Vpp, but this must be the component is the use of 12V programming voltage Vpp 中文翻译 STC89C52处理芯片 首要性能: 与MCS-51单片机产物兼容、8K字节在系统可编程Flash存储器、1000次擦写周期、全静态操作:0Hz~33Hz、三级加密程序存储器、32个可编程I/O口线、三个16位定时器/计数器、八个中断源、全双职工UART串行通道、低功耗空闲和掉电模式、掉电后间断可唤醒、看门狗定时器、双数值指针、掉电标识符。 功效特性描述: STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。试用高密度非易失性存储技术制造,与工业80C51产物指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。 42 在单芯片上,拥有灵巧的8位CPU和在线系统可编程Flash,使患上STC89C52为众多嵌入式控制应用系统提供高矫捷、超有用的解决方案。STC89C52具有以下标准功效:8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数值指针,三个16位定时器/计数器,一个6向量2级间断结构,全双职工串行口,片内晶振及钟表电路。另外,STC89C52可将至0Hz静态逻辑操作,支持两种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、间断继续工作。掉电保护体式格局下,RAM内容被生存,振动器被冻结,单片机一起工作停止,知道下一个间断或者硬件复位为止。8位微控制器8K字节在系统可编程Flash STC89C52。 P0 口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对于P0口写入“1”时,引脚用作高阻抗输入。 当访问外部程序和数值存储器时,P0口也被作为低8位地址/数值复用。在这种模式下,P0具有内部上拉电阻。 在flash编程时,P0口也用来吸收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。 P1口:P1口是要一个具有内部上拉电阻的8位双向I/O口,P1输出缓冲器能驱动四个TTL逻辑电平。对于P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流。 此外,P1.0和P2.0分别作定时器/计数器2的外部计数输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX),具体如下表所示。在flash编程和校验时,P1口吸收低8位地址字节。 引脚号第二功效: P1.0T2(定时器/计数器T2的外部技术输入),钟表输出 P1.1T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制) P1.5MOSI(在线系统编程用) P1.6MISO(在线系统编程用) P1.7SCK(在线系统编程用) P2口:P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能 43 驱动四个TTL逻辑电平。对于P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流。 在访问外部程序存储器或者用16位地址读取外部数值存储器时,P2口送出高八位地址。在这种应用中,P2口使用很强的内部上拉发送1.在使用8位地址访问外部数值存储器时,P2口输出P2锁存器的内容。在flash编程和校验时,P2口也吸收高8位地址字节和一些控制信号。 P3口:P3口是一个具有内部上拉电阻的8位双向I/O口,P3出缓冲器能驱动四个TTL逻辑电平。对于P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用.。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流。P3口亦作为STC89C52特殊功效(第二功效)使用,如下表所示。在flash编程和校验时,P3口也吸收一些控制信号。 端口引脚第二功效: P3.0RXD(串行输入口) P3.1TXD(串行输出口) P3.2INTO(外间断0) P3.3INT1(外间断1) P3.4TO(定时器/计数器0) P3.5T1(定时器/计数器1) P3.6WR(外部数值存储器写选通) P3.7RD(外部数值存储器读选通) 此外,P3口还吸收一些用于FLASH闪存编程和程序校验的控制信号。 RST复位输入:当振动器工作时,RST引脚出现两个集齐周期以上高电平将是单片机复位。 ALE/PROG——当访问外部程序存储器或者数值存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以钟表振动频率的1/6输出固定的脉冲信号,因此它可对于外输出钟表或者用于定时目的。更重要的是:每当访问外部数值存储器时将跳过一个ALE脉冲。 对于FLASH存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有 44 必要,可通过对于特殊功能寄存器 (SFR) 区中的8EH单位的D0位置位,可禁止ALE操作。该位置位后,只有一条MOVX和MOVC指令才将ALE激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。 PSEN——程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当STC89C52由外部程序存储器取指令或者数值时,每一个机器周期两次PSEN用,即输出两个脉冲,在此期间,当访问外部数值存储器,将跳过两次PSEN信号。 EA/VPP——外部访问允许,欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH)EA端必须保持低电平(接地)。需注重的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。 如EA端为高电平(接VCC端),CPU则执行内部程序存储器的指令。 FLASH存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该部件是使用12V的编程电压Vpp。 45 因篇幅问题不能全部显示,请点此查看更多更全内容