版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
-.z1绪言目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的平安保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械以及各种智能机械了。因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域。琴弦音频测定仪的设计正是以单片机为核心,通过其他的外围电路实现琴弦的准确调弦。1.1课题研究的背景和意义作为乐器家族中弦乐器的一员,吉他是一种通过拨动上面一根根的琴弦发出声音的有弦的演奏乐器。弹奏时用一只手拨动琴弦,另一只手的手指抵在指板上,后者是覆盖在琴颈上的金属小条。弹奏出来的声音会通过吉他的共鸣箱得到增强。吉他在不压弦时所弹出来的音,叫吉他的空弦音。吉他是一种十二平均律乐器,钢琴也是,目前绝大多数的音乐场合都是在使用十二平均律。吉他、小提琴等弦乐器经常需要进展校音,通过调节弦的*力来调节弦的振动频率(即空弦音的音高)。作为一个吉它手,调音是必备技术之一,很难想象,一个吉它手每次弹琴前都需要别人替他调弦,那可真是不可思议。关于调音的方法,主要有以下几类:〔1〕六音笛法〔2〕单音笛法〔3〕听音法〔4〕听自然泛音法〔5〕看弦法以上几种方法可以根据不同情况加以采用。其共同的要求是调弦者的听音能力要好,对初学音乐或者音阶听力不是很好的人来说掌握起来有一定的困难。本设计针对这一问题,设计一个琴弦频率智能测试仪,可以帮助初学者或音阶听力不好的人准确、快速地校准琴弦频率,而且体积小,携带和使用都很方便。1.2课题研究开展方向市场上存在类似的琴弦音频测定仪设备,与我们设计的琴弦频率智能测试仪相比,它们的缺点是体积较大,对使用环境要求苛刻,耗电大,价格昂贵等。制作了以单片机为核心的电子校音器,通过LCD液晶显示屏更加直观地显示。以其大量的显示信息量、寿命长、耗电量小、重量轻、空间尺寸小、稳定性高、易于操作、携带和维护等特点可以在市场上取代老式的测试仪。1.3课题研究的内容琴弦频率智能测定仪实现功能:测定仪对琴弦每根弦的空弦音频率进展计算判断,并通过液晶显示模块把频率显示在屏幕上,再用语音模块进展语音提示,从而让使用者明白调整方向及幅度,反复调整,直至将琴弦频率调准。2琴弦频率智能测定仪的总体设计从图1.1可以看出,本设计可以分为四大模块,分别为声音采集模块、核心控制模块、语音模块设计、外围辅助电路模块。图2.1系统总框图〔1〕声音采集模块的设计:这局部是利用单片机测量琴弦频率的前提,主要功能是将要采集的声音信号转换成可测量的电信号。要保证转换的精度,还要处理好电路本身产生的谐波。电路应该有根本的放大、滤波、比拟电路的设计。〔2〕核心控制模块的设计:这局部属于系统的软件局部设计。主要是控制芯片的选择和编程语言的选择。通过单片机控制各个子模块的正常工作,实现需要的功能是需要解决的重点。子模块包括:键盘模块、LCD12864显示模块、频率测量模块、PC机通信模块。〔3〕语音模块设计:内部存储每根琴弦所发出的标准频率声音的数据,可以对每根琴弦发出的声音进展录音,也可以播放声音。在单片机处理完数据输出到液晶显示器,语音模块同时发出对应弦的频率。〔4〕外围辅助电路的设计:这局部都是系统的硬件局部设计,包括复位晶振电路、电源电路、液晶显示电路、语音播报电路、按键控制电路等。需要合理将这些电路准确组合并能够实现各自所需的功能。根据设计任务,以及方案的研究,我们最终确定了以下方案:晶振和复位电路:晶振作用是为系统提供根本的时钟信号,通常一个系统共用一个晶振,便于各局部保持同步。复位是单片机的初始化操作。通过选择的控制芯片设计适宜的晶振和复位电路。键盘电路:电路设计了6个按键,直接与I/O口相连,其中2个按键用作选弦和选调,1个按键作为确认键,其余3个按键用来扩展功能。由于所用到的按键不多,I/O口线数量足够,所以键盘电路采用独立式按键。显示电路:主要由LCD12864构成,可以将声音频率显示在LCD屏幕上,看起来清楚明了。能够直观的得出琴弦的频率,以便对它进展调整。语音模块电路:可以将所测定声音与标准声音比拟,发出语音提示。内部存储着每根琴弦所发出声音的标准频率的数据,在单片机处理完数据后输出到液晶显示屏的同时,语音模块播放出当前所测弦的频率。电源电路:可以使用多种方式供电,如:稳压电源供电,USB供电,电池供电。可以随身携带,随时使用,快捷方便。串口电路:使用MA*232芯片设计一个简单的串口下载电路,为了方便单片机程序的下载。3琴弦频率智能测试仪的软件设计3.1软件程序编程语言及开发环境选择以往的单片机系统,其控制程序大多是用相应单片机的汇编指令编制,其执行效率高,但其可读性和可移植性却较差,直接影响其软、硬件的扩展和升级。C语言早期用于编写UNI*操作系统,是一种构造化的语言,可产生紧凑代码。C语言可用许多机器级的函数直接控制操作单片机的硬件,不必通过汇编语言。与汇编语言相比,C语言主要有以下一些优点有:不要求了解单片机的指令系统,仅要求对其存储器构造有初步了解;存放器分配、存储器寻址及数据类型等细节可由编译器管理;程序由不同的函数构成,便于程序的构造化和模块化;程序的可读性及可移植性较高;关键字及运算符可用近似人的思维方式使用;程序编制及调试时间显著缩短,大大地提高了编程效率;C语言提供的库包含许多标准的子程序,具有较强的数据处理能力。C语言是一种非常便于使用的计算机高级编程语言,使用C语言进展单片机尤其是MCS-51系列单片机的开发具有极大的优势。用C51编制程序时,应遵循构造化、模块化的设计方法。在编程时,可将任务分成假设干模块,对每个模块分别进展编制及调试,最后有机结合成一个完整的控制程序。KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、构造性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境〔uVision〕将这些局部组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WIN*P等操作系统。使用C语言编程么Keil几乎就是编程的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令编程事半功倍。3.2主程序模块设计3.2.1主程序模块实现的功能主程序模块实现的功能为:琴弦音频测定仪的校音工程为吉他六根弦的空弦音,琴弦音频测定仪开场工作时,先出现一个欢送界面。然后通过不停的对按键进展扫描,来判断哪个键按下,如果有相应的键按下,则执行相应程序并进展语音播报;如果没有一个键被按下,则返回按键扫描程序,继续进展按键扫描。3.2.2程序设计思想及说明通过一个按键来识别每种不同的功能,给每个不同的功能模块用不同的ID号标识,每按下一次按键,ID的值是不一样的,单片机识别不同功能的身份了。当我们按下待测琴弦切换键后,变量ID的值就不断的加一,通过不同的ID值,分别控制六根弦频率的显示和语音提示。主要使用的语句有:A.while〔1〕{}这是个死循环语句,通过这个语句循环调用键盘函数,不断判断是否有按键按下;调用显示函数进展液晶显示和调用语音播放函数进展语音提示。Bdo{}while(...)它是先执行一次指定的循环体语句,然后判别表达式。当表达式的值为非零(“真〞)时,返回重新执行循环体语句,如此反复,直到表达式的值等于0为止,此时循环完毕。C.if语句的3种形式〔1〕if〔...〕语句〔2〕if〔...〕语句1else语句2〔3〕if〔...〕语句1elseif〔...〕语句2elseif〔...〕语句3┆elseif〔...〕语句melse语句nif语句是用来判定所给定的条件是否满足,根据判定的结果〔真或假〕决定执行给出的两种操作之一。同硬件设计一样,软件设计也是分模块进展的。主要包括系统主程序、录音子程序模块、键盘扫描程序模块、频率测量程序、lcd12864显示子程序模块,语音播报程序等。各局部程序由主程序调用,组成一个整体。程序整体构造清晰、简洁、流程合理,各种功能的实现采用模块化,子程序化,便于阅读连接修改。按总体要求划分出各功能程序模块,分别确定主程序,子程序。图3-1是系统总流程图。首先需要进展系统初始化设置,初始化后就进入循环。在这里通过判断相应的键值来进入各子程序。具体来说,就是电路通电后,单片机内部进展初始化,显示一个欢送界面。然后不停对键盘进展扫描,判断确认测量键是否有按下,当该键按下时,进展琴弦频率的测量和显示,同时进展语音提示。完毕后返回按键扫描程序;如果确认键没有按下,则再返回按键扫描程序,继续判断是否有按键按下。通过这样不停的循环就可以到达琴弦频率的测量。单片机主程序流程图如图3.1所示。图3.1单片机主程序流程图3.3显示模块设计液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用。本设计用的是12864液晶模块,12864液晶模块是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成。可完成图形显示,也可以显示8×4个(16×16点阵)汉字。128×64点阵液晶显示屏有三种控制器,分别是KS0107〔KS0108〕、T6963C和ST7920,三种控制器主要区别是:KS0107〔KS0108〕不带任何字库、T6963C带ASCII码,ST7920带国标二级字库〔8千多个汉字〕。
12864点阵型液晶对应的DDRAM有1024个地址,无论是显示字符还是图片,灵活设置起始页地址和Y地址,可以到达想要的结果。比起传统的液晶显示屏1602只能显示数字与字符,不可以显示汉字,12864点阵型液晶显示频可根据需求任意显示字符与数字,汉字与图形。所以我们选用12864液晶模块来完成显示。3.3.1LCD12864显示模块实现的功能LCD12864显示模块实现的功能为:在开场时显示欢送界面,如图3.2欢送界面。图3.2欢送界面按下选弦键,显示当前测量的弦号,通过按键控制选弦。按下选调键,显示当前的音调,在第二行显示当前琴弦的音调,通过按键控制选调。如图3.3选弦选调界面。图3.3选弦选调界面进展琴弦频率测量时,在第一行显示琴弦标准频率,在第二行显示当前测量的实际频率,进展频率的误差计算,如图3.4频率显示界面.图3.4频率显示界面这里我们主要对显示芯片写操作,所以WRD端保持为低电平。读操作时序图如图3.5所示,写操作时序图如图3.6所示。图3.5读操作时序图图3.6写操作时序图3.3.2程序设计说明无论是字符型还是点阵型LCD,其根本原理都是通过将数据写入所对应的DDRAM地址中来显示所需要的图形或是字符。12864点阵型液晶对应的DDRAM有1024个地址,当需显示的字符或图片已转为二进制数据时,确定将数据写入对应的DDRAM地址就是要做的工作。数据按字节在屏幕上是竖向排列的。上方为低位,下方为高位。因此在横向上(也就是Y)就一共是128列数据。分为CS1和CS2两个64列来写入。在竖方向上(也就是*)一字节数据显示8个点,竖向64个点分为8个字节,称做8页(*=0-7)。了解这些后我们就知道要满屏显示一*图就要从y=0…127、*=0…7一共写128×8=1024个字节的数据。同样在AT89S51中存一*图就要1024个字节的空间。如图3.712864的DDRAM地址图3.712864的DDRAM地址它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。单片机控制的管脚来显示想要的字符和图像,用来发送必要的指令和数据,单片机控制12864的管脚来显示想要的字符和图像,P0用来发送必要的指令和数据,写数据,P2口协助P1口给12864写数据,指令存放器(IR)1.指令存放器(IR)是用于存放指令码,与数据存放器数据相对应。IR是用于存放指令码,与数据存放器数据相对应。当D/I=0时,在E信号下降沿的作用下,指令码写入IRIR。降沿的作用下,指令码写入IR。数据存放器(DR)2.数据存放器(DR)是用于存放数据的,与指令存放器存放指令相对应。DR是用于存放数据的,与指令存放器存放指令相对应。当D/I=1时,在下降沿作用下,图形显示数据写入DR或在E信号高电平作用下由DR读到DB7DR,DB7∽沿作用下,图形显示数据写入DR,或在E信号高电平作用下由DR读到DB7∽DB0数据总线。之间的数据传输是模块内部自动执行的模块内部自动执行的。数据总线。DR和DDRAM之间的数据传输是模块内部自动执行的。忙标志:3.忙标志:BF标志提供内部工作情况。表示模块在内部操作,BF标志提供内部工作情况。BF=1表示模块在内部操作,此时模块不承受外部指令和数据。模块为准备状态,随时可承受外部指令和数据。指令和数据。BF=0时,模块为准备状态,随时可承受外部指令和数据。利用STATUS指令,可以将BF读到DB7总线,从检验模块之工作状态。利用STATUSREAD指令,可以将BF读到DB7总线,从检验模块之工作状态。显示控制触发器DFF4.显示控制触发器DFF此触发器是用于模块屏幕显示开和关的控制。为开显示〔OFF〕,此触发器是用于模块屏幕显示开和关的控制。DFF=1为开显示〔DISPLAYOFF〕,的内容就显示在屏幕上,为关显示〔OFF〕。DDRAM的内容就显示在屏幕上,从图3.8显示模块流程图可以看出利用LCD12864芯片显示时,首先对LCD12864液晶显示芯片初始化字库等,经过延时后,开启全屏,通过P0口传输数据显示。图3.8显示模块流程图主要使用的根本指令有:指令1:清显示,指令码01H,光标复位到地址00H位置
指令2:光标复位,光标返回到地址00H
指令3:光标和显示模式设置I/D:光标移动方向,高电平右移,低电平左移S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效指令4:显示开关控制。D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:控制光标的开与关,高电平表示有光标,低电平表示无光标B:控制光标是否闪烁,高电平闪烁,低电平不闪烁指令5:光标或显示移位S/C:高电平时移动显示的文字,低电平时移动光标指令6:功能设置命令DL:高电平时为4位总线,低电平时为8位总线N:低电平时为单行显示,高电平时双行显示F:低电平时显示5*7的点阵字符,高电平时显示5*10的点阵字符指令7:字符发生器RAM地址设置指令8:DDRAM地址设置指令9:读忙信号和光标地址BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。LCD初始化
包含开显示〔0*3F〕,起始行〔0*C0),设置起始页地址〔0*B8〕和Y地址〔0*40〕,即分别向LCD的左右半屏写命令。可按括号内的数据进展初始化。具体可查阅12864的PDF资料。
清屏〔向DDRAM所有地址写0〕显示一幅新图片前必须清屏,否则之前显示的数据仍存在于液晶上。LCD12864初始化流程图如图3.9图3.9LCD12864的初始化流程图LCD12864欲在*一个位置显示字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。显示ASCII字符过程与显示中文字符过程一样。不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。当字符编码为2字节时,应先写入高位字节,再写入低位字节。
模块在接收指令前,向处理器必须先确认模块内部处于非忙状态,即读取BF标志时BF需为“0〞,方可承受新的指令。如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。“RE〞为根本指令集与扩大指令集的选择控制位。当变更“RE〞后,以后的指令集将维持在最后的状态,除非再次变更“RE〞位,否则使用一样指令集时,无需每次均重设“RE〞位。C文件中定义如下:*defineWD1*BYTE[0*F5FF]
定义了总线地址后,对外部地址的操作变得非常简单。
如向左半屏写数据0*FF : WD1=0*FF
读左半屏数据 : data=RD1〔data存储读取到的数据〕3.3.3LCD12864初始化关键程序voiddelay(uintz) // 延时函数{ uint*,y; for(*=z;*>0;*--) for(y=110;y>0;y--);}voidwrite_(uchar) // 命令函数{ lcdrs=0; P0=; //传输指令 delay(5); //延时5ms lcden=1; //使能端为高电平 delay(5); // 延时5ms lcden=0; // 使能端变为低电平}voidwrite_data(uchardate) // 数据函数{ lcdrs=1; // rs=1的时为写数据 P0=date; delay(5); lcden=1; delay(5); lcden=0;}voidlcd_init() // 初始化 { lcden=0; write_(0*38); //显示模式设置 write_(0*0e); //开显示,显示光标,光标不闪烁write_(0*06); //当写一个字符后地址指针加一,且光标加一,整屏显示不移动 write_(0*01); //清屏 write_(0*80);}3.4琴弦频率测量模块设计3.4.1频率测量方法的选取测量频率的方法一般分为无源测频法、有源测频法及电子计数法三种。无源测频法(又可分为谐振法和电桥法),常用于频率粗测,精度在1%左右。有源比拟法可分为拍频法和差频法,前者是利用两个信号线性叠加以产生拍频现象,再通过检测零拍现象进展测频,常用于低频测量,误差在零点几Hz;后者则利用两个非线性信号叠加来产生差频现象,然后通过检测零差现象进展测频,常用于高频测量,误差在±20Hz左右。以上方法在测量*围和精度上都有一定的缺乏,而电子计数法主要通过单片机进展控制。由于单片机的较强控制与运算功能,电子计数法的测量频率*围宽,精度高,易于实现。本设计就是采用单片机电子计数法来测量琴弦频率。3.4.2频率测量程序设计说明利用单片机的T0、T1的定时计数器功能,完成对输入的信号进展频率计数。频率的测量方法:通过检测一定时间内〔1s内〕输入方波的个数计算琴弦频率。T0主要功能时进展计数,T1是进展计时。T0是工作在计数状态下对输入的方波信号进展计数,但对工作在计数状态下的T0,最大计数值为fOSC/24,由于fOSC=12MHz,因此,T0的最大计数频率为250KHz,满足设计要求。对于频率的概念就是在一秒时间内输入脉冲的个数,即为频率值。设定T1工作在定时状态下,每定时1秒到,就停顿T0的计数,并从T0的计数单元中读取计数的数值即为琴弦的频率。T1工作在定时状态下,最大定时时间为65ms,达不到1秒的定时,所以采用定时50ms,共定时20次,即可完成1秒的定时功能。琴弦频率测量流程图如图3.6。定时/计数器T0由TH0和TL0构成,T1由TH1和TL1构成。TMOD用于控制和确定T0,T1的功能和工作模式。TCON用于控制T0、T1启动和停顿计数,同时包括T0、T1的状态。他们属于特殊功能存放器,这些存放器的内容靠软件预先设置。系统复位时,存放器的所有位都被清零。定时/计数器T0和T1都是加法计数器,每输入一个脉冲,计数器加1,当加到计数器T1为1时再输入一个脉冲,就使计数器发生溢出,溢出时,计数器回零,并置位TCON中的TF0或TF1,以表示定时时间已到或计数值已满,向CPU发出中断申请。设计数器的最大值为M(在不同的工作模式下,M可以为,或),则置入的初值*可这样来计算。计数方式时*=M-计数值定时方式时计数值T=〔M-*〕T=定时值所以置入的初值*=M-(定时值/T)T为计数周期,是单片机的机器周期。当机器周期为1时,工作在模式0时,最大定时值为假设工作在模式1,则最大定时值为。吉他的几根弦标准频率如下所示:1弦空弦,音高e1,频率f=440.0000/2^(5/12)=329.6276Hz2弦空弦,音高b,频率f=440.0000/2^(10/12)=246.9417Hz3弦空弦,音高g,频率f=440.0000/2^(14/12)=195.9977Hz
4弦空弦,音高d,频率f=440.0000/2^(19/12)=146.8324Hz
5弦空弦,音高A,频率f=440.0000/2^(24/12)=110.0000Hz
6弦空弦,音高E,频率f=440.0000/2^(29/12)=82.4069Hz根据课题要求,误差在5%左右,我们控制在5hz以内。琴弦频率测量流程图如图3.10图3.10琴弦频率测量流程图先对TMOD存放器赋值,以确定定时器的工作模式是0还是1,即确定机器周期,从而设置定时器/计数器初值。直接将初值写入存放器的TH0,TL0或TH1,TL1,再根据需要,对存放器ET0,ET1置初值,开放定时器中断。最后对TCON存放器中的TR0或TR1置位,启动定时/计数器,置位以后,计数器T0,T1即按规定的工作模式和初值进展定时计数。琴弦频率测量子程序TMOD=0*15;//设定T0,T1工作模式TH0=0;//设定T0计数初值TL0=0;TH1=(65536-4000)/256;//设定T1初值TL1=(65536-4000)%256;TR1=1;//T1开场工作TR0=1; //T0开场工作ET0=1;//T0中断开ET1=1;//T1中断开EA=1;//开总中断voidt0(void)interrupt1using0//t0中断程序{T0count++;//计数值存在变量T0count中}voidt1(void)interrupt3using0//t1中断程序{TH1=(65536-4000)/256;TL1=(65536-4000)%256;timecount++;if(timecount==250)//定时1s{TR0=0;timecount=0;requency=T0count;//将计数值赋给变量requencyT0count=0;TR1=0;}}3.5键盘输入模块设计键盘输入模块实现的功能键盘输入模块实现的功能为:当键盘有键按下时,执行对应的子程序。如按下确认测量键时,则进展琴弦频率的测量。键盘输入模块程序设计说明键盘分编码键盘和非编码键盘。键盘上闭合键的识别由硬件编码实现,产生键编码号或键值的称为编码键盘,如计算机键盘;靠软件编程来识别的称为非编码键盘。在单片机组成的各种系统中,非编码键盘有分为:独立键盘和行列式〔又称为矩阵式〕键盘。在这里我们用到的是独立键盘,独立键盘具有电路配置灵活,软件构造简单等优点。键盘编程扫描法识别按键一般应包括以下内容:〔1〕判别有无键按下。〔2〕键盘扫描取得闭合键的行、列号。〔3〕用计算法或查表法得到键值。〔4〕判断闭合键是否释放,如没释放则继续等待。〔5〕将闭合键的键值保存,同时转去执行该闭合键的功能。在软件设计中,当单片机检测到有键按下时,可以先延时一段时间越过抖动过程再对按键识别。按键消抖一般有两种方法,即硬件消抖和软件消抖.实际应用中,一般希望按键一次按下单片机只处理一次,但由于单片机执行程序的速度很快,按键一次按下可能被单片机屡次处理。为防止此问题,可在按键第一次按下时延时10ms之后再次检测按键是否按下,如果此时按键仍然按下,则确定有按键输入。这样便可以防止按键的重复处理。软件消抖流程图如图3.11所示。按键处理方式有以下两种:第一种方法是不断地查询按键,有按键按下时进展消抖处理,再判断是否真的有按键按下。这种方法在按键查询期间不能做任何其他操作。第二种方法是每隔一段时间,抽样检测一次,对键值进展判别处理。独立式按键是各按键相互独立,每个按键单独占用一根I/O口线,每根I/O口线的按键工作状态不影响其他I/O口线上的工作状态,通过检测输入线的电平状态可以很容易判断哪个按键被按下了。按键在闭合和断开时,触点会存在抖动现象,如图3.12在编程操作中我们要进展消抖。软件消抖流程图如图3.11图3.12按键波形图所以在编程操作中我们要进展消抖。按键去抖如图3.13.按键去抖流程图〔a〕检测按键〔b〕释放按键图3.13按键去抖流程图键盘输入模块初始化流程图如图3.14图3.14键盘输入模块初始化流程图键盘扫描关键程序voidjianpan(){while(1){if(!key1){delay1ms(10);//去抖动if(!key1)//检测按键确实按下,进展按键处理{LED1=0;while(!key1);//松手检测LED1=1;}}if(!key2){delay1ms(10);//去抖动if(!key2)//检测按键确{LED2=0;while(!key2);//松手检测LED2=1;}}if(!key3){delay1ms(10);//去抖动if(!key3)//检测按键确实按下,进展按键处理{LED3=0;while(!key3);//松手检测LED3=1;}}}}3.6语音提示模块设计3.6.1语音提示模块功能语音提示模块功能为:智能琴弦调试仪开场工作时,先进展初始化。当按下确认测量键时,显示模块进展测量显示,根据频率计算出的琴弦频率,语言提示当前琴弦频率是偏高,偏低,还是标准状态。语音提示模块程序设计说明本设计分段录入语音,通过将琴弦测量频率与标准频率进展比拟,根据不同的三种情况,播放对应的语音内容。主控单片机主要通过四线〔SCLK,MOSI,MISO,/SS〕SPI协议对ISD1700进展串行通信。ISD1700作为从机,几乎所有的操作都可以通过SPI协议来完成。此外,还有一些命令可以APC存放器,用来设置芯片模拟输入的方式[。协议要求数据在时钟上升沿移入,在下降沿移出,即在时钟上升沿锁存MOSI引脚的数据,写入命令字;在下降沿将数据送至MISO引脚,读取状态字。单片机的串行口方式0与其要求是一致的。命令字的高5位为操作码,低11位为操作地址。状态字的最高2位分别是溢出标志OVF和信息段末尾标志EOM,紧跟其后的是行地址计数器的值。分段录入语音,通过将琴弦测量频率与标准频率进展比拟,根据不同的情况播放对应语音提示内容。主控单片机主要通过四线〔SCLK,MOSI,MISO,/SS〕SPI协议对ISD1700进展串行通信。ISD1700作为从机,几乎所有的操作都可以通过SPI协议来完成。此外,还有一些命令可以APC存放器,用来设置芯片模拟输入的方式。协议要求数据在时钟上升沿移入,在下降沿移出,即在时钟上升沿锁存MOSI引脚的数据,写入命令字;在下降沿将数据送至MISO引脚,读取状态字。单片机的串行口方式0与其要求是一致的。命令字的高5位为操作码,低11位为操作地址。状态字的最高2位分别是溢出标志OVF和信息段末尾标志EOM,紧跟其后的是行地址计数器的值。ISD1700系列的SPI串行接口操作遵照以下协议:a.一个SPI处理开场于/SS管脚的下降沿b、在一个完整的SPI指令传输周期,/SS管脚必须保持低电平;c、数据在SCLK的上升沿所存在芯片的MOSI管脚,在SCLK的下降沿从MISO管脚输出,低位先出;d、SPI指令操作码包括命令字节、数据字节和地址字节,取决于1700的命令类型;e、当命令字及地址数据输入到MOSI管脚时,同时“状态存放器〞和当前地址信息从MISO管脚输出;f、一个SPI处理在/SS变高后启动;g、在完成一个SPI命令的操作后,会启动一个中断信息,且持续为低,直到芯片收到CLR_INT指令或复位。空闲状态下:/SS=HIGH;SCLK=HIGH;MOSI=LOWMEGA16L相关SPI存放器及设置:SPCR,SPI控制存放器:初始化为SPCR=0*78;意思是SPI中断不使能,SPI使能,低位先发,主机模式,SCK空闲高电平,起始沿〔下降沿〕采样。SPSR,SPI状态存放器:仅0位可读写,SPI2*=0,配合SPCR的0、1位为0,设置SCLK频率为4分频〔晶振〕。在SPI模式下,存储位置都可以通过行地址很容易的进展。主控单片机可以任何行地址。如果开场地址和完毕地址一样,那ISD1700将只在这一行进展操作。图3.15SPI协议格式在SPI命令输入到ISD1700前,SPI端口的状态应该保持如下状态:/SS=HIGH、SCLK=HIGH、MOSI=LOWSPI命令:一个SPI命令总是由第一个命令字节开场。命令字节中的bit4位〔LED〕是具有特殊用途的。这个bit4位可以控制LED的输出。如果使用者想开启这个操作LED的功能,则所有的SPI命令字都要将这个bit4位置1。在SPI模式下,存储位置都可以通过行地址很容易地进展。主控单片机可以任何行地址,包括存储SE音效的行地址〔0*000-0*00F〕。像SET_PLAY,SET_REC和SET_ERASE这些命令需要一个准确地起始地址和完毕地址。如果开场地址和完毕地址一样,则ISD1700将只在这一行进展操作。SET_ERASE操作可以准确地擦除在起始地址和完毕地址间的所有信息。SET_REC操作从起始地址开场录音,并完毕于完毕地址,并且在完毕地址自动加上EOM标志。同理,SET_PLAY操作从起始地址播放语音信息,在完毕地址返回。电路上电后,首先完成程序的初始化,随后查询按键状态,进入系统待机状态。如果有AN按键按下,查询电路中PR标志位状态,如果为PR=0则执行放音操作,否则就执行录音操作。在待机状态下,如果放音,自动读出第一站的放音内容,显示站号。如果不是首次按下,则首先判断当前站号,并以该站号为依据获得存放该站放音内容的首地址;然后调用放音程序,读入前面获得的本站放音内容首地址,开场放音。AN键接着按下后,程序放音内容转向下一站;相应的站号显示也将随之刷新;停顿键按下,将中止当前的放音,放音状态。停顿键按下三秒后,将擦除所有的语音内容。如果是录音的话,该站号为依据获得存放该站录音内容的首地址,然后调用录音程序,录入前面获得的本站录音内容首地址,开场录音。系统流程图如图4-1。如果循环存储体系处于令人满意的状态,则可以使用PLAY,REC,FWD,RESET,ERASE这些命令,功能类似于1700的独立模式中相应的功能设置一个变量d为标准频率Fs与实际测量程序Fn的差值,即D=Fs-Fn。实际情况中有三种情况:偏高d=Fs-Fn<-0.5标准-0.5<d=Fs-Fn<0.5偏低d=Fs-Fn>0.5根据不同的情况,分别播放事先录入的的提示音1,提示音2.提示音3,偏高,标准,或是偏低。语音模块流程图如图3.16.图3.16语言模块流程图语言模块关键程序voidISD_Init(void)//初始化{ISD_Reset();Do{P1=0;ISD_PU();RdStatus();}while((SR0_L&0*01)||(!(SR1&0*01)));SBUF=RD_DevID();//读取芯片IDClrInt();ISD_WR_APC2();RdAPC();voidSetREC(void)//定点录音{ucharAdd_ST_H,Add_ST_L,Add_ED_H,Add_ED_L;Do{RdStatus();}while((SR0_L&0*01)||(!(SR1&0*01)));ClrInt();Add_ST_L=0*00;Add_ED_L=0*FF;Add_ST_H=0*00;Add_ED_H=0*00;ISD_SendData(0*91);ISD_SendData(0*00);ISD_SendData(Add_ST_L);//S7:S0开场地址ISD_SendData(Add_ST_H);//S10:S8ISD_SendData(Add_ED_L);//E7:E0完毕地址ISD_SendData(Add_ED_H);//E10:E8ISD_SendData(0*00);SS=1;delay_ms(10);//延迟10msDo{RdStatus();}while((SR0_L&0*01)||(!(SR1&0*01)));}voidSetPLAY(void)//定点播放{ucharAdd_ST_H,Add_ST_L,Add_ED_H,Add_ED_L;do{RdStatus();}while((SR0_L&0*01)||(!(SR1&0*01)));ClrInt();Add_ST_L=0*00;Add_ED_L=0*FF;Add_ST_H=0*00;Add_ED_H=0*00;ISD_SendData(0*90);ISD_SendData(0*00);ISD_SendData(Add_ST_L);//S7:S0开场地址ISD_SendData(Add_ST_H);//S10:S8ISD_SendData(Add_ED_L);//E7:E0完毕地址ISD_SendData(Add_ED_H);//E10:E8ISD_SendData(0*00);SS=1;delay_ms(10);//延迟10msDo{RdStatus();}while((SR0_L&0*01)||((SR1&0*04)));}voidISD_Reset(void)//复位{ISD_SendData(0*13);ISD_SendData(0*00);SS=1;delay_ms(50);}3.7数据通信模块设计数据通信模块实现的功能数据通信模块设计主要实现电脑与单片机的通信,使PC机上编辑的软件程序下载到单片机。51系列单片机内部的串行口具有通信的功能,该串行口可以作为通信接口,与PC机的串行口1和2进展串行通信。3.7.2数据通信模块程序设计说明MA*3232为RS-232收发器,简单易用,单+5V电源供电,仅需外接几个电容即可成从TTL电平到RS-232电平的转换,单片机程序主要包括串行数据采集模块“DATA_SAM〞和串行数据传输模块“RS232〞,调试所用到的显示子程序在此略去。PC机和单片机通信时,首先分别对各自的串行口进展初始化,确定串行口工作方式,设定波特率〔两者应设置一致〕、传输数据长度等,然后才开场数据传输,这些工作是由软件来完成的,因此对PC机和单片机均需有相应的通信软件。TLC2543的通道选择和方式数据为8位,其功能为:D7、D6、D5和D4用来选择要求转换的通道,D7D6D5D4=0000时选择0通道,D7D6D5D4=0001时选择1通道,依次类推;D3和D2用来选择输出数据长度,本程序选择输出数据长度为12位,即D3D2=00或D3D2=10;D1,D0选择输入数据的导前位,D1D0=00选择高位导前。TLC2543在每次I/O周期读取的数据都是上次转换的结果,当前的转换结果在下一个I/O周期中被串行移出。第一次读数由于内部调整,读取的转换结果可能不准确,应丢弃。串行数据传输模块包括串行口初始化子程序和数据传输子程序,各子程序分别如下:NIT_: MOVSCON,*50H ;串口方式1工作,8位数据位,1位停顿位,无奇偶校验 MOVPCON,*80H ;SMOD=1,波特率增倍 MOVTMOD,*20H ;波特率设置,fOSC=12MHz,波特率=2*2400,N=0F3H MOVTH1,*0F3H MOVTL1,*0F3H SETBTR1 ;启动定时器T1 RET RS232: MOVR0,*30H ;缓冲区首地址30H→R0 MOVR5,*22 ;发送数据长度→R5,11*2=22LOOP: MOVA,R0 ;取数据→A MOVSBUF,A ;数据→SBUFWAIT: CTI,CONT ;判断发送中断标志,是1则转到CONT,并清TI SJMPWAIT CONT: INCR0 DJNZR5,LOOP RET 在DOS环境下,串行通信一般用中断方式来实现,用户对通信端口进展完全控制。而在Windows环境下,系统制止应用程序直接对硬件进展操作。在Windows环境下提供了完备的API应用程序接口函数,程序员通过这些函数与通信硬件接口。通信函数是由中断驱动的,发送数据时,先将其放入缓存区,串行口准备好后,就将其发送出去,传来的数据迅速申请中断,使Windows承受它并将其存入缓冲区,以供读取。承受方式主要有查询和中断方式。采用查询方式时,CPU要不断测试串口是否有数据,以防承受串口数据时出现错误、效率低;而采用中断方式则无需测试串口,一旦有数据传至,CPU暂停当前任务,由中断效劳程序完成操作。程序由STC-ISP〔下载编程烧录软件〕下载到单片机中。数据通信模块相关流程图如图3.17图3.17数据通信模块相关流程图3.7.3数据通信模块关键程序*include<reg52.h>sbitRE_DE=P3^2;//定义P3.2为接收、发送使能端voidInitSerial(){SCON=0*50;//8位数据、接收使能TMOD=0*20;//8位可自动重装定时器/计数器T1TH1=0*FD;//波特率9600TL1=0*FD;TR1=1;//启动定时器}voidmain(){unsignedchartemp; InitSerial();//串口初始化while(1){RE_DE=0;//232接收while(!RI);temp=SBUF;//接收从PC机发送过来的数据RI=0;RE_DE=1;//232发送TI=0;SBUF=temp;//将接收到的数据返回给PC机while(!TI);}}4软件调试在调试硬件电路的同时,也开场了软件子模块的调试,验证硬件电路的正确性。本设计采用基于KeilC51高级语言的系统调试,KEILC51标准C编译器为8051微控制器的软件开发提供了C语言环境,同时保存了汇编代码高效,快速的特点,先在KeilC51软件中将所有模块程序编好,分别调试。4.1KeilC51调试对工程成功地进展编译〔汇编〕、连接以后,在主菜单中翻开“调试〞栏,点击“开场/停顿调试模式〞,即可进入软件模拟仿真调试状态,KeilC51内建了一个仿真CPU用来模拟执行程序,该仿真CPU功能非常强大,可以在没有硬件和仿真器的情况下进展程序的调试,但是在时序上,软件模拟仿真是达不到硬件的时序的。进入调试状态后,“调试〞栏菜单项中原来不能用的命令现在已经可以使用了。“调试〞栏菜单上的大局部命令可以在调试界面上找到对应的快捷按钮,从左到右依次是复位、运行、暂停、单步、单步跳过、执行完当前子程序、运行到当前行、下一状态、翻开跟踪、观察跟踪、反汇编窗口、观察窗口、代码作用*围分析、1*串行窗口、内存窗口、性能分析、工具按钮等命令。使用菜单“单步到之外〞或相应命令或功能键F10可以用“单步跳过〞形式执行命令,所谓“单步跳过〞,是指将汇编语言中的子程序或高级语言中的函数作为一个语句一步执行完。使用菜单“单步〞或相应的命令按钮或使用快捷键F11可以单步执行程序〔即一条一条语句执行〕,通过单步执行程序,可以找出一些问题的所在,但是仅依靠单步执行来查错效率较低。设计调试分为2个局部:第一局部:频率的处理模块,声音信号能否产生可被单片机处理的方波信号。第二局部:按键电路,显示电路,语音电路等。LCD1602液晶能够正常的显示,按键能否正常的工作,串口能正否常的下载程序,电源工作等要求。还有通过单片机控制ISD1700语音芯片效果。4.2KeilC与Proteus连接调试1、假假设KeilC与Proteus均已正确安装在C:\ProgramFiles的目录里,把C:\ProgramFiles\LabcenterElectronics\Proteus6Professional\MODELS\VDM51.dll复制到C:\ProgramFiles\keilC\C51\BIN目录中。2、用记事本翻开C:\ProgramFiles\keilC\C51\TOOLS.INI文件,在[C51]栏目下参加:TDRV5=BIN\VDM51.DLL("ProteusVSMMonitor-51Driver")。其中“TDRV5〞中的“5〞要根据实际情况写,不要和原来的重复。〔步骤1和2只需在初次使用设置。〕3、进入KeilCμVision2开发集成环境,创立一个新工程(Project),并为该工程选定适宜的单片机CPU器件〔如:Atmel公司的AT89C51〕。并为该工程参加KeilC源程序。4、单击“Project菜单/OptionsforTarget〞选项或者点击工具栏的“optionfor〞按扭,弹出窗口,点击“Debug〞按钮,出现如下图页面。
在出现的对话框里在右栏上部的下拉菜单里选中“ProteusVSMMonitor一51Driver〞。并且还要点击一下“Use〞前面说明选中的小圆点。再点击“Setting〞按钮,设置通信接口,在“Host〞后面添上“〞,如果使用的不是同一台电脑,则需要在这里添上另一台电脑的IP地址(另一台电脑也应安装Proteus)。在“Port〞后面添加“8000〞。设置好的情形如下图,点击“OK〞按钮即可。最后将工程编译,进入调试状态,并运行。5、Proteus的设置进入Proteus的ISIS,鼠标左键点击菜单“Debug〞,选中“useromotedebugermonitor〞。此后,便可实现KeilC与Proteus连接调试。结论本文的主要内容是琴弦频率智能测试仪的软件设计。我们采用单片机对琴弦空弦音的频率进展计算判断,并通过液晶显示模块把频率显示出来,同时进展语音提示,从而让调弦者明白调整方向及调整幅度。本文所做主要工作概括如下:介绍课题研究的背景,提出了以单片机为控制核心的琴弦音频测定仪的设计;提出了几种频率的测量方法,经过比拟后确定了基于8051单片机的电子计数法,这种方法测量频率*围宽,精度高,易于实现;详细阐述了整个系统的软件设计。包括:主程序模块设计、键盘模块设计、显示模块设计、语音播放模块设计、通信模块设计等;通过C语言对单片机进展软件编程,基于KeilC51集成开发环境对软件进展编译调试。琴弦音频测定仪采用高性能单片机控制,性能稳定,可靠性高,具有掉电保护功能,运用的元件也可推广,还能据实际要求扩展功能,应用广泛,性价比高。毕业设计接近尾声,在这段时间内,通过查阅各种书籍与,同时在指导教师的指导和同学的帮助下,完成了此次毕业设计。我们掌握对所学知识得到利用,锻炼我们的实际运用能力,同时让我们认识到团结互助在各种工作中的重要性。毕业设计不仅锻炼了我们的动手能力,更加促进了我们对理论联系实际的理解,对我们今后的工作开展有着很大的促进作用。参考文献1赵文博,*文淘.语言C51程序设计.人民邮电,2006.12马忠梅.单片机的语言程序设计航天,20103*志良.单片机原理与控制技术机械工业,20094梅丽凤,王艳秋,*军.单片机原理及接口技术.:清华大学,20084严势,王洪成.单片机环境uvision使用指南及USB固件编程与调试航空,20105陈晓荣,蔡萍,周红全.基于单片机的频率测量的几种实用方法:[学位论文],**:**交通大学自动检测研究所,20036何立民.单片机高级教程航空航天大学7赵晓安.MCS-51单片机原理及应用**大学8李广第.单片机根底航空航天大学9康华光.电子技术根底模拟局部.第五版.:高等教育,2006.110李子健.isd1700_语音芯片中文手册航空航天大学,200811康华光.电子技术根底数字局部.第五版.:高等教育,2006.112胡守松.LCD1602字符液晶显示模块应用.:机械工业,201213王刚.单片机应用.**:大学,200014*毅刚.MCS-51单片机应用设计.**:**工业大学,199016Designofanosie-freemicrocontrollerHyun-KyuJeon;Sang-YoonLee;Dae-KeunHan;ASIC,2000.AP-ASIC2000.ProceedingsoftheSecongIEEEAsiaPacificConferenceon28-29Aug.2000Page(s):375-378附录A控制模块与显示模块仿真图附录B控制模块与显示模块原理图附录C局部程序清单//***********************头文件***************************//*include"reg51.h"*include<stdio.h>*include<math.h>*include<reg52.h>*include<string.h>//*************************端口定义***************************//sbitlcden=P1^0;sbitlcdrs=P1^3 ;sbitkey1=P2^0;sbitkey2=P2^1;sbitkey3=P2^2;//************************全局变量定义*************************//uncharrequency,T0count,num;//************************延时子程序***************************//voiddelayms(unsignedintn){unsignedinti,j;for(i=0;i<n;i++)for(j=0;j<2000;j++);}voiddelay(unsignedintm){unsignedinti,j;for(i=0;i<m;i++)for(j=0;j<10;j++);}//************************频率测量程序***************************//voiddelay(unsignedintm){unsignedinti,j;for(i=0;i<m;i++)for(j=0;j<10;j++);}voidce_pin(void){TMOD=0*15;//设置T0,T1工作模式TH0=0; //设定T0计数初值 TL0=0;TH1=(65536-4000)/256; //设定T1初值TL1=(65536-4000)%256;TR1=1; //T1开场工作TR0=1; //T0开场工作ET0=1; //T0中断开ET1=1; //T1中断开EA=1; //开总中断}voidt0(void)interrupt1using0// T0中断程序{T0count++;//计数值放在变量T0count中}voidt1(void)interrupt3using0 // t1中断程序{TH1=(65536-4000)/256;TL1=(65536-4000)%256;timecount++;if(timecount==250)//定时1s{TR0=0;timecount=0;requency=T0count; //将计数初值赋给变量requencyT0count=0;TR1=0;}}//*********************LCD1602显示相关程序***************************//*include<reg51.h>*defineucharunsignedchar*defineuintunsignedintucharcodetable[]="1B:329HZ1C:";ucharcodetable1[]="0HZ";sbitlcden=P1^0;sbitlcdrs=P1^3;ucharnum; voiddelay(uintz) // 延时函数{ uint*,y; for(*=z;*>0;*--) for(y=110;y>0;y--);}voidwrite_(uchar) // 命令函数{ lcdrs=0; P0=; //传输指令 delay(5); //延时5ms lcden=1; //使能端为高电平 delay(5); // 延时5ms lcden=0; // 使能端变为低电平}voidwrite_data(uchardate) // 数据函数{ lcdrs=1; // rs=1的时为写数据 P0=date; delay(5); lcden=1; delay(5); lcden=0;}voidlcd_init() // 初始化{ lcden=0; write_(0*38); //显示模式设置 write_(0*0e); //开显示,显示光标,光标不闪烁 write_(0*06); //当写一个字符后地址指针加一,且光标加一,整屏显示不移动write_(0*01); //清屏 write_(0*80);}void*ian_shi1(){ lcd_init(); for(num=0;num<14;num++) //显示第一行 { write_data(table[num]); delay(20); }write_(0*80+0*40+0*04); //重新设置数据指针,使显示在第二行 for(num=0;num<3;num++) //显示第二行 { write_data(table1[num]); delay(20); } while(1);}//*********************键盘扫描相关程序***************************//voidjianpan(){while(1){if(!key1){delay1ms(10);//去抖动if(!key1)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 创新教案:针对特殊需要学生的20以内加减法教学(2024年)
- 2024年版保安员培训教学大纲全面解读
- 2024房地产销售冠军培训全集:打造销售神话的关键因素
- 起重机司机(限门式起重机)试题题库及答案
- 四川普通高中学生综合素质阶段性评价报告单
- 美容师(初级)操作证考试题及答案(完整版)
- 古典概型【新教材】人教A版高中数学必修第二册课件
- 2024-2025学年新教材高中生物第5章基因突变及其他变异3人类遗传病教案新人教版必修2
- 2024-2025学年新教材高中历史第二单元三国两晋南北朝的民族交融与隋唐统一多民族封建国家的发展第7课隋唐制度的变化与创新课后训练巩固提升含解析新人教版必修中外历史纲要上
- 2024-2025学年高中英语课时素养评价十四Unit5Canada-“TheTrueNorth”LearningaboutLanguage含解析新人教版必修3
- ISO9001体系文件与IRIS标准条款对应表
- 汉语教师志愿者培训大纲
- 护理导论 评判性思维
- SPC培训资料_2
- 学习适应性测验(AAT)
- ADS创建自己的元件库
- MATLAB仿真三相桥式整流电路(详细完美)
- 2019年重庆普通高中会考通用技术真题及答案
- 天秤座小奏鸣曲,Libra Sonatine;迪安斯,Roland Dyens(古典吉他谱)
- 钢筋混凝土工程施工及验收规范最新(完整版)
- 光缆施工规范及要求
评论
0/150
提交评论