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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于pic16f1947單片機的USART2驅動程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:511543 發表于 2020-12-25 11:15 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
一下驅動本人已經測試可用并穩定,請放心使用。之所以發出來,是覺得網絡的好處應該是以一人長益所需之人短,謝謝。

///////////////////////////////////////////  頭文件 //////////////////////////////////////////////////
#ifndef  __USART2_H
#define  __USART2_H

#include   "datatype.h"   //數據類型定義文件
#include    "pic.h"           //PIC16F IC寄存器定義文件

//RG1(TX2)
//RG2(RX2)

#define   USART2_PRINTF_REDIRECT     //printf重定向目的是為了使用printf格式化輸出
//#define   USART2_RECEIVE                    //打開接受中斷標志位

#ifdef   USART2_RECEIVE
extern  uchar    usart2_receive[8 ] ;            //接受數據緩沖區
extern  uint8_t  usart2_receive_count ;      //接受數據數量
extern  uint8_t  usart2_receiveflage  ;       //接受數據完成標志位
#endif

/*
*@breif                串口2初始化
*@prama        None
*@retval        None
*/
void Usart2_Init(void);

/*
*@brief                usart1發送一個字節數據
*@prama        buf:待發送的數據
*@retval        None
*/
void Usart2_Send_Onebyte( uchar buf);

/*
*@brief                usart發送字符串
*@prama        buf:數據指針
*@retval        None
*/
void Usart2_Send_String(const uchar *buf);



#endif

/////////////////////////////////////// 對應的.c 文件 //////////////////////////////////////
#include   "usart2.h"
#ifdef  USART2_RECEIVE
uchar    usart2_receive[8 ] ;           //接受數據緩沖區
uint8_t  usart2_receive_count ;     //接受數據數量
uint8_t  usart2_receiveflage = 0 ; //接受數據完成標志位
#endif

/*
*@breif                串口2初始化
*@prama        None
*@retval        None
*   SYNC    BRG16   BRGH
      0             0          0       --        SPBRG寄存器值 = 晶振頻率 / (目標波特率 * 64) - 1
      0             0          1       --        SPBRG寄存器值 = 晶振頻率 / (目標波特率 * 16) - 1
      0             1          0       --        SPBRG寄存器值 = 晶振頻率 / (目標波特率 * 16) - 1
*/
void Usart2_Init(void)
{        
         //RG1(TX2)
       //RG2(RX2)
       ANSG1 = 0 ;        //RG1 配置為模擬或者數字功能:0-數字,1-模擬
       ANSG2 = 0 ;          //RG2 配置為模擬或者數字功能:0-數字,1-模擬

       //SPBRG寄存器值 = 晶振頻率 / (目標波特率 * 64) - 1            
      if (SYSTEMCLK == 64 ) //系統工作時鐘是16M
     {
            SP2BRGL=103;                  //EUSART2 波特率發生器低字節:設置波特率為9600
                    SP2BRGH=0;                 //EUSART2 波特率發生器高字節:
     }         
     else //系統工作時鐘是16M
     {
           SP2BRGL=25;                  //EUSART2 波特率發生器低字節:設置波特率為9600
                  SP2BRGH=0;                 //EUSART2 波特率發生器高字節:
     }

      //BRG16=0;                         //0-使用8位,1-使用16位
      //BRGH=0;                          //設置高速波特率,1-高速,0-低速
      //SYNC=0;                          //SYNC=0為異步模式,SYNC=1為同步模式
        TX2STA=0b00100000;         //發送狀態和控制寄存器:選擇8位發送,開發送使能,選擇低速波特率模式
        RC2STA=0b10010000;        //接受狀態和控制寄存器:8位接收,開串口使能
        BAUD2CON=0b00000000;  //波特率控制寄存器:使用8位波特率發生器
        
        #ifdef  USART2_RECEIVE
        TX2IE=0;                           //禁止USART2發送中斷                                
        RC2IE=1;                           //開啟USART2接收中斷
        GIE=1;                                     //開總全局中斷
        PEIE=1;                                   //開啟外設中斷
        #endif
}

/*
*@brief                usart2發送一個字節數據
*@prama        buf:待發送的數據
*@retval        None
*/
void Usart2_Send_Onebyte( uchar buf)
{
        TX2REG = buf ;
        while(!(TX2STA&0x02));        //移位發送寄存器TSR發送完成后,TRMT置1,隨即發送下一位        
}

/*
*@brief                usart2發送字符串
*@prama        buf:數據指針
*@retval        None
*/
void Usart2_Send_String(const uchar *buf)
{
        while(*buf!='\0')
        {
                TX2REG=*buf;
                while(!(TX2STA&0x02));        //移位發送寄存器TSR發送完成后,TRMT置1,隨即發送下一位
                buf++;
        }
}

#ifdef   USART2_PRINTF_REDIRECT
/*
函數名:void putch( char ch )
功能:重定向printf函數
*/
void putch( char ch )
{
    while( !(TX2STA&0x02) )
        continue;
       TX2REG = ch;
}
#endif

/////////////////////////////////////測試文件////////////////////////////////

#ifdef      PLLx4TO64M
#define   SYSTEMCLK    64
#else
#define   SYSTEMCLK    16
#endif

#ifdef   PLLx4TO64M
__CONFIG( FOSC_HS  & WDTE_OFF & BOREN_OFF );        //配置字一,選擇外部振蕩器,關閉看門狗,關閉低電壓復位
__CONFIG( VCAPEN_ON & LVP_OFF& PLLEN_ON );        //配置字二,使能RF0引腳穩壓電容,關閉低電壓編程,打開時鐘4倍頻
#else
__CONFIG( FOSC_HS  & WDTE_OFF & BOREN_OFF );        //配置字一,選擇外部振蕩器,關閉看門狗,關閉低電壓復位
__CONFIG( VCAPEN_ON & LVP_OFF& PLLEN_OFF );        //配置字二,使能RF0引腳穩壓電容,關閉低電壓編程,關閉時鐘4倍頻
#endif
void main(void)
{
     Usart2_Init();                    //USART1 Init

      delayms(100); //等待片內外設初始化完成
      printf("The device Is finish...\r\n");
      while(1)
     {
                            #ifdef  USART2_RECEIVE  //USART2 測試              {
                       if ( usart2_receiveflage ) //接收到符合規則的數據流
                        {
                              usart2_receiveflage=0;
                              Usart2_Send_String("Hello World !\r\n");
                        }
                }
              #endif
      }

}
//中斷處理函數
void interrupt  ISR(void)      
{
                 //USART2 接受中斷      #ifdef  USART2_RECEIVE
        {
                    if( RC2IE && RC2IF )  //默認為USART2寄存器位
             {                        
                       usart2_receive[usart2_receive_count++] = RC2REG;
                       if (usart2_receive[0]==0x68)
                       {
                                if(usart2_receive_count>=2)
                                {
                                                if(usart2_receive[1]==0x68)
                                          {
                                                      if (usart2_receive_count>=8)
                                                         {
                                                                 if(usart2_receive[7]==0x0D)        
                                                                 {        
                                                                     usart2_receiveflage =1;                //置位數據接收成功標志
                                                                  }
                                                           usart2_receive_count=0;
                                                          }
                                               }
                                                 else
                                             {
                                                     usart2_receive_count=0;
                                               }   
                                      }                    
                          }
                        else
                       {
                               usart2_receive_count=0;
                          }
                         RC2IF=0;  //清除中斷標志位
              }
        }
      #endif
}

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 香蕉久久a毛片 | 亚州国产 | 91人人在线 | 精品在线免费观看视频 | 天天影视亚洲综合网 | 国产91在线观看 | 国产超碰人人爽人人做人人爱 | 日韩精品一区二区三区第95 | 成人av片在线观看 | 一级黄色片一级黄色片 | 久久久久亚洲国产| 91视频大全 | 欧美激情亚洲天堂 | 国产清纯白嫩初高生视频在线观看 | 天天草天天干 | 91小视频在线 | 成人三级视频 | 亚洲一区二区网站 | 欧美日本亚洲 | 日韩国产精品一区二区三区 | 天天干干 | 韩国av网站在线观看 | 久久久久免费精品国产 | 国产一区二区三区四区五区加勒比 | 久久综合成人精品亚洲另类欧美 | 黄色在线观看国产 | 一区二区在线 | 国产日屁 | 欧美日韩久久精品 | 国产精品成人一区二区三区 | 亚洲免费观看视频 | 一级毛片免费视频 | 国产区一区二区三区 | www..99re| 一区二区三区精品 | www.伊人.com| 亚洲成人日韩 | 日韩中文字幕在线播放 | 超碰在线播 | 7777久久| 亚洲第一av |