標題: 基于STCSTC15F2K60S2單片機的串口通訊 [打印本頁]
作者: lzj23642008 時間: 2018-12-18 16:47
標題: 基于STCSTC15F2K60S2單片機的串口通訊
第一章 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;
}
}
作者: 最美不過初 時間: 2019-11-8 16:32
u8 TX1_Cnt;出現錯誤是什么原因
作者: 田裕中 時間: 2019-12-6 16:47
我也一樣的,改為char試試
歡迎光臨 (http://www.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
五月天婷婷综合
|
在线看黄免费
|
亚洲高清一区二区三区
|
在线91
|
五月天天丁香婷婷在线中
|
国产精品免费播放
|
亚洲精品不卡
|
成人国产精品入口免费视频
|
一区二区视频在线
|
美女视频一区二区三区
|
久久成人免费视频
|
欧美视频网
|
91亚洲精华国产
|
成人免费视频
|
欧美精品一区二区三区四区 在线
|
久久午夜精品
|
欧美视频成人
|
亚洲精品久久久久久国产精华液
|
欧美日本韩国一区二区
|
色999日韩
|
在线成人
|
欧美成人一区二区
|
亚洲精品成人av久久
|
日韩在线视频一区
|
久久精品91久久久久久再现
|
国产精品美女久久久久久久久久久
|
成人自拍视频
|
久久久久久av
|
国产精品一区二区三区在线播放
|
久久99深爱久久99精品
|
成人欧美一区二区三区在线播放
|
欧美极品视频
|
毛片a区
|
精久久久|
久久久高清
|
国产99热精品
|
91av在线不卡
|
天天色综
|
亚洲国产视频一区
|
亚洲一区免费
|
黄色一级在线播放
|