一下驅動本人已經測試可用并穩定,請放心使用。之所以發出來,是覺得網絡的好處應該是以一人長益所需之人短,謝謝。
/////////////////////////////////////////// 頭文件 //////////////////////////////////////////////////
#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
}
|