最近開發(fā)一個項(xiàng)目,想用STC15系列來作為控制芯片,,主要看中它的功能還比較豐富,,尤其是有四個串口資源,,在8位單片機(jī)中算是少有,,但是開發(fā)起來就發(fā)現(xiàn)官方提供的庫里面只提供了兩個串口的庫函數(shù),,官方提供的庫函數(shù)的使用相對復(fù)雜(要先用結(jié)構(gòu)填一堆參數(shù)),,本人讀了下代碼還有一些隱患,。 相比現(xiàn)在比較火熱的Arduino,51系列單片機(jī)的易用性差了好大的一截,,宏晶的老大應(yīng)該在開發(fā)易用方面下點(diǎn)功夫,。 能給開發(fā)者提供一個傻瓜式的調(diào)用函數(shù)是最好的,串口用到現(xiàn)在,,其實(shí)參數(shù)基本固定了,。 常用的協(xié)議就是8數(shù)據(jù)位,1停止位,,無校驗(yàn)位,,常用的波特率考慮兩個就夠了,一個是9600,,一個是115200,。 基于使用最方便的考慮,本人寫了一個調(diào)用相對簡單的庫,,供大家參考,。 本文中的函數(shù)庫寫采用的是同步方式,每次都是等待發(fā)送完畢后才返回;讀則取采用異步,,如果沒有數(shù)據(jù)則返回-1,; 好了,開發(fā)者最好的語言是代碼,,下面就貼代碼 首先是xyusart.h文件,,引用了stc官方庫的config.h文件,文件內(nèi)容如下 //STC15WxxxxS4 系列4串口使用函數(shù)庫 文件中注釋已經(jīng)把用法寫得相當(dāng)清楚,比如S1_init(BAUD9600)代表初始化串口1,,8數(shù)據(jù)位,,1停止位,無校驗(yàn)位,,波特率9600,; 然后是xyusart.c文件 //STC15WxxxxS4 系列4串口使用函數(shù)庫 //開發(fā)者,北京創(chuàng)世星辰機(jī)器人科技,,星辰李 //本程序遵循GPL協(xié)議,,轉(zhuǎn)載請保留注釋和出處 //2016.1.5 #include 'xyusart.h' #define S3RI 0x01 //S3CON.0 #define S3TI 0x02 //S3CON.1 #define S2RI 0x01 //S2CON.0 #define S2TI 0x02 //S2CON.1 #define S4RI 0x01 //S4CON.0 #define S4TI 0x02 //S4CON.1 void S1_init(u8 baud){ //初始化串口1 P3.0->RXD P3.1->TXD u32 baudrate; if (baud) baudrate=115200; else baudrate=9600; SCON = 0x50; AUXR |= 0x40; AUXR &= ~0x01; TMOD = 0x00; TL1 = (65536 - (MAIN_Fosc/4/baudrate)); TH1 = (65536 - (MAIN_Fosc/4/baudrate))>>8; TR1 = 1; ES = 1; EA = 1; } void S2_init(u8 baud){ //初始化串口2 P1.0->RXD2 P1.1->TXD2 u32 baudrate; if (baud) baudrate=115200; else baudrate=9600; S2CON = 0x50; //8-bit variable UART T2L = (65536 - (MAIN_Fosc/4/baudrate)); T2H = (65536 - (MAIN_Fosc/4/baudrate))>>8; AUXR &= ~(1<<3); AUXR |= (1<<2); AUXR |= (1<<4); // AUXR |= 0x14; IE2 |= 0x01; EA = 1; } void S3_init(u8 baud){ //初始化串口3 P0.0->RXD3 P0.1->TXD3 u32 baudrate; if (baud) baudrate=115200; else baudrate=9600; S3CON = 0x50; T3L = (65536 - (MAIN_Fosc/4/baudrate)); T3H = (65536 - (MAIN_Fosc/4/baudrate))>>8; T4T3M |= 0x02; T4T3M |= 0x08; IE2 |= 0x08; EA = 1; } void S4_init(u8 baud){ //初始化串口4 P0.2->RXD4 P0.3->TXD4 u32 baudrate; if (baud) baudrate=115200; else baudrate=9600; S4CON = 0x50; T4L = (65536 - (MAIN_Fosc/4/baudrate)); T4H = (65536 - (MAIN_Fosc/4/baudrate))>>8; T4T3M |= 0x20; T4T3M |= 0x80; IE2 |= 0x10; EA = 1; } void S1_send(u8 c){//串口1發(fā)送一個字節(jié) SBUF = c; while (!TI); TI = 0; return ; } void S2_send(u8 c){ //串口2發(fā)送一個字節(jié) S2BUF = c; while (!(S2CON & S2TI)); S2CON &= ~S2TI; return ; } void S3_send(u8 c){ //串口3發(fā)送一個字節(jié) S3BUF = c; while (!(S3CON & S3TI)); S3CON &= ~S3TI; return ; } void S4_send(u8 c){ //串口4發(fā)送一個字節(jié) S4BUF = c; while (!(S4CON & S4TI)); S4CON &= ~S4TI; return ; } short S1_read(){ //串口1,,讀一個字節(jié) ,返回>0表示成功讀取數(shù)據(jù),,返回-1表示沒有讀到數(shù)據(jù),,數(shù)據(jù)放在c中 short c; if (RI) { c=SBUF; RI=0; } else c=-1; return c; } short S2_read(){ //串口2,讀一個字節(jié) ,,返回>0表示成功讀取數(shù)據(jù),,返回-1表示沒有讀到數(shù)據(jù),數(shù)據(jù)放在c中 short c; if (S2CON & S2RI) { c = S2BUF; S2CON &= ~S2RI; } else c = -1; return c; } short S3_read(){ //串口3,,讀一個字節(jié) ,,返回>0表示成功讀取數(shù)據(jù),返回-1表示沒有讀到數(shù)據(jù),,數(shù)據(jù)放在c中 short c; if (S3CON & S3RI) { c = S3BUF; S3CON &= ~S3RI; } else c = -1; return c ; } short S4_read(){ //串口4,,讀一個字節(jié) ,返回>0表示成功讀取數(shù)據(jù),,返回-1表示沒有讀到數(shù)據(jù),,數(shù)據(jù)放在c中 short c; if (S4CON & S4RI) { c = S4BUF; S4CON &= ~S4RI; } else c = -1; return c ; } 使用例子: #include 'xyusart.h' #incoude 'config.h' //來自于stc15的庫函數(shù) void main() { short c; unsigned char d; S1_init(BAUD9600); while(1){ c=S1_read(); //讀取串口1 if (c>=0){ //將讀到的字節(jié)回送串口1 d= c & 0xff; S1_send(d); } } } 本次寫的庫函數(shù)是查詢讀和同步寫的方式,不夠完善,,有空的話,,把它完善成中斷方式,并帶讀寫緩沖的庫,。 |
|