一下驱动本人已经测试可用并稳定,请放心使用。之所以发出来,是觉得网络的好处应该是以一人长益所需之人短,谢谢。
/////////////////////////////////////////// 头文件 //////////////////////////////////////////////////
#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
}
{
|