溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MCU如何自定義引腳做UART串口

發(fā)布時間:2021-12-24 17:27:14 來源:億速云 閱讀:519 作者:小新 欄目:互聯(lián)網科技

這篇文章主要介紹了MCU如何自定義引腳做UART串口,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

    當(單片機)芯片自帶的UART端口不夠用時,我們可以考慮利用其它引腳作為UART.

    串口RS232的數(shù)據(jù)協(xié)議有兩種,我們以PC與8位/32位單片機間比較常用的異步模式為例子講解. 
單片機的TXD引腳先發(fā)一個低電平0給對方,然后發(fā)送5–8個位作為數(shù)據(jù),最后發(fā)送1個位奇偶校驗和1個位高電平1作為停止位. 
以下例子為波特率9600bps,1個開始位,8個數(shù)據(jù)位,1個停止位 [10位數(shù)據(jù),無奇偶校驗位:9600-8-N-1] 
波特率:每秒鐘發(fā)送的字節(jié)位,如果baudrate=9600,也就是說,每發(fā)送1位耗時1000/9600=104uSec

/**************************************
   利用51芯片定時器中斷模擬串口信息發(fā)送
   優(yōu)點:可以自定義串口引腳,可以實現(xiàn)多個串口
   格式: 9600-8-N-1
   功能:模擬串口Send
*****************************************/
#include <REG52.H>         

char   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
 //使用這種方案,由于精確性問題,長時間傳輸會偶然出現(xiàn)幾個誤碼
    TMOD &= 0xF0;       //設置定時器模式
    TMOD |= 0x02;       //設置定時器模式
    TL0 = 0xA0;     //設置定時初值
    TH0 = 0xA0;     //設置定時重載值
    TF0 = 0;        //清除TF0標志
    TR0 = 1;        //定時器0開始計時

    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);
  }
}


/*
   定時器0中斷服務
*/
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個字節(jié)
  {
     MY_TXD=1;//停止位拉高
     TR0=0;
     g_nSendInx=0;
     g_nFlag=1;///發(fā)送完成標志位
  }else{

    MY_TXD=g_nBuff&0x01;////sbuffer_data
    g_nBuff>>=1;
  }


}

/**********************************
  用Timer0定時中斷模擬串口信號
**********************************/
void main (void) {

   Timer0Init();///定時器初始化,周期為 1000ms/9600=104us

   MyUart_String("===Welcome,My Uart===\r\n ");
   MyUart_Send(0x61);
   MyUart_Send(0x62);
   MyUart_Send(0x63);

  while (1);

 }

感謝你能夠認真閱讀完這篇文章,希望小編分享的“MCU如何自定義引腳做UART串口”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業(yè)資訊頻道,更多相關知識等著你來學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI