void UART2_SendByte(uchar DAT) { ES = 0; S2BUF = DAT; while((S2CON & 0X02) == 0); S2CON &= ~0X02; ES = 1; }
时间: 2024-05-26 12:15:53 浏览: 148
= 0x00) != 0x02); ES = 1; }
这是一个发送单个字节的函数,使用的是8051单片机的UART2口。其中,ES是中断允许位,S2BUF是UART2的发送缓冲区,S2CON是UART2的控制寄存器。函数的执行流程是先禁止中断,将要发送的数据放入发送缓冲区,然后等待发送完成,最后再开启中断。
相关问题
#include "reg51.h" #include "intrins.h" #define FOSC 11059200UL #define BRT (65536 - FOSC / 115200 / 4) sfr AUXR = 0x8e; sfr T2H = 0xd6; sfr T2L = 0xd7; sfr S2CON = 0x9a; sfr S2BUF = 0x9b; sfr IE2 = 0xaf; sfr P0M1 = 0x93; sfr P0M0 = 0x94; sfr P1M1 = 0x91; sfr P1M0 = 0x92; sfr P2M1 = 0x95; sfr P2M0 = 0x96; sfr P3M1 = 0xb1; sfr P3M0 = 0xb2; sfr P4M1 = 0xb3; sfr P4M0 = 0xb4; sfr P5M1 = 0xc9; sfr P5M0 = 0xca; bit busy; char wptr; char rptr; char buffer[16]; void Uart2Isr() interrupt 8 { if (S2CON & 0x02) { S2CON &= ~0x02; busy = 0; } if (S2CON & 0x01) { S2CON &= ~0x01; buffer[wptr++] = S2BUF; wptr &= 0x0f; } } void Uart2Init() { S2CON = 0x10; T2L = BRT; T2H = BRT >> 8; AUXR = 0x14; wptr = 0x00; rptr = 0x00; busy = 0; } void Uart2Send(char dat) { while (busy); busy = 1; S2BUF = dat; } void Uart2SendStr(char *p) { while (*p) { Uart2Send(*p++); } } void main() { P0M0 = 0x00; P0M1 = 0x00; P1M0 = 0x00; P1M1 = 0x00; P2M0 = 0x00; P2M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; P4M0 = 0x00; P4M1 = 0x00; P5M0 = 0x00; P5M1 = 0x00; Uart2Init(); IE2 = 0x01; EA = 1; Uart2SendStr("Uart Test !\r\n"); while (1) { if (rptr != wptr) { Uart2Send(buffer[rptr++]); rptr &= 0x0f; } } } 修改此程序使发送者发送字母o接收者连接的板子中端口P2.5灯开始亮其余灯灭
将程序中的 P2M1 和 P2M0 的值改为 0x20,即可将 P2.5 设置为推挽输出模式。然后在主函数中加入以下代码,即可实现发送字母o时点亮 P2.5 灯,停止发送时熄灭 P2.5 灯的功能:
```
while (1) {
if (rptr != wptr) {
if (buffer[rptr] == 'o') {
P2_5 = 0; // 点亮 P2.5 灯
} else {
P2_5 = 1; // 熄灭 P2.5 灯
}
Uart2Send(buffer[rptr++]);
rptr &= 0x0f;
}
}
```
需要注意的是,程序中的 P2_5 是对 P2.5 引脚进行操作的宏定义,需要根据具体的单片机型号进行修改。
void Uart_Send_Hex(unsigned char *input_byte,unsigned int input_len) { char buff[2]; unsigned int i; UART_Com3_Para.buff = buff; for(i=0;i<input_len;i++) { UART_Com3_Para.buff[0] =(*(input_byte+i) & 0xF0)>>4; if (UART_Com3_Para.buff[0]<0x0A) UART_Com3_Para.buff[0] +=0x30; else UART_Com3_Para.buff[0] +=0x37; UART_Com3_Para.buff[1]=(*(input_byte+i) & 0x0F); if (UART_Com3_Para.buff[1]<0x0A) UART_Com3_Para.buff[1] +=0x30; else UART_Com3_Para.buff[1] +=0x37; UART_Com3_Para.SendStatus = False; UART_Com3_Para.Send_Len = 2; UART_Com3_Para.Send_Index = 0; USART3->DR =(u16)UART_Com3_Para.buff [0];//开始发送 while( UART_Com3_Para.SendStatus==0); } return; } 解释一下这段代码
这段代码是一个函数 `Uart_Send_Hex`,用于将输入的字节数据以十六进制的形式发送到UART串口。
首先,定义了一个字符数组 `buff`,用于存放转换后的十六进制数据。
然后,通过一个循环将每个输入字节进行转换和发送。
在循环内部,首先将当前输入字节的高四位取出并右移四位,然后根据其值判断应该转换成字符 `'0'` 到 `'9'` 或 `'A'` 到 `'F'`,并将结果存入 `buff[0]` 中。
接着,将当前输入字节的低四位取出,同样根据其值进行转换,并将结果存入 `buff[1]` 中。
然后,将发送状态 `UART_Com3_Para.SendStatus` 设置为 `False`,发送长度 `UART_Com3_Para.Send_Len` 设置为 2,发送索引 `UART_Com3_Para.Send_Index` 设置为 0。
最后,通过向 USART3 的数据寄存器 `USART3->DR` 写入 `UART_Com3_Para.buff[0]` 的值来开始发送数据。
在发送数据期间,使用了一个循环来等待发送完成。只有当发送状态 `UART_Com3_Para.SendStatus` 变为非零值时才会跳出循环。
整个过程完成后,函数返回。
阅读全文