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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3454|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于PIC16F1947芯片的USART1 驅(qū)動(dòng)配置程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:511543 發(fā)表于 2020-12-25 11:11 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
一下驅(qū)動(dòng)本人已經(jīng)測(cè)試可用并穩(wěn)定,請(qǐng)放心使用。之所以發(fā)出來(lái),是覺(jué)得網(wǎng)絡(luò)的好處應(yīng)該是以一人長(zhǎng)益所需之人短,謝謝。

///////////////////////////////////////////  頭文件 //////////////////////////////////////////////////
#ifndef  __USART1_H
#define  __USART1_H
#include   "datatype.h"   //數(shù)據(jù)類型定義文件
#include    "pic.h"           //PIC16F IC寄存器定義文件

//RC6(TX1)
//RC7(RX1)

//#define   USART1_PRINTF_REDIRECT     //printf重定向目的是為了使用printf格式化輸出
//#define   USART1_RECEIVE

#ifdef   USART1_RECEIVE
extern  uchar    usart1_receive[8 ] ;            //接受數(shù)據(jù)緩沖區(qū)
extern  uint8_t  usart1_receive_count ;      //接受數(shù)據(jù)數(shù)量
extern  uint8_t  usart1_receiveflage  ;       //接受數(shù)據(jù)完成標(biāo)志位
#endif

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

/*
*@brief                usart1發(fā)送一個(gè)字節(jié)數(shù)據(jù)
*@prama        buf:待發(fā)送的數(shù)據(jù)
*@retval        None
*/
void Usart1_Send_Onebyte( uchar buf);

/*
*@brief                usart發(fā)送字符串
*@prama        buf:數(shù)據(jù)指針
*@retval        None
*/
void Usart1_Send_String(const uchar *buf);

#endif

/////////////////////////////////////// 對(duì)應(yīng)的.c 文件 //////////////////////////////////////
#include   "usart1.h"

#ifdef   USART1_RECEIVE
uchar    usart1_receive[8 ] ;           //接受數(shù)據(jù)緩沖區(qū)
uint8_t  usart1_receive_count ;     //接受數(shù)據(jù)數(shù)量
uint8_t  usart1_receiveflage = 0 ; //接受數(shù)據(jù)完成標(biāo)志位
#endif

/*
*@breif                串口1初始化
*@prama        None
*@retval        None
*   SYNC    BRG16   BRGH
      0             0          0       --        SPBRG寄存器值 = 晶振頻率 / (目標(biāo)波特率 * 64) - 1
      0             0          1       --        SPBRG寄存器值 = 晶振頻率 / (目標(biāo)波特率 * 16) - 1
      0             1          0       --        SPBRG寄存器值 = 晶振頻率 / (目標(biāo)波特率 * 16) - 1
*/
void Usart1_Init(void)
{        
      //SPBRG寄存器值 = 晶振頻率 / (目標(biāo)波特率 * 64) - 1         
     if (SYSTEMCLK == 64 )//系統(tǒng)工作時(shí)鐘是16M
     {
            SP1BRGL=103;               //EUSART1 波特率發(fā)生器低字節(jié):設(shè)置波特率為9600
                    SP1BRGH=0;                 //EUSART1 波特率發(fā)生器高字節(jié):
     }         
     else//系統(tǒng)工作時(shí)鐘是16M
     {
           SP1BRGL=25;                  //EUSART1 波特率發(fā)生器低字節(jié):設(shè)置波特率為9600
                  SP1BRGH=0;                 //EUSART1 波特率發(fā)生器高字節(jié):
     }
      //BRG16=0;                         //0-使用8位,1-使用16位
      //BRGH=0;                          //設(shè)置高速波特率,1-高速,0-低速
      //SYNC=0;                          //SYNC=0為異步模式,SYNC=1為同步模式
        TX1STA=0b00100000;   //發(fā)送狀態(tài)和控制寄存器:選擇8位發(fā)送,開(kāi)發(fā)送使能,選擇低速波特率模式
        RC1STA=0b10010000;   //接受狀態(tài)和控制寄存器:8位接收,開(kāi)串口使能
        BAUD1CON=0x00;            //波特率控制寄存器:使用8位波特率發(fā)生器

        TXIE=0;                                  //禁止USART1發(fā)送中斷                                
        RCIE=1;                                  //開(kāi)啟USART1接收中斷
        GIE=1;                                     //開(kāi)總?cè)种袛?br />         PEIE=1;                                   //開(kāi)啟外設(shè)中斷
}

/*
*@brief                usart1發(fā)送一個(gè)字節(jié)數(shù)據(jù)
*@prama        buf:待發(fā)送的數(shù)據(jù)
*@retval        None
*/
void Usart1_Send_Onebyte( uchar buf)
{
        TX1REG = buf ;
        while(!(TX1STA&0x02));        //移位發(fā)送寄存器TSR發(fā)送完成后,TRMT置1,隨即發(fā)送下一位        
}


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

#ifdef   USART1_PRINTF_REDIRECT
/*
函數(shù)名:void putch( char ch )
功能:重定向printf函數(shù)
*/
void putch( char ch )
{
    while( !(TX1STA&0x02) )
        continue;
       TX1REG = ch;
}
#endif

/////////////////////////////////////測(cè)試文件////////////////////////////////

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

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

      delayms(100); //等待片內(nèi)外設(shè)初始化完成
      printf("The device Is finish...\r\n");
      while(1)
     {
                  #ifdef   USART1_RECEIVE  //USART1 測(cè)試
              {
                     if ( usart1_receiveflage )        //接收到符合規(guī)則的數(shù)據(jù)流
                      {
                             usart1_receiveflage=0;
                             Usart1_Send_String("Hello World !\r\n");
                      }
                }
              #endif
      }

}
//中斷處理函數(shù)
void interrupt  ISR(void)        
{
              //USART1 接受中斷
        #ifdef  USART1_RECEIVE
        {
                    if( RCIE && RCIF )  //默認(rèn)為USART1寄存器位
             {                        
                       usart1_receive[usart1_receive_count++] = RC1REG;
                       if (usart1_receive[0]==0x68)
                       {
                                if(usart1_receive_count>=2)
                                {
                                                if(usart1_receive[1]==0x68)
                                          {
                                                      if (usart1_receive_count>=8)
                                                         {
                                                                 if(usart1_receive[7]==0x0D)        
                                                                 {        
                                                                     usart1_receiveflage =1;                //置位數(shù)據(jù)接收成功標(biāo)志
                                                                  }
                                                           usart1_receive_count=0;
                                                          }
                                               }
                                                 else
                                             {
                                                     usart1_receive_count=0;
                                               }   
                                      }                    
                          }
                        else
                       {
                               usart1_receive_count=0;
                          }
                         RCIF=0;  //清除中斷標(biāo)志位
              }
        }
      #endif


}
{

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 在线午夜| 午夜视频在线免费观看 | 成人免费一区二区三区牛牛 | 日韩精品在线视频 | 成人精品鲁一区一区二区 | 国产亚洲高清视频 | 日本不卡一区二区三区 | 成人免费视频网站在线看 | 日韩视频精品在线 | 91久久久久久久久久久久久 | 91精品久久久久久综合五月天 | 天堂网avav| 久久久久国产精品午夜一区 | 国产伦精品一区二区三区视频金莲 | 欧美黄色一区 | 国产亚洲精品美女久久久久久久久久 | 一级毛片视频在线观看 | 久久精品国产一区二区三区 | 一区二区三区高清 | 日韩精品区 | 国产精品海角社区在线观看 | 日本久久一区 | 国产一区二区三区四区三区四 | 在线观看免费av网 | 亚洲精品成人 | 国产一区二区三区久久久久久久久 | 欧美一级免费片 | 成人美女免费网站视频 | 日韩一区av | 一区二区视频在线观看 | 免费激情| 人人擦人人 | 日本一区二区三区在线观看 | 天堂亚洲 | 色视频www在线播放国产人成 | 亚洲精品无| 国产精品久久久久久久久久尿 | 欧美激情久久久 | 国产一区二区电影 | 91精品国产综合久久久亚洲 | 久久精品一级 |