導航:首頁 > 操作系統 > 51單片機uart

51單片機uart

發布時間:2022-07-18 22:47:27

Ⅰ 51單片機UART連續發送問題

在uart_send(i);後面加一個短延時看看。

再看一下你的晶振是不是11.0592MHz。
ES = 1;改成ES =0;

Ⅱ 51單片機內置uart硬體

51內置UART是硬體的,IO不能變化。如果你不想使用P3.0、P3.1,就只能在其它IO上通過程序來模擬UART了。

Ⅲ 51單片機uart接收數據出錯

電壓設定問題。
UART所在的Bank中的電壓設定為3.3v,而根據開發板原理顯示應該設定為1.8v。在UART_RX中接收時,由於在FPGA一端給的電壓為3.3v,因此可以滿足1.8v的電壓要求,數據可以正常的發送給UART,但是在UART一端發送數據給FPGA時,由於FPGA給的電壓標為3.3v,要想為導通狀態,即拉高狀態,電壓最低為2.4v才行,但是給UART1提供的電壓只有最高1.8v,這樣就會不滿足3.3v的電壓要求,就會一直為低的狀態,數據就會出錯。
通用非同步收發傳輸器,通常稱作UART。它將要傳輸的資料在串列通信與並行通信之間加以轉換。作為把並行輸入信號轉成串列輸出信號的晶元,UART通常被集成於其他通訊介面的連結上。

Ⅳ 51單片機中的串列介面和全雙工的UART分別是指什麼

串列介面是指數據一位位地順序傳送,常用的有RS232和RS485;
UART是非同步串列介面,即是主從機時鍾頻率不同步,通信是通過設置波特率實現的。
UART其實就是串列介面中的一種。
通信有串列、並行之分,而串列通信又有同步、非同步之分。
同步常用協議是SPI、IIC。非同步就上面說的。

Ⅳ 51單片機與uart通信

//51串口通信基本設置我不講了,網上泛濫得很,基本通信調通的基礎上通過命令來控制單片機動作可以用以下的方法,很簡單。

//串口中斷處理,接收用數組RecCmd[],調試助手每次發送數據的最後兩個字元是'\r'和'\n'
//接收一個命令完成後將接收的內容放入緩沖RecCmdBuf[]

extern uchar idata RecCmd[10],RecCmdBuf[10]; //串口接收雙緩沖,最大接收9個有效位元組,第10個是』\r『
extern bit RecCmdFlag;
void ISR_SERIAL(void) interrupt 4 using 2
{
uchar i;
if(RI) //RI接受中斷標志
{
RI = 0; //清除RI接受中斷標志
i = SBUF; //SUBF接受/發送緩沖器
SBUF= i; //RecCmd[RecPtr]; Echo Back
unReadyToSend = 1; //與另一個非echo發送程序之間的互鎖信號
if('\n' == i) //收到『\n'字元表示調試助手已經發送完成
{
i = 0;
while(('\r' != (RecCmdBuf[i] = RecCmd[i])) && i<10)
{
i++; //已接收部分放入緩沖
}
if(i) //避免調試助手發空內容,即只發'\r'和'\n'
RecCmdFlag =1; //通知主程序命令接收完成
RecPtr = 0; //准備接收新命令
}
else
{
RecCmd[RecPtr++] = i;
if(RecPtr>9)
RecPtr = 0; //超長無效命令
}
}
if(TI)
{
TI = 0; //發送中斷響應
unReadyToSend = 0;
}
}

//命令處理部分可以放在主循環里調用,命令判斷的方式非常原始,但自己測試用就無所謂
void SerialCmdHandle(void)
{
if(RecCmdFlag)
{
if('m' == RecCmdBuf[0] && 'e' == RecCmdBuf[1] && 'n' == RecCmdBuf[2] && 'u' == RecCmdBuf[3] && '\r' == RecCmdBuf[4])
ShowMenu(); //command "menu"
if('s' == RecCmdBuf[0] && 'h' == RecCmdBuf[1] && 'o' == RecCmdBuf[2] && 'w' == RecCmdBuf[3] && ' ' == RecCmdBuf[4] && 's' == RecCmdBuf[5] && '\r' == RecCmdBuf[6])
{
LedShow = Serial; //command "show s"
}
if('s' == RecCmdBuf[0] && 'h' == RecCmdBuf[1] && 'o' == RecCmdBuf[2] && 'w' == RecCmdBuf[3] && ' ' == RecCmdBuf[4] && 'a' == RecCmdBuf[5] && 'd' == RecCmdBuf[6] && '\r' == RecCmdBuf[7])
{
LedShow = Adc; //command "show ad"
}
if('s' == RecCmdBuf[0] && 'h' == RecCmdBuf[1] && 'o' == RecCmdBuf[2] && 'w' == RecCmdBuf[3] && ' ' == RecCmdBuf[4] && 't' == RecCmdBuf[5] && 'e' == RecCmdBuf[6] && '\r' == RecCmdBuf[7])
{
LedShow = TempCov; //command "show te"
}
if('s' == RecCmdBuf[0] && 'h' == RecCmdBuf[1] && 'o' == RecCmdBuf[2] && 'w' == RecCmdBuf[3] && ' ' == RecCmdBuf[4] && 't' == RecCmdBuf[5] && 'i' == RecCmdBuf[6] && '\r' == RecCmdBuf[7])
{
LedShow = Time; //command "show ti"
}
if('s' == RecCmdBuf[0] && 'h' == RecCmdBuf[1] && 'o' == RecCmdBuf[2] && 'w' == RecCmdBuf[3] && ' ' == RecCmdBuf[4] && 't' == RecCmdBuf[5] && 'd' == RecCmdBuf[6] && '\r' == RecCmdBuf[7])
{
LedShow = Date; //command "show td"
}
if('s' == RecCmdBuf[0] && 't' == RecCmdBuf[1] && ' ' == RecCmdBuf[2] && '\r' == RecCmdBuf[9])
{
//command "st 000012" 改變ds1302的時間 ss:mm:hh //24hour |0x80
SetClockTime((((RecCmdBuf[3]-'0')<<4) | (RecCmdBuf[4]-'0')),(((RecCmdBuf[5]-'0')<<4) | (RecCmdBuf[6]-'0')),(((RecCmdBuf[7]-'0')<<4) | (RecCmdBuf[8]-'0')));
}
if('s' == RecCmdBuf[0] && 'd' == RecCmdBuf[1] && ' ' == RecCmdBuf[2] && '\r' == RecCmdBuf[9])
{
//command "sd 011299"改變ds1302的日期 dd:mm:yy
SetClockDate((((RecCmdBuf[3]-'0')<<4) | (RecCmdBuf[4]-'0')),(((RecCmdBuf[5]-'0')<<4) | (RecCmdBuf[6]-'0')),(((RecCmdBuf[7]-'0')<<4) | (RecCmdBuf[8]-'0')));
}
LedChangeFlag = 1;
//LcdChangeByteFlag = 0 + CHANGE + SERIAL;
RecCmdFlag = 0;
}
}

//下面是一個串口輸出的menu菜單,給你參考。

void SendOneByte(uchar ch)
{
//ES = 0; //禁止發送中斷
SBUF = ch;
unReadyToSend = 1; //互鎖信號
}
void UartSendST(uchar *st, uchar len)
{
while(len > 0)
{
while(unReadyToSend);
SendOneByte(*st++);
len--;
}
}

typedef struct _menu{
uchar *item;
uchar size;
} T_Menu;

T_Menu code MAINM = {"MENU\r\n",6}, \
MENU0 = {"_____________________________________\r\n",39}, \
MENU1 = {"menu-> list this menu\r\n",23}, \
MENU2 = {"show s/ad/te/ti/td-> \r\n",19}, \
MENU3 = {"serial/ad-da/temp/time/date\r\n",29}, \
MENU4 = {"led f num-> led flash time us\r\n",31}, \
MENU5 = {"st ssmmhh->set time\r\n",21}, \
MENU6 = {"sd ddmmyy->set date\r\n",21}, \
MENU7 = {"\r\n",2}, \
MENU8 = {"\r\n",2};

void ShowMenu(void)
{
UartSendST(MAINM.item,MAINM.size);
UartSendST(MENU0.item,MENU0.size);
UartSendST(MENU1.item,MENU1.size);
UartSendST(MENU2.item,MENU2.size);
UartSendST(MENU3.item,MENU3.size);
UartSendST(MENU4.item,MENU4.size);
UartSendST(MENU5.item,MENU5.size);
UartSendST(MENU6.item,MENU6.size);
UartSendST(MENU7.item,MENU7.size);
UartSendST(MENU8.item,MENU8.size);

}

Ⅵ 51單片機的uart串口的TXD與RXD為什麼必須是P3.0與P3.1口,P3.2與P3.3也能做TXD與RXD嗎

你的想法很好,即使是小白的問題,也要分清是哪一類。想像力是創造力的翅膀,相信你的思維能力適合學習單片機,如果肯努力,將來會有很好的發展。
對於大多數51單片機而言,第二功能是由內核結構決定的,也就是說設計晶元時已經固定了,除非你用模擬的方法編寫相應程序,否則必須那樣使用。這也僅對串口有效,像WR\、RD\等你模擬都模擬不成。
之所以贊賞你的想像力,是因為已經有單片機廠商如此做了(單串口還是固定的,因為要ISP下載代碼),C8051F單片機不分管腳是可以重新分配的。

Ⅶ 51單片機中UART通信中的公式中除2是什麼意思

51單片機中UART通信中的公式中除2是又經過2倍分頻了,這要結合串口電路原理就明白了。

閱讀全文

與51單片機uart相關的資料

熱點內容
自己建了伺服器地址 瀏覽:698
命令按鈕的屬性設置 瀏覽:965
證券技術分析pdf 瀏覽:779
linux命令連接oracle 瀏覽:202
墊江停車收費樁怎麼上App 瀏覽:135
好興動app還款怎麼登錄不上去了 瀏覽:665
鄭州雲伺服器託管 瀏覽:722
伺服器地址跟蹤 瀏覽:980
免費google雲伺服器 瀏覽:516
摘譯和編譯的英文 瀏覽:359
熱泵壓縮機選型 瀏覽:121
op手機微信加密如何解除 瀏覽:386
如何在王牌戰爭找到高爆率伺服器 瀏覽:13
江浙小學語文輔導課用什麼APP 瀏覽:99
新夢幻大陸伺服器地址 瀏覽:241
網吧伺服器怎麼更換壁紙 瀏覽:530
linux命令方法 瀏覽:332
linux下載freetype 瀏覽:123
程序員入駐平台 瀏覽:327
程序員大戰外掛 瀏覽:745