超声波电子琴_第1页
超声波电子琴_第2页
超声波电子琴_第3页
超声波电子琴_第4页
超声波电子琴_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、项目编号:262015-2016学年第一学期微机原理(单片机)课程设计总结报告项目名称:超声波电子琴 班级:姓名:学号: 微机原理(单片机)课程设计任务书项目名称:26号 超声波电子琴内容与要求:上位机:完成界面设计与通讯程序(1)能够显示测得长度值。(2)能够接受下位机的曲子并保存至文档。(3)能够发送命令启动或暂停设备。(4)可以对串口进行设置。下位机:完成电路设计与控制程序(1)采用超声波测距,不同的距离对应不同的音阶,由蜂鸣发声。(2)通过串口与上位机通讯。(3)能够演奏一首曲子并上传至上位机。(4)将当前测得长度值、音阶显示在LCD屏上。项目组任务分担评价表姓名分担任务组内评价王陆童

2、下位机全部程序的编写与调试,整体程序的运行与改进,实验记录单的填写4邓青宇上位机软件编写4段利波系统调试和检测2课程设计报告评分表内容总体方案硬件设计软件设计结果分析明细清单问题分析心得体会参考文献程序代码格式规范总分王陆童得分邓青宇得分 段利波得分微机原理(单片机)课程设计报告目录一总体方案1二、硬件设计22.1 STC89C52RC单片机22.1.1 概述22.1.2 电气特性22.1.3 封装形式32.1.4 最小系统52.1.5 芯片优点52.2 LCD 1602液晶显示屏52.2.1 概述52.2.2 电气特性62.2.3 器件优点62.2.4 接线及原理图62.3 HC-SR04

3、超声波探头72.3.1 概述72.3.2 电气特性72.3.3 器件优点82.3.4 连线及原理图82.4 喇叭82.5 系统原理图9三、软件设计103.1、下位机程序设计103.1.1 需求分析103.1.2 程序原理103.2 上位机程序设计11四、结果分析或项目所实现的功能、指标124.1下位机部分124.2上位机部分13五、明细清单13六、设计调试中遇到的疑难问题及解决办法14七、心得体会与建议14参考文献16附录16源代码16下位机程序16上位机程序26I一总体方案超声波电子琴总体结构图如下图所示:LCD显示模块保存文本控制器(单片机)上位机显示测试值超声波测距模块蜂鸣器鸣叫模块 图

4、1-1 系统整体结构图图中,单片机控制器模块采用的是STC89C52RC型号的单片机,按照最小系统搭建;超声波测距模块选用HC-SR04型号的超声波探头,其可以自主进行测距,并且将测距的结果回传到单片机当中进行保存,具有实时性,下一次的数据回传会将前一次的数据替代;LCD显示模块采用1602型号的LCD显示屏,是一个2X16的规格,其中第一行用来显示当前音阶,第二行用来显示测得距离;蜂鸣器通过一个PNP型三极管被单片机控制,单片机根据距离转换成对应的音阶以及频率,该频率被送入蜂鸣器发声;上位机控制单片机的启动和停止,内部自行编写程序实现,并且可以将单片机送回的数据显示在屏幕上和保存文本。二、硬

5、件设计2.1 STC89C52RC单片机2.1.1 概述STC89C52RC是一款低功耗、高性能的CMOS8位微控制器,内部集成8KB可编程Flash储存器。STC89C52RC因为高度的灵活性和功耗效率解决方式而被广泛的应用在众多的嵌入式控制系统中。STC89C52RC 拥有8KB的Flash,256B的随机读写存储器,32个IO引脚,看门狗定时器,两个数据指针,三个16为的定时器/计数器,6向量通道两个中断优先级的中断系统架构,一个全双工通信接口,片内晶振和时钟监测。2.1.2 电气特性向下兼容MCS-51产品;8KB在系统编程Flash储存器,耐受值为1000次擦写;供电电压为4.0V到

6、5.5V;时钟频率:0 Hz- 33Mhz;三级可编程储存器锁定;256B内部随机存储器;32个可编程IO口;3个16为定时器/计数器;8个中断源;全双工Uart通信接口;以及低功耗空闲模式和掉电模式、支持掉电中断唤醒功能、看门狗定时器、双数据指针、电源关闭标志。2.1.3 封装形式封装形式包括PDIP、PLCC、TQFP图2-1 PDIP封装形图2-2 PLCC封装形式图2-3 TQFP封装形式2.1.4 最小系统图2-4 STC89C52最小系统原理图2.1.5 芯片优点STC89C52芯片同属8051架构,也是应用最为广泛的一类微控制器,市场价格为5元一片。STC89C52芯片具有完整的

7、系统的功能能够满足基本的嵌入式系统控制器要求。具有较高的性价比同时也是一款轻松上手容易学习的芯片。对于课程设计中要求的任务使用STC89C52芯片能够完全满足。2.2 LCD 1602液晶显示屏2.2.1 概述1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符

8、液晶模块(显示字符和数字)。市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。微功耗、体积小、显示内容丰富、超薄轻巧,常用在袖珍式仪表和低功耗应用系统中。2.2.2 电气特性1602采用标准的16脚接口,8位双向数据端;3.3V或5V工作电压,对比度可调,内含复位电路;提供如:清屏、字符闪烁、光标闪烁、显示移位等多种功能;有80字节显示数据存储器DDRAM;内建有192个5X7点阵的字型的字符发生器CGROM;8个可由用户自定义的5X7的字符发生器CGRAM;2.2.3 器件优点1602液晶屏

9、市场价格4元左右,具有较高的性价比,具有完整的控制指令集,易于与微控制器连接;供电3.3V或5V能够使用较宽范围的为控制类型。是学习和实验中一款非常有用的显示产品。2.2.4 接线及原理图将RS引脚接到P1.0引脚,RW引脚接到P1.1引脚,E引脚接到P1.2引脚,VCC、GND正确接线,D0D7对应接入P0.0-P0.7.BLA接高电平,BLK接低电平。原理图如图2-5所示。图2-5 LCD1602与MCU连接原理图2.3 HC-SR04 超声波探头2.3.1 概述超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射

10、波就立即停止计时。超声波在空气中的传播速度为 340m/s,根据计时器记录的时间 t,就可以计算出发射点距障碍物的距离(s),即: s=340t/2 。2.3.2 电气特性模块含4个引脚,引脚 1: VCC;引脚 2: Trig(控制端);引脚 3: Echo(接收端);引脚 4: GND。本模块使用方法:控制端发一个 10us 以上的高电平, 就可以在接收端等待高电平输出,一旦有输出就可以开定时器计时, 当此口变为低电平时就可以读定时器的值, 此时就为此次测距的时间,即可算出距离。2.3.3 器件优点HC-SR04 超声波探头具有性价比高,功能特性好的优点,测量距离。2.3.4 连线及原理图

11、超声波模块有4个引脚,VCC引脚接+5V,GND引脚接地。其中Trig引脚和Echo引脚接任何两个未使用的MCU引脚即可。实验中Trig接P2.7,Echo接P2.6。原理图如图3-4所示。图2-6 超声波模块与MCU连接原理图2.4 喇叭MCU通过一个PNP型三极管控制喇叭电源的通断,三极管基极接单片机普通IO口,通过控制单片机引脚的高低电平状态即可实现对喇叭的控制。而喇叭发出不同的音阶则是通过对定时器装载不同的值产生不同占空比的波形也就是控制高电平的时间实现对音阶的控制。喇叭的原理图如图2-7所示。图2-7 喇叭与MCU连接原理图2.5 系统原理图图2-8 系统原理图三、软件设计3.1、下

12、位机程序设计3.1.1 需求分析本课程设计下位机程序使用C语言编写,根据任务书要求,下位机应该实现以下需求:(a)能够产生占空比固定,频率可变的方波用于激励蜂鸣器产生音调不同的声音;(b)需要实现对超声波测距模块的控制,通过超声波模块得出距离;(c)需要实现对显示屏的通信,在显示屏上显示当前测得距离与音调;(d)能够通过串口与上位机进行通信,实现在上位机的控制下启停。3.1.2 程序原理对于需求(a),我们采用了80C52中的Timer 1,利用方式1的定时中断功能,在每次产生定时中断时,自动重装初值,以及反转输出电平。在这里,方式2自动重装的计数值只有8位,太短不适用。查阅标准音阶频率表,确

13、定各个音阶所需要的初值即可。对于需求(b),根据超声波模块所需要的时序,在发出启动信号后等待Echo信号返回测距开始信号,之后利用Timer 0,计数出声波传播所需要的时钟周期数,利用声速公式计算即可。对于需求(c),查阅显示屏的控制方法,可以发现显示屏的通信方式类似并口通信。利用P0,可以很方便的实现控制。对于需求(d),80C52集成了串口通信模块。这里我们定义上位机与下位机之间的通信协议为:波特率9600bps,8位数据位,1位停止位,无奇偶校验。将上述原理进行整合,最终得到流程图,如图3-1。图3-1 下位机程序框图3.2 上位机程序设计本课程设计上位机程序使用了Microsoft从.

14、NET Framework 3.0开始引进的Windows Presentation Foundation(WPF)用户界面框架。它提供了统一的编程模型,语言与框架。后台使用C#编程语言,前台使用XAML标记语言,有效地分离了开发人员与UI设计人员的工作。图3-2 上位机程序界面上位机程序利用了.NET Framework类库中的System.IO.Ports中的SerialPort类。在程序中创建一个该类的实例,通过UI交互设定好这个实例。调用在类中封装好的方法就可以方便地进行串口接收数据,发送数据。C#提供的事件响应机制,可以使上位机程序自行对串口接收到的数据进行处理,上位机程序界面如图3

15、-2所示。在上位机程序中,我们实现了对串口传输的参数的设置,可以统计从串口打开以来接收到的数据帧数,以及以十六进制的表示方式显示上次传输接收到的数据。当在开启端口之后,点击“开始监测”,就可以开始监测下位机传回来的数据。为了方便起见,这个按钮也集成了通过串口通知下位机开始测距的功能。在监测状态,我们可以使用录制功能,录制功能在串口每收到一帧数据的时候,记录当前的音阶数,并在停止录制的时候,将内存中记录的数据写入到硬盘中的文本文档中。四、结果分析或项目所实现的功能、指标4.1下位机部分根据课程任务书的要求,我们设计完成的下位机可以正常的进行测试距离并且将其值和对应的音阶值通过LCD显示屏体现出来

16、;蜂鸣器可以根据不同的距离值对应的音阶进行鸣叫;并且可以通过串口和上位机进行通讯,由上位机控制其启动或者停止。图4-1 下位机最终结果图4.2上位机部分根据课程任务书的要求,我们设计完成的上位机可以通过发送启动或者停止信号控制单片机;可以将单片机回传的距离值显示在屏幕上,由于串口的通讯设置,完成一次的传送会有1.5秒左右的延时;可以将演奏的曲子以音阶回传的顺序进行排列并且记录下来,为txt文件。图4-2 上位机最终结果图五、明细清单表5-1 各种器件清单器件名称数量价格STC89C52RC 单片机1个5元LCD 1602 液晶显示屏1个5元HC-SR04 超声波探头1个4元蜂鸣器1个9元总计2

17、3元六、设计调试中遇到的疑难问题及解决办法王陆童:1、问题:第一次整体检验的时候,超声波测距器无法正确的进行工作。解决办法:检查线路问题,发现超声波测距器的Trig和Echo端接线错误,认真查阅硬件原理图后修改了接线,再次上电工作正常。2、问题:第一次整体检验的时候发现在LCD显示屏上距离值显示的格式不对,覆盖了前面的注释以及后面的单位。解决办法:通过修改下位机的程序,调整字符出现的位置使问题得到了合理的解决。3、问题:下位机向上位机传输的数据(距离值)无法正确的在上位机中体现出来。解决办法:反复检查下位机和上位机编写的程序,发现下位机向上位机传送数据的格式和上位机接收数据的格式不相符合,修改

18、接收格式后问题得到解决。邓青宇:1、对WPF应用程序的设计不熟,经验不足。在MSDN查阅例程之后,仿写代码写成了上位机。七、心得体会与建议王陆童:这次的单片机课程设计在四个课程设计当中难度应该是相当大的,不同于大三上学期微机原理最后的综合实验,考察了我们汇编当中定时器、中断、串口、并口的用法,这次的实验更加综合,考察了我们微机原理+计算机控制理论并且融合了我们大学所学习的编程思想,在设计侧面难度很大,但同时也非常人性化,没有限定我们必须使用汇编语言,我们可以选择自己擅长的机器语言进行编写。我负责下位机程序的编写,我使用的是C语言,因为相对汇编来说,C语言我更加了解,但是由于长时间不怎么使用,上

19、手的时候不太熟练,经过了一上午的摸索,渐渐找回了当时的感觉,于是全力地投入到程序的编写当中。在编写之前,会制定出一份流程图,即主程序的编写规则,在编写完主程序后,分别编写主程序当中引用的各个子程序,其中对于如何将距离值换算成频率值这个子程序我比较头疼,没有什么思绪,和同学探讨无果之后我们尝试在网上查阅资料,经过不断的比对和理论分析,最终修改完成了这个子程序,第一次全部编写完感觉还是比较顺利,但是在编译的时候遇到了不少的问题,其中有语法错误,也有引入函数格式不对这样的问题,经过和组里同学的讨论,逐一的修改程序,最终得到了比较完美的解决。我想小组完成任务的目的就是在这个过程当中不断地互相交流不断地

20、互相提高,使效率最大化。感谢这次的课程设计,不仅再一次加深了我对单片机的理论学习,更加强调的是在实际操作中如何解决遇到的问题以及如何避免再次遇到这些问题,理论结合实际,再次给我们敲响警钟,不能一味的追求理论,因为很多时候仅仅使用理论是无法做出真正的实物成果的,必须经过实践的磨练,最终才可以成功完成任务。另外我想感谢我的两名队友,感谢他们在我遇到困难时的不懈帮助,我想正是由于我们的共同努力才可以这么顺利的完成任务,使我们小组成为了前几名完成的小组之一,我收获的不仅是学习侧面上的,更是我们在一起分析设计题目、互相解决各自问题、共同调试程序的这个过程,意义非常深远。邓青宇:这次课程设计,我尝试使用了

21、课外所学到的技术来编写上位机程序。随着时代的发展,计算机领域已经发生了极大的变化。许多新概念出现了,新技术也层出不穷。这些新技术极大地提高了开发人员的工作效率。然而,新技术同时也是在不断变化。因此,不断学习新技术是作为一名开发人员的基本要求。在这次的课程设计中,我使用到了WPF应用程序设计。这是一个非常实用的,在Win平台上现在日趋流行的一个GUI设计框架。在工业控制领域也用得比较多。但是限于知识水平与时间,上位机程序仍然有着相当多的缺陷。首先,我并没有针对每一条路径进行测试,也没有进行异常处理,使得上位机程序比较难用,时常出现崩溃的情况。另外,由于我现在并没有深入了解C#中的事件机制,导致串

22、口接收事件可能会丢失掉,导致显示延时等。这些都是可以改进的地方。通过这次课程设计,我得到了在程序设计上的很多教训。这些都是非常有意义的。段利波:我们的专业有三个发展方向,第一个是工业过程控制方向,第二个是电气工程方向,第三个是嵌入式系统方向。无论哪个方向为控制器都会使用到,我们不但不能好高骛远反而应该脚踏实地的从最基本的做起。8051微控制器是绝对的经典,迄今为止仍然占据着较大的市场,于此同时8051架构特别是51单片机能够轻松的上手学习。从学习的过程中培养起我们的工程意识和实践经验。这对于以后学习其他类型的微控制器都能起到很好的作用。课程设计是我们将理论知识付诸实践的方法之一,也是我们大多数

23、人实践的机会。同样也是对我们自己的一个考验。学习的东西唯有运用起来才能成为自己的技能最终也才能将其转换为生产力。最后感谢老师的辛苦指导、感谢队友的理解和团结合作使得我们的任务圆满的完成。参考文献1Karli Watson, Christian Negel. Beginning Visual C# 2012M.Hoboken:Wrox Press,2012附录源代码下位机程序#include"reg52.h"#include"intrins.h" #define uchar unsigned char  &

24、#160;/无符号8位#define uint unsigned int    /无符号16位#define ulong unsigned long   /无符号32位 #define   FOSC    12000000#define T0FENPING  12  uchar run = 0;/- sbit SPK&

25、#160;= P1  5;bit RunFlag = 0; sbit  Trig = P2  7;sbit  Echo = P2  6;sbit LCD_RS = P1  0; /寄存器选择位,将RS位定义为P1.0引脚 sbit LCD_RW = P1  1;   /读写选择位,将RW位

26、定义为P1.1引脚 sbit LCD_E = P1  2; /使能信号位,将E位定义为P1.2引脚#define LCD_Data  P0 #define Busy    0x80 /用于检测LCD状态字中的Busy标识uint code JINJIEFREQ =    523,587,659,699,784,880,988;unsigned char STH0,&#

27、160;STL0;unsigned char code Music =  "tone " unsigned char code Distance =  "Range" unsigned char code NUMBER15 =  '0','1','2','3','4',

28、'5','6','7','8','9','.','-','M' static unsigned char DisNum = 0; /显示用指针      uint  time = 0;unsigned long S = 0;bit  

29、0;flag = 0;uchar disbuff3 =  0,0,0;/*5ms延时*/void delay5Ms(void)    uint TempCyc = 5552;    while (TempCyc-);/*400ms延时*/void delay400Ms(void)    uchar TempCycA = 5;&#

30、160;   uint TempCycB;    while (TempCycA-)            TempCycB = 7269;        while (TempCycB-);    /*延迟*/void dela

31、yms(uint ms)    unsigned char i = 100, j;    for (;ms;ms-)            while (-i)             &#

32、160;      j = 10;            while (-j);            /*读状态*/uchar readStatusLCD(void)    LCD_Data = 0

33、xFF;    LCD_RS = 0;    LCD_RW = 1;    LCD_E = 0;    LCD_E = 0;    LCD_E = 1;    while (LCD_Data & Busy); 

34、/检测忙信号    return(LCD_Data);/*写数据*/void writeDataLCD(uchar WDLCD)    readStatusLCD(); /检测忙    LCD_Data = WDLCD;    LCD_RS = 1;    LCD_RW = 0;  

35、60; LCD_E = 0;  /若晶振速度太高可以在这后加小的延时    LCD_E = 0;  /延时    LCD_E = 1;/*写指令*/void writeCommandLCD(unsigned char WCLCD, BuysC) /BuysC为0时忽略忙检测    if (BuysC)  &#

36、160;     readStatusLCD();  /根据需要检测忙    LCD_Data = WCLCD;    LCD_RS = 0;    LCD_RW = 0;    LCD_E = 0;    LCD_E = 0; 

37、   LCD_E = 1;/*初始化*/void LCDInit(void) /LCD初始化    writeCommandLCD(0x38, 0);  /显示模式设置,不检测忙信号    delay5Ms();    writeCommandLCD(0x38, 1);  /显示模式设置,开始要求每次检测忙信号    write

38、CommandLCD(0x08, 1);  /关闭显示    writeCommandLCD(0x01, 1);  /显示清屏    writeCommandLCD(0x06, 1);  /显示光标移动设置    writeCommandLCD(0x0c, 1);  /显示关及光标设置/按指定位置显示一个字符void DisplayOneChar(unsigned char&#

39、160;X, unsigned char Y, unsigned char DData)    Y &= 0x1;    X &= 0xF;  /限制X不能大于15,Y不能大于1    if (Y)            X

40、 |= 0x40;  /当要显示第二行时地址码+0x40;        X |= 0x80;  /算出指令码    writeCommandLCD(X, 1);  /发命令字    writeDataLCD(DData);  /发数据/*显示字符*/按指定位置显示一串字符void displayListChar(uchar X

41、, uchar Y, uchar code *DData)    uchar ListLength;    ListLength = 0;    Y &= 0x1;    X &= 0xF;  /限制X不能大于15,Y不能大于1    while

42、0;(DDataListLength > 0x19) /若到达字串尾则退出          if (X <= 0xF)  /X坐标应小于0xF                DisplayOneChar(X, Y, DDataListL

43、ength); /显示单个字符          ListLength+;          X+;           /*计数*/void count(void)    time = TH0 * 

44、256 + TL0;    TH0 = 0;    TL0 = 0;    S = (time*1.7) / 100;      /算出来是CM    if (S >= 700) | flag = 1) 

45、/当距离超出测量时,范围显示“-”            flag = 0;         DisplayOneChar(0, 1, NUMBER11);        DisplayOneChar(1, 1, NUMBER10); /显示点

46、60;       DisplayOneChar(2, 1, NUMBER11);        DisplayOneChar(3, 1, NUMBER11);        DisplayOneChar(4, 1, NUMBER12); /显示M    &#

47、160;   else  /当距离未超出距离限制时,正常显示            disbuff0 = S % 1000 / 100;        disbuff1 = S % 1000 % 100 / 1

48、0;        disbuff2 = S % 1000 % 10 % 10;        DisplayOneChar(0, 1, NUMBERdisbuff0);        DisplayOneChar(1, 1, NUMBER

49、10);  /显示点        DisplayOneChar(2, 1, NUMBERdisbuff1);        DisplayOneChar(3, 1, NUMBERdisbuff2);        DisplayOneChar(4, 1, NUMBER12); 

50、 /显示M     /*发声程序*/void voice()    if (S >= 0 && S < 6)            STH0 = (65536 - FOSC / T0FENPING / 2

51、0;/ JINJIEFREQ0) / 256;        STL0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ0) % 256;        TH1 = STH0;    

52、60; /- 装入TH1,TL1的计数寄存器 -        TL1 = STL0;        RunFlag = 1;     /- 置音阶播放标志为1 -        SPK = 1; &

53、#160;      DisplayOneChar(5, 0, NUMBER1);        if (S >= 6 && S < 12)            STH0 = (65536 

54、- FOSC / T0FENPING / 2 / JINJIEFREQ1) / 256;        STL0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ1) % 256;       

55、60;TH1 = STH0;      /- 装入TH1,TL1的计数寄存器 -        TL1 = STL0;        RunFlag = 1;      /- 置音阶播放标志为1 -  

56、0;     SPK = 1;        DisplayOneChar(5, 0, NUMBER2);        if (S >= 12 && S < 18)       &

57、#160;    STH0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ2) / 256;        STL0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ2)

58、0;% 256;        TH1 = STH0;      /- 装入TH1,TL1的计数寄存器 -        TL1 = STL0;        RunFlag = 1;  &

59、#160;  /- 置音阶播放标志为1 -        SPK = 1;        DisplayOneChar(5, 0, NUMBER3);        if (S >= 18 && S <

60、 24)            STH0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ3) / 256;        STL0 = (65536 - FOSC / 

61、T0FENPING / 2 / JINJIEFREQ3) % 256;        TH1 = STH0;      /- 装入TH1,TL1的计数寄存器 -        TL1 = STL0;     &

62、#160;  RunFlag = 1;      /- 置音阶播放标志为1 -        SPK = 1;        DisplayOneChar(5, 0, NUMBER4);        if&#

63、160;(S >= 24 && S < 30)            STH0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ4) / 256;       &

64、#160;STL0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ4) % 256;        TH1 = STH0;      /- 装入TH1,TL1的计数寄存器 -       

65、 TL1 = STL0;        RunFlag = 1;      /- 置音阶播放标志为1 -        SPK = 1;        DisplayOneChar(5, 0, NUM

66、BER5);        if (S >= 30 && S < 36)            STH0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ5)&#

67、160;/ 256;        STL0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ5) % 256;        TH1 = STH0;      /- 装入TH1,TL1的计

68、数寄存器 -        TL1 = STL0;        RunFlag = 1;     /- 置音阶播放标志为1 -        SPK = 1;      

69、;  DisplayOneChar(5, 0, NUMBER6);        if (S >= 36 && S < 42)            STH0 = (65536 - FOSC / T0F

70、ENPING / 2 / JINJIEFREQ6) / 256;        STL0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ6) % 256;        TH1 = STH0;

71、60;      /- 装入TH1,TL1的计数寄存器 -        TL1 = STL0;        RunFlag = 1;      /- 置音阶播放标志为1 -      &

72、#160; SPK = 1;        DisplayOneChar(5, 0, NUMBER7);        if (S >= 42)               DisplayOneChar(

73、5, 0, NUMBER11);     /*中断*/void timer0() interrupt 1     /T0中断用来计数器溢出,超过测距范围    flag = 1;         /中断溢出标志/*外部中断0*/void Int0_isr() interrupt 0 

74、60;   /EXint0中断用来单独控制芯片    EX0=0;    run=run;    EX0=1; /*启动模块*/void  startModule()          /启动模块    uchar i;    Trig = 

75、;1;           /启动一次模块    for (i = 0;i < 20;i+)   /延迟 以便于进行传送数据            _nop_();       

76、60;Trig = 0; /*/- 定时器T1溢出中断服务程序 -void T1_ISR(void) interrupt 3    if (1 = RunFlag&&run = 1)                    &

77、#160;              /- 在音阶播放标志为1情况下 -            TH1 = STH0;    /- 重新装初值 -        TL1 

78、= STL0;        SPK = SPK;    /- P1.5引脚上的电平翻转 -    /*/串口初始化void  init()         / 串口初始化函数    RCAP2H = 0xff;

79、0;  / 9600 bps    RCAP2L = 0xdc;    TH2 = RCAP2H;    TL2 = RCAP2L;    T2CON = 0x34;   / TF2 EXF2 RCLK TCLK EXEN2 TR

80、2 C_T2 CP_RL2    SCON = 0x50;    / 串口方式1, 8-n-1, 允许接收.    PCON = 0x00;    / 波特率不倍增    ES = 1;      / 允许串口中断  &

81、#160; EA = 1; void timer2() interrupt 5    TF2 = 0; / 定时器2软件对溢出标志位清零   /*发数据*/ void uartSend(uchar s, uint n)    uint i;     for (i = 0;i &l

82、t; n;i+)            SBUF = si;        while (!TI);        TI = 0;     /*发帧头*/ void uartData(unsigned 

83、;char Data)            SBUF = Data;        while (!TI);        TI = 0;     /*收数据*/void recieve() int

84、errupt 4      /串口中断函数    RI = 0;      /接收中断标志位,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。                     

85、0; run = SBUF;    /收到的数据存入缓冲器,然后赋给a /*主函数*/void main()    LCDInit();       /LCD初始化    delay5Ms();      /延时片刻    displayListChar(0, 0, Music)

86、;  /第一行显示    displayListChar(0, 1, Distance);/第二行显示    TMOD = 0x11;   /设T0为方式1,GATE=1;T1为方式1    TH0 = 0;    TL0 = 0;    ET0 = 1; &

87、#160;     /允许T0中断        ET1 = 1;       /使能T1中断    TR1 = 1;    EX0=1;    EA = 1;      

88、0; /开启总中断     init();        /串口初始化     while (1)            if (run = 1)          &#

89、160;         startModule();            while (!Echo); /当RX为零时等待            TR0 = 1;      /

90、开启计数            while (Echo);    /当RX为1计数并等待            TR0 = 0;      /关闭计数      

91、0;     count();       /计算            voice();       /发声            uartData(10); 

92、;    /和串口进行通讯的启动信号            uartSend(disbuff, 3);/发送数据            delayms(80);     /80MS      

93、0;         else SPK=1;      上位机程序<MainWindow.xaml.cs>using System.Windows;using System.IO;using System.IO.Ports;using System.Collections.Generic;using System.Text; namespace SonicViolin

94、0;   / <summary>    / MainWindow.xaml 的交互逻辑    / </summary>    public partial class MainWindow : Window           

95、; SerialPort _serialport;        bool _enableMonitor;         bool _enableRecord;        Queue<string> _recordbuffer;      &

96、#160;  int _lastReceivedData;        int _count;        int _statusCount;         int digit1;        int 

97、digit2;        int digit3;        double result;        string scale;         public MainWindow()    

98、;                InitializeComponent();                        /  Initialize  &#

99、160;         _serialport = new SerialPort();             _enableMonitor = false;            _enableRecord = false;             _count = 0;            digit1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论