📄 uart.c
字号:
#include <avr/io.h>
#include "Uart.h"
/*
1.USART数据寄存器-UDR
7 6 5 4 3 2 1 0 ??
2.USART控制和状态寄存器A - UCSRA
7 RXC USART接收完成
6 TXC USART发送完成
5 UDRE USART数据寄存器空
4 FE 接收帧出错
3 DOR 接收数据溢出出错
2 PE 校验错误
1 U2X USART传输速率倍数 分频由16将为8而加速
0 MPCM 多机通信模式允许
3.USART控制和状态寄存器B - UCSRB
7 RXCIE RX接收完成中断允许
6 TXCIE TX发送完成中断允许
5 UDRIE USART数据寄存器中断允许
4 RXEN 数据接收允许
3 TXEN 数据发送允许
2 UCSZ2 数据位数大小,同UCSRC寄存器中UCSZ1:0一起使用,设置数据位的个数(5,6,7,8,9)位
1 RXB8 接收数据的第8位
0 TXB8 发送数据的第8位
4.USART控制和状态寄存器C - UCSRC
7 URSEL 寄存器选择.读取UCSRC 读= 1;写入UCSRC 写1
6 UMSEL USART工作模式选择.=0 异步模式;=1 同步模式
5 UPM1 5.4-UPM1.0 校验方式
4 UPM0 0 0 - 无; 0 1 - 保留;1 0 - 偶校验;1 1 - 奇校验
3 USBS 停止位选择. =0 1个停止位; =1 2位停止位
2 UCSZ1 UCSZ1.0 传送、接收字符长度
1 UCSZ0
0 UCPOL 时钟极性,只能在同步模式下使用,设定串行输出数据变化和数据输入采样与
同步时钟XCK之间的关系。
5.波特率寄存器 - UBRRL 和 UBRRH
15 ---11,10,9,8; 7.....0
URSEL 12位
URSEL 读UBRRH寄存器,读=0;写UBRRH寄存器,写0;
6.一些波特率UBBR的取值
BBP 20M 16M 8M 4M 2M 1M
4800 259 207 103 51 25 12
9600 129 103 51 25 12 6
14.4K 86 68 34 16 8 3
*/
//初始化
void Uart_Init(unsigned int ucBaudRate) //9600 :25/4m 38/6m
{
// 晶振频率 : 4.0MHz
// 通信参数: 8 Data, 1 Stop, No Parity
// 波特率:
// UBRRL= 0x0C 19200;
// UBRRL= 0x19 9600;
// UBRRL= 0x33 4800;
// UBRRL= 0x67 2400
UCSRB |= (1<<RXEN)|(1<<TXEN)|(1<<RXCIE); //允许发送和接收,接收中断使能
UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8位数据位+1位停止位
UBRRH = (unsigned char)(ucBaudRate >> 8);
UBRRL = (unsigned char)(ucBaudRate & 0x7f);
fdevopen(Uart_PutChar,Uart_GetChar,0);
}
//输出一个字符
int Uart_PutChar(char c)
{
if(c=='\n')
Uart_PutChar('\r');
loop_until_bit_is_set(UCSRA,UDRE);
UDR = c;
return 0;
}
//输入一个字符
int Uart_GetChar(void)
{
loop_until_bit_is_set(UCSRA,RXC);
return UDR;
}
//输出一个字符串
void Uart_PutStr(unsigned char* szStr)
{
while(*szStr != '\0')
{
Uart_PutChar(*szStr);
szStr++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -