PIC18F26串口通信程序
时间: 2023-10-11 10:12:00 浏览: 271
以下是使用 PIC18F26 MCU 与 PC 之间进行串口通信的示例程序。此程序使用了 UART 模块和中断来实现数据的接收和发送。
```c
#include <xc.h>
#include <stdio.h>
#pragma config FOSC = HS // 使用外部晶振
#pragma config WDTE = OFF // 禁用看门狗定时器
#pragma config PWRTE = OFF // 禁用上电延时定时器
#pragma config BOREN = OFF // 禁用复位时的低电压检测
#pragma config LVP = OFF // 关闭低电压编程模式
#define _XTAL_FREQ 20000000 // 晶振频率为20MHz
#define BAUD_RATE 9600 // 串口波特率为9600
void init_uart(void);
void uart_tx(char data);
char uart_rx(void);
void main(void) {
TRISB = 0x00; // 设置 PORTB 为输出模式
PORTB = 0x00; // 初始化 PORTB 为0
init_uart(); // 初始化 UART
while(1) {
char rx_data = uart_rx(); // 接收串口数据
uart_tx(rx_data); // 发送串口数据
}
}
void init_uart(void) {
TRISCbits.TRISC7 = 1; // 将 RX 引脚设置为输入
TRISCbits.TRISC6 = 0; // 将 TX 引脚设置为输出
SPBRG = (_XTAL_FREQ / (16 * BAUD_RATE)) - 1; // 设置波特率
TXSTAbits.BRGH = 1; // 使用高波特率模式
RCSTAbits.CREN = 1; // 启用连续接收模式
TXSTAbits.TXEN = 1; // 启用发送模式
RCIE = 1; // 启用接收中断
PEIE = 1; // 启用外部中断
GIE = 1; // 启用全局中断
}
void uart_tx(char data) {
while(!TXIF); // 等待 TX 寄存器为空
TXREG = data; // 发送数据
}
char uart_rx(void) {
while(!RCIF); // 等待接收完毕
return RCREG; // 返回接收到的数据
}
void interrupt isr() {
if(RCIF) { // 如果是接收中断
char rx_data = uart_rx(); // 接收串口数据
uart_tx(rx_data); // 发送串口数据
}
}
```
在此示例程序中,我们将 PORTB 设置为输出模式,并使用 UART 模块和中断来实现串口通信。在 `init_uart` 函数中,我们设置了波特率和其他 UART 寄存器的值,启用了连续接收模式和发送模式,并启用了接收中断。
在主循环中,我们使用 `uart_rx` 函数来接收串口数据,并使用 `uart_tx` 函数来发送串口数据。在中断服务例程中,我们也使用了 `uart_rx` 和 `uart_tx` 函数来实现接收和发送。
请注意,在 `init_uart` 函数中,我们启用了接收中断,并在中断服务例程中处理接收中断。这样可以确保即使 MCU 正在执行其他任务时,也可以及时地接收和发送数据。
此示例程序可以通过串口终端程序与 PC 进行通信,如 TeraTerm、PuTTY 等。
阅读全文