久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3446|回復: 1
打印 上一主題 下一主題
收起左側

STC15系列4個串口的使用庫函數

[復制鏈接]
跳轉到指定樓層
樓主
ID:105323 發表于 2016-2-24 18:01 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
最近開發一個項目,想用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);

        }

     }

}

本次寫的庫函數是查詢讀和同步寫的方式,不夠完善,有空的話,把它完善成中斷方式,并帶讀寫緩沖的庫。


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:92029 發表于 2016-3-9 16:12 | 只看該作者
前段時間弄15,單個串口怎么弄都行,但一但兩個串口同時工作就不行了,不知道是啥問題,還得看看
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美视频 | 农村黄性色生活片 | 国产成人福利在线 | 精品久久av| 一级免费毛片 | 亚洲一区二区免费 | 狠狠久 | 91伦理片| 午夜精品久久久久久不卡欧美一级 | 久久久久91 | 日韩中文在线观看 | 综合精品久久久 | 超碰av在线 | 亚洲欧美综合 | 亚洲免费在线观看 | 国产电影一区二区三区爱妃记 | 99久久精品国产毛片 | 天天干天天玩天天操 | 在线视频a| 国产精品久久久久久一区二区三区 | 精品久久久一区二区 | 国产免费一区二区 | 色橹橹欧美在线观看视频高清 | 欧美激情视频一区二区三区免费 | 北条麻妃一区二区三区在线观看 | 日本电影一区二区 | 91xxx在线观看 | 日韩不卡一区二区三区 | 国产精品国产成人国产三级 | 日韩欧美一区二区三区四区 | 亚洲区一 | 福利一区二区在线 | 久久av一区二区三区 | 国产精品日韩高清伦字幕搜索 | 国产一级视屏 | 日韩欧美在线不卡 | 日韩精品1区2区3区 成人黄页在线观看 | 特级毛片www | www.99热这里只有精品 | 人人做人人澡人人爽欧美 | 一级国产精品一级国产精品片 |