意见箱
恒创运营部门将仔细参阅您的意见和建议,必要时将通过预留邮箱与您保持联络。感谢您的支持!
意见/建议
提交建议

备战电赛---赛前:准备篇

来源:恒创科技 编辑:恒创科技编辑部
2024-01-08 22:01:59


板子选型:STM32F103ZET6

写代码不易,如需要请关注微信公众号:Tech云 回复备战电赛STM32库

注意:7天内有效!


备战电赛---赛前:准备篇

一、5个串口备用(包括printf函数scanf函数getchar函数等):

其中包括例程

接线方式    
/***********************************************
串口 TX RX
USART1 A9 A10
USART2 A2 A3
USART3 B10 B11
UART4 C10 C11
UART5 C12 D2
************************************************/
/***开启---USART_ON***/ /***关闭---USART_OFF***/
#define USART1_switch USART_ON //默认开启
#define USART2_switch USART_OFF //默认关闭
#define USART3_switch USART_OFF //默认关闭
#define USART4_switch USART_OFF //默认关闭
#define USART5_switch USART_OFF //默认关闭

/* printf函数scanf函数getchar函数使用串口设置:默认为串口1 */

#define Choose_USARTx USART1 //可填 USART1 USART2 USART3 UART4 UART5

/*** 波特率设置:默认为115200 ***/
#define DEBUG_USART1_BAUDRATE 115200 //若使用蓝牙,请注意两者一致
#define DEBUG_USART2_BAUDRATE 115200 //若使用蓝牙,请注意两者一致
#define DEBUG_USART3_BAUDRATE 115200 //若使用蓝牙,请注意两者一致
#define DEBUG_USART4_BAUDRATE 115200 //若使用蓝牙,请注意两者一致
#define DEBUG_USART5_BAUDRATE 115200 //若使用蓝牙,请注意两者一致
/*** 串口中断设置:默认为关闭状态 ***/
#define usart_nvic 0

/* USART_TypeDef * pUSARTx 可填 USART1 USART2 USART3 UART4 UART5 */
/* PS:1
//此方法默认串口1
printf("此方法默认串口1");
//向串口1发送一个字符
Usart_SendByte( USART1,'w');
//向串口1发送字符串
Usart_SendString( USART1,"这是一个串口中断接收回显实验\n");
//向串口1发送16位数
Usart_SendHalfWord( USART1,0x23);
*/
/* PS:2
scanf("%c",&cha); //等待串口1输入数据
printf("接收到字符:%c\n",cha); //将串1发来的数据接收
*/
/* PS:3
sha=getchar(); //接收数据
printf("接收到字符:%c\n",sha); //将接收到的数据发回去
*/
/* PS:4
sha=getchar(); //接收数据
printf("接收到字符:%c\n",sha); //将接收到的数据发回去
*/
extern void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch); //发送一个字符
extern void Usart_SendString( USART_TypeDef * pUSARTx, char *str); //发送字符串
extern void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch); //发送16位数

extern uint8_t Usart_Sum_rec( USART_TypeDef * pUSARTx); //接收到数据
extern uint8_t rev; //通过串口接收到的数据
/* PS:5
if(Usart_Sum_rec( USART2 )) //如果接收到了数据
printf("%c", rev); //那么打印数据

//注意:数据接收到的数据都储存在rev这个变量中
二、OLED显示(包括字符显示函数、图片显示函数、数字显示函数等):

其中包括例程

/
/**
* @brief OLED显示代码
* @author Sumjess
* @retval
@PS
*/
///
// 引脚连接 /
// D0 接PG15(SCL)
// D1 接PG14(SDA)
// RES 接PG13
// DC 接PG12
// CS 接PG11
//

//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!
extern void OLED_Clear(void); //清屏:清空屏幕
//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//mode:0,反白显示;1,正常显示
//size:选择字体 16/12
extern void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr); //显示一个字符
//显示2个数字
//x,y :起点坐标
//len :数字的位数
//size:字体大小
//mode:模式 0,填充模式;1,叠加模式
//num:数值(0~4294967295);
extern void OLED_ShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t size); //显示一个数字
//显示一个字符号串 起始点坐标(x,y),x的范围0~127,y为页的范围0~7*
extern void OLED_ShowString(uint8_t x,uint8_t y, uint8_t *p); //显示字符串
//画点 点坐标(x,y),x的范围0~127,y为页的范围0~7*
extern void OLED_Set_Pos(unsigned char x, unsigned char y); //画一个点
//显示汉字 起始点坐标(x,y),x的范围0~127,y为页的范围0~7*
extern void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no); //显示中文 //可参考
/***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/
extern void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]);// 显示图片

/*PS: 程序下载后对照实物,一句一句删减函数,观察不同,进行学习即可。
OLED_ShowCHinese(63,3,90);//
OLED_ShowCHinese(18,0,1);//
OLED_ShowCHinese(36,0,2);//
OLED_ShowCHinese(54,0,3);//显示汉字,需要的汉字在OLEDFONT.H中添加
OLED_ShowCHinese(72,0,4);//
OLED_ShowCHinese(90,0,5);//
OLED_ShowCHinese(108,0,6);//


OLED_ShowString(0,3,"1.3' OLED TEST");
OLED_ShowString(8,2,"sumjess");//x,y,字符号串)

OLED_ShowString(20,4,"2014/05/01"); //

OLED_ShowString(0,6,"ASCII:"); //
OLED_ShowString(63,6,"CODE:"); //


OLED_ShowChar(48,6,t);//显示ASCII字符 指定位置显示一个字符,包括部分字符//x:0~127//y:0~63

t++;
if(t>'~')t=' ';
OLED_ShowNum(103,6,t,3,16);//显示ASCII字符的码值(x,y,数值,数字位数,字体大小)

delay_ms(1000);
*/
/
三、4个超声波代码(调用函数直接返回数据):

其中包括例程

/
/**
* @brief 超声波代码
* @author Sumjess
* @retval
@PS 请勿将障碍物 贴近超声波接收器模块前,即让其距离为零,会卡死程序
*/
///
// 引脚连接 /
// TRIG ECHO
// PC2 PB6
// PC3 PB7
// PC4 PB8
// PC5 PB9
//

extern short DistanceRight1(void); //超声波1数据返回 直接调用即可
extern short DistanceRight2(void); //超声波2数据返回 直接调用即可
extern short DistanceLeft1(void); //超声波3数据返回 直接调用即可
extern short DistanceLeft2(void); //超声波4数据返回 直接调用即可
/*PS:
printf("D1=%d\n",DistanceRight1());
delay_ms(100);
printf("D2=%d\n",DistanceRight2());
delay_ms(100);
printf("D3=%d\n",DistanceLeft1());
delay_ms(100);
printf("D4=%d\n",DistanceLeft2());
delay_ms(100);
*/
/
四、5个ADC采集通道:

其中包括例程

/
/**
* @brief ADC数据采集代码
* @author Sumjess
* @retval
@PS
*/
//
//
// 引脚 返回值获取
// F6 ADC_ConvertedValueLocal[0]
// F7 ADC_ConvertedValueLocal[1]
// F8 ADC_ConvertedValueLocal[2]
// F9 ADC_ConvertedValueLocal[3]
// F10 ADC_ConvertedValueLocal[4]
//
//在主函数中直接调用即可//
//
/* PS:
ADC_ConvertedValueLocal[0] =(float) ADC_ConvertedValue[0]/4096*3.3;
ADC_ConvertedValueLocal[1] =(float) ADC_ConvertedValue[1]/4096*3.3;
ADC_ConvertedValueLocal[2] =(float) ADC_ConvertedValue[2]/4096*3.3;
ADC_ConvertedValueLocal[3] =(float) ADC_ConvertedValue[3]/4096*3.3;
ADC_ConvertedValueLocal[4] =(float) ADC_ConvertedValue[4]/4096*3.3;

printf("\r\n CH0 value = %f V \r\n",ADC_ConvertedValueLocal[0]);
printf("\r\n CH1 value = %f V \r\n",ADC_ConvertedValueLocal[1]);
printf("\r\n CH2 value = %f V \r\n",ADC_ConvertedValueLocal[2]);
printf("\r\n CH3 value = %f V \r\n",ADC_ConvertedValueLocal[3]);
printf("\r\n CH4 value = %f V \r\n",ADC_ConvertedValueLocal[4]);
*/

/
五、陀螺仪代码:

其中包括例程

/
/**
* @brief 陀螺仪代码
* @author Sumjess
* @retval
* @PS
*/
///
// 引脚连接 /
// SDA PB13
// SCL PB14
// INT PA11
// AD0 GND
//

//注意使用下列函数时,必须要完成引用,,否则可能会导致返回数据不准确,可在printf那行直接自行修改即可//

/*
if ( MPU6050_get())
{
inv_execute_on_data();
//
// 该函数从MPL读取偏置补偿的传感器数据和传感器融合输出。输出的格式如empl_output .c所示。这个函数只需要按主机请求的速率调用。
//
Pitch_value = read_Pitch_from_mpl();
Roll_value = read_Roll_from_mpl();
Yaw_value = read_Yaw_from_mpl();
printf("Pitch_value = %f Roll_value = %f Yaw_value = %f \r\n",Pitch_value,Roll_value,Yaw_value);
}
*/

/
六、4路电机PWM代码:
/

/**
* @brief 电机PWM
* @author Sumjess
* @retval
@PS
*/


PWM1 PWM2 PWM3 PWM4
直接写对应的数值即可


extern void SetMOTORValue(uint8_t PWM1,uint8_t PWM2,uint8_t PWM3,uint8_t PWM4); //设置电机PWM值 0--100


/
七、舵机控制(基于PCA9685舵机控制板):此部分由网友提供,笔者简单进行了下封装,本身就很简单。!!!但是此部分尚未测试,由于模块未到!!!
/

/**
* @brief 舵机控制
* @author Sumjess
* @retval
@PS
*/
///
///为减少内存的占用,若不使用该部分功能、函数,请将下面改为OFF,默认为ON///
#define PCA_MG9XX_Switch ON
///

// 引脚连接 /
// SDA PB2
// SCL PB3

#define MG9 60 //初始化PWM频率
#define Angle_init 90 //初始化舵机角度

/*
函数作用:控制舵机转动;
参数:1.输出端口,可选0~15;
2.起始角度,可选0~180;
3.结束角度,可选0~180;
4.模式选择, 0 表示函数内无延时,调用时需要在函数后另外加延时函数,且不可调速,第五个参数可填任意值;
1 表示函数内有延时,调用时不需要在函数后另外加延时函数,且不可调速,第五个参数可填任意值;
2 表示速度可调,第五个参数表示速度值;
5.速度,可填大于 0 的任意值,填 1 时速度最快,数值越大,速度越小;
!注意事项:模式 0和1 的速度比模式 2 的最大速度大;
*/
extern void PCA_MG9XX(u8 num,u8 start_angle,u8 end_angle,u8 mode,u8 speed)

/

上一篇: 2022/8/25 TP6 控制器中间件 下一篇: 资深开发工程师面试题(通宵整理出的精华)