【基于STM32的城市轨道交通开关门控制系统设计13000字(论文)】_第1页
【基于STM32的城市轨道交通开关门控制系统设计13000字(论文)】_第2页
【基于STM32的城市轨道交通开关门控制系统设计13000字(论文)】_第3页
【基于STM32的城市轨道交通开关门控制系统设计13000字(论文)】_第4页
【基于STM32的城市轨道交通开关门控制系统设计13000字(论文)】_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

基于STM32的城市轨道交通开关门控制系统设计摘要:单片机是一种集成电路芯片,它利用VLSI技术集成CPU、ram、ROM、各种I/O口和中断系统、定时器/计数器等功能(包括显示驱动电路、脉宽调制电路、,将模拟多路A/D转换器等电路集成到一块硅片上,形成一个小型、完善的微机系统,在工业控制领域得到广泛应用。本论文主要基于当前市场主流的(ST)意法半导体公司STM32单片机这一大系列ALIENTEKMiniSTM32V3开发板来研究和设计的。ALIENTEKMiniSTM32开发板是一款迷你型的STM32F103开发板,这块开发板继承了STM32系列的优点,凭借该系列优秀处理器Cortex-M3与多种突破性技术的结合,开发板在低功耗、低成本、高性能三个方面进行了突破性创新。自推出以来,开发板一直受到广大STM32学习者的喜爱,总销量超过1.6W台。关键词:关键词:城市轨道交通;STM32;控制;门控系统目录1绪论 11.1研究背景及研究意义 11.2发展历史及研究现状 11.3本文的主要研究内容 22ALIENTEKMiniSTM32V3基本结构 32.1开发板资源初步探索 32.2开发板资源说明 42.2.1硬件资源说明 42.2.2软件资源说明 83总体设计 93.1设计初期的探索和想法 93.2总体设计 93.2.1总体硬件设计 93.2.2总体硬件电路设计 93.2.3总体软件电路设计 104总体系统硬件模块 114.1摄像头选择 114.2红外传感器选择 124.3Led显示选择 134.4蜂鸣器安装 144.5驱动下载电路 155总体软件设计 165.1软件设计中的思考和知识点介绍 165.1.1设计思考 165.1.2二值化 165.2软件代码及相应细节 175.2.1红外传感器程序函数 175.2.2图像识别函数 245.2.3时钟代码 326系统的整体设计小结及分析 346.1系统设计的自我分析 346.2设计小结 347开发软件工具 357.1MDK5软件入门 35结束语 37参考文献 38绪论研究背景及研究意义我国国力不断增强,要解决城市车辆拥挤和外出交通问题,铁路也从地面上的运输开始往地下发展,而早在1863年开始,英国建造了世界上第一个地铁系统,伦敦大都会。铁路系统运营第一年载客950万人次,证明了铁路系统的实用性,而为了保证铁路运输安全的需要,以及方便运输,更伴随着第二次工业革命电力的发展,最简单的门控系统由此应运而生。而进入二十一世纪初,第三次工业革命所带来的较为完善电子计算机科技也伴随着电子信息的进步融入人们的日常生活,变成为我们生活中不可缺少的一部分。发展历史及研究现状现如今门控系统隶属于列车自动控制系统的一部分,而门控系统在工业革命早期是一个单独的系统,在早期的铁路门控采用的气压式,这种方式不仅安全隐患极大,而且更需要人工的维护和更换,而伴随着电力的普及还有工业化进程的高速进步并且还有单片微机技术的发展,二十世纪末期门控系统已经是由电力作为驱动,单片机作为小型控制核心的一个相对完善的系统。而随着二十一世纪初的第三次工业革命,列车的不断提速和信息化的高速发展门控系统作为列车自动控制系统的一部分,为了保护旅客安全发挥了巨大的作用。目前,世界上拥有地铁的国家和地区的轨道交通线路正在使用或加装门控系统都是安装有电控单元和传动设备,通过电信号来控制传动装置,以此来控制车门的开关。地铁车门分为气动式和电动式,在国外德国、日本和法国的铁路工业达到国际一流水平,尤其像来自日本的新干线铁路,成为了日本铁路工业的一座丰碑,为其他国家铁路工业的发展提供了经验。日本在车门领域的研发上也取得了有成效的进展,像电动式开关门。在日本通勤电动公交车,车门上没有台阶,使游客能够顺畅通行,快速候车,满足了安全需求,节省了时间。一方面,为了解决工作高峰期候车问题,另一方面,为了缩短候车时间,从209系列和e217系列之后的新系列电车,东日本客运公司在郊区尝试运行了四门电车,并把四门作为通勤电车的标准车门数量。在其他方面,为满足实际需求,达成模块化好修理,可靠度高的要求,第一个电动开关门系统在在1992年由东日客公司研制出来,并安装在901系列编组点车上,首次的试运行在东京滨海东北岸。日本新干线电车车门都使用了这个结构,这个装置有这样几个部分组成:减压阀、电磁阀踏板开关、驱动装置、手动开关、自动控制开关等组成。随着我国铁路客运体系的不断发展,世界各地的铁路客车自动塞拉门生产企业纷纷涌入我国。为了从众多厂家中挑选出适合中国国情的塞拉门系统,国内几家铁路客车厂家从1995年开始陆续对ife、Connie、Bode等公司的塞拉门系统产品进行试装,为中国塞拉门系统的最终成型和合资生产奠定了一定的基础。这些国外公司的产品能充分展示世界一些国家地铁车门技术发展的现状。本文的主要研究内容本课题的研究内容主要包括对门控系统电控单元的硬件系统设计和软件控制设计两大组成部分,在硬件设计方面首先要了解各模块的工作原理,然后根据硬件设计芯片手册以及参考电路设计出可用的电路模块。在硬件系统的设计包括如何选择合适的主控芯片,还有I/O接口在单片机当中的扩展,加装红外传感器等可能需要用到的模块,在软件设计这方面充分利用STM32的单片机库函数部分,在研究过程中,深刻体验模拟电子技术,自动控制原理,单片机原理等知识的具体运用及实践,熟悉意法半导体公司的STM32系列单片机编程基本方法。ALIENTEKMiniSTM32V3基本结构开发板资源初步探索首先,如果要运用一个单片机,首先就得了解该款单片机的硬件结构,然后熟悉该平台所使用的开发工具,在满足这些前提条件的情况下在进行分析问题、方法论证、硬件设计、软件设计等步骤才能解决实际的问题。那么我们就了了解该单片机都有那些开发资源。◆CPU:是STM32F103RCT6,LQFP64,FLASH:256K,SRAM:48K;◆1个JTAG/SWD调试下载口◆1个电源指示灯◆2个系统状态指示灯(DS0:红,DS1:绿)◆1个红外接收头◆1个EEPROM芯片,容量为256B◆1个SPIFLASH芯片,W25Q64,容量为64mbit◆1个DS18B20/DS1820温度传感器的预留接口◆1个标准的LCD接口◆1个OLED模块的接口◆1个USB串口的接口,用来下载程序,调试代码◆1个USBSLAVE接口◆1个单独的SD卡接口◆1个PS/2的接口,用来接入鼠标、键盘这类外设◆1组5V电源和接入口◆1组3.3V电源和接入口◆1个选择启动模式的配置接口◆1个2.4Ghz的无线通信接口◆1个单独地RTC后备电池座,并带电池◆1个复位按钮◆3个功能按钮◆1个电源开关,用于控制整个开发板的电源◆3.3V的电源与5V的电源都拥有TVS保护◆特有的一键下载程序功能如下图2-1所示图2-1ALIENTEKMiniSTM32V3基本结构图开发板资源说明硬件资源说明首先介绍开发板硬件部分的资源说明,采用逆时针旋转的顺序来进行,具体位置可在下图2-2中看到。1、HS0038红外接收头:开发板上自带的红外线接收头,用于接收红外遥控的信号。2、DS18B20接口:开发板上预留的数字温度传感器接口。3、USB串口:可以下载程序和调试代码。4、两个LED灯:开发板上的LED灯,标为DS0和DS1。DS0为红色,DS1为绿色,方便识别。5、STM32USB口:这是一个MiniUSB头,是开发板上板载自带的。它经常用于单片机与电脑见进行信息交换。它的标号为:USB,用于连接STM32F103RCT6的usb。6、24C02EEPROM:这是一个2KbitEEPROM,用于在掉电时保存数据。由于STM32没有EEPROM设计,所以需要额外的存储器。EEPROM安装在板子的I/O接口上。7、JTAG/SWD:它是一个20针JTAG调试端口。8、CH340G:这是一个USB转串口芯片。它的作用时实现USB转串口,进而可以做到通过USB来下载代码,串口通信等。9、USB转串口接口:它是开发板上的另一个迷你USB头。一般用于ch340g芯片与USB连接,进一步实现USB到串口。因此,在下载代码时,USB连接到这个接口。同时,MINIUSB也是主要的电源端口。10、STM32启动配置选择:一个选择开关,在板子上标为boot。STM32有boot0和boot1两个启动选择引脚,功能是在MCU复位后重新选择启动模式。11、电源指示灯:它是蓝色的LED灯,表示电源状态,被标记为PWR。12、复位按键:于复位STM32。它还具有复位LCD的功能。由于该按钮的引脚与LCD的复位按钮相连,所以被标记为复位。按下按钮时,STM32和LCD一起复位。13、WK_UP按键:它是一个唤醒按键,这个按键连接到PA0引脚,它的功能是待机模式下叫醒单片机,不使用这个功能时,这个按键的功能也7可以自己设定,它被标记为WK_UP。14、两个普通按键:它是两个普通按键,功能可以由自己设计选择,它们被标记为KEY0、KEY1。15、电源芯片:它是电源稳压芯片。因为STM32一般是由3.3V的带能源供电,但USB的标准一般为5V,它的功能就是将5V的电源转换为3.3V的电源。16、电源开关:它被标为K1,并上面有ON/OFF印记。这个开关用于控制着整个单片机的供电,如果它被转为关状态,则整个单片机都将断电,电源指示灯也会熄灭。17、3.3V电源输出/入:电源的排针,它被标为VOUT1。另外板载了3.3V的防过载管,可以防止电流损坏开发板。18、5V电源输出/输入:电源排针,它被标为VOUT2,用于提供5V的电源。它还具有5V防过载管,可以有效地吸收高压脉冲,防止电流损坏开发板。19、GPIOC&D:它是开发板自带的GPIOC和GPIOD等I/O接口的引出排针,它被标为P5。20、SD卡接口:它是SD卡接口。21、W25Q6464MFLASH:它是开发板自带的FLASH芯片。这颗芯片的容量为64Mbit,也就是8M字节。22、NRF24L01模块接口:它是开发板自带的NRF24L01接口,只要插入NRF24L01模块,我们就可以实现无线的通信功能。23、GPIOB&C:它是开发板自带的GPIOB和GPIOC之间的引出口,它的功能是将STM32和GPIOB和部分的GPIOC引出,方便使用,它被标记为P1。24、STM32F103RCT6:单片机核心。一个48KSRAM、一个256KFLASH、2个16位基本定时器、4个通用定时器、2个高级定时器、2个DMA控制器、3个SPI、2个IIC、5个串口、1个USB口、1个CAN、3个12位ADC口、1个12位DAC口、1个SDIO接口、51个通用I/O口组成了它。25、OLED&LCD共用接口:它是ALIENTEK开发板的特色模块,兼容两种模块。在此部分,LCD的部分I/O接口和OLED的I/O接口共用。这个接口既可以接LCD模块,又可以连接OLED模块。26、GPIOA引出I/O口:它是开发板GPIOA的引出排针,它被标记为P3。ALIENTEK将所有的I/O口接口都用排针标记出来了。27、红外传感器接口:它是开发板自带的红外传感器的接口。图2—2ALIENTEKMiniSTM32V3功能图示软件资源说明Ministm32开发板一共由三十八个标准例程可供使用。按平常情况,STM32的开发人员只为用户提供库函数版本的代码。它们主要提供寄存器版本和库函数版本代码。市场占比最高的意法半导体公司为了方便用户单独操作使用,提供了一套相当完善的STM32固件库。STM32标准外设库是由程序、数据结构和宏组成的固件功能包。它包含几乎所有的外围性能特征。灵活使用固态函数库可以充分减少开发人员使用片内和片外设备的时间,进而降低单台计算机的开发成本,每个外设的驱动程序本质上就是一组函数,这组函数包含了这款外设近乎所有的功能。同时,STM32官方还给出了大量的示例例程和代码用来供学习。总体设计设计初期的探索和想法在现代代城市交通的体系中,地铁充分发挥了高效、快速、安全的优势,其中最关键的就是安全。现代社会以人为本,所以我们的设计也因该把人民的生命安全放到第一位,在拥有车门的基本功能的基础上在延申出一系列的额外功能,例如红外识别、自动开关、还有在突发情况下的手动强制开关。总体设计总体硬件设计由于本次设计的是地铁的开关门系统,首先就要有作为门的基础功能,其次再在基础上在单片机的额外I/O接口上添加新的外设,以此增加新功能。摄像头的安装红外传感器的安装Led显示屏的安装蜂鸣器的安装总体硬件电路设计由于设计的是车门系统,所以在满足基础的开关门使用上和显示时间和车门开启状态,还有就要想到一些额外的突发状况,例如突发停电,突发紧急状况,需要手动强制开门,还需要一个额外的呼救按钮,在危急时刻发出声响,让别人能注意到的功能。最小系统电路摄像头电路驱动电路程序下载电路外设电路电源电路如图3—1图3—1硬件电路图总体软件电路设计软件就像开关门系统的灵魂,尤为重要,软件决定了系统的实际使用上限,精简而有效的软件程序可以让开关门系统更加具有适应性和稳定性。该程序分为四个部分:摄像识别、开关控制、温度识别和危险报警。摄像机采集采用视频流处理来获取元素信息。开关控制使用的是电信号和计时器。然后,芯片通过实现闭环控制。温度识别是由红外测温传感器采集信息后将温度信息发送给芯片,芯片经过与寄存器中的数据比较将信息反馈给芯片,使得控制地铁车门进行开或关的动作,从而形成开关的闭环控制。在使用额外功能时也会使用到一些辅助模块,例如OLED显示屏、蜂鸣器等。总体系统硬件模块摄像头选择考虑到摄像头作为门控系统的一部分,应该尽可能的做到小巧而简便,并且拥有一定的像素,能够比较清晰的看到摄像头中所拍摄的事物,所以采用的是OV2640这款摄像头。Ov2640作为一款传感器,它体积小、工作电压十分低。最重要的是要提供单片机uxga相机和图像处理器的功能。通过总线控制,可以输出整帧图像,并通过二次采样、放缩等方式提取所采集到的低分辨率的图像数据。如图4-1图4-1摄像头实体图其功能原理图如下图,模块自带了1.3V和2.8V的稳压芯片,可以给OV2640提供合适的电源让它能适应的场合更多但一般情况下提3.3V的电压就可以使用;在原理图左上角,可以看到这个摄像头自带了一个有源晶振,所以不需要外部提供时钟。其中HREF为该摄像头的片选端,是否使用该传感器可自己设置并选择高或低电平为有效。图4-2摄像头电路原理图红外传感器选择首先作为一款开关门系统,以人的安全为重,就必须要做到能识别人,所以就要选择一款能够识别到人的传感器。所以我选择了红外传感器。红外传感器的原理是利用红外光谱对物体进行温度识别。对于任何物质,只要它有一定的温度(该温度高于-273.5度),就可以向外辐射红外线。红外传感器测量时,不需要与被测物体直接接触,所以它与被测物体不存在摩擦,并且具有高灵敏,反应快等等优点。所以选用了HC-SR501这款传感器,它这个自动控制模块采用的是红外光谱感应技术,不仅高灵敏、很可靠,而且有超低电压版本的工作模式,能够适应多种复杂多变的工作环境与电器设备,而它感应角度<100度角,工作温度零下15-零上70度,小巧方便,仅仅用作门控系统的一部分绰绰有余。如图4-3.图4—3红外传感器实体图图4—4红外传感器电路原理图工作原理图如上图4-4,其主要模块为芯片BISS0001,正是由于它的存在,传感器才能实现全自动感应(感测到红外线时输出高电平,感测不到红外线时输出低电平)。这个传感器还有光敏控制功能,即可调整合适的光敏感应方式,它在白天或光线强烈的时候没有反应。还有温度补偿:在夏天或者在环境温度升高到三十度左右,探测性能会变差,而温度补偿可以对距离进行一些补偿。Led显示选择考虑到该开发板上本来就附送一块led显示屏,但因为备用考虑由此又多准备了一块led显示屏,而之所以在开关门系统上安装显示屏,一方面是为了提供一些地铁上常用的时钟功能,其次是可以显示一些门控系统的相关信息在显示屏上。我选用的是PZ-MCU-TFT7.0-SSD1963这款电阻触摸屏。PZ-MCU-TFT7.0-SSD1963模块是普中设计的一款高性能的电阻触摸屏模块。该led的屏幕分辨率为800*480,它可以16位真彩显示,并且采用了SSD1963芯片作为驱动,该款芯片板载了GRAM,所以无需外加驱动器,因而任何电器设备,都可以较为轻易的使用。这个显示屏是电阻触摸屏,具有良好的操控效果,非常适合工业上的应用。模块的硬件接口与普中其他液晶模块接口完全一致。当然最后使用可以是两块显示屏任选其一,其中PZ-MCU-TFT7.0-SSD1963如图4-5,.图4—5led显示屏原理图开发板上的led显示屏原理图如下图4—6图4-6led显示屏电路原理图9TFT/LCD是一种普遍存在于STM32的LCD模块接口。OLEDVCC是为OLED显示模块供电的引脚。它与TFT连接,和LCD连接在一起。所以当我们使用LCD时,我们得到的是TFT\LCD(图种右侧的位置)是可以的。在使用单片机的显示模块时,我们将OLED上的指针作为电源,同时将TFT与LCD(图中左侧位置)连接起来,完成OLED与单片机的连接。蜂鸣器安装市面上有许多蜂鸣器,有两大类蜂鸣器。它们的模式又被区分为是有源和无源。两种蜂鸣器最根本的差别是“源”,它不是电源,而是冲击源。因此,主动蜂鸣器有自己的振源,所以只要接通电源,就会发出啸叫声。无源蜂鸣器内部没有安装冲击源,因此直流电不能使其发出声音。但有源蜂鸣器和无源蜂鸣器在成本和价格上还存在一定差距,但随着科技的发展,有源蜂鸣器价格也逐渐下降,出于方便考虑,这里选用的是有源蜂鸣器。如图4-7图4-7蜂鸣器实体图其工作原理图如4-8图4-8蜂鸣器电路原理图驱动下载电路常用的单片机和电气设备一般采用标准的JTAG电路连接方式,而STM32不仅具有JTAG接口,还具有SWD接口。SWD解决方案至少需要2根线来下载和调试代码,这与我们使用串口下载代码的方式类似,而且速度更快。因此,在设计产品时,可以使用SWD接口来下载调试代码,而不是JTAG。一般来说,STM32的SWD接口是与JTAG共享的。只要连接JTAG,就可以使用SWD模式。例如,JLINKV8/V7和stlink支持SWD。其原理图如图4-9图4-9驱动接口电路原理图总体软件设计软件设计中的思考和知识点介绍设计思考我所设计的门控系统采用的是STM32F103为主控芯片,利用该主控芯片,从而进行数据的分析和处理以及对整个系统的控制,通过人群发出的红外线信号,从而让红外传感器对周围存在的物质进行感应,以确定是否开启视频图像采集功能,运用OV2640进行对影像的采集。其中主要是红外传感器进行对周围的温度进行识别,以此判断周围是否存在人群,然后开启摄像头来识别文字以此进行对比来看具体是否到站。二值化二值化全称图像二值化,在图像的辨析识别应用领域,发挥了不可或缺的巨大作用。二值化的操作是将采集到的像素的灰度值设置为0或者是255,大体是将采集到的图像经过设置将图像所需要的地方突凸出为白色而不需要的将之变为灰色。就是说,抽出256个亮度级灰度图像的适当阈值,可以整理出显示此图像的大体和部分图像的灰度数值。在数字图像处理和分析领域里,二值化扮演者不可缺少的重要一角,尤为在现实生活的图像处理中。有许多系统搭建平凑的才能完成二值图像处理。要对图像进行处理和分析,第一步就是要对灰度图像进行二值化,得到灰度数值,这有利于下一步的数值处理,图像的如何汇聚到一起只与像素值为0或255的点的位置有联系,不再涉及像素的多级值,使得操作简单,数据处理和压缩量小。为了得到一个处理好的二值图像,通常采用闭合和联通的边界来定义没有重叠到一起的区域。确定灰度大于或等于阈值的所有像素属于特定对象,灰度值为255的这些数值从对象区域被清除在外,灰度值为0,表示背景或异常对象区域。常用的二极化方法有三种用二值化方法:

   1、取中值:将合适值设置为127,小于127的灰度值为0,大于127的灰度值为255。这个方法计轻快,高效。缺点十分严重:在不同的影像资料中,颜色分布不同,处理效果不是很好。在程序开始之前设置R、G和B的阈值,并且通过阈值判断将像素设置为全黑或全白。同时根据颜色变化记录每行的颜色跳变点,以便识别。

   2、取平均值:像素平均值=(像素位置1的灰度值+像素位置2的灰度值+…+像素位置n的灰度值)/n   3、双峰法:这种方法适合双峰直方趋势明显的图像,但不适用于双峰直方图差异较大或双峰直方图谷宽平缓的图像。这个方法涉及图像由前景和背景组成。在灰度直方图中,前景和背景将拼凑成一个峰,两个峰值之间的最低谷为合适值。软件代码及相应细节红外传感器程序函数首先是连接传感器和单片机,其连接示意图如下5-1图5-1模块连接示意图该传感器的说明书上的说明,该传感器为全自动化处理,人进入其感应范围则该传感器输出高电平,人离开后则自动延时关闭,转为低电平,所以它不需要特殊的参数配置,但还是需要一些基础的模式配置。其设置代码如下,为该模块的基础配置。#include<hc_sr501.h>#include<stm32f10x_rcc.h>#include<stm32f10x_gpio.h>#include<stm32f10x_type.h>#include<delay_by_systick.h>voidHC_SR(void){ GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //打开GPIOA时钟 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//选中0引脚 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//配置为下拉口输模式 GPIO_Init(GPIOA,&GPIO_InitStructure);}u8HC_SR501_Statue(void){ if(PAI(0)==1)//如果GPIOA_0引脚输入高电平,代表有人,返回1 { return1; } return0;//没人就返回0}其主函数如下#include<stdio.h>#include<stm32f10x_lib.h>#include<stm32f10x_gpio.h>#include<stm32f10x_rcc.h>#include<delay_by_systick.h>#include<GPIOweibangding.h>#include<hc_sr501.h>#include<USART1_Configuration.h>voidRCC_Configuration(void);voidGPIO_Configuration(void);intfputc(intch,FILE*p) { USART_SendData(USART1,(u8)ch); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); returnch; }intmain(void){ delay_init(72); RCC_Configuration(); GPIO_Configuration(); HC_SR(); USART1_Configuration(); while(1) { GPIO_ResetBits(GPIOC,GPIO_Pin_0); if(HC_SR501_Statue()==1) { printf("有人¨?); } elseprintf("没人¨?); delay_ms(500); }}voidRCC_Configuration(void){ //使用外部晶振 RCC_DeInit(); //初始化为缺省值 RCC_HSEConfig(RCC_HSE_ON); //使能外部的高速时钟 while(RCC_GetFlagStatus(RCC_FLAG_HSERDY)==RESET); //等待外部的高速时钟 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //启动PrefetchBuffer FLASH_SetLatency(FLASH_Latency_2); //Flash2等待状态 RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK=SYSCLK RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2=HCLK RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1=HCLK/2 RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK=8MHZ*9=72MHZ RCC_PLLCmd(ENABLE); //启动PLLCLK while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET); //等待PLLCLK准备好RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //选择PLL作为系统时钟 while(RCC_GetSYSCLKSource()!=0x08); //等待使用PLL作为系统时钟源 //打开相应的外设时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE); //使能APB2外设的GPIO时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);}voidGPIO_Configuration(void){ GPIO_InitTypeDefGPIO_InitStructure; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(GPIOC,&GPIO_InitStructure); GPIO_SetBits(GPIOC,GPIO_Pin_0);其后为STM32的库函数,其中主函数部分涉及到了下列的一些库函数,所以在此列出几个在主函数中涉及到的来自意法半导体公司库函数。像LIB、GPIO。/*Definetopreventrecursiveinclusion*/#ifndef__STM32F10x_LIB_H#define__STM32F10x_LIB_H/*Includes*/#include"stm32f10x_map.h"#ifdef_ADC#include"stm32f10x_adc.h"#endif/*_ADC*/#ifdef_BKP#include"stm32f10x_bkp.h"#endif/*_BKP*/#ifdef_CAN#include"stm32f10x_can.h"#endif/*_CAN*/#ifdef_CRC#include"stm32f10x_crc.h"#endif/*_CRC*/#ifdef_DAC#include"stm32f10x_dac.h"#endif/*_DAC*/#ifdef_DBGMCU#include"stm32f10x_dbgmcu.h"#endif/*_DBGMCU*/#ifdef_DMA#include"stm32f10x_dma.h"#endif/*_DMA*/#ifdef_EXTI#include"stm32f10x_exti.h"#endif/*_EXTI*/#ifdef_FLASH#include"stm32f10x_flash.h"#endif/*_FLASH*/#ifdef_FSMC#include"stm32f10x_fsmc.h"#endif/*_FSMC*/#ifdef_GPIO#include"stm32f10x_gpio.h"#endif/*_GPIO*/#ifdef_I2C#include"stm32f10x_i2c.h"#endif/*_I2C*/#ifdef_IWDG#include"stm32f10x_iwdg.h"#endif/*_IWDG*/#ifdef_NVIC#include"stm32f10x_nvic.h"#endif/*_NVIC*/#ifdef_PWR#include"stm32f10x_pwr.h"#endif/*_PWR*/#ifdef_RCC#include"stm32f10x_rcc.h"#endif/*_RCC*/#ifdef_RTC#include"stm32f10x_rtc.h"#endif/*_RTC*/#ifdef_SDIO#include"stm32f10x_sdio.h"#endif/*_SDIO*/#ifdef_SPI#include"stm32f10x_spi.h"#endif/*_SPI*/#ifdef_SysTick#include"stm32f10x_systick.h"#endif/*_SysTick*/#ifdef_TIM#include"stm32f10x_tim.h"#endif/*_TIM*/#ifdef_USART#include"stm32f10x_usart.h"#endif/*_USART*/#ifdef_WWDG#include"stm32f10x_wwdg.h"#endif/*_WWDG*//*Exportedtypes*//*Exportedconstants*//*Exportedmacro*//*Exportedfunctions*/voiddebug(void);#endif/*__STM32F10x_LIB_H*//*******************(C)COPYRIGHT2008STMicroelectronics*****ENDOFFILE****//*Definetopreventrecursiveinclusion*/#ifndef__STM32F10x_GPIO_H#define__STM32F10x_GPIO_H/*Includes*/#include"stm32f10x_map.h"/*Exportedtypes*/#defineIS_GPIO_ALL_PERIPH(PERIPH)(((*(u32*)&(PERIPH))==GPIOA_BASE)||\((*(u32*)&(PERIPH))==GPIOB_BASE)||\((*(u32*)&(PERIPH))==GPIOC_BASE)||\((*(u32*)&(PERIPH))==GPIOD_BASE)||\((*(u32*)&(PERIPH))==GPIOE_BASE)||\((*(u32*)&(PERIPH))==GPIOF_BASE)||\((*(u32*)&(PERIPH))==GPIOG_BASE))/*OutputMaximumfrequencyselection*/typedefenum{GPIO_Speed_10MHz=1,GPIO_Speed_2MHz,GPIO_Speed_50MHz}GPIOSpeed_TypeDef;#defineIS_GPIO_SPEED(SPEED)(((SPEED)==GPIO_Speed_10MHz)||((SPEED)==GPIO_Speed_2MHz)||\((SPEED)==GPIO_Speed_50MHz))/*ConfigurationModeenumeration*/typedefenum{GPIO_Mode_AIN=0x0,GPIO_Mode_IN_FLOATING=0x04,GPIO_Mode_IPD=0x28,GPIO_Mode_IPU=0x48,GPIO_Mode_Out_OD=0x14,GPIO_Mode_Out_PP=0x10,GPIO_Mode_AF_OD=0x1C,GPIO_Mode_AF_PP=0x18}GPIOMode_TypeDef;#defineIS_GPIO_MODE(MODE)(((MODE)==GPIO_Mode_AIN)||((MODE)==GPIO_Mode_IN_FLOATING)||\((MODE)==GPIO_Mode_IPD)||((MODE)==GPIO_Mode_IPU)||\((MODE)==GPIO_Mode_Out_OD)||((MODE)==GPIO_Mode_Out_PP)||\((MODE)==GPIO_Mode_AF_OD)||((MODE)==GPIO_Mode_AF_PP))/*GPIOInitstructuredefinition*/typedefstruct{u16GPIO_Pin;GPIOSpeed_TypeDefGPIO_Speed;GPIOMode_TypeDefGPIO_Mode;}GPIO_InitTypeDef;/*Bit_SETandBit_RESETenumeration*/typedefenum{Bit_RESET=0,Bit_SET}BitAction;#defineIS_GPIO_BIT_ACTION(ACTION)(((ACTION)==Bit_RESET)||((ACTION)==Bit_SET))/*Exportedconstants*//*GPIOpinsdefine*/#defineGPIO_Pin_0((u16)0x0001)/*Pin0selected*/#defineGPIO_Pin_1((u16)0x0002)/*Pin1selected*/#defineGPIO_Pin_2((u16)0x0004)/*Pin2selected*/#defineGPIO_Pin_3((u16)0x0008)/*Pin3selected*/#defineGPIO_Pin_4((u16)0x0010)/*Pin4selected*/#defineGPIO_Pin_5((u16)0x0020)/*Pin5selected*/#defineGPIO_Pin_6((u16)0x0040)/*Pin6selected*/#defineGPIO_Pin_7((u16)0x0080)/*Pin7selected*/#defineGPIO_Pin_8((u16)0x0100)/*Pin8selected*/#defineGPIO_Pin_9((u16)0x0200)/*Pin9selected*/#defineGPIO_Pin_10((u16)0x0400)/*Pin10selected*/#defineGPIO_Pin_11((u16)0x0800)/*Pin11selected*/#defineGPIO_Pin_12((u16)0x1000)/*Pin12selected*/#defineGPIO_Pin_13((u16)0x2000)/*Pin13selected*/#defineGPIO_Pin_14((u16)0x4000)/*Pin14selected*/#defineGPIO_Pin_15((u16)0x8000)/*Pin15selected*/#defineGPIO_Pin_All((u16)0xFFFF)/*Allpinsselected*/#defineIS_GPIO_PIN(PIN)((((PIN)&(u16)0x00)==0x00)&&((PIN)!=(u16)0x00))#defineIS_GET_GPIO_PIN(PIN)(((PIN)==GPIO_Pin_0)||\((PIN)==GPIO_Pin_1)||\((PIN)==GPIO_Pin_2)||\((PIN)==GPIO_Pin_3)||\((PIN)==GPIO_Pin_4)||\((PIN)==GPIO_Pin_5)||\((PIN)==GPIO_Pin_6)||\((PIN)==GPIO_Pin_7)||\((PIN)==GPIO_Pin_8)||\((PIN)==GPIO_Pin_9)||\((PIN)==GPIO_Pin_10)||\((PIN)==GPIO_Pin_11)||\((PIN)==GPIO_Pin_12)||\((PIN)==GPIO_Pin_13)||\((PIN)==GPIO_Pin_14)||\((PIN)==GPIO_Pin_15))/*GPIORemapdefine*/#defineGPIO_Remap_SPI1((u32)0x00000001)/*SPI1AlternateFunctionmapping*/#defineGPIO_Remap_I2C1((u32)0x00000002)/*I2C1AlternateFunctionmapping*/#defineGPIO_Remap_USART1((u32)0x00000004)/*USART1AlternateFunctionmapping*/#defineGPIO_Remap_USART2((u32)0x00000008)/*USART2AlternateFunctionmapping*/#defineGPIO_PartialRemap_USART3((u32)0x00140010)/*USART3PartialAlternateFunctionmapping*/#defineGPIO_FullRemap_USART3((u32)0x00140030)/*USART3FullAlternateFunctionmapping*/#defineGPIO_PartialRemap_TIM1((u32)0x00160040)/*TIM1PartialAlternateFunctionmapping*/#defineGPIO_FullRemap_TIM1((u32)0x001600C0)/*TIM1FullAlternateFunctionmapping*/#defineGPIO_PartialRemap1_TIM2((u32)0x00180100)/*TIM2Partial1AlternateFunctionmapping*/#defineGPIO_PartialRemap2_TIM2((u32)0x00180200)/*TIM2Partial2AlternateFunctionmapping*/#defineGPIO_FullRemap_TIM2((u32)0x00180300)/*TIM2FullAlternateFunctionmapping*/#defineGPIO_PartialRemap_TIM3((u32)0x001A0800)/*TIM3PartialAlternateFunctionmapping*/#defineGPIO_FullRemap_TIM3((u32)0x001A0C00)/*TIM3FullAlternateFunctionmapping*/#defineGPIO_Remap_TIM4((u32)0x00001000)/*TIM4AlternateFunctionmapping*/#defineGPIO_Remap1_CAN((u32)0x001D4000)/*CANAlternateFunctionmapping*/#defineGPIO_Remap2_CAN((u32)0x001D6000)/*CANAlternateFunctionmapping*/#defineGPIO_Remap_PD01((u32)0x00008000)/*PD01AlternateFunctionmapping*/#defineGPIO_Remap_TIM5CH4_LSI((u32)0x00200001)/*LSIconnectedtoTIM5Channel4inputcaptureforcalibration*/#defineGPIO_Remap_ADC1_ETRGINJ((u32)0x00200002)/*ADC1ExternalTriggerInjectedConversionremapping*/#defineGPIO_Remap_ADC1_ETRGREG((u32)0x00200004)/*ADC1ExternalTriggerRegularConversionremapping*/#defineGPIO_Remap_ADC2_ETRGINJ((u32)0x00200008)/*ADC2ExternalTriggerInjectedConversionremapping*/#defineGPIO_Remap_ADC2_ETRGREG((u32)0x00200010)/*ADC2ExternalTriggerRegularConversionremapping*/#defineGPIO_Remap_SWJ_NoJTRST((u32)0x00300100)/*FullSWJEnabled(JTAG-DP+SW-DP)butwithoutJTRST*/#defineGPIO_Remap_SWJ_JTAGDisable((u32)0x00300200)/*JTAG-DPDisabledandSW-DPEnabled*/#defineGPIO_Remap_SWJ_Disable((u32)0x00300400)/*FullSWJDisabled(JTAG-DP+SW-DP)*/#defineIS_GPIO_REMAP(REMAP)(((REMAP)==GPIO_Remap_SPI1)||((REMAP)==GPIO_Remap_I2C1)||\((REMAP)==GPIO_Remap_USART1)||((REMAP)==GPIO_Remap_USART2)||\((REMAP)==GPIO_PartialRemap_USART3)||((REMAP)==GPIO_FullRemap_USART3)||\((REMAP)==GPIO_PartialRemap_TIM1)||((REMAP)==GPIO_FullRemap_TIM1)||\((REMAP)==GPIO_PartialRemap1_TIM2)||((REMAP)==GPIO_PartialRemap2_TIM2)||\((REMAP)==GPIO_FullRemap_TIM2)||((REMAP)==GPIO_PartialRemap_TIM3)||\((REMAP)==GPIO_FullRemap_TIM3)||((REMAP)==GPIO_Remap_TIM4)||\((REMAP)==GPIO_Remap1_CAN)||((REMAP)==GPIO_Remap2_CAN)||\((REMAP)==GPIO_Remap_PD01)||((REMAP)==GPIO_Remap_TIM5CH4_LSI)||\((REMAP)==GPIO_Remap_ADC1_ETRGINJ)||((REMAP)==GPIO_Remap_ADC1_ETRGREG)||\((REMAP)==GPIO_Remap_ADC2_ETRGINJ)||((REMAP)==GPIO_Remap_ADC2_ETRGREG)||\((REMAP)==GPIO_Remap_SWJ_NoJTRST)||((REMAP)==GPIO_Remap_SWJ_JTAGDisable)||\((REMAP)==GPIO_Remap_SWJ_Disable))/*GPIOPortSources*/#defineGPIO_PortSourceGPIOA((u8)0x00)#defineGPIO_PortSourceGPIOB((u8)0x01)#defineGPIO_PortSourceGPIOC((u8)0x02)#defineGPIO_PortSourceGPIOD((u8)0x03)#defineGPIO_PortSourceGPIOE((u8)0x04)#defineGPIO_PortSourceGPIOF((u8)0x05)#defineGPIO_PortSourceGPIOG((u8)0x06)#defineIS_GPIO_EVENTOUT_PORT_SOURCE(PORTSOURCE)(((PORTSOURCE)==GPIO_PortSourceGPIOA)||\((PORTSOURCE)==GPIO_PortSourceGPIOB)||\((PORTSOURCE)==GPIO_PortSourceGPIOC)||\((PORTSOURCE)==GPIO_PortSourceGPIOD)||\((PORTSOURCE)==GPIO_PortSourceGPIOE))#defineIS_GPIO_EXTI_PORT_SOURCE(PORTSOURCE)(((PORTSOURCE)==GPIO_PortSourceGPIOA)||\((PORTSOURCE)==GPIO_PortSourceGPIOB)||\((PORTSOURCE)==GPIO_PortSourceGPIOC)||\((PORTSOURCE)==GPIO_PortSourceGPIOD)||\((PORTSOURCE)==GPIO_PortSourceGPIOE)||\((PORTSOURCE)==GPIO_PortSourceGPIOF)||\((PORTSOURCE)==GPIO_PortSourceGPIOG))/*GPIOPinsources*/#defineGPIO_PinSource0((u8)0x00)#defineGPIO_PinSource1((u8)0x01)#defineGPIO_PinSource2((u8)0x02)#defineGPIO_PinSource3((u8)0x03)#defineGPIO_PinSource4((u8)0x04)#defineGPIO_PinSource5((u8)0x05)#defineGPIO_PinSource6((u8)0x06)#defineGPIO_PinSource7((u8)0x07)#defineGPIO_PinSource8((u8)0x08)#defineGPIO_PinSource9((u8)0x09)#defineGPIO_PinSource10((u8)0x0A)#defineGPIO_PinSource11((u8)0x0B)#defineGPIO_PinSource12((u8)0x0C)#defineGPIO_PinSource13((u8)0x0D)#defineGPIO_PinSource14((u8)0x0E)#defineGPIO_PinSource15((u8)0x0F)#defineIS_GPIO_PIN_SOURCE(PINSOURCE)(((PINSOURCE)==GPIO_PinSource0)||\((PINSOURCE)==GPIO_PinSource1)||\((PINSOURCE)==GPIO_PinSource2)||\((PINSOURCE)==GPIO_PinSource3)||\((PINSOURCE)==GPIO_PinSource4)||\((PINSOURCE)==GPIO_PinSource5)||\((PINSOURCE)==GPIO_PinSource6)||\((PINSOURCE)==GPIO_PinSource7)||\((PINSOURCE)==GPIO_PinSource8)||\((PINSOURCE)==GPIO_PinSource9)||\((PINSOURCE)==GPIO_PinSource10)||\((PINSOURCE)==GPIO_PinSource11)||\((PINSOURCE)==GPIO_PinSource12)||\((PINSOURCE)==GPIO_PinSource13)||\((PINSOURCE)==GPIO_PinSource14)||\((PINSOURCE)==GPIO_PinSource15))/*Exportedmacro*//*Exportedfunctions*/voidGPIO_DeInit(GPIO_TypeDef*GPIOx);voidGPIO_AFIODeInit(void);voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct);voidGPIO_StructInit(GPIO_InitTypeDef*GPIO_InitStruct);u8GPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,u16GPIO_Pin);u16GPIO_ReadInputData(GPIO_TypeDef*GPIOx);u8GPIO_ReadOutputDataBit(GPIO_TypeDef*GPIOx,u16GPIO_Pin);u16GPIO_ReadOutputData(GPIO_TypeDef*GPIOx);voidGPIO_SetBits(GPIO_TypeDef*GPIOx,u16GPIO_Pin);voidGPIO_ResetBits(GPIO_TypeDef*GPIOx,u16GPIO_Pin);voidGPIO_WriteBit(GPIO_TypeDef*GPIOx,u16GPIO_Pin,BitActionBitVal);voidGPIO_Write(GPIO_TypeDef*GPIOx,u16PortVal);voidGPIO_PinLockConfig(GPIO_TypeDef*GPIOx,u16GPIO_Pin);voidGPIO_EventOutputConfig(u8GPIO_PortSource,u8GPIO_PinSource);voidGPIO_EventOutputCmd(FunctionalStateNewState);voidGPIO_PinRemapConfig(u32GPIO_Remap,FunctionalStateNewState);voidGPIO_EXTILineConfig(u8GPIO_PortSource,u8GPIO_PinSource);#endif/*__STM32F10x_GPIO_H*//*******************(C)COPYRIGHT2008STMicroelectronics*****ENDOFFILE****/图像识别函数首先如果要进行图像识别,就必须要有图像采集功能而ov2640也需要进行一定的配置,配置代码如下。#ifndef__OV2640_H#define__OV2640_H#ifdef__cplusplusextern"C"{#endifvoidOV2640_Gpio_Init();voidSCCB_SID_change_in();//引脚切换为输入voidSCCB_SID_change_out();//引脚切换为输出voidFIFO_Reset_Read_Addr(void);//FIFO读数据复位voidstartSCCB(void);voidstopSCCB(void);voidnoAck(void);unsignedchargetAck();unsignedcharSCCBwriteByte(unsignedchardat);unsignedcharSCCBreadByte(void);voidFIFO_Reset_Read_Addr(void);unsignedcharwr_Sensor_Reg(unsignedcharregID,unsignedcharregDat);unsignedcharrd_Sensor_Reg(unsignedcharregID,unsignedchar*regDat);unsignedcharSensor_init(void);#ifdef__cplusplus}#endif其次作为识别地名首先要分为其下几个步骤,图像采集、二值化、识别站牌区域、字符分割、字符匹配,其中图像采集所需的代码已经在上面所说明,其后则为该程序的主函数部分。#include"stm32f10x.h"#include"stm32f10x_it.h"#include"led.h"#include"key.h"#include"usart.h"#include"delay.h"#include"lcd.h"#include"ov7670.h"#include"string.h"#include"bsp_esp8266.h"//#defineWIFITIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;vu8cur_status=0;vu8LED_flag=0;//vu32a=0;//vu32b=0;vu16AA=0,BB=0;vu16color=0;vu16color_save=0;//保存一个像素的值vu8R=0,G=0,B=0;//颜色分量vu8TableChangePoint_240[240];//跳变点240个vu8Max_ChangePoint_240=0,Min_ChangePoint_240=0,Max_bCha

温馨提示

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

最新文档

评论

0/150

提交评论