![]() |
發布時間: 2017-4-9 14:35
正文摘要:我的目的是通過電腦給單片機發送一個字符串k+25,單片機接收到該字符串后,發送給電腦25這兩個字符;單片機雖然接受到了該字符串,但是發送到電腦時總是+2 這兩個字符。我在發送函數里已經用for(j=2;j<4;j++) ... |
hujj 發表于 2018-9-2 08:56 3q,時隔一年的互動 ![]() |
FIGHLTDEAME 發表于 2017-4-9 20:01 芯片型號 : STC89C51RC/LE51RC 關于此芯片的重要說明: 固件版本在v7.0及以上時 . 芯片內部包含有全球唯一ID號 . 上電復位后,ID號會自動復制到RAM區域的F1H-F7H . 更新代碼時可使用燒錄選項將ID號燒錄到程序區的最后7字節中 這是官方的,說明有這個型號。 |
ahshmj 發表于 2017-4-9 18:16 我的是51單片機,但是賣家說STC上沒有51,型號選擇“STC89C/LE52RC”這個就行,他說沒有事兒 |
imxuheng 發表于 2017-4-9 18:25 恩恩 好的 謝謝了 |
來,試試我這個 #include<reg52.h> unsigned char cntRxd = 0; unsigned char cmdArrived = 0; unsigned char bufRxd[40]; //串口接收緩沖區 void ConfigUART(unsigned int baud) //串口配置函數,baud為波特率 { SCON = 0x50; //配置串口為模式1 TMOD &= 0x0F; //清零T1的控制位 TMOD |= 0x20; //配置T1為模式2 TH1 = 256 - (11059200/12/32) / baud; //計算T1重載值 TL1 = TH1; //初值等于重載值 ET1 = 0; //禁止T1中斷 ES = 1; //使能串口中斷 TR1 = 1; //啟動T1 } void UartWrite(unsigned char *buf) //串口發送函數 { unsigned char i; for(i = 0;i<cntRxd;i++) //發送數據 { SBUF = *buf; buf++; } } void main () { EA = 1; //開總中斷 ConfigUART(9600); //配置波特率為9600 while(1) { if (cmdArrived) //有命令到達時,讀取處理該命令 { cmdArrived = 0; UartWrite(bufRxd); cntRxd = 0; } } } void InterruptUART() interrupt 4 //UART中斷服務函數 { if(RI) { bufRxd[cntRxd++] = SBUF; //保存接收字節 while(!RI); RI = 0; //手動清零接收中斷標志位 cmdArrived = 1; } if (TI) //字節發送完畢 { TI = 0; } } |
本帖最后由 ahshmj 于 2017-4-9 18:21 編輯 感覺你的波特率設置不對。晶振是多少? 你電腦界面上選的是“STC89C/LE52RC”,但是STC官方給出的如下: SCON = 0x50; //8位數據,可變波特率 AUXR &= 0xBF; //定時器1時鐘為Fosc/12,即12T AUXR &= 0xFE; //串口1選擇定時器1為波特率發生器 TMOD &= 0x0F; //設定定時器1為16位自動重裝方式 TL1 = 0xE8; //設定定時初值 TH1 = 0xFF; //設定定時初值 ET1 = 0; //禁止定時器1中斷 TR1 = 1; //啟動定時器1 (11.0592晶振) |