void UART_Init(void) { //**All notes can be deleted and modified**// SCON |= 0x50; // SCON: 模式 1, 8-bit UART, 使能接收 TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装 TH1 = 0xFD; // TH1: 重装值 9600 波特率 晶振 11.0592MHz TL1 = TH1; TR1 = 1; // TR1: timer 1 打开 EA = 1; //打开总中断 ES = 1; //打开串口中断 } void UART_SER (void) interrupt 4 //串行中断服务程序 { if(RI) //判断是接收中断产生 { RI=0; //标志位清零 R_buf=SBUF; if(mode1 == 1) { switch(R_buf) { // case 0x00:Stop();break; //打开相应的灯 并恢复命令标志 // case 0x01:Turnfront();break; //打开相应的灯 并恢复命令标志 case '0':Stop();break; //打开相应的灯 并恢复命令标志 case '1':Turnfront();break; //打开相应的灯 并恢复命令标志 case '2':Turnright();break; //打开相应的灯 并恢复命令标志 case '3':Turnback();break; //打开相应的灯 并恢复命令标志 case '4':Turnleft();break; //打开相应的灯 并恢复命令标志 default:break; //此处错误判断 不可恢复命令标准 } } SBUF=R_buf; //返回接收到的数据 } if(TI) //如果是发送标志位,清零 TI=0; }
时间: 2023-06-18 18:03:41 浏览: 43
这段代码是一个8051单片机的串口通信初始化和中断服务程序。主要实现了通过串口接收指令并对指令进行处理,然后通过串口返回处理结果。
在初始化函数UART_Init()中,设置了串口工作模式为模式1,即8位UART并使能接收;设置了定时器1的工作模式为模式2,并设置了重装值TH1,以实现波特率为9600的通信;最后打开总中断和串口中断。
在中断服务函数UART_SER()中,判断是接收中断产生,则将接收到的数据存入R_buf中,并通过switch-case语句对R_buf进行处理,执行相应的指令;最后将处理结果通过串口返回。如果是发送标志位,则直接清零。
相关问题
void UART_Init(void) { //**All notes can be deleted and modified**// SCON = 0x05; // SCON: ?? 1, 8-bit UART, ???? TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit ?? TH1 = 0xFD; // TH1: ??? 9600 ??? ?? 11.0592MHz TL1 = TH1; TR1 = 1; // TR1: timer 1 ?? EA = 1; //????? ES = 1; //?????? }
这是一个初始化串口通信模块的函数。下面是对每行代码的解释:
1. SCON = 0x05; // 设置串口为模式1,8位UART,允许接收。
2. TMOD |= 0x20; // 设置定时器1为工作在模式2,8位自动重装载计数器模式。
3. TH1 = 0xFD; // 设置波特率发生器的初值,用于9600波特率(在11.0592MHz的晶振下)。
4. TL1 = TH1; // 定时器1计数器初值等于波特率发生器初值。
5. TR1 = 1; // 开启定时器1。
6. EA = 1; // 开启总中断。
7. ES = 1; // 开启串口中断。
该函数使用8051单片机的UART模块和定时器1来实现串口通信,其中TH1和TL1是波特率发生器和定时器计数器的初值,可以根据不同的波特率和晶振频率进行调整。
void usart_init(uint32_t baudrate) { /*UART 初始化设置*/ g_uart1_handle.Instance = USART_UX; /* USART_UX */ g_uart1_handle.Init.BaudRate = baudrate; /* 波特率 */ g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* 字长为8位数据格式 */ g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* 一个停止位 */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* 无奇偶校验位 */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* 无硬件流控 */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* 收发模式 */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()会使能UART1 */ /* 该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量 */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if (huart->Instance == USART_UX) /* 如果是串口1,进行串口1 MSP初始化 */ { USART_TX_GPIO_CLK_ENABLE(); /* 使能串口TX脚时钟 */ USART_RX_GPIO_CLK_ENABLE();/* 使能串口RX脚时钟 */ USART_UX_CLK_ENABLE(); /* 使能串口时钟 */ gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* 串口发送引脚号 */ gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* 复用推挽输出 */ gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */ gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* IO速度设置为高速 */ HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* 串口RX脚 模式设置 */ gpio_init_struct.Mode = GPIO_MODE_AF_INPUT; HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* 串口RX脚 必须设置成输入模式 */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* 使能USART1中断通道 */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* 组2,最低优先级:抢占优先级3,子优先级3 */ #endif }
这段代码是用来初始化一个串口(UART)的。其中,函数usart_init()用来配置串口的一些参数,比如波特率、数据位数、停止位数等,并通过HAL_UART_Init()函数来使能串口。另外,HAL_UART_Receive_IT()函数用来开启接收中断。函数HAL_UART_MspInit()则是初始化串口的GPIO引脚和中断优先级等。在此代码中,串口号为USART_UX,具体的GPIO引脚号和中断优先级等都需要根据具体的硬件平台进行修改。