找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2622|回复: 0
收起左侧

基于PIC16F1947芯片的USART1 驱动配置程序

[复制链接]
ID:511543 发表于 2020-12-25 11:11 | 显示全部楼层 |阅读模式
一下驱动本人已经测试可用并稳定,请放心使用。之所以发出来,是觉得网络的好处应该是以一人长益所需之人短,谢谢。

///////////////////////////////////////////  头文件 //////////////////////////////////////////////////
#ifndef  __USART1_H
#define  __USART1_H
#include   "datatype.h"   //数据类型定义文件
#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 ] ;            //接受数据缓冲区
extern  uint8_t  usart1_receive_count ;      //接受数据数量
extern  uint8_t  usart1_receiveflage  ;       //接受数据完成标志位
#endif

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

/*
*@brief                usart1发送一个字节数据
*@prama        buf:待发送的数据
*@retval        None
*/
void Usart1_Send_Onebyte( uchar buf);

/*
*@brief                usart发送字符串
*@prama        buf:数据指针
*@retval        None
*/
void Usart1_Send_String(const uchar *buf);

#endif

/////////////////////////////////////// 对应的.c 文件 //////////////////////////////////////
#include   "usart1.h"

#ifdef   USART1_RECEIVE
uchar    usart1_receive[8 ] ;           //接受数据缓冲区
uint8_t  usart1_receive_count ;     //接受数据数量
uint8_t  usart1_receiveflage = 0 ; //接受数据完成标志位
#endif

/*
*@breif                串口1初始化
*@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 Usart1_Init(void)
{        
      //SPBRG寄存器值 = 晶振频率 / (目标波特率 * 64) - 1         
     if (SYSTEMCLK == 64 )//系统工作时钟是16M
     {
            SP1BRGL=103;               //EUSART1 波特率发生器低字节:设置波特率为9600
                    SP1BRGH=0;                 //EUSART1 波特率发生器高字节:
     }         
     else//系统工作时钟是16M
     {
           SP1BRGL=25;                  //EUSART1 波特率发生器低字节:设置波特率为9600
                  SP1BRGH=0;                 //EUSART1 波特率发生器高字节:
     }
      //BRG16=0;                         //0-使用8位,1-使用16位
      //BRGH=0;                          //设置高速波特率,1-高速,0-低速
      //SYNC=0;                          //SYNC=0为异步模式,SYNC=1为同步模式
        TX1STA=0b00100000;   //发送状态和控制寄存器:选择8位发送,开发送使能,选择低速波特率模式
        RC1STA=0b10010000;   //接受状态和控制寄存器:8位接收,开串口使能
        BAUD1CON=0x00;            //波特率控制寄存器:使用8位波特率发生器

        TXIE=0;                                  //禁止USART1发送中断                                
        RCIE=1;                                  //开启USART1接收中断
        GIE=1;                                     //开总全局中断
        PEIE=1;                                   //开启外设中断
}

/*
*@brief                usart1发送一个字节数据
*@prama        buf:待发送的数据
*@retval        None
*/
void Usart1_Send_Onebyte( uchar buf)
{
        TX1REG = buf ;
        while(!(TX1STA&0x02));        //移位发送寄存器TSR发送完成后,TRMT置1,随即发送下一位        
}


/*
*@brief                usart发送字符串
*@prama        buf:数据指针
*@retval        None
*/
void Usart1_Send_String(const uchar *buf)
{
        while(*buf!='\0')
        {
                TX1REG=*buf;
                while(!(TX1STA&0x02));        //移位发送寄存器TSR发送完成后,TRMT置1,随即发送下一位
                buf++;
        }
}

#ifdef   USART1_PRINTF_REDIRECT
/*
函数名:void putch( char ch )
功能:重定向printf函数
*/
void putch( char ch )
{
    while( !(TX1STA&0x02) )
        continue;
       TX1REG = 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)
{
     Usart1_Init();                    //USART1 Init

      delayms(100); //等待片内外设初始化完成
      printf("The device Is finish...\r\n");
      while(1)
     {
                  #ifdef   USART1_RECEIVE  //USART1 测试
              {
                     if ( usart1_receiveflage )        //接收到符合规则的数据流
                      {
                             usart1_receiveflage=0;
                             Usart1_Send_String("Hello World !\r\n");
                      }
                }
              #endif
      }

}
//中断处理函数
void interrupt  ISR(void)        
{
              //USART1 接受中断
        #ifdef  USART1_RECEIVE
        {
                    if( RCIE && RCIF )  //默认为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;                //置位数据接收成功标志
                                                                  }
                                                           usart1_receive_count=0;
                                                          }
                                               }
                                                 else
                                             {
                                                     usart1_receive_count=0;
                                               }   
                                      }                    
                          }
                        else
                       {
                               usart1_receive_count=0;
                          }
                         RCIF=0;  //清除中断标志位
              }
        }
      #endif


}
{

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表