单片机型号STM32F103R6:
最后实现的效果是,开机后PC内要求输入1或0,输入1则打开灯泡,输入0则关闭灯泡,输入其他内容则显示错误,值得注意的是这个模拟的东西只能输入英文
之所以用2个LED灯是因为LED电阻粗略一算就是100欧姆,所以懒得再去画其他的东西,真是天助我也
时钟频率HSI 8MHZ;
之所以用8MHZ 这么慢的内部时钟,是因为时钟太快了,模拟速度其实也上不去,proteus模拟一秒钟要花几十秒,我还不如选个慢的反倒快了一点。真的是欲速则不达
选择PB1作为输出引脚具体设置看图片。选择了推挽输出,初始化输出高电平,接了上拉电阻。
这个是串口设置
值得一提的是好像proteus里面那个终端的波特率最高只能值5.7万那个样子
所以我把波特率设置为了56000.proteus里面的虚拟PC同样也要这样设置,而且单片机频率最好也设置为8MHZ.
//这个是main函数
int main(void)
{
// uint8_t txtbuff[]="please input num1 or 2 \n\r 1 turn on the light\n\r 2 turn off the light";
uint8_t txtbuff[]="please input num 1 or 2\n\r";
uint8_t txtbuff1[]="1 turn on the light\n\r";
uint8_t txtbuff2[]="2 turn off the light\n\r";
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
HAL_UART_Transmit(&huart1,txtbuff,sizeof(txtbuff),1000);
HAL_UART_Transmit(&huart1,txtbuff1,sizeof(txtbuff1),1000);
HAL_UART_Transmit(&huart1,txtbuff2,sizeof(txtbuff2),1000);
HAL_UART_Receive_IT(&huart1,(uint8_t*)&aRxBuffer,1);
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
//这个是修改后的函数 需要找到这个函数然后改成这个样子就可以了,建议使用搜索整个project
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
uint8_t a[]="light on\n\r";
uint8_t b[]="light off\n\r";
uint8_t c[]="error badness\n\r";
extern uint8_t aRxBuffer;
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
if(aRxBuffer=='0')
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
HAL_UART_Transmit(&huart1,b,sizeof(b),1000);
}
else if(aRxBuffer=='1')
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_UART_Transmit(&huart1,a,sizeof(a),1000);
}
else
{
HAL_UART_Transmit(&huart1,c,sizeof(c),1000);
}
/* USER CODE END USART1_IRQn 1 */
HAL_UART_Receive_IT(&huart1,&aRxBuffer,1);
}
其他的地方都没有修改全都保持默认就可以了