![]() |
發(fā)布時間: 2023-3-19 21:38
正文摘要:#include <REGX52.H> void URET_TX(unsigned int key) { SBUF=key;//寫入數(shù)據(jù)進SBUF緩存器   ... |
wulin 發(fā)表于 2023-3-20 21:22 為啥是先判斷是否接收到數(shù)據(jù)(即RI=1)再發(fā)送數(shù)據(jù),而不是先由電腦發(fā)送數(shù)據(jù),再來判斷單片機是否接收,如果接收了 ,后面再取出? 即下面這樣 void URET_TX() { SBUF=num; //發(fā)送數(shù)據(jù) while(!TI); //等待發(fā)送中斷請求標志位為1(已發(fā)送) TI=0; //發(fā)送中斷請求標志位清0 if(RI==1) //查詢接收中斷請求標志位為1(已收到) { RI=0; //接收中斷請求標志位清0 num=SBUF; //獲取接收寄存器數(shù)據(jù) } } 我把它改成這樣就又全部是00 000 00 大師你那上面的程序可以收發(fā) |
89C52RC單片機 發(fā)表于 2023-3-20 12:28 #include <REG51.H> unsigned char num; void URET_TX() { if(RI==1) //查詢接收中斷請求標志位為1(已收到) { RI=0; //接收中斷請求標志位清0 num=SBUF; //獲取接收寄存器數(shù)據(jù) SBUF=num; //發(fā)送數(shù)據(jù) while(!TI); //等待發(fā)送中斷請求標志位為1(已發(fā)送) TI=0; //發(fā)送中斷請求標志位清0 } } void URET_Tu(void) //4800bps@11.0592MHz { PCON |= 0x80; //使能波特率倍速位SMOD SCON = 0x50; //8位數(shù)據(jù),可變波特率 TMOD &= 0x0F; //設(shè)置定時器模式 TMOD |= 0x20; //設(shè)置定時器模式 TL1 = 0xF4; //設(shè)置定時初始值 TH1 = 0xF4; //設(shè)置定時重載值 ET1 = 0; //禁止定時器%d中斷 TR1 = 1; //定時器1開始計時 } void main(void) { URET_Tu(); while(1) { URET_TX(); } } |
我復(fù)制錯了下面才是在主函數(shù)中,URET_TX(SBUF)的參數(shù)是未初始化的變量SBUF,它沒有定義任何值。因此,在發(fā)送數(shù)據(jù)之前,您需要在主函數(shù)中定義并賦值給SBUF變量。 另外,在URET_TX函數(shù)中,while循環(huán)應(yīng)該檢查RI標志位是否為1,表示接收到數(shù)據(jù),而不是TI標志位是否為0,表示數(shù)據(jù)傳輸完成。要處理接收到的數(shù)據(jù),請先讀取SBUF緩沖器,然后重置RI標志位。 最后,您需要配置串口通信的波特率,否則默認波特率可能與您的設(shè)備不兼容,導(dǎo)致無法正常通信。 |
AI機器人給的答案看對你有沒有幫面向工資編程 ChatGPT 多人模式 個人模式 #include <REGX52.H> void URET_TX(unsigned int key) { SBUF=key;//寫入數(shù)據(jù)進SBUF緩存器 while(TI==0)//檢測標志位,是否置1,如果置1,表示數(shù)據(jù)傳輸完成 {TI=0;}//重置標志位位0 if(RI==1)//檢測是否接收完成 {P2=SBUF;//讀取發(fā)送過來的SBUF數(shù)據(jù) RI=0;}//重置標志位 } void URET_Tu(void) { PCON |= 0x80; //使能波特率倍速位SMOD SCON = 0x50; //8位數(shù)據(jù),可變波特率 TMOD &= 0x0F; //設(shè)置定時器模式 TMOD |= 0x20; //設(shè)置定時器模式 TL1 = 0x15; //設(shè)置定時初值 TH1 = 0x15; //設(shè)置定時重載值 ET1 = 0; // TR1 = 1; //定時器1中斷 } void main(void) { URET_Tu(); while(1) { URET_TX(SBUF); } }幫我檢查一下這段代碼有沒有什么邏輯問題 這段代碼可能存在邏輯問題,具體如下: URET_TX函數(shù)中while循環(huán)的標志位重置操作TI=0應(yīng)該在if判斷語句前,否則會導(dǎo)致無限循環(huán)等待TI標志位變?yōu)?,阻塞程序執(zhí)行。 在主函數(shù)中URET_TX(SBUF)傳入的參數(shù)SBUF并沒有被定義或初始化,因此不能保證其值的正確性。 在主函數(shù)中,URET_Tu()只需要在程序開始時調(diào)用一次即可,無需在while循環(huán)中重復(fù)調(diào)用。助 |
Powered by 單片機教程網(wǎng)