您现在的位置是:主页 > news > 手机网站导航特效/活动营销推广方案
手机网站导航特效/活动营销推广方案
admin2025/4/30 6:54:33【news】
简介手机网站导航特效,活动营销推广方案,幼儿园课程活动设计主题网络图,百容千域可以免费做网站吗文章目录整体框图一、基础工程1 新建工程2 配置RCC3 配置SYS4 工程设置5 生成代码6 keil设置下载&复位二、必备外设1 目录规范2 LED2 RTC3 USART4 KEY三、其他外设1 OLED(模拟IIC、模拟SPI)2 BH1750光强检测3 MQ2烟雾检测3 MQ4甲醛检测4 DHT11温湿度…
文章目录
- 整体框图
- 一、基础工程
- 1 新建工程
- 2 配置RCC
- 3 配置SYS
- 4 工程设置
- 5 生成代码
- 6 keil设置下载&复位
- 二、必备外设
- 1 目录规范
- 2 LED
- 2 RTC
- 3 USART
- 4 KEY
- 三、其他外设
- 1 OLED(模拟IIC、模拟SPI)
- 2 BH1750光强检测
- 3 MQ2烟雾检测
- 3 MQ4甲醛检测
- 4 DHT11温湿度
- 5 SIM900A GSM模块
整体框图
软件:keil5、STM32Cubemx
硬件:淘宝的STM32F103C8T6最小系统
一、基础工程
1 新建工程
2 配置RCC
选择外部时钟源。
设置外部晶振输入值,我这块板子是8M。
然后手动输入最大时钟频率,然后回车让他自动配置时钟树。我这块板子是72M。
3 配置SYS
我的下载器是SWD两根线的,所以我选这个。(一定配置完下载模式再进行程序下载,不然单片机变砖,需要从串口下载进行恢复)
4 工程设置
5 生成代码
点击生成代码
打开keil工程
6 keil设置下载&复位
选择下载器类型,我用的是DAP。点击后面的Setting。
进入后勾选自动复位,表现为每次下载程序后单片机自动复位运行程序。
设置完点击OK。
二、必备外设
1 目录规范
在工程目录下,新建一个ICODE文件夹,用于存放自己写的各种外设文件。
2 LED
1 导入.c.h文件(就是将.c.h文件导入keil工程,后面不再叙述此环节)
将之前写好的 LED文件夹复制到本工程的ICODE目录下。
里边有led.c led.h文件夹。
在工程中,创建ICODE文件夹,添加led.c文件。
在工程中,添加led.h文件。
2 Cubemx配置
配置板子LED引脚,推挽输出模式。我这块板子是 PC13。
重新生成代码。
3 修改 .h 文件
更改为其他引脚,只需更改LED端口号和引脚PIN。我这块板子是PC13。
4 测试
在main.c中添加 #include “led.h”
在while里添加下面代码。LED灯闪烁。
LED_Contrary();
HAL_Delay(500);//500ms
2 RTC
1 导入.c.h文件(不再赘述,详细见LED部分)
无
2 Cubemx配置
和PC13冲突,核心板PC13是LED,所以禁用RTC OUT。
3 修改 .c 文件
在中断.c里,填加led头文件,在RTC中断函数里,加入500ms,LED电平反转函数。
#include "led.h"static uint16_t rtccnt=0;
rtccnt++;
if(rtccnt>500) rtccnt=0,LED_Contrary();
4 测试
LED闪烁。
3 USART
1 导入.c.h文件(不再赘述,详细见LED部分)
在keil工程中导入之前写好的.c.h文件。
2 Cubemx配置
使用串口1,波特率默认,异步通信。
开启中断
3 修改 .h 文件
代码默认使用串口1。添加其他串口可以在.h里,复制,改名。
4 测试
串口发送/接收函数:
HAL_UART_Transmit();串口发送数据,使用超时管理机制
HAL_UART_Receive();串口接收数据,使用超时管理机制
HAL_UART_Transmit_IT();串口中断模式发送
HAL_UART_Receive_IT();串口中断模式接收
HAL_UART_Transmit_DMA();串口DMA模式发送
HAL_UART_Transmit_DMA();串口DMA模式接收
串口中断函数:
HAL_UART_IRQHandler(UART_HandleTypeDef *huart); //串口中断处理函数
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); //串口发送中断回调函数
HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); //串口发送一半中断回调函数(用的较少)
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); //串口接收中断回调函数
HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//串口接收一半回调函数(用的较少)
HAL_UART_ErrorCallback();串口接收错误函数
常用的发送函数为:HAL_UART_Transmit();
常用的接收函数为:HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
HAL库串口中断调用流程:
发送:
1 printf重映射:
/* printf重映射 */
#include <stdio.h>
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{//具体哪个串口可以更改huart1为其它串口HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1 , 0xffff);return ch;
}
2 printf发送:
printf("hello \r\n"); //发送字符串float Data=1.11;
printf("Data=%.2f \r\n",Data); //发送变量
3 Hal库自带发送函数:
#include <stdio.h>HAL_UART_Transmit(&huart1,"hello\r\n",sizeof("hello\r\n"),0xffff);//发送字符串uint8_t Data1[]={"hello\r\n"};
HAL_UART_Transmit(&huart1,Data1,sizeof(Data1),0xffff);//发送字符串uint8_t Databuffer[20]={0};
float Data=1.11;
sprintf(Databuffer,"Data=%.2f \r\n",Data);
HAL_UART_Transmit(&huart1,Databuffer,strlen(Databuffer),0xffff);//发送变量 用strlen
中断接收:
1 定长
/* 串口接收中断定长接收
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart == &huart1){HAL_UART_Transmit(&huart1,(uint8_t *)&Uart1_RxData,1,0xffff);//原样返回while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束HAL_UART_Receive_IT(&huart1,(uint8_t *)&Uart1_RxData, 1); //&取地址}
}
2 不定长
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{/* Prevent unused argument(s) compilation warning */UNUSED(huart);if(huart == &huart1){if(Uart1_Rx_Cnt >= 255) //溢出判断{Uart1_Rx_Cnt = 0;memset(Uart1_RxBuffer,0x00,sizeof(Uart1_RxBuffer));HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10,0xFFFF); }else{Uart1_RxBuffer[Uart1_Rx_Cnt++] = Uart1_RxData; //接收数据转存if((Uart1_RxBuffer[Uart1_Rx_Cnt-1] == 0x0A)&&(Uart1_RxBuffer[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位\r\n。0x0D是\r,0x0A是\n{/* 此处添加用户代码 */HAL_UART_Transmit(&huart1, (uint8_t *)&Uart1_RxBuffer, Uart1_Rx_Cnt,0xFFFF); //将收到的信息发送出去while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束/* 此处添加用户代码 */Uart1_Rx_Cnt = 0;memset(Uart1_RxBuffer,0x00,sizeof(Uart1_RxBuffer)); //清空数组}}HAL_UART_Receive_IT(&huart1, (uint8_t *)&Uart1_RxData, 1); //再开启接收中断}
}
4 KEY
1 导入.c.h文件(不再赘述,详细见LED部分)
在keil工程中导入之前写好的.c.h文件。
2 Cubemx配置
3 修改 .h 文件
4 测试
三、其他外设
1 OLED(模拟IIC、模拟SPI)
1 导入.c.h文件(不再赘述,详细见LED部分)
在keil工程中导入之前写好的.c.h文件。选择IIC的或者SPI的。(模拟IIC和模拟SPI)
2 Cubemx配置
任选对应OLED引脚个数的GPIO,设置成推挽输出。设置为高速。
3 修改 .h 文件
更改为其他引脚,只需更改OLED端口号和引脚PIN
4 测试
OLED 显示字体大小 16*16 最合适。能放4行:0 16 32 48。
添加头文件
#include "oled.h"
添加初始化
OLED_Init();
OLED_ColorTurn(0); //0正常显示,1 反色显示
OLED_DisplayTurn(0); //0正常显示 1 屏幕翻转显示
1 显示字符:
OLED_ShowString(0,0,"hello",16,1);
OLED_Refresh();//更新0
2 显示变量:
uint8_t Databuffer[20]={0};
float Data=1.11;
sprintf(Databuffer,"Data=%.2f \r\n",Data);//sprintf
OLED_ShowString(0,16,Databuffer,16,1);
OLED_Refresh();
3 显示中文:
2 BH1750光强检测
1 导入.c.h文件(不再赘述,详细见LED部分)
在keil工程中导入之前写好的.c.h文件。
2 Cubemx配置
3 修改 .h 文件
4 测试
添加头文件
添加初始化
3 MQ2烟雾检测
1 导入.c.h文件(不再赘述,详细见LED部分)
在keil工程中导入之前写好的.c.h文件。
2 Cubemx配置
3 修改 .h 文件
4 测试
添加头文件
添加初始化
3 MQ4甲醛检测
4 DHT11温湿度
1 导入.c.h文件(不再赘述,详细见LED部分)
在keil工程中导入之前写好的.c.h文件。
2 Cubemx配置
任选一个IO口,配置为高速,推挽输出。
3 修改 .h 文件
定义DHT11总线连接的GPIO端口, 只需要修改下面2行代码即可任意改变DATA的引脚
4 测试
添加头文件
#include "dht11.h"
添加初始化
DHT11_Init(); //DHT11温湿模块初始化
读取温湿度
uint8_t DHT11_DATA[2]={0}; //用于存放DHT11温湿度数据
DHT11_ReadData(DHT11_BUF); //读出DHT11传感器数据(参数是存放数据的数组指针)
printf("湿度:%2d% 温度:%2d℃\r\n",DHT11_BUF[0],DHT11_BUF[1]);//串口打印湿度温度