#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#pragma interrupt_handler SerialService:12
uchar rtemp,sflag;
void SerialInit(void)
{
UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //置一接收结束中断使能、接收使能、发送使能,并且其他位为0
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //置一寄存器选择位、设置字符位数为8位,结束位1位,并且其他位为0
UBRRH=0;
UBRRL=51; //晶振8M,波特率9600,则UBRR初始值为51
SREG|=BIT(7); //开全局中断
}
void SerialService(void)
{
rtemp=UDR; //读接收缓冲区
//UCSRA&=~BIT(RXC); //此行没有必要,读出缓冲区后,接收结束标志位清零由硬件自动完成,而且我不确定RXC是写1清零还是赋0清零。
sflag=1;
}
void main(void )
{
SerialInit();
while(1)
{
if(sflag==1)
{
UCSRB&=~BIT(RXCIE); //关闭接收结束中断使能
sflag=0;
UDR=rtemp; //数据送给发送缓冲区
while(!(UCSRA&(BIT(TXC)))); //等待发送结束
UCSRA|=BIT(TXC); //清零发送结束标志位(写1清零)
UCSRB|=BIT(RXCIE); //打开接收结束中断使能
}
}
}
AVR单片机(ATMEGA16)串行收发程序
最新推荐文章于 2023-10-18 00:39:51 发布