📄 int_uart.c
字号:
/****************************
*** RS232 中断模式的通信程序
****************************/
#include <iom8v.h>
#include <macros.h>
#define Fosc 4096000 //系统晶振频率 4.096MHz
#define BAUD 57600 //通信波特率57600bps
unsigned char uartbuf[128],uart_data_start=0,uart_data_end=0; // 128字节uart缓冲区,数据头、尾
/* UART初始化函数 */
void uart_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UBRRL=8;
UBRRH=0;
//UBRRL=(Fosc/16/BAUD-1)%256; // 设置波特率寄存器低位字节
//UBRRH=(Fosc/16/BAUD-1)/256; // 设置波特率寄存器高位字节
//UBRRL=(Fosc/8/BAUD-1)%256; // 设置传输速率倍速波特率寄存器低位字节
//UBRRH=(Fosc/8/BAUD-1)/256; // 设置传输速率倍速波特率寄存器高位字节
UCSRA=(1<<U2X); // 传输速率倍速
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // 8位数据+1位STOP位
UCSRB=(1<<TXCIE)|(1<<RXEN)|(1<<TXEN); // 发送完成中断允许,允许发送和接受
}
#pragma interrupt_handler uart0_tx_isr:14
void uart0_tx_isr(void) // 发送完成中断
{
//WDR();
if(uart_data_start != uart_data_end) // 如果发送缓冲区有数据
{
UDR = uartbuf[uart_data_start];
uart_data_start++;
if(uart_data_start == 128) uart_data_start = 0;
}
}
/* 字符输出函数 */
void putchar(unsigned char c)
{
if((uart_data_end == uart_data_start) && (UCSRA&(1<<UDRE))) // 缓冲区无数据和发送寄存器UDR空
{
UDR = c; // 直接向发送寄存器UDR写入数据
}
else
{
uartbuf[uart_data_end]=c; // 向缓冲区写入数据
uart_data_end++;
if(uart_data_end == 128) uart_data_end = 0;
}
}
/* 字符输入函数 */
unsigned char getchar(void)
{
while(!(UCSRA&(1<<RXC)));
return UDR;
}
/* 字符串输出函数 */
void putstring(unsigned char *s)
{
while(*s)
{
putchar(*s);
s++;
}
}
/* 回车换行字符输出函数 */
void putchar_ENTER(void)
{
putchar(0x0d);
putchar(0x0a);
}
/****************************
*** RS232 中断模式的通信程序
*************************end/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -