1樓:
肯定不會執行while(ti==0);下面的程式的,因為你的中斷開著,程式跳到中斷服務程式裡面了,然後中斷處理結束了之後,ti自動清零了,所以一直在while(ti==0);無限迴圈。
程式裡面,既然開通了中斷功能,那你就一直使用中斷功能,為什麼你還要使用查詢功能呢?甚至有時把中斷給禁止了,這裡面容易出現問題哈。
你不要使用查詢功能,就一直使用中斷,具體程式檢視下面:
#include
#define uint unsigned int#define uchar unsigned charvoid delay(int z);
char a,flag;
void main()
void ser_interrupt()interrupt 4else if(ti==1)ti=0;}
2樓:匿名使用者
串列埠接收與傳送都是用的相同中斷源。所以在中斷函式中要判斷是接收還是傳送中斷,同時,要軟體清中斷。所以中斷函式修改
void ser_interrupt()interrupt 4}if(ti)
}主函式中可改為
if(flag==1)
3樓:匿名使用者
開啟pc串列埠軟體就有資料接收,是和第一次發的資料一樣嗎,具體是什麼樣的資料。
你把 while ( ri == 0) ;放到中斷第一句,再把main中的es=0放進中斷最後看看。
4樓:倫哲齊騫
對於51而言,每幀產生一次中斷。接收4個位元組是分4次中斷接收完成的。51的uart模組從序列移位暫存器接收完成後是直接放入接收緩衝的,而且接收緩衝只有一個單元。
51微控制器串列埠通訊問題
5樓:匿名使用者
c51微控制器的程式:
1、初始化程式:
tmod=0x20; th1=0xfd; tl1=0xfd;sm0=0; sm1=1; ren=1; tr1=1; ea=1; es=1;
2、傳送程式:
void comdata_send()//串列埠傳送資料3、接收資料:
void comdata_receive() interrupt 4}
6樓:魔靨一陣風
#include
#define uchar unsigned char
#define uint unsigned int
uchar idata trdata=;
sbit k1=p3^2; //對應開發板k1按鍵
//串列埠初始化
void uart_init(void)
void delay1ms(uint i)}}
//串列埠傳送一個位元組
void uart_sendchar(unsigned char dat)
//串列埠傳送一個字串
void uart_sendstring()
//主函式
void main(void)}}
//串列埠接收中斷函式
void int_uartrcv(void) interrupt 4}
7樓:曾年胥昌黎
樓主,傳送與接收不要放在同一個中斷服務程式中,rx_data[i]=sbuf;
sbuf=rx_data[i];
這兩句不應放在同一個中斷服務程式中啊,都放在main()}rx_data[i]=sbuf,放在中斷服務程式中;
8樓:奈妍杭綺琴
這個很難說,可能是其它程式問題,你仔細檢查一下,你整段程式,總能發現其中問題的!一步一步的找,和執行看看,一下哪步出問題了
51微控制器串列埠通訊出現問題,5V微控制器與3 3V微控制器串列埠通訊問題
做而論道 void main 如果是ascii碼,加上引號即可 if sbuf 0 p0 smg 0 通過數碼管顯示接收到的資訊 if sbuf 1 p0 smg 2 通過數碼管顯示接收到的資訊 if sbuf 2 p0 smg 12 通過數碼管顯示接收到的資訊 if sbuf 3 p0 smg 1...
微控制器串列埠中斷問題
樓主的問題我覺得應該出在這裡 該中斷函式是將接收的資料加一然後回顯,方法簡單明瞭,不錯。但是進入了死迴圈。void serial void interrupt 4 using 3 中斷內再出中斷,打亂了中斷服務程式的返回。if ti 修改的如下,希望樓主看完後明白這個是同步互斥的問題。void se...
51微控制器UART通訊問題
定時器1工作在自動重灌模式時,不需要軟體加以干預,就可以為uart的波特率提供連續穩定的時鐘。之所以只能用定時器1作為uart的波特率時鐘,這是由微控制器內部硬體所決定的。但並不是定時器1工作在自動重灌模式時才成為uart的波特率,定時器1工作在其它模式也可以為uart提供波特率時鐘,比如工作在模式...