📄 uart.c
字号:
#include "UART.h"
//全局变量
unsigned char *UartRx; //存放接收数据的指针
unsigned int RxIndex=0; //存放接收数据的个数
unsigned int *RxLength; //数据接收长度地址指针
unsigned char UartState=0;
#define UART_REC_COM 7
/*
BIT 7 6----------------------------------------0
UART_REC_COM RESERVE
接收完成
*/
void put_c(unsigned char c) //发送采用查询方式
{
while( !(UCSRA & (1<<UDRE)) );
UDR=c;
}
void put_s(unsigned char *ptr)
{
while (*ptr)
{
put_c(*ptr++);
}
}
void put_bytes(unsigned char *ptr,unsigned int length)
{
unsigned int SendIndex;
for(SendIndex = 0;SendIndex < length;SendIndex++)
{
put_c(*ptr++);
}
}
//串口接收中断服务程序
#pragma interrupt_handler usart_rx_isr: iv_USART_RX
void usart_rx_isr(void)
{
*(UartRx+RxIndex) = UDR; //保存数据到数组里面
RxIndex++;
if((RxIndex>=2) &&
(RxIndex>= *RxLength))
{
RxIndex=0;
UartState|= 1<<UART_REC_COM; //通知主函数已经接收一帧数据完成
}
}
/************************************************************************/
/* EnInterrup:0,不使能接收功能,!0使能接收功能
*/
/************************************************************************/
void init_USART(unsigned char EnInterrup)//USART 初始化
{
//USART 9600 8, n,1 PC上位机软件(超级终端等)也要设成同样的设置才能通讯
UCSRC = (1<<URSEL) | 0x06;
//异步,8位数据,无奇偶校验,一个停止位,无倍速
/*
UBRRH与UCSRC共用I/O 地址。因此访问该地址时需注意以下问题。
写访问
当在该地址执行写访问时, USART 寄存器选择位(URSEL)控制被写入的寄存器。
若URSEL为0,对UBRRH值更新;若URSEL为1,对UCSRC设置更新
读访问
对UBRRH 或UCSRC 寄存器的读访问则较为复杂。但在大多数应用中,基本不需要读这些寄存器
没有UBRR这个16位寄存器,因为UBRRL(0x09)/UBRRH(0x20)的地址不连续,而且UBRRH跟UCSRC共用地址
*/
//U2X=0时的公式计算
UBRRL= (F_CPU/BAUDRATE/16-1)%256;
UBRRH= (F_CPU/BAUDRATE/16-1)/256;
//U2X=1时的公式计算
//UBRRL= (F_CPU/BAUDRATE/8-1)%256;
//UBRRH= (F_CPU/BAUDRATE/8-1)/256;
//也可根据数据手册的[波特率设置的例子]查得
//UBRRL = 0x2F; //set baud rate lo
//UBRRH = 0x00; //set baud rate hi
UCSRA = 0x00;
if(EnInterrup)
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
//使能接收中断,使能接收,使能发送
else
UCSRB = (1<<RXEN)|(1<<TXEN);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -