找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11480|回復: 2
打印 上一主題 下一主題
收起左側(cè)

基于STCSTC15F2K60S2單片機的串口通訊

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:444712 發(fā)表于 2018-12-18 16:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
第一章 STCSTC15F2K60S2的簡介
1.1 STC15F2K60S的各引腳簡介
(1)電源引腳
   Vcc:一般接電源的+5V。具體的電壓幅度應參考單片機的手冊。
   GND:接電源地。
(2)外接晶體引腳
                        
     芯片內(nèi)部一個反相放大器的輸入端和輸出端。通常用于連接晶體振蕩器。
(3)控制和復位引腳
                        
     功能:當訪問外部存儲器或者外部擴展的并行I/O口時,ALE(允許地址鎖
     存)的輸出用于鎖存地址的低位字節(jié)。
    RST(與P5.4復用):當振蕩器運行時,在此引腳上出現(xiàn)兩個機器周期的
     高電平將使單片機復位。如果需要單片機接上電源就可以復位,則需要使
     用上電復位電路。
(4)I/O口的復用功能   
    P0口:
       a.用作數(shù)據(jù)總線(D7~D0)或者地址總線低8位(A7~A0)。
      b.用作普通I/O。   
    P1口:
      a.用作普通I/O。
      b.復用為ADC轉(zhuǎn)換輸入、捕獲/比較/脈寬調(diào)制、SPI通信線、第二串口
        或者第二時鐘輸出,如表所示。
      
      P2口:
       a:用作通用I/O。
       b:用作地址總線的高8位輸出。
       c:用于SPI和捕獲/比較/脈寬調(diào)制的備用切換端口。
     
     P3口:
       a:用作通用I/O。
       b:可復用為外部中斷輸入、計數(shù)器輸入、時鐘輸出、第一串口和外部總
         線的讀/寫控制,如表所示。
            
      P4口:
        a:用作通用I/O。
        b:某些口線具有復用功能,可配置為SPI通信線、捕捉/比較/脈寬調(diào)
           制、第二串口線等。
         
       P5口:
         a:P5.4/RST(復位腳)/MCLKO(內(nèi)部R/C振蕩時鐘輸出;
         b:輸出的頻率可為MCLK/1或MCLK/2)/SS_3(SPI接口的從機選擇信
           號備用切換引腳)。
         c:該引腳默認為I/O口,可以通過ISP編程將其設置為RST(復位)
           引腳。
第二章 單片機通過USB與PC機的通信設計
2.1設計方案選擇
由于實際應用中單片機在數(shù)據(jù)處理能力、人機交互等方面往往不能滿足要求, 因而通常用PC來彌補單片機的這些不足。例如,在工程應用中,常常由一臺PC機和一臺單片機構(gòu)成主從式計算機測控系統(tǒng)。在這樣的系統(tǒng)中,以單片機為核心的智能測控儀表(從機)作為現(xiàn)場測控設備,完成數(shù)據(jù)的采集、處理和控制各種任務,同時將數(shù)據(jù)傳給PC機(主機),PC機將這些數(shù)據(jù)加工處理后,進行顯示、打印報表等。PC機也可以將各種控制命令傳送給單片機,干預單片機系統(tǒng)的運行,從而發(fā)揮PC機的優(yōu)勢。要實現(xiàn)這樣的功能,就涉及到PC機與單片機之間的通信問題,F(xiàn)在的計算機提供了各種各樣的串口,他們支持不同的通信協(xié)議,有著不同的功能。目前計算機提供的串口有RS-232,RJ45,USB2.0等。
   2.1.1 PC機同單片機通信存在的問題
目前,15系列單片機同PC機的通信在大多數(shù)情況下仍然是使用RS-232(DB-9)串口作為通信接口實現(xiàn)的。而隨著USB接口技術(shù)的成熟和使用的普及,由于USB接口有著一系列RS-232(DB-9)串口無法比擬的優(yōu)點,RS-232(DB-9)串口正在逐步的為USB接口所替代。而在現(xiàn)在的大多數(shù)筆記本電腦中,出于節(jié)省物理空間和用處不大等原因,RS-232(DB-9)串口已不再設置,這就約束了基于RS-232(DB-9)串口與PC機聯(lián)絡的單片機設備的使用范圍。
   2.1.2 USB接口同RS-232(DB-9)串口的比較
      通過USB接口和RS-232(DB-9)的比較,不難發(fā)現(xiàn):
(1)USB接口支持即插即用和熱插拔,而RS-232(DB-9)串口不支持即插即  
     用和熱插拔,設備安裝后需重啟計算機方可使用。
(2)USB接口的傳輸速率較快,可達480Mbps(V2.0),而RS-232(DB-9)串
     口的最高速率僅為19200波特。
(3)USB接口占用體積較小,插拔方便;而RS-232(DB-9)串口的的插拔需
     要使用改錐,且在機箱后操作,比較麻煩。
     綜上可知,USB 接口取代RS-232(DB-9)串口的趨勢不可逆轉(zhuǎn)。
   2.1.3 USB轉(zhuǎn)接芯片的選擇
   目前常用的USB轉(zhuǎn)接芯片包括PL2303,CH341,CP2101,F(xiàn)T232等。在綜合考慮了各方面因素后,CH341成為了本次電路設計的首選芯片。CH341是南京沁恒電子公司生產(chǎn)的USB總線的轉(zhuǎn)接芯片,通過USB總線提供異步串口,打印口,并口及常用的2線和4線等同步串行端口。其特點有:
(1)提供全速USB設備借口,兼容USB2.0,外圍設備只需要晶體和電容;
(2)可通過外部的低成本串行EPROM定義廠商ID,產(chǎn)品ID,序列號等;
(3)成本低廉,可直接轉(zhuǎn)換原串口外圍設備;
(4)采用SOP-28封裝,串口應用還提供小型的SSOP-20封裝。正是由于在PC機同單片機通信電路中,USB轉(zhuǎn)接芯片CH341 具有以上其他芯片無法比擬的優(yōu)點,同時價格低廉并且提供中文技術(shù)支持,因此它成為了本電路USB轉(zhuǎn)接芯片的最優(yōu)選擇。本電路采用的是SSOP-20封裝的CH341T。            
2.2 通信功能要求
(1)PC控制單片機IO口輸出,并且通過兩個LED燈顯示數(shù)據(jù)發(fā)收狀態(tài),如果數(shù)據(jù)處于發(fā)送或者接收狀態(tài),則相應的LED燈閃亮。
(2)PC控制單片機IO口輸出,并且通過兩個按鍵控制PC機是否接收數(shù)據(jù)。
(3)PC機與單片機之間的通信結(jié)果通過串口助手進行調(diào)試和顯示。第四章 程序設計
2.3 串口初始化
    voidUartInit(void)      //115200bps@22.1184MHz
{
    SCON= 0x50;      //8位數(shù)據(jù)可變波特率
    AUXR|= 0x40;     //定時器1時鐘為Fosc,即1T
    AUXR&= 0xFE;     //串口1選擇定時器1為波特率發(fā)射生器
    TMOD&= 0x0F;     //設置定時器1為16位自動重裝方式
    TL1= 0xD0;       //設定定時初值
    TH1= 0xFF;       //設定定時初值
    ET1= 0;       //禁止定時器1中斷
    TR1= 1;       //啟動定時器1
}
2.4 主程序
voidmain(void)
{
    P0M1= 0;  P0M0 = 0;  //設置為準雙向口
    P1M1= 0;  P1M0 = 0;  //設置為準雙向口
    P2M1= 0;  P2M0 = 0;  //設置為準雙向口
    P3M1= 0;  P3M0 = 0;  //設置為準雙向口
    P4M1= 0;  P4M0 = 0;  //設置為準雙向口
    P5M1= 0;  P5M0 = 0;  //設置為準雙向口
    P6M1= 0;  P6M0 = 0;  //設置為準雙向口
    P7M1= 0;  P7M0 = 0;  //設置為準雙向口
UartInit()     ;      
    //UART1_config(1);   // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
    EA= 1;    //允許總中斷
    ES=1; //開串口中斷
    PrintString1("STC15F2K60S2UART1 Test Prgramme!\r\n");  //SUART1發(fā)送一個字符串
    while(1)
    {   if(INT0==0)    //如果相應按鍵(默認為sw18)按下,則允許接收
       {REN=0;}
        if((TX1_Cnt != RX1_Cnt) &&(!B_TX1_Busy)) //收到數(shù)據(jù), 發(fā)送空閑
        {
            SBUF= RX1_Buffer[TX1_Cnt];     //把收到的數(shù)據(jù)遠樣返回
            B_TX1_Busy= 1;
            if(++TX1_Cnt>= UART1_BUF_LENGTH)  TX1_Cnt = 0;
        }
    else{if(INT1==0)    //如果相應按鍵(默認為sw17)按下,則禁止接收
        {REN=1;}}
    }
}
2.5 中斷服務程序
    voidUART1_int (void) interrupt 4//中斷服務子程序
{
    if(RI)   //如果產(chǎn)生中斷,則把SBUF內(nèi)容賦值給單片機的數(shù)組
    {   
           RI= 0;
          RX1_Buffer[RX1_Cnt] = SBUF;
          if(++RX1_Cnt >= UART1_BUF_LENGTH)   
          RX1_Cnt = 0;    //防溢出
       }   
    if(TI)
    {
        TI = 0;
        B_TX1_Busy = 0;
    }
}

3.0 總程序
    /*************   功能說明   **************
雙串口全雙工中斷方式收發(fā)通訊程序。
通過PC向MCU發(fā)送數(shù)據(jù), MCU收到后通過串口把收到的數(shù)據(jù)原樣返回.
******************************************/
#define    MAIN_Fosc          22118400L  //定義主時鐘
#include   "STC15Fxxxx.H"
#define        Baudrate1          115200L
#define        UART1_BUF_LENGTH  200
u8  TX1_Cnt;   //發(fā)送計數(shù)
u8  RX1_Cnt;   //接收計數(shù)
bit B_TX1_Busy;   //發(fā)送忙標志
u8  idataRX1_Buffer[UART1_BUF_LENGTH];    //接收緩沖
void UartInit(void)      //115200bps@22.1184MHz
{
    SCON= 0x50;      //8位數(shù)據(jù)可變波特率
    AUXR|= 0x40;     //定時器1時鐘為Fosc,即1T
    AUXR&= 0xFE;     //串口1選擇定時器1為波特率發(fā)射生器
    TMOD&= 0x0F;     //設置定時器1為16位自動重裝方式
    TL1= 0xD0;       //設定定時初值
    TH1= 0xFF;       //設定定時初值
    ET1= 0;       //禁止定時器1中斷
    TR1= 1;       //啟動定時器1
}
void main(void)
{
    P0M1= 0;  P0M0 = 0;  //設置為準雙向口
    P1M1= 0;  P1M0 = 0;  //設置為準雙向口
    P2M1= 0;  P2M0 = 0;  //設置為準雙向口
    P3M1= 0;  P3M0 = 0;  //設置為準雙向口
    P4M1= 0;  P4M0 = 0;  //設置為準雙向口
    P5M1= 0;  P5M0 = 0;  //設置為準雙向口
    P6M1= 0;  P6M0 = 0;  //設置為準雙向口
    P7M1= 0;  P7M0 = 0;  //設置為準雙向口
UartInit()     ;      
    //UART1_config(1);   // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
    EA= 1;    //允許總中斷
    ES=1; //開串口中斷
    PrintString1("STC15F2K60S2UART1 Test Prgramme!\r\n");  //SUART1發(fā)送一個字符串
    while(1)
    {   if(INT0==0)
       {REN=0;}
        if((TX1_Cnt != RX1_Cnt) &&(!B_TX1_Busy)) //收到數(shù)據(jù), 發(fā)送空閑
        {
            SBUF= RX1_Buffer[TX1_Cnt];     //把收到的數(shù)據(jù)遠樣返回
            B_TX1_Busy= 1;
            if(++TX1_Cnt>= UART1_BUF_LENGTH)  TX1_Cnt = 0;
        }
    else{if(INT1==0)
        {REN=1;}}
    }
}
void UART1_int (void) interrupt 4//中斷服務子程序
{
    if(RI)
    {   
           RI= 0;
          RX1_Buffer[RX1_Cnt] = SBUF;
          if(++RX1_Cnt >= UART1_BUF_LENGTH)   
          RX1_Cnt = 0;    //防溢出
       }   
    if(TI)
    {
        TI = 0;
        B_TX1_Busy = 0;
    }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:555092 發(fā)表于 2019-11-8 16:32 | 只看該作者
u8  TX1_Cnt;出現(xiàn)錯誤是什么原因
回復

使用道具 舉報

板凳
ID:394949 發(fā)表于 2019-12-6 16:47 | 只看該作者
我也一樣的,改為char試試
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表