📄 avr-usart.c
字号:
/*---------------------UART初始化:器件=mega88
帧结构的确定:
起始位1,数据位8,无奇偶校验,2位停止位
---数据位数8:
UCSZn2 UCSZn1 UCSZn0 字符长度
000 5 位
001 6 位
010 7 位
011 8 位
UCSZn2 位于UCSRnB寄存器,UCSZn1 0位于UCSRnC
setbits2(UCSRnC,UCSZn1,UCSZn0);clrbit(UCSRnB,UCSZn2);
----停止位选择:
USBSn 停止位
0 1 位
1 2 位
setbit(UCSRnC,USBSn);
-----无奇偶校验:
UPMn1 UPMn0 校验模式
00 禁止
clrbits2(UCSRnC,UPMn1,UPMn0);
-----异步模式:
UMSELn1 UMSELn0 模式
0 0 异步操作
clrbits2(UCSRnC,UMSELn1,UMSELn0);
----波特率 9600bps:
clrbit(UCSRnA,U2Xn);//不倍速
UBRRn=Fosc/(16*baud)-1; // 倍速模式则为8 也可查表
-----------------------------------*/
void UartInit(void)
{
UCSRnC=0x0e;
clrbit(UCSRnB,UCSZn2);
clrbit(UCSRnA,U2Xn);
UBRRn=25;//Fosc1/(16*baud)-1;
out(DDRC,5);
out(DDRD,2);//en
out(DDRD,1);//TXD
in(DDRD,0);//RXD
pullup(PORTD,0);//
RXEN;
RXIE;
selectRX;
rxbytescount=0;
rxokflag=0;
}
//-------------------------interrupt handler,commu rx
#pragma vector=USART_RX_vect
__interrupt void rxisr(void)
{
//while(!getbit(UCSRnA,RXCn));//polling method
if(rxbytescount<TOTAL_BYTES_COUNT)
{
rxpackage[rxbytescount++]=UDRn; //or out if
rxtimeoutfactor=1;
RXEN;
RXIE;
}
if(rxbytescount>=TOTAL_BYTES_COUNT) //shouldnot just else
{
rxbytescount=0;rxokflag=1;
}
}
//-----------------------------------------------
void CommuTrans(unsigned char *ptr,unsigned char len){
unchar i;
TXEN;
selectTX;
for(i=0;i<len;i++)
{
while(!getbit(UCSRnA,UDREn));//wait for tx buffer being empty
UDRn=*ptr;ptr++;//txpackage[i];
}//end for
while(!getbit(UCSR0A,TXCn)) ;//wait for tx over //needed?
delayms(10);
selectRX;
}
//-------------------------------------process commu info
void ProcessCommuInfo(void)
{
unsigned char i;
switch(rxokflag)
{
case 0: break;
case 1:
{
//ADD TO DO HERE
rxokflag=0;
}break;//end case 1
default:break;
}//end switch
}//end fun
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -