第一章 STCSTC15F2K60S2的簡介
1.1 STC15F2K60S的各引腳簡介(1)電源引腳 Vcc:一般接電源的+5V。具體的電壓幅度應參考單片機的手冊。 GND:接電源地。 (2)外接晶體引腳 芯片內部一個反相放大器的輸入端和輸出端。通常用于連接晶體振蕩器。 (3)控制和復位引腳 功能:當訪問外部存儲器或者外部擴展的并行I/O口時,ALE(允許地址鎖 存)的輸出用于鎖存地址的低位字節。 RST(與P5.4復用):當振蕩器運行時,在此引腳上出現兩個機器周期的 高電平將使單片機復位。如果需要單片機接上電源就可以復位,則需要使 用上電復位電路。 (4)I/O口的復用功能 P0口: a.用作數據總線(D7~D0)或者地址總線低8位(A7~A0)。 b.用作普通I/O。 P1口: a.用作普通I/O。 b.復用為ADC轉換輸入、捕獲/比較/脈寬調制、SPI通信線、第二串口 或者第二時鐘輸出,如表所示。 P2口: a:用作通用I/O。 b:用作地址總線的高8位輸出。 c:用于SPI和捕獲/比較/脈寬調制的備用切換端口。 P3口: a:用作通用I/O。 b:可復用為外部中斷輸入、計數器輸入、時鐘輸出、第一串口和外部總 線的讀/寫控制,如表所示。 P4口: a:用作通用I/O。 b:某些口線具有復用功能,可配置為SPI通信線、捕捉/比較/脈寬調 制、第二串口線等。 P5口: a:P5.4/RST(復位腳)/MCLKO(內部R/C振蕩時鐘輸出; b:輸出的頻率可為MCLK/1或MCLK/2)/SS_3(SPI接口的從機選擇信 號備用切換引腳)。 c:該引腳默認為I/O口,可以通過ISP編程將其設置為RST(復位) 引腳。 第二章 單片機通過USB與PC機的通信設計
2.1設計方案選擇 由于實際應用中單片機在數據處理能力、人機交互等方面往往不能滿足要求, 因而通常用PC來彌補單片機的這些不足。例如,在工程應用中,常常由一臺PC機和一臺單片機構成主從式計算機測控系統。在這樣的系統中,以單片機為核心的智能測控儀表(從機)作為現場測控設備,完成數據的采集、處理和控制各種任務,同時將數據傳給PC機(主機),PC機將這些數據加工處理后,進行顯示、打印報表等。PC機也可以將各種控制命令傳送給單片機,干預單片機系統的運行,從而發揮PC機的優勢。要實現這樣的功能,就涉及到PC機與單片機之間的通信問題。現在的計算機提供了各種各樣的串口,他們支持不同的通信協議,有著不同的功能。目前計算機提供的串口有RS-232,RJ45,USB2.0等。 2.1.1 PC機同單片機通信存在的問題目前,15系列單片機同PC機的通信在大多數情況下仍然是使用RS-232(DB-9)串口作為通信接口實現的。而隨著USB接口技術的成熟和使用的普及,由于USB接口有著一系列RS-232(DB-9)串口無法比擬的優點,RS-232(DB-9)串口正在逐步的為USB接口所替代。而在現在的大多數筆記本電腦中,出于節省物理空間和用處不大等原因,RS-232(DB-9)串口已不再設置,這就約束了基于RS-232(DB-9)串口與PC機聯絡的單片機設備的使用范圍。 2.1.2 USB接口同RS-232(DB-9)串口的比較 通過USB接口和RS-232(DB-9)的比較,不難發現: (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)串口的趨勢不可逆轉。 2.1.3 USB轉接芯片的選擇 目前常用的USB轉接芯片包括PL2303,CH341,CP2101,FT232等。在綜合考慮了各方面因素后,CH341成為了本次電路設計的首選芯片。CH341是南京沁恒電子公司生產的USB總線的轉接芯片,通過USB總線提供異步串口,打印口,并口及常用的2線和4線等同步串行端口。其特點有: (1)提供全速USB設備借口,兼容USB2.0,外圍設備只需要晶體和電容; (2)可通過外部的低成本串行EPROM定義廠商ID,產品ID,序列號等; (3)成本低廉,可直接轉換原串口外圍設備; (4)采用SOP-28封裝,串口應用還提供小型的SSOP-20封裝。正是由于在PC機同單片機通信電路中,USB轉接芯片CH341 具有以上其他芯片無法比擬的優點,同時價格低廉并且提供中文技術支持,因此它成為了本電路USB轉接芯片的最優選擇。本電路采用的是SSOP-20封裝的CH341T。 2.2 通信功能要求(1)PC控制單片機IO口輸出,并且通過兩個LED燈顯示數據發收狀態,如果數據處于發送或者接收狀態,則相應的LED燈閃亮。 (2)PC控制單片機IO口輸出,并且通過兩個按鍵控制PC機是否接收數據。 (3)PC機與單片機之間的通信結果通過串口助手進行調試和顯示。第四章 程序設計 2.3 串口初始化 voidUartInit(void) //115200bps@22.1184MHz { SCON= 0x50; //8位數據可變波特率 AUXR|= 0x40; //定時器1時鐘為Fosc,即1T AUXR&= 0xFE; //串口1選擇定時器1為波特率發射生器 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發送一個字符串 while(1) { if(INT0==0) //如果相應按鍵(默認為sw18)按下,則允許接收 {REN=0;} if((TX1_Cnt != RX1_Cnt) &&(!B_TX1_Busy)) //收到數據, 發送空閑 { SBUF= RX1_Buffer[TX1_Cnt]; //把收到的數據遠樣返回 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) //如果產生中斷,則把SBUF內容賦值給單片機的數組 { 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 總程序 /************* 功能說明 ************** 雙串口全雙工中斷方式收發通訊程序。 通過PC向MCU發送數據, MCU收到后通過串口把收到的數據原樣返回. ******************************************/ #define MAIN_Fosc 22118400L //定義主時鐘 #include "STC15Fxxxx.H" #define Baudrate1 115200L #define UART1_BUF_LENGTH 200 u8 TX1_Cnt; //發送計數 u8 RX1_Cnt; //接收計數 bit B_TX1_Busy; //發送忙標志 u8 idataRX1_Buffer[UART1_BUF_LENGTH]; //接收緩沖 void UartInit(void) //115200bps@22.1184MHz { SCON= 0x50; //8位數據可變波特率 AUXR|= 0x40; //定時器1時鐘為Fosc,即1T AUXR&= 0xFE; //串口1選擇定時器1為波特率發射生器 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發送一個字符串 while(1) { if(INT0==0) {REN=0;} if((TX1_Cnt != RX1_Cnt) &&(!B_TX1_Busy)) //收到數據, 發送空閑 { SBUF= RX1_Buffer[TX1_Cnt]; //把收到的數據遠樣返回 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; } }
|