目录
资料下载地址:基于STM32视频监控系统
一、项目需求
上位机能够实时显示摄像头的画面,并且可以控制摄像头转动
二、原理图
三、上位机界面
上位机提供源码!!!
四、实物
五、程序
部分代码
#include "usart.h"
#include "gpio.h"
_DEF_UART RS485_Uart1;
UART_HandleTypeDef huart1;
void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
// Error_Handler();
}
__HAL_UART_DISABLE_IT(&huart1,UART_IT_TC);
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);//使能接收中断
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);//使能空闲中断
HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
}
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{
GPIO_InitTypeDef GPIO_InitStruct;
if(uartHandle->Instance==USART1)
{
/* USER CODE BEGIN USART1_MspInit 0 */
/* USER CODE END USART1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_USART1_CLK_ENABLE();
/**USART1 GPIO Configuration
PA9 ------> USART1_TX
PA10 ------> USART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* Peripheral interrupt init */
HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
}
}
void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
{
if(uartHandle->Instance==USART1)
{
/* USER CODE BEGIN USART1_MspDeInit 0 */
/* USER CODE END USART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_USART1_CLK_DISABLE();
/**USART1 GPIO Configuration
PA9 ------> USART1_TX
PA10 ------> USART1_RX
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
HAL_NVIC_DisableIRQ(USART1_IRQn);
}
}
void USART1_IRQHandler(void)
{
if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) != RESET))
{
volatile uint32_t temp=0;
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
temp = huart1.Instance->SR;
temp = huart1.Instance->DR;
temp = 0;
if(RS485_Uart1.Cnt >=0)
{
RS485_Uart1.RcvFinish = 1;
//HAL_NVIC_EnableIRQ (USART1_IRQn );
}
}
if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE) != RESET))
{
if(RS485_Uart1.Cnt >= 50) RS485_Uart1.Cnt=0;
RS485_Uart1.Buf[RS485_Uart1.Cnt] = huart1.Instance->DR;
RS485_Uart1.Cnt++;
}
}
void Driver_Motor(uint16_t mode)
{
int i = 0;
if(mode == 0)//正传
{
for( i = 0 ; i < 256 ; i++)//四节拍为一步,转一圈要256步
{
MOTOR1 = 1;
MOTOR2 = 1;
MOTOR3 = 0;
MOTOR4 = 0;
HAL_Delay(1);
MOTOR1 = 0;
MOTOR2 = 1;
MOTOR3 = 1;
MOTOR4 = 0;
HAL_Delay(1);
MOTOR1 = 0;
MOTOR2 = 0;
MOTOR3 = 1;
MOTOR4 = 1;
HAL_Delay(1);
MOTOR1 = 1;
MOTOR2 = 0;
MOTOR3 = 0;
MOTOR4 = 1;
HAL_Delay(1);
}
}
else//反转
{
for( i = 0 ; i < 256 ; i++)//四节拍为一步,转一圈要256步
{
MOTOR4 = 1;
MOTOR3 = 1;
MOTOR2 = 0;
MOTOR1 = 0;
HAL_Delay(1);
MOTOR4 = 0;
MOTOR3 = 1;
MOTOR2 = 1;
MOTOR1 = 0;
HAL_Delay(1);
MOTOR4 = 0;
MOTOR3 = 0;
MOTOR2 = 1;
MOTOR1 = 1;
HAL_Delay(1);
MOTOR4 = 1;
MOTOR3 = 0;
MOTOR2 = 0;
MOTOR1 = 1;
HAL_Delay(1);
}
}
}
void Main_Uart(void)
{
if(RS485_Uart1.RcvFinish == 1)
{
RS485_Uart1.RcvFinish = 0;
RS485_Uart1.Cnt = 0;
if(RS485_Uart1.Buf[0] == 0x35)//上调
{
Driver_Motor(0);
}
else if(RS485_Uart1.Buf[0] == 0x36)//下调
{
Driver_Motor(1);
}
}
}