久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

STC15系列4個串口的使用庫函數(shù)

 夢想永遠(yuǎn)堅(jiān)持 2018-01-07

最近開發(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ù)庫
//開發(fā)者,,北京創(chuàng)世星辰機(jī)器人科技,,星辰李
//本程序遵循GPL協(xié)議,轉(zhuǎn)載請保留注釋和出處
//2016.1.5
#ifndef __XYUSART_H
#define __XYUSART_H  


#include 'config.h'
#define BAUD9600   0   //波特率9600
#define BAUD115200 1   //波特率115200
//只有一種模式8位數(shù)據(jù)位,,1位停止位,,無奇偶校驗(yàn),只有兩種傳輸速率9600和115200,簡化調(diào)用者的使用,,引腳都使用默認(rèn)引腳
void S1_init(u8 baud); //初始化串口1  P3.0->RXD P3.1->TXD
void S2_init(u8 baud); //初始化串口2  P1.0->RXD2 P1.1->TXD2
void S3_init(u8 baud); //初始化串口3  P0.0->RXD3 P0.1->TXD3
void S4_init(u8 baud); //初始化串口4  P0.2->RXD4 P0.3->TXD4

void S1_send(u8 c); //串口1發(fā)送一個字節(jié)
void S2_send(u8 c); //串口2發(fā)送一個字節(jié)
void S3_send(u8 c); //串口3發(fā)送一個字節(jié)
void S4_send(u8 c); //串口4發(fā)送一個字節(jié)

short  S1_read();  //串口1,,讀一個字節(jié) ,返回>0表示成功讀取數(shù)據(jù),,返回-1表示沒有讀到數(shù)據(jù),,數(shù)據(jù)放在c中
short  S2_read();  //串口2,讀一個字節(jié) ,,返回>0表示成功讀取數(shù)據(jù),,返回-1表示沒有讀到數(shù)據(jù),數(shù)據(jù)放在c中
short  S3_read();  //串口3,,讀一個字節(jié) ,,返回>0表示成功讀取數(shù)據(jù),返回-1表示沒有讀到數(shù)據(jù),,數(shù)據(jù)放在c中
short  S4_read();  //串口4,,讀一個字節(jié) ,返回>0表示成功讀取數(shù)據(jù),,返回-1表示沒有讀到數(shù)據(jù),,數(shù)據(jù)放在c中
#endif


文件中注釋已經(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ù)是查詢讀和同步寫的方式,不夠完善,,有空的話,,把它完善成中斷方式,并帶讀寫緩沖的庫,。


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多