📄 usart.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 + -