最近開發一個項目,想用STC15系列來作為控制芯片,主要看中它的功能還比較豐富,尤其是有四個串口資源,在8位單片機中算是少有,但是開發起來就發現官方提供的庫里面只提供了兩個串口的庫函數,官方提供的庫函數的使用相對復雜(要先用結構填一堆參數),本人讀了下代碼還有一些隱患。
相比現在比較火熱的Arduino,51系列單片機的易用性差了好大的一截,宏晶的老大應該在開發易用方面下點功夫。 能給開發者提供一個傻瓜式的調用函數是最好的,串口用到現在,其實參數基本固定了。 常用的協議就是8數據位,1停止位,無校驗位,常用的波特率考慮兩個就夠了,一個是9600,一個是115200。 基于使用最方便的考慮,本人寫了一個調用相對簡單的庫,供大家參考。 本文中的函數庫寫采用的是同步方式,每次都是等待發送完畢后才返回;讀則取采用異步,如果沒有數據則返回-1; 好了,開發者最好的語言是代碼,下面就貼代碼 首先是xyusart.h文件,引用了stc官方庫的config.h文件,文件內容如下
//STC15WxxxxS4 系列4串口使用函數庫
//開發者,北京創世星辰機器人科技,星辰李
//本程序遵循GPL協議,轉載請保留注釋和出處
//2016.1.5
#ifndef __XYUSART_H
#define __XYUSART_H
#include "config.h"
#define BAUD9600 0 //波特率9600
#define BAUD115200 1 //波特率115200
//只有一種模式8位數據位,1位停止位,無奇偶校驗,只有兩種傳輸速率9600和115200,簡化調用者的使用,引腳都使用默認引腳
void S1_init(u8 baud); //初始化串口1 P3.0->RXDP3.1->TXD
void S2_init(u8 baud); //初始化串口2 P1.0->RXD2P1.1->TXD2
void S3_init(u8 baud); //初始化串口3 P0.0->RXD3P0.1->TXD3
void S4_init(u8 baud); //初始化串口4 P0.2->RXD4P0.3->TXD4
void S1_send(u8 c); //串口1發送一個字節
void S2_send(u8 c); //串口2發送一個字節
void S3_send(u8 c); //串口3發送一個字節
void S4_send(u8 c); //串口4發送一個字節
short S1_read(); //串口1,讀一個字節,返回>0表示成功讀取數據,返回-1表示沒有讀到數據,數據放在c中
short S2_read(); //串口2,讀一個字節,返回>0表示成功讀取數據,返回-1表示沒有讀到數據,數據放在c中
short S3_read(); //串口3,讀一個字節,返回>0表示成功讀取數據,返回-1表示沒有讀到數據,數據放在c中
short S4_read(); //串口4,讀一個字節,返回>0表示成功讀取數據,返回-1表示沒有讀到數據,數據放在c中
#endif
文件中注釋已經把用法寫得相當清楚,比如S1_init(BAUD9600)代表初始化串口1,8數據位,1停止位,無校驗位,波特率9600; 然后是xyusart.c文件
//STC15WxxxxS4系列4串口使用函數庫
//開發者,北京創世星辰機器人科技,星辰李
//本程序遵循GPL協議,轉載請保留注釋和出處
//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->RXDP3.1->TXD
u32baudrate;
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->RXD2P1.1->TXD2
u32baudrate;
if (baud)
baudrate=115200;
else
baudrate=9600;
S2CON = 0x50; //8-bit variableUART
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->RXD3P0.1->TXD3
u32baudrate;
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->RXD4P0.3->TXD4
u32baudrate;
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發送一個字節
SBUF = c;
while (!TI);
TI = 0;
return ;
}
void S2_send(u8 c){ //串口2發送一個字節
S2BUF = c;
while (!(S2CON &S2TI));
S2CON &= ~S2TI;
return ;
}
void S3_send(u8 c){ //串口3發送一個字節
S3BUF = c;
while (!(S3CON &S3TI));
S3CON &= ~S3TI;
return ;
}
void S4_send(u8 c){ //串口4發送一個字節
S4BUF = c;
while (!(S4CON &S4TI));
S4CON &= ~S4TI;
return ;
}
short S1_read(){ //串口1,讀一個字節,返回>0表示成功讀取數據,返回-1表示沒有讀到數據,數據放在c中
short c;
if (RI)
{
c=SBUF;
RI=0;
}
else
c=-1;
return c;
}
short S2_read(){ //串口2,讀一個字節,返回>0表示成功讀取數據,返回-1表示沒有讀到數據,數據放在c中
short c;
if (S2CON & S2RI)
{
c =S2BUF;
S2CON&= ~S2RI;
}
else
c =-1;
return c;
}
short S3_read(){ //串口3,讀一個字節,返回>0表示成功讀取數據,返回-1表示沒有讀到數據,數據放在c中
short c;
if (S3CON & S3RI)
{
c =S3BUF;
S3CON&= ~S3RI;
}
else
c =-1;
return c ;
}
short S4_read(){ //串口4,讀一個字節,返回>0表示成功讀取數據,返回-1表示沒有讀到數據,數據放在c中
short c;
if (S4CON & S4RI)
{
c =S4BUF;
S4CON&= ~S4RI;
}
else
c =-1;
return c ;
}
使用例子:
#include "xyusart.h" #incoude "config.h" //來自于stc15的庫函數
void main() { short c; unsigned char d; S1_init(BAUD9600); while(1){ c=S1_read(); //讀取串口1 if (c>=0){ //將讀到的字節回送串口1 d= c & 0xff; S1_send(d); } } } 本次寫的庫函數是查詢讀和同步寫的方式,不夠完善,有空的話,把它完善成中斷方式,并帶讀寫緩沖的庫。
|