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

📄 usart.h

📁 用AVR控制GPRM模块。用于远程通讯等等
💻 H
字号:
#define read_IO_ini PORTB|=(1<<PB1)
#define send_IO_ini PORTB&=~(1<<PB1)
#define IO_ini      DDRB|=(1<<PB1)

volatile int smsinput_Length=0;//串口1一次接受字符串的长度
volatile int Tsmsinput_Length=0;//串口1一次接受字符串的长度
volatile char smsinput_buf[256];//串口1接受数据缓存区
volatile uchar read_ustart1_ok;//串口1是否接受完成一组信息的标志位

volatile int equsinput_Length=0;//串口0一次接受字符串的长度
volatile int Tequsinput_Length=0;//串口0一次接受字符串的长度
volatile char equsinput_buf[64];//串口0接受数据缓存区


/*************************************
功能:初始化串口0
参数:无
返回值:无
编写人:王志辉
时间:2007年6月4日
*************************************/
void USART0_int(void)
{
 /*设置波特率9600*/
 UBRR0H=0x00;
 UBRR0L=0x47;
 /*中断设置*/
 UCSR0A = 0x00;
 UCSR0B|=(1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0);//(1<<TXCIE0)|接受完成中断允许、接受允许、发送允许、发送中断允许
 UCSR0C|=(1<<UCSZ00)|(1<<UCSZ01)|(1<<URSEL0);//8个数据位、一个停止位	
}

/*************************************
功能:初始化串口1
参数:无
返回值:无
编写人:王志辉
时间:2007年6月4日
*************************************/
void USART1_int(void)
{
 /*设置波特率9600*/
 UBRR1H=0x00;
 UBRR1L=0x47;
 /*中断设置*/
 UCSR1A = 0x00;
 UCSR1B|=(1<<RXCIE1)|(1<<RXEN1)|(1<<TXEN1);//(1<<TXCIE1)|接受完成中断允许、接受允许、发送允许、发送中断允许
 UCSR1C|=(1<<UCSZ10)|(1<<UCSZ11)|(1<<URSEL1);//8个数据位、一个停止位	
}

/*************************************
功能:串口1接收中断
参数:无
返回值:无
编写人:王志辉
时间:2007年6月4日
是否测试:是
*************************************/
SIGNAL(SIG_USART1_RECV)
{TCNT0 = 0x00;  //初始化定时器0数据寄存器
 TCCR0 = 0x05;//开定时器
 smsinput_buf[Tsmsinput_Length]=UDR1;
 Tsmsinput_Length++;
}

/**************************************************************   
功能:通过串口1发送命令信息
参数:pSrc: 命令字符串指针
      size: 字符串长度
返回: 无
编写人:王志辉
时间:2007年8月7日
****************************************************************/                 
void WriteComm(char *ptr,int size)
{   send_IO_ini;//关闭RTS禁止短消息模块向单片机发送信息
	int w;
	for (w=0;w<size;w++)
	{
 		UDR1=*(ptr+w);
 		loop_until_bit_is_set(UCSR1A,UDRE1);
 		UCSR1A|=(1<<UDRE1);
	}
	smsinput_Length=0;//清零smsinput_Length
	read_ustart1_ok=0;//清零read_ustart1_ok
	//等待450ms用于短消息模块处理数据为了稳定接受
	for (w=0;w<15;w++)
	_delay_ms(30);
	read_IO_ini;//开启RTS允许短消息模块向单片机发送信息
}
//发送命令信息子程序
void WriteCommRam(const prog_uchar *ptr,uchar size)
{   send_IO_ini;
	uchar w;
	for (w=0;w<size;w++)
	{
 		UDR1=pgm_read_byte(ptr+w);
 		loop_until_bit_is_set(UCSR1A,UDRE1);
 		UCSR1A|=(1<<UDRE1);
	}
	smsinput_Length=0;//清零smsinput_Length
	read_ustart1_ok=0;//清零read_ustart1_ok
	for (w=0;w<15;w++)
	_delay_ms(30);
	read_IO_ini;
}
/**************************************************************   
功能:读串口1的接受缓存区
参数:pData目标字符串指针      
返回: 目标字符串长度
编写人:王志辉
时间:2007年8月7日
是否测试:是
****************************************************************/             
int ReadComm(char* pData)
{   
    int a;
	while(read_ustart1_ok!=0xff)//等待串口接受完成
	  {	
	   		NOP;
	  } 
	memcpy(pData,smsinput_buf,smsinput_Length);//复制串口接受缓存区的内容到目标字符串
	a=smsinput_Length;
	smsinput_Length=0;//清零smsinput_Length
	read_ustart1_ok=0;//清零read_ustart1_ok
	return a;//返回复制的长度
}
int ReadCommd(void)
{   
    int a;
	while(read_ustart1_ok!=0xff)//等待串口接受完成
	  {	
	   		NOP;
	  } 
	a=smsinput_Length;
	smsinput_Length=0;//清零smsinput_Length
	read_ustart1_ok=0;//清零read_ustart1_ok
	return a;//返回复制的长度
}
/*************************************
功能:串口0接收中断
参数:无
返回值:无
编写人:王志辉
时间:2007年6月4日
是否测试:是
*************************************/
SIGNAL(SIG_USART0_RECV)
{TCNT2 = 0x00;  //初始化定时器2数据寄存器
 TCCR2 = 0x05;//开定时器
 equsinput_buf[Tequsinput_Length]=UDR0;
 Tequsinput_Length++;
}

//发送命令信息子程序
void WriteEqu(char *ptr,uchar size)
{   
	uchar w;
	for (w=0;w<size;w++)
	{
 		UDR0=*(ptr+w);
 		loop_until_bit_is_set(UCSR0A,UDRE0);
 		UCSR0A|=(1<<UDRE0);
	}
	
}

/*************************************
功能:串口0波特率设置
参数:a:波特率选择
返回值:无
编写人:王志辉
时间:2007年6月4日
是否测试:是
*************************************/
void usart0_baud_set(uchar a)
{
	switch(a)
	{
		case '1'://设为1200
			UBRR0H=0x02;
 			UBRR0L=0x3f;
		break;
		case '2'://设为2400
			UBRR0H=0x01;
 			UBRR0L=0x1F;
		break;
		case '4'://设为4800
			UBRR0H=0x00;
 			UBRR0L=0x8F;
		break;
		case '9'://设为9600
			UBRR0H=0x00;
 			UBRR0L=0x47;
		break;
		default://默认9600波特率
			UBRR0H=0x00;
 			UBRR0L=0x47;
		break;

	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -