⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usart.c

📁 一个通过串口与51通信的AVR的程序,还有一些其实功能
💻 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 + -