3 回答

TA貢獻1868條經驗 獲得超4個贊
用ICC產生的初始化程序
#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
void uart0_rx_isr(void)
{
//uart has received a character in UDR
//UCSRB&=~BIT(RXCIE); //接收完畢中斷不使能
//AVR沒有中斷優先級概念,中斷處理結束前不接受新中斷,沒必要關接收中斷
RX_Buffer[i]=UDR;
// delay(5);
i++;
if(i==12)
{
i=0;
flag=1;
//delay(5);
}

TA貢獻1785條經驗 獲得超4個贊
當然老是接收到00了,我給你解釋一下:你的串口中斷函數不止是在接收數據的時候執行,在執行while(!Ti);時等待發送完成時也會觸發中斷函數,此時sbuf里面為空,數據之前被取走了。解決辦法:把串口中斷函數改為:void ser()interrupt 4
{if(Ri)
{Ri=0;
a=sbuf;
}
if (Ti)
{
}}
當然老是接收到00了,我給你解釋一下:你的串口中斷函數不止是在接收數據的時候執行,在執行while(!Ti);時等待發送完成時也會觸發中斷函數,此時sbuf里面為空,數據之前被取走了。解決辦法:把串口中斷函數改為:void ser()interrupt 4{if(Ri){Ri=0;a=sbuf;
flag=1;
}if (Ti){}}
再說一句,sbuf里面的數之前被取走的話就為0了,速度給分啊,用手機打了老半天

TA貢獻1752條經驗 獲得超4個贊
void ser() interrupt 4 //串口中斷函數
{
if(RI)
{
RI=0;
a=SBUF; //收到的數據存入緩沖器,然后賦給a
flag=1;
}
}
另外看看你的波特率,應該有問題,9600的話初值應該是0xfd,初始化時也沒有設置1T模式,缺省狀態應該12T模式的。
添加回答
舉報