陕西国防工业职业技术学院单片机课程实训报告专业:班级:姓名:学号:指导老师:陈巧莉刘慧梅实训地点:8-5047-502成绩:基于AT89C51单片机的多音阶电子琴组长:薛群浩成员:张艳君、王建文、谭欢、许国梁、侯强、马飞、郭力分工:1.程序:谭欢、薛群浩2.程序画图:谭欢、张艳君、薛群浩3.连线:许国梁、王建文、侯强4.调试:郭力、马飞5.报告:谭欢、王建文一摘要介绍了用单片机实训微型电子琴的方法。给出了电路、程序框图及程序。本实训包括单片机学习的外设,如独立键盘、矩阵键盘、扬声器等。关键词:单片机,电子琴,程序。二实训要求实训一个简易电子琴。(1)用喇叭发1、2、3、4、5、6、7、ⅰ。(2)要求按下按键发声,松开延时一段时间停止。(3)中间再按别的键则发另一音调的声音。(4)键盘输入功能。(5)按键同时对应指示灯点亮,按键结束,指示灯熄灭。三方案实训1.音乐产生原理由于一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。本次实训中单片机晶振为12MHZ,那么定时器的计数周期为1MHZ,假如选择工作方式1,那T值便为T=216--5﹡105/相应的频率,那么根据不同的频率计算出应该赋给定时器的计数值,列出不同音符与单片机计数T0相关的计数值如下表所示:按键音阶参数S1中音do108S2中音re102S3中音mi91S4中音fa86S5中音so77S6中音la68S7中音xi61S8高音do572.方案实训(1)方案一:采用CPLD外接扬声器、键盘、数码管等。8个译码输出显示的数码管,以显示目标芯片的32位输出信号,且8个发光管也能显示目标器件的8位输出信号。时钟为50MHz,输出接扬声器。具体过程:主系统可由两个模块组成:当系统检测到有按键按下时,对应音符的频率由模块1获得,这是一个数控分频器。由其clk端输入一具有较高频率的信号,分频后输出。音符的持续时间须根据乐曲的速度及每个音符的节拍数决定,模块2的功能是为模块1提供决定所发音的分频预置值,而此数在模块1输入口停留的时间即为此音符的节拍值。(2)方案二:采用单片机外接扬声器、键盘、数码管等。具体过程:当系统扫描到键盘上有键子被按下,则快速检测出是那一个键子,然后单片机的定时器被启动,发出一定频率的脉冲,该频率的脉冲经喇叭驱动电路放大滤波后,就会发出相应的音调。如果在前一个按下的键发声的同时有另一个键被按下,则启用中断系统,前面键的发音停止,转到后按的键的发音程序,发出后按的键的音。3.方案选择对比两套方案各有优缺点,方案一采用CPLD,工作速度快,系统稳定,效果好,但是其价格昂贵;而方案二在实训这样小型电子系统方面,无论是效果还是工作速度与方案一都相差不大,而且价格较为便宜。因此,选择方案二即单片机加外设的方式实训该系统较好。四系统实训框图实训图1基于AT89C51单片机的多音阶电子琴系统框图图2电子琴键盘功能图五系统硬件实训根据实训题目要求,该系统需要涉及如下几个方面:(1)电源部分(2)单片机部分(3)音频功放部分(4)扬声器、键盘部分1.电源部分实训由于本系统构造简单,不宜使用自制或者购买的5v稳压电源,采用三节5号电池供电即可。2.单片机部分实训根据本系统的特点,采用AT89S51单片机即可完成全部功能。AT89S51是一个低功耗,高性能CMOS8位单片机,片内含4kBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,AT89S51在众多嵌入式控制应用系统中得到广泛应用。AT89C51单片机引脚图见下图:(1)主要特性与MCS-51兼容4K字节可编程闪烁存储器寿命:1000写/擦循环数据保留时间:10年全静态工作:0Hz-24Hz三级程序存储器锁定128*8位内部RAM32可编程I/O线两个16位定时器/计数器5个中断源可编程串行通道低功耗的闲置和掉电模式片内振荡器和时钟电路(2)管脚说明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口除了作为普通I/O口,还有第二功能:P3.0RXD(串行输入口)P3.1TXD(串行输出口)P3.2/INT0(外部中断0)P3.3/INT1(外部中断1)P3.4T0(T0定时器的外部计数输入)P3.5T1(T1定时器的外部计数输入)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:来自反向振荡器的输出。(3)振荡器特性XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。(4)芯片擦除整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。此外,AT89S51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。3.音频部分实训利用三极管的放大作用和扬声器相连构成。六软件实训1.程序流程图主程序流程图和T0中断服务流程图如图2-5所示开始T0初始化并开T0中断按键按下成功否?识别按键功能根据按键功能,装入音符T值到T0中启动T0工作按键释放成功否?停止T0工作中断返回P1.0取反重装T0初值T0中断入口NNYY(a)主程序流程图(b)T0中断服务程序流程图图-5主程序和T0中断服务程序流程图(1)4×4矩阵键盘识别处理键盘只简单地提供按键开关的行列矩阵。有关按键的识别、键码的确定与输入、去抖等功能均由软件完成。每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线通过P2口和单片机相连。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么,还要消除按键在闭合或断开时的抖动。通过行线输出扫描码,使按键逐行动态接地,列线输入按键状态,无键按下,列线输入1,有键按下,列线输入0,由行扫描值和列线的回馈信号共同形成键编码而识别按键,通过软件查表,查出该键功能。(2)如何产生音频信号一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,要产生音频脉冲,只要算出某一音频的周期(1/频率),将此周期除以2,即为半周期的时间,然后利用定时器定时此半周期时间,每当定时时间到后就将输出脉冲的I/O反相,不断重复,就可在I/O引脚上得到此频率的脉冲。利用AT89S51单片机内部的定时器T0,让其工作在定时模式方式1下,改变计数值,就可以产生不同频率的音频信号,从而构成所想要的音乐。AT89S51单片机采用12MHZ晶振,高中低音符与单片机计数T0相关的计数值如表2-2所示。表2-2音符频率表音乐的音拍以节拍为单位(C调),曲调值如表2-3所示。电子琴原理框图电子琴工作框图系统程序:#includereg51.h#includeintrins.h#defineuintunsignedint#defineucharunsignedcharsbitSPK=P1^0;//P1.0外接扬声器uintFreqTemp;unsignedintcodeFreqtab[]={//定时半周期的初始值64021,64103,64260,64400,//低音345664524,64580,64684,64777,//低音7,中音12364820,64898,64968,65030,//中音456765058,65110,65157,65178};//高音1234ucharKeyscan(void){uchari,j,temp,Buffer[4]={0xfe,0xfd,0xfb,0xf7};for(j=0;j4;j++){//循环四次,扫描四行P2=Buffer[j];//在低四位分别输出一个低电平_nop_();temp=0x80;//计划先读出P2.0位for(i=0;i4;i++){//循环四次,检查四列if(!(P2&temp)){//从高四位,截取1位return(i+j*4);//返回取得的按键值}temp=1;//换右边一位}}return16;//没有键按下就返回16}voidMain(void){ucharKey_Value=16,Key_Temp1,Key_Temp2;//读出的键值TMOD=0x01;//T0定时方式1ET0