• 包括以下每部分:

  1. 超声波部分
  2. 继电器部分
  3. 循迹模块
  4. 按键部分
  5. 蜂鸣器部分
  6. LED指示灯部分
  • 以上六部分代码集合:

Sum_IOin-out.C文件

#include "Sum_IOin-out.h"
#include "delay.h"
 
/*******************************************************************************
================================================================================
【平    台】stm32f103zet6_sumjess平台
【编    写】sumjess
【E-mail  】1371129880@qq.com
【软件版本】V2.0
【最后更新】2018年09月06日
【相关信息参考下列地址】
【网    站】
           https://blog.csdn.net/qq_38351824
           http://www.openedv.com/
           http://www.stmcu.org/
					 http://www.firebbs.cn/forum.php
---------------------------------------------------------------------------------
【dev.env.】MDK5.14及以上版本
【Target  】stm32f103zet6
第一次修订:2017/11/09
第二次修订:2018/01/21
第三次修订:2018/09/06
---------------------------------------------------------------------------------
没有完美的代码,只有不断的奉献,大家一起努力;
赠人玫瑰手留余香,欢迎大家反馈bug!
================================================================================
********************************************************************************/	
//LED、BEEP、relay、key、track驱动代码	
 
 
 
///LED IO初始化/
初始化PF0-PF2为输出口.并使能这两个口的时钟//		    
 
void LED_Init(void)
{ 
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE); //使能PF端口时钟
	
 GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0|             //RGB灯端口配置
	                               GPIO_Pin_1|
	                               GPIO_Pin_2; 
 GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOF, &GPIO_InitStructure);					       //根据设定参数初始化GPIOF
	
 GPIO_SetBits(GPIOF,GPIO_Pin_0);						           //PF0输出高电平
 GPIO_SetBits(GPIOF,GPIO_Pin_1);						           //PF1输出高电平
 GPIO_SetBits(GPIOF,GPIO_Pin_2);						           //PF2输出高电平
}
 
//--------------------------------------------------------------------------------------------//
 
 
 
/蜂鸣器初始化///
初始化PB8为输出口.并使能这个口的时钟		    
 
void BEEP_Init(void)
{ 
 GPIO_InitTypeDef  GPIO_InitStructure;
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB端口时钟
 
 GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8;				   //BEEP-->PB.8 端口配置
 GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;     //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //速度为50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure);	               //根据参数初始化GPIOB.8
 
 GPIO_ResetBits(GPIOB,GPIO_Pin_8);//输出0,关闭蜂鸣器输出
}
 
//--------------------------------------------------------------------------------------------//
 
 
 
//Relay IO初始化
初始化PF3-PF4为输出口.并使能这两个口的时钟//		    
 
void Relay_Init(void)
{ 
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE); //使能PF端口时钟
	
 GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_3|           //继电器端口配置
	                               GPIO_Pin_4; 
 GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOF, &GPIO_InitStructure);					       //根据设定参数初始化GPIOF
	
 GPIO_SetBits(GPIOF,GPIO_Pin_3);						           //PF3输出高电平
 GPIO_SetBits(GPIOF,GPIO_Pin_4);						           //PF4输出高电平
}
 
//--------------------------------------------------------------------------------------------//
 
 
 
//4*4按键初始化/
///初始化PF6-13为输出口.并使能这两个口的时钟	    
 
void key44_Init(void)
{
 GPIO_InitTypeDef  GPIO_InitStruct;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);	 //使能PF端口时钟
	
 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6|
														GPIO_Pin_7|
														GPIO_Pin_8|
														GPIO_Pin_9;				 						//端口配置
 GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_Out_PP; 		 			//推挽输出
 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;		 				//IO口速度为50MHz
 GPIO_Init(GPIOF, &GPIO_InitStruct);					 						//根据设定参数初始化GPIOF
 
 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10|
														GPIO_Pin_11|
														GPIO_Pin_12|
														GPIO_Pin_13;				 					//端口配置
 GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IPD; 		 					//下拉输入
 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;		 				//IO口速度为50MHz
 GPIO_Init(GPIOF, &GPIO_InitStruct);					 						//根据设定参数初始化GPIOF
	
}
 
/**-------------------------------------------------------------
  * @函数名 STM32_KEYScan
  * @功能   获取KEY按键的输入电平状态,按键按下时为低电平0
  * @参数   无
  * @连接   将模块正面朝上,顺次插入即可。
  * @返回值 1  对应开发板上第一个KEY按键处于按下状态
  *         2  对应开发板上第二个KEY按键处于按下状态
  *         3  对应开发板上第三个KEY按键处于按下状态
  *         4  对应开发板上第四个KEY按键处于按下状态
  *         0  开发板上没有KEY按键处于按下状态
  * @参数说明   ( GPIOF->ODR & 0xfc3f )    将PF6-PF9在ODR对应的位清零,然后赋值
***-------------------------------------------------------------*/
int STM32_KEYScan(void) //实现矩阵键盘。返回值为各按键的键值,此键值由用户自己定义。
{
	u8 KeyVal;	 //keyVal为最后返回的键值。
 
	GPIO_Write(GPIOF,(( GPIOF->ODR & 0xFC3F ) | 0x0040));	//让PF6到PF9输出二进制的0001.
		switch(GPIOF->IDR & 0x3C00)//对PF10到PF13的值进行判断,以输出不同的键值。
		{
			case 0x0400: KeyVal=1;  break;
			case 0x0800: KeyVal=2;	break;
			case 0x1000: KeyVal=3;	break;
			case 0x2000: KeyVal='A';break;
		}
	   
	GPIO_Write(GPIOF,(( GPIOF->ODR & 0xFC3F ) | 0x0080));	//让PF6到PF9输出二进制的0010
		switch(GPIOF->IDR & 0x3C00)		        //对PF10到PF13的值进行判断,以输出不同的键值。
		{
			case 0x0400: KeyVal=4;	break;
			case 0x0800: KeyVal=5;	break;
			case 0x1000: KeyVal=6;	break;
			case 0x2000: KeyVal='B';break;
		}
 
	GPIO_Write(GPIOF,(( GPIOF->ODR & 0xFC3F ) | 0x0100));	//让PF6到PF9输出二进制的0100
		switch(GPIOF->IDR & 0x3C00)		        //对PF10到PF13的值进行判断,以输出不同的键值。
		{
			case 0x0400: KeyVal=7;	break;
			case 0x0800: KeyVal=8;	break;
			case 0x1000: KeyVal=9;	break;
			case 0x2000: KeyVal='C';break;
		}
 
	 GPIO_Write(GPIOF,(( GPIOF->ODR & 0xFC3F ) | 0x0200));	//让PF6到PF9输出二进制的1000
		switch(GPIOF->IDR & 0x3C00)		        //对PF10到PF13的值进行判断,以输出不同的键值。
		{
			case 0x0400: KeyVal='*';	break;
			case 0x0800: KeyVal=0;	  break;
			case 0x1000: KeyVal='#';	break;
			case 0x2000: KeyVal='D';	break;
		}									  
	return KeyVal;
}
 
 
//--------------------------------------------------------------------------------------------//
 
 
//循迹模块初始化
///初始化PB8-11为输出口.并使能这两个口的时钟	    
 
void track_Init(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //使能PE端口时钟
	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|             //循迹模块PE2~PE9端口配置
	                             GPIO_Pin_3|
															 GPIO_Pin_4|
															 GPIO_Pin_5|
	                             GPIO_Pin_6|
															 GPIO_Pin_7|
															 GPIO_Pin_8|
															 GPIO_Pin_9; 
 GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;//浮空输入
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOE, &GPIO_InitStructure);					       //根据设定参数初始化GPIOE
 
}
 
 
//--------------------------------------------------------------------------------------------//
 
 
/初始化成功/   
 
void Init_success(void)
{
 
	BEEP_ON;
	LED_G_ON;delay_ms(100);LED_G_OFF;delay_ms(100);
	LED_R_ON;delay_ms(100);LED_R_OFF;delay_ms(100);
	LED_B_ON;delay_ms(100);LED_B_OFF;delay_ms(100); 
	BEEP_OFF;
 
}

Sum_IOin-out.h文件

/*******************************************************************************
================================================================================
【平    台】stm32f103zet6_sumjess平台
【编    写】sumjess
【E-mail  】1371129880@qq.com
【软件版本】V2.0
【最后更新】2018年09月06日
【相关信息参考下列地址】
【网    站】
           https://blog.csdn.net/qq_38351824
           http://www.openedv.com/
           http://www.stmcu.org/
					 http://www.firebbs.cn/forum.php
---------------------------------------------------------------------------------
【dev.env.】MDK5.14及以上版本
【Target  】stm32f103zet6
第一次修订:2017/11/09
第二次修订:2018/01/21
第三次修订:2018/09/06
---------------------------------------------------------------------------------
没有完美的代码,只有不断的奉献,大家一起努力;
赠人玫瑰手留余香,欢迎大家反馈bug!
================================================================================
********************************************************************************/	
//LED、BEEP、relay、key、track驱动代码	
#ifndef __SUM_INIO_OUT_H
#define __SUM_INIO_OUT_H	 
#include "sys.h"
 
#define BEEP_ON  GPIO_SetBits(GPIOB,GPIO_Pin_8)
#define BEEP_OFF GPIO_ResetBits(GPIOB,GPIO_Pin_8)
 
#define LED_R_OFF  GPIO_SetBits(GPIOF,GPIO_Pin_0)
#define LED_R_ON   GPIO_ResetBits(GPIOF,GPIO_Pin_0)
#define LED_G_OFF  GPIO_SetBits(GPIOF,GPIO_Pin_1)
#define LED_G_ON   GPIO_ResetBits(GPIOF,GPIO_Pin_1)
#define LED_B_OFF  GPIO_SetBits(GPIOF,GPIO_Pin_2)
#define LED_B_ON   GPIO_ResetBits(GPIOF,GPIO_Pin_2)
 
#define Relay_A_OFF  GPIO_SetBits(GPIOF,GPIO_Pin_3)
#define Relay_A_ON   GPIO_ResetBits(GPIOF,GPIO_Pin_3)
#define Relay_B_OFF  GPIO_SetBits(GPIOF,GPIO_Pin_4)
#define Relay_B_ON   GPIO_ResetBits(GPIOF,GPIO_Pin_4)
 
 
void LED_Init(void);
void BEEP_Init(void);
void Relay_Init(void);
void key44_Init(void);
 int STM32_KEYScan(void);
void track_Init(void);
void Init_success(void);
 
#endif