嵌入式实验六
嵌入式实验报告

目录实验一跑马灯实验 (1)实验二按键输入实验 (3)实验三串口实验 (5)实验四外部中断实验 (8)实验五独立看门狗实验 (11)实验七定时器中断实验 (13)实验十三 ADC实验 (15)实验十五 DMA实验 (17)实验十六 I2C实验 (21)实验十七 SPI实验 (24)实验二十一红外遥控实验 (27)实验二十二 DS18B20实验 (30)实验一跑马灯实验一.实验简介我的第一个实验,跑马灯实验。
二.实验目的掌握STM32开发环境,掌握从无到有的构建工程。
三.实验内容熟悉MDK KEIL开发环境,构建基于固件库的工程,编写代码实现跑马灯工程。
通过ISP 下载代码到实验板,查看运行结果。
使用JLINK下载代码到目标板,查看运行结果,使用JLINK在线调试。
四.实验设备硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。
软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件。
五.实验步骤1.熟悉MDK KEIL开发环境2.熟悉串口编程软件ISP3.查看固件库结构和文件4.建立工程目录,复制库文件5.建立和配置工程6.编写代码7.编译代码8.使用ISP下载到实验板9.测试运行结果10.使用JLINK下载到实验板11.单步调试12.记录实验过程,撰写实验报告六.实验结果及测试源代码:两个灯LED0与LED1实现交替闪烁的类跑马灯效果,每300ms闪烁一次。
七.实验总结通过本次次实验我了解了STM32开发板的基本使用,初次接触这个开发板和MDK KEILC 软件,对软件操作不太了解,通过这次实验了解并熟练地使用MDK KEIL软件,用这个软件来编程和完成一些功能的实现。
作为STM32 的入门第一个例子,详细介绍了STM32 的IO口操作,同时巩固了前面的学习,并进一步介绍了MDK的软件仿真功能。
实验二按键输入实验一.实验简介在实验一的基础上,使用按键控制流水灯速度,及使用按键控制流水灯流水方向。
嵌入式实训课实验报告

一、实验背景嵌入式系统在现代工业、消费电子、智能家居等领域扮演着越来越重要的角色。
为了让学生深入了解嵌入式系统的设计原理和开发过程,提高学生的实践能力和创新精神,我们开设了嵌入式实训课程。
本次实验报告将针对实训课程中的部分实验进行总结和分析。
二、实验目的1. 掌握嵌入式系统的基本原理和开发流程。
2. 熟悉嵌入式开发工具和环境。
3. 熟练使用C语言进行嵌入式编程。
4. 学会调试和优化嵌入式程序。
三、实验内容本次实训课程共安排了五个实验,以下是每个实验的具体内容和实验步骤:实验一:使用NeoPixel库控制RGB LED灯带1. 实验目的:学习使用NeoPixel库控制RGB LED灯带,实现循环显示不同颜色。
2. 实验步骤:(1)搭建实验平台,连接NeoPixel LED灯带。
(2)编写程序,初始化NeoPixel库,设置LED灯带模式。
(3)通过循环,控制LED灯带显示不同的颜色。
实验二:使用tm1637库控制数码管显示器1. 实验目的:学习使用tm1637库控制数码管显示器,显示数字、十六进制数、温度值以及字符串,并实现字符串滚动显示和倒计时功能。
2. 实验步骤:(1)搭建实验平台,连接tm1637数码管显示器。
(2)编写程序,初始化tm1637库,设置显示模式。
(3)编写函数,实现数字、十六进制数、温度值的显示。
(4)编写函数,实现字符串滚动显示和倒计时功能。
实验三:使用ds18x20库和onewire库读取DS18B20温度传感器的数据1. 实验目的:学习使用ds18x20库和onewire库读取DS18B20温度传感器的数据,并输出温度值。
2. 实验步骤:(1)搭建实验平台,连接DS18B20温度传感器。
(2)编写程序,初始化ds18x20库和onewire库。
(3)编写函数,读取温度传感器的数据,并输出温度值。
实验四:使用ESP32开发板连接手机热点,并实现LED1作为连接指示灯1. 实验目的:学习使用ESP32开发板连接手机热点,并通过LED1指示灯显示连接状态。
嵌入式实习报告(共5篇)

嵌入式实习报告(共5篇)第一篇:嵌入式实习报告一、嵌入式系统开发与应用概述在今日,嵌入式ARM 技术已经成为了一门比较热门的学科,无论是在电子类的什么领域,你都可以看到嵌入式ARM 的影子。
如果你还停留在单片机级别的学习,那么实际上你已经落下时代脚步了,ARM 嵌入式技术正以几何的倍数高速发展,它几乎渗透到了几乎你所想到的领域。
本章节就是将你领入ARM 的学习大门,开始嵌入式开发之旅。
以嵌入式计算机为技术核心的嵌入式系统是继网络技术之后,又一个IT领域新的技术发展方向。
由于嵌入式系统具有体积小、性能强、功耗低、可靠性高以及面向行业具体应用等突出特征,目前已经广泛地应用于军事国防、消费电子、信息家电、网络通信、工业控制等各个领域。
嵌入式的广泛应用可以说是无所不在。
嵌入式微处理器技术的基础是通用计算机技术。
现在许多嵌入式处理器也是从早期的PC 机的应用发展演化过来的,如早期PC 诸如TRS-80、Apple II 和所用的Z80 和6502 处理器,至今仍为低端的嵌入式应用。
在应用中,嵌入式微处理器具有体积小、重量轻、成本低、可靠性高的优点。
嵌入式处理器目前主要有Am186/88、386EX、SC-400、Power PC、68000、MIPS、ARM 等系列。
在早期实际的嵌入式应用中,芯片选择时往往以某一种微处理器内核为核心,在芯片内部集成必要的ROM/EPROM/Flash/EEPROM、SRAM、接口总线及总线控制逻辑、定时/计数器、WatchDog、I/O、串行口、脉宽调制输出、A/D、D/A 等各种必要的功能和外设。
二、实习设备硬件:Embest EduKit-IV实验平台、ULINK2仿真器套件、PC机软件:μVision IDE for ARM集成开发环境、Windows 98/2000/NT/XP三、实习目的1.初步掌握液晶屏的使用及其电路设计方法;掌握S3C2410X处理器的LCD控制器的使用;掌握通过任务调用的方法把液晶显示函数添加到uC/OS-II中;通过实验掌握液晶显示文本及图形的方法与程序设计。
嵌入式实验报告

目录嵌入式系统实践实验报告1(使用GCC编译C语言程序) (1)嵌入式系统实践实验报告2(Linux 中通过minicom串口下载程序) (14)嵌入式系统实践实验报告1五、实验结果与分析(含程序、数据记录及分析和实验总结等):图5-1 实验结果截图1图5-2 实验结果截图2图5-3 实验结果截图3 图5-4 实验结果截图4图5-5 实验结果截图5 图5-6 实验结果截图6图5-7 实验结果截图7 图5-8 实验结果截图8图5-9 实验结果截图9图5-10 实验结果截图10本次实验按照实验步骤进行,完全符合实验要求,达到了实验预期。
嵌入式系统实践实验报告2二、实验环境:硬件:Mini6410嵌入式实验平台。
软件:PC机操作系统CentOS+Minicom+Arm-Linux 交叉编译环境。
图2-1 嵌入式开发板顶视图四、实验步骤:1.建立工作目录图4-1此时我们新建的hello工作目录,在home目录下,已出现,说明,我们此次操作成功(这里我们要注意,记清楚自己在创建目录时,所在的位置),如下图所示:图4-2编写程序源代码在Linux 下的文本编辑器有许多,常用的是vi 和Xwindow界面下的gedit 等,我们在开发过程中推荐使用vi。
hello.c 源代码较简单,如下:/*****hello.c*****/#include <stdio.h>int main(){printf("Hello,World!\n");return0;}我们可以是用下面的命令来编写hello.c 的源代码,进入hello 目录使用vi 命令来编辑代码(如果不会使用vi命令来编辑,我们也可以使用gedit命令来编辑hello.c文件,命令为:gedithello.c)vi命令中常用命令有: esc i :wq :q!图4-3按“i”或者“a”进入编辑模式,将上面的代码录入进去,完成后按Esc 键进入命令状态,再用命令“:wq”保存并退出。
嵌入式linux实验报告

嵌入式linux实验报告嵌入式Linux实验报告一、引言嵌入式系统是指嵌入在各种设备中的计算机系统,它通常包括硬件和软件两部分。
而Linux作为一种开源的操作系统,被广泛应用于嵌入式系统中。
本实验报告将介绍嵌入式Linux的相关实验内容和实验结果,以及对实验过程中遇到的问题的解决方法。
二、实验目的本次实验旨在通过搭建嵌入式Linux系统,了解Linux在嵌入式领域的应用,并掌握相关的配置和调试技巧。
具体目标如下:1. 理解嵌入式系统的基本概念和原理;2. 掌握Linux内核的编译和配置方法;3. 熟悉交叉编译环境的搭建和使用;4. 实现简单的应用程序开发和调试。
三、实验环境1. 硬件环境:嵌入式开发板、计算机;2. 软件环境:Ubuntu操作系统、交叉编译工具链、嵌入式Linux内核源码。
四、实验步骤与结果1. 内核编译与配置通过下载嵌入式Linux内核源码,使用交叉编译工具链进行编译和配置。
在编译过程中,需要根据实际需求选择合适的内核配置选项。
编译完成后,生成内核镜像文件。
2. 系统烧录与启动将生成的内核镜像文件烧录到嵌入式开发板中,并通过串口连接进行启动。
在启动过程中,可以观察到Linux内核的启动信息,并通过串口终端进行交互。
3. 应用程序开发与调试在嵌入式Linux系统中,可以通过交叉编译工具链进行应用程序的开发。
开发过程中,需要注意与目标平台的兼容性和调试方法。
通过调试工具,可以实时监测应用程序的运行状态和调试信息。
五、实验结果与分析在本次实验中,我们成功搭建了嵌入式Linux系统,并实现了简单的应用程序开发和调试。
通过观察实验结果,我们可以得出以下结论:1. 嵌入式Linux系统的搭建需要一定的配置和编译知识,但通过合理的配置选项和编译参数,可以实现系统的定制化;2. 应用程序的开发过程中,需要注意与目标平台的兼容性和调试方法,以确保程序的正确运行和调试的有效性;3. 嵌入式Linux系统的稳定性和性能受到硬件和软件的综合影响,需要进行系统级的优化和调试。
嵌入式系统实验报告

嵌入式系统实验报告学号:姓名:班级:13电子信息工程指导老师:苏州大学电子信息学院2016年12月实验一:一个灯的闪烁1、实验要求实现PF6-10端口所连接的任意一个LED灯点亮2、电路原理图图1 LED灯硬件连接图3、软件分析RCC_Configuration(); /* 配置系统时钟*/GPIO_Configuration(); /* 配置GPIO IO口初始化*/ for(;;){GPIOF->ODR = 0xfcff; /* PF8=0 --> 点亮D3 */Delay(1000000);GPIOF->ODR = 0xffff; /* PF8=1 --> 熄灭D3 */Delay(1000000);4、实验现象通过对GPIOF8的操作,可以使LED3闪烁5、实验总结这是第一次使用STM32开发板,主要内容是对IO端口进行配置,点亮与IO端口相连接的LED灯,闪烁周期为2S。
通过本实验对STM32开发板的硬件原理有了初步了解。
实验二:流水灯1、实验要求实现PF6-10端口所连接的5个LED灯顺次亮灭2、电路原理图图1 流水灯硬件连接图3、软件分析int main(void){RCC_Configuration();/* 配置系统时钟*/GPIO_Configuration();/* 配置GPIO IO 口初始化*/for(;;){GPIOF->ODR = 0xffbf;/* PF6=0 --> 点亮LED1 */Delay(5000000);GPIOF->ODR = 0xff7f;/* PF7=0 --> 点亮LED2 */Delay(5000000);GPIOF->ODR = 0xfeff;/* PF8=0 --> 点亮LED3 */Delay(5000000);GPIOF->ODR = 0xfdff;/* PF9=0 --> 点亮LED4 */Delay(5000000);GPIOF->ODR = 0xfbff;/* PF10=0 --> 点亮LED5 */ }}4、实验现象LED1~LED5依次点亮,亮灭的时间间隔都为1S。
嵌入式设计实验报告

一、实验目的1. 熟悉嵌入式系统开发的基本流程和常用工具;2. 掌握嵌入式系统硬件资源的使用方法;3. 熟悉嵌入式系统软件开发的基本方法;4. 提高嵌入式系统设计能力。
二、实验内容1. 硬件平台:基于STM32F103系列单片机的开发板;2. 软件平台:Keil uVision5集成开发环境;3. 实验任务:设计一个简单的嵌入式系统,实现按键输入和LED灯控制功能。
三、实验原理1. 硬件原理:STM32F103系列单片机是一款高性能、低功耗的ARM Cortex-M3内核微控制器,具有丰富的片上外设资源,如GPIO、定时器、ADC等。
在本实验中,主要使用GPIO进行按键输入和LED灯控制。
2. 软件原理:嵌入式系统软件开发主要包括底层驱动程序、中间件和应用层。
底层驱动程序负责硬件资源的管理和配置;中间件提供系统服务,如通信、定时器等;应用层实现用户功能。
在本实验中,主要使用C语言编写程序,实现按键输入和LED灯控制功能。
四、实验步骤1. 硬件连接:将开发板上的按键和LED灯分别连接到单片机的GPIO端口;2. 软件编写:(1)创建项目:在Keil uVision5中创建一个新的项目,选择STM32F103系列单片机作为目标设备;(2)添加源文件:添加一个C语言源文件,用于编写主程序;(3)配置GPIO:在源文件中编写GPIO初始化代码,配置按键和LED灯的GPIO端口为输入和输出模式;(4)编写按键输入程序:编写按键扫描函数,用于检测按键状态,并根据按键状态控制LED灯;(5)编译程序:编译项目,生成目标文件;(6)下载程序:将编译好的程序下载到开发板;3. 实验验证:在开发板上运行程序,观察按键输入和LED灯控制功能是否正常。
五、实验结果与分析1. 实验结果:按键按下时,LED灯点亮;按键松开时,LED灯熄灭;2. 实验分析:通过编写程序,实现了按键输入和LED灯控制功能,验证了嵌入式系统开发的基本流程和常用工具。
嵌入式实验电子教案文档

嵌入式实验电子教案文档第一章:嵌入式系统概述1.1 嵌入式系统的定义与特点介绍嵌入式系统的概念解释嵌入式系统的特点,如实时性、功耗低、资源有限等1.2 嵌入式系统的应用领域列举常见的嵌入式系统应用领域,如家电、医疗、工业控制等1.3 嵌入式系统的发展趋势讨论嵌入式系统的发展趋势,如物联网、智能制造等第二章:嵌入式硬件基础2.1 嵌入式处理器介绍嵌入式处理器的基本概念讲解常见嵌入式处理器架构与选型2.2 嵌入式硬件平台介绍嵌入式硬件平台的基本组成分析嵌入式硬件平台的设计与选型原则2.3 嵌入式外围设备讲解嵌入式外围设备的作用与选型,如存储器、传感器等第三章:嵌入式软件基础3.1 嵌入式操作系统介绍嵌入式操作系统的概念与作用讲解常见嵌入式操作系统,如Linux、uc/OS、FreeRTOS等3.2 嵌入式软件开发工具介绍嵌入式软件开发工具的概念与作用讲解常见嵌入式软件开发工具的使用方法,如编译器、调试器等3.3 嵌入式软件设计方法讲解嵌入式软件设计方法与流程分析嵌入式软件的模块化设计、实时性要求等第四章:嵌入式系统设计与实践4.1 嵌入式系统设计流程讲解嵌入式系统设计的整个流程,包括需求分析、硬件选型等4.2 嵌入式系统实践项目提供一个具体的嵌入式系统实践项目案例分析项目的需求、设计方案、实现过程等4.3 嵌入式系统设计的注意事项讨论嵌入式系统设计中需要注意的问题,如安全性、稳定性等第五章:嵌入式系统的应用案例分析5.1 智能家居嵌入式系统应用案例分析智能家居嵌入式系统的需求、架构、实现方法等5.2 工业控制嵌入式系统应用案例分析工业控制嵌入式系统的需求、架构、实现方法等5.3 无人驾驶嵌入式系统应用案例分析无人驾驶嵌入式系统的需求、架构、实现方法等第六章:嵌入式系统编程语言6.1 嵌入式系统编程基础介绍嵌入式系统编程的基本概念讲解嵌入式系统编程的常用语言,如C、C++、汇编等6.2 嵌入式系统编程技巧讲解嵌入式系统编程的技巧与最佳实践分析如何提高嵌入式系统编程的效率和质量6.3 嵌入式系统编程实例提供几个简单的嵌入式系统编程实例引导学生通过实例掌握嵌入式系统编程的方法和技巧第七章:嵌入式系统调试与优化7.1 嵌入式系统调试方法介绍嵌入式系统调试的基本方法讲解嵌入式系统调试工具的使用,如逻辑分析仪、示波器等7.2 嵌入式系统性能优化讲解嵌入式系统性能优化的方法与策略分析如何提高嵌入式系统的运行效率和响应速度7.3 嵌入式系统调试与优化实例提供几个嵌入式系统调试与优化的实例引导学生通过实例掌握嵌入式系统调试与优化的方法和技巧第八章:嵌入式系统安全与防护8.1 嵌入式系统安全概述介绍嵌入式系统安全的概念与重要性讲解嵌入式系统安全的基本要求与挑战8.2 嵌入式系统安全防护技术讲解嵌入式系统安全防护的技术与方法分析如何防止嵌入式系统受到恶意攻击和非法访问8.3 嵌入式系统安全防护实例提供几个嵌入式系统安全防护的实例引导学生通过实例了解和掌握嵌入式系统安全防护的方法和技巧第九章:嵌入式系统项目管理与团队协作9.1 嵌入式系统项目管理概述介绍嵌入式系统项目管理的概念与重要性讲解嵌入式系统项目管理的基本流程与方法9.2 嵌入式系统项目团队协作讲解嵌入式系统项目团队协作的重要性与方法分析如何提高嵌入式系统项目团队的工作效率和协作质量9.3 嵌入式系统项目管理实例提供几个嵌入式系统项目管理与团队协作的实例引导学生通过实例了解和掌握嵌入式系统项目管理和团队协作的方法和技巧第十章:嵌入式系统发展趋势与未来挑战10.1 嵌入式系统发展趋势分析嵌入式系统的发展趋势,如物联网、大数据、等讲解新兴技术对嵌入式系统发展的影响和挑战10.2 嵌入式系统未来挑战讨论嵌入式系统在未来发展中所面临的挑战引导学生思考如何应对这些挑战,推动嵌入式系统的创新与发展10.3 嵌入式系统发展方向的思考引导学生思考嵌入式系统的未来发展方向鼓励学生积极参与嵌入式系统的研究与创新,为嵌入式系统的发展贡献力量重点和难点解析重点环节1:嵌入式系统的基本概念与特点嵌入式系统是一类专用的计算机系统,它集成了硬件和软件,用于完成特定的任务。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验六嵌入式设备驱动程序设计班级:计算机14-1 学号:140344123139 姓名:23223 成绩:一、实验目的1. 掌握设备驱动程序的基本框架结构;2. 掌握设备进入点的创建、查看、删除方法;3. 掌握设备驱动程序模块的加载、查看、卸载方法;4. 编写简单字符设备驱动程序,并测试运行。
二、实验内容1.编写一个字符设备驱动程序,可实现字符串的读、写操作,再编写一个调用该设备驱动程序功能接口(打开、关闭、读、写)的用户程序,测试该驱动程序是否能正常运行。
2.对上述驱动程序进行修改,实现设备的互斥访问(设备上锁)。
(1)编译(2)装载模块(3)创建设备进入点(4)测试驱动程序(5) 程序代码如下devDrv.c#include "linux/kernel.h"#include "linux/module.h"#include "linux/fs.h"#include "linux/init.h"#include "linux/types.h"#include "linux/errno.h"#include "linux/uaccess.h"#include "linux/kdev_t.h"#define MAX_SIZE 1024static int my_open(struct inode *inode, struct file *file);static int my_release(struct inode *inode, struct file *file);static ssize_t my_read(struct file *file, char __user *user, size_t t, loff_t *f); static ssize_t my_write(struct file *file, const char __user *user, size_t t, loff_t *f);static char message[MAX_SIZE] = "-------congratulations--------!";static int device_num = 0;//设备号static int counter = 0;//计数用static int mutex = 0;//互斥用static char* devName = "myDevice";//设备名struct file_operations pStruct ={ open:my_open, release:my_release, read:my_read, write:my_write, };/* 注册模块*/int init_module(){int ret;/* 函数中第一个参数是告诉系统,新注册的设备的主设备号由系统分配,* 第二个参数是新设备注册时的设备名字,* 第三个参数是指向file_operations的指针,* 当用设备号为0创建时,系统一个可以用的设备号创建模块*/ret = register_chrdev(0, devName, &pStruct);if (ret < 0){printk("regist failure!\n");return -1;}else{printk("the device has been registered!\n");device_num = ret;printk("<1>the virtual device's major number %d.\n", device_num);printk("<1>Or you can see it by using\n");printk("<1>------more /proc/devices-------\n");printk("<1>To talk to the driver,create a dev file with\n");printk("<1>------'mknod /dev/myDevice c %d 0'-------\n", device_num);printk("<1>Use \"rmmode\" to remove the module\n");return 0;}}/* 注销模块,函数名很特殊*/void cleanup_module(){unregister_chrdev(device_num, devName);printk("unregister it success!\n");}static int my_open(struct inode *inode, struct file *file){if(mutex)return -EBUSY;mutex = 1;//上锁printk("<1>main device : %d\n", MAJOR(inode->i_rdev));printk("<1>slave device : %d\n", MINOR(inode->i_rdev));printk("<1>%d times to call the device\n", ++counter);try_module_get(THIS_MODULE);return 0;}/* 每次使用完后会release */static int my_release(struct inode *inode, struct file *file){printk("Device released!\n");module_put(THIS_MODULE);mutex = 0;//开锁return 0;}static ssize_t my_read(struct file *file, char __user *user, size_t t, loff_t *f){if(copy_to_user(user,message,sizeof(message))){return -EFAULT;}return sizeof(message);}static ssize_t my_write(struct file *file, const char __user *user, size_t t, loff_t *f) {if(copy_from_user(message,user,sizeof(message))){return -EFAULT;}return sizeof(message);}测试程序test.c#include <sys/types.h>#include <sys/stat.h>#include <stdlib.h>#include <string.h>#include <stdio.h>#include <fcntl.h>#include <unistd.h>#define MAX_SIZE 1024int main(void){int fd;char buf[MAX_SIZE];char get[MAX_SIZE];char devName[20], dir[50] = "/dev/";system("ls /dev/");printf("Please input the device's name you wanna to use :");gets(devName);strcat(dir, devName);fd = open(dir, O_RDWR | O_NONBLOCK);if (fd != -1){read(fd, buf, sizeof(buf));printf("The device was inited with a string : %s\n", buf);/* 测试写*/printf("Please input a string :\n");gets(get);write(fd, get, sizeof(get));/* 测试读*/read(fd, buf, sizeof(buf));system("dmesg");printf("\nThe string in the device now is : %s\n", buf);close(fd);return 0;}else{printf("Device open failed\n");return -1;}}Makefile# If KERNELRELEASE is defined, we've been invoked from the# kernel build system and can use its language.ifeq ($(KERNELRELEASE),)# Assume the source tree is where the running kernel was built # You should set KERNELDIR in the environment if it's elsewhere KERNELDIR ?= /lib/modules/$(shell uname -r)/build# The current directory is passed to sub-makes as argumentPWD := $(shell pwd)modules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesmodules_install:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_installclean:rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions.PHONY: modules modules_install cleanelse# called from kernel build system: just declare what our modules areobj-m := devDrv.oendif三、实验总结这一次的实验主要是实现一个驱动程序,虽然之前上课时讲过相关知识,但实现起来还是有点难,好在最后有参考程序,终于完成了这次实验,虽然对程序还是有一些不懂得地方,但把主要的函数先弄懂就行了。