📄 usart.c
字号:
#include <header.h>
#include <usart.h>
#define BAUDRATE 172800 //波特率
unsigned char USART_dat_send[13]={0xf0,0xf0};
volatile unsigned char USART_dat_rev[11];
unsigned char *USART_dat=USART_dat_send+2;
unsigned char USART_dat_sending;
volatile unsigned char USART_dat_reving=0;
unsigned char USART_dat_sended;
volatile unsigned char USART_dat_reved=0;
volatile unsigned char USART_rev_head=0;
//如果变量会在中断服务程序中被修改,须加volatile限定
void USART_int()
{
//USART 172800 9, n,1 PC上位机软件(超级终端等)也要设成同样的设置才能通讯
UCSRC = ((1<<URSEL) | 0x06);
//异步,9位数据,无奇偶校验,一个停止位,无倍速
/*
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 = 0x07; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRA = 0x00|(1<<U2X);
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN)|(1<<UCSZ2)|(1<<TXB8);
//使能接收中断,使能接收,使能发送,9位
}
void USART_send_c(unsigned char c) //发送采用查询方式
{
while( !(UCSRA & (1<<UDRE)) );
UDR=c;
}
void USART_send_dat(unsigned char *dat,unsigned char lng) //发送数据
{
unsigned char i;
USART_dat_sended=0;
memcpy(USART_dat, dat, lng);
lng+=2;
for(i=0;i<lng;i++)
USART_send_c(USART_dat_send[i]);
USART_dat_sended=1;
}
void USART_rev()
{
//USART_rev_head=UDR;
if(USART_rev_head<2)
{
if(UDR==0xf0)
{USART_rev_head++;
USART_dat_reving=0;}
else
{USART_rev_head=0;
USART_dat_reving=0;}
}
else
{
USART_dat_reved=0;
USART_dat_rev[USART_dat_reving]=UDR;
USART_dat_reving++;
if(USART_dat_reving>USART_dat_rev[0])
{
USART_dat_reving=0;
USART_rev_head=0;
USART_dat_reved=1;
}
}
}
/*
void USART_test()
{
unsigned char i;
USART_dat_send[2]=9;
USART_dat_send[3]=1;
USART_dat_send[4]=2;
USART_dat_send[5]=3;
USART_dat_send[6]=4;
USART_dat_send[7]=5;
USART_dat_send[8]=6;
USART_dat_send[9]=7;
USART_dat_send[10]=8;
USART_dat_send[11]=21;
USART_dat_send[12]=35;
for(i=0;i<13;i++)
USART_send_c(USART_dat_send[i]);
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -