這篇文章主要介紹了MCU如何自定義引腳做UART串口,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
成都創(chuàng)新互聯(lián)公司堅(jiān)實(shí)的技術(shù)研發(fā)基礎(chǔ)贏得了行業(yè)內(nèi)的良好口碑,公司成立十載來,為近千家企業(yè)提供過網(wǎng)站建設(shè)、軟件開發(fā)、搜索引擎優(yōu)化技術(shù)、互聯(lián)網(wǎng)大數(shù)據(jù)整合營(yíng)銷服務(wù),多年的技術(shù)服務(wù)成功經(jīng)驗(yàn)、眾多的客戶使我們能懂得更多,做得更好。"讓您的網(wǎng)站跑起來"是我們一直追求的目標(biāo)!
當(dāng)(單片機(jī))芯片自帶的UART端口不夠用時(shí),我們可以考慮利用其它引腳作為UART.
串口RS232的數(shù)據(jù)協(xié)議有兩種,我們以PC與8位/32位單片機(jī)間比較常用的異步模式為例子講解.
單片機(jī)的TXD引腳先發(fā)一個(gè)低電平0給對(duì)方,然后發(fā)送5–8個(gè)位作為數(shù)據(jù),最后發(fā)送1個(gè)位奇偶校驗(yàn)和1個(gè)位高電平1作為停止位.
以下例子為波特率9600bps,1個(gè)開始位,8個(gè)數(shù)據(jù)位,1個(gè)停止位 [10位數(shù)據(jù),無奇偶校驗(yàn)位:9600-8-N-1]
波特率:每秒鐘發(fā)送的字節(jié)位,如果baudrate=9600,也就是說,每發(fā)送1位耗時(shí)1000/9600=104uSec
/************************************** 利用51芯片定時(shí)器中斷模擬串口信息發(fā)送 優(yōu)點(diǎn):可以自定義串口引腳,可以實(shí)現(xiàn)多個(gè)串口 格式: 9600-8-N-1 功能:模擬串口Send *****************************************/ #includechar g_nSendInx=0; char g_nBuff=0; char g_nFlag=0; #define MY_TXD P1_0 //模擬TXD引腳 void Timer0Init(void)//104微秒@11.0592MHz { //1000ms/9600=104.166us //使用這種方案,由于精確性問題,長(zhǎng)時(shí)間傳輸會(huì)偶然出現(xiàn)幾個(gè)誤碼 TMOD &= 0xF0; //設(shè)置定時(shí)器模式 TMOD |= 0x02; //設(shè)置定時(shí)器模式 TL0 = 0xA0; //設(shè)置定時(shí)初值 TH0 = 0xA0; //設(shè)置定時(shí)重載值 TF0 = 0; //清除TF0標(biāo)志 TR0 = 1; //定時(shí)器0開始計(jì)時(shí) ET0=1; EA=1; } /****************************** 自定義串口發(fā)送單字符 ******************************/ void MyUart_Send(char ch){ g_nFlag=0; g_nBuff=ch; TR0=1; while(g_nFlag==0); } /****************************** 自定義串口發(fā)送字符串 ******************************/ void MyUart_String(char* str){ int i=0; while(*(str+i)){ i++; g_nFlag=0; g_nBuff=*(str+i); TR0=1; while(g_nFlag==0); } } /* 定時(shí)器0中斷服務(wù) */ void Timer0_ISP() interrupt 1{ g_nSendInx++;//發(fā)送模擬第幾位 if(g_nSendInx==1) { MY_TXD=0;//起始位拉低 }else if(g_nSendInx==10) //格式: 9600-8-N-1,完整10個(gè)字節(jié) { MY_TXD=1;//停止位拉高 TR0=0; g_nSendInx=0; g_nFlag=1;///發(fā)送完成標(biāo)志位 }else{ MY_TXD=g_nBuff&0x01;////sbuffer_data g_nBuff>>=1; } } /********************************** 用Timer0定時(shí)中斷模擬串口信號(hào) **********************************/ void main (void) { Timer0Init();///定時(shí)器初始化,周期為 1000ms/9600=104us MyUart_String("===Welcome,My Uart===\r\n "); MyUart_Send(0x61); MyUart_Send(0x62); MyUart_Send(0x63); while (1); }
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“MCU如何自定義引腳做UART串口”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!