赛元微 SC92F8003 UART0收发数据

赛元微 SC92F8003 UART0收发数据 使用示范

#include "sc92f8003_uart0.h"
#include "sc92f8003_gpio.h"

void Uart0Init()
{
	GPIO_Init(GPIO1, GPIO_PIN_5, GPIO_MODE_IN_PU);
	//波特率9600,TIMER1做时钟源,允许接收
	UART0_Init(16000000, 9600, UART0_Mode_10B, UART0_CLOCK_TIMER1, UART0_RX_ENABLE);
	UART0_ITConfig(ENABLE, LOW);	//使能uart0中断
}


void main(void)
{   	
	Uart0Init();
	enableInterrupts();
	
	while(1);
}

#include "sc92f8003_uart0.h"

/**************************************************
*函数名称:void UART0_DeInit(void)
*函数功能:UART0相关寄存器复位至缺省值
*入口参数:void
*出口参数:void
**************************************************/
void UART0_DeInit(void)
{
	OTCON &= 0XEF;
	SCON = 0X00;
	PCON &= 0X7F;
	IE &= (~0X10);
	IP &= (~0X10);		
}

/**************************************************
*函数名称:UART0_PinSelection(UART0_PinSelection_TypeDef PinSeletion)
*函数功能:UART0引脚选择
*入口参数:PinSeletion   选择UART0引脚为P15P16或P11P20     
*出口参数:void
**************************************************/
void UART0_PinSelection(UART0_PinSelection_TypeDef PinSeletion)
{
	OTCON = OTCON & 0XDF | PinSeletion;	
}

/**************************************************
*函数名称:void UART0_Init(uint32_t Uart0Fsys, uint32_t BaudRate, UART0_Mode_Typedef Mode,
						   UART0_Clock_Typedef ClockMode, UART0_RX_Typedef RxMode)
*函数功能:UART0初始化配置函数
*入口参数:Uart0Fsys	系统时钟频率
		   BaudRate		波特率(模式0下只可选择UART0_BaudRate_FsysDIV12或UART0_BaudRate_FsysDIV4)
		   Mode			UART0工作模式
		   ClockMode	波特率时钟源(TIMER1/TIMER2)
		   RxMode		接收允许选择
*出口参数:void
**************************************************/
void UART0_Init(uint32_t Uart0Fsys, uint32_t BaudRate, UART0_Mode_Typedef Mode,
			   UART0_Clock_Typedef ClockMode, UART0_RX_Typedef RxMode)
{
	SCON  = (SCON & 0X2F) | Mode | RxMode;	//设置UART工作模式,设置接收允许位

	if(Mode == UART0_Mode_8B)
	{
		if(BaudRate == UART0_BaudRate_FsysDIV12)
		{
			PCON &= 0X7F;		
		}
		else if(BaudRate == UART0_BaudRate_FsysDIV4)
		{
			PCON |= 0X80;		
		}
	}

	else
	{
		T2CON = (T2CON & 0xCF) | ClockMode;		//设置波特率时钟源					
		if(ClockMode == UART0_CLOCK_TIMER1)
		{
			TH1 = (Uart0Fsys / BaudRate) / 256;
			TL1 = (Uart0Fsys / BaudRate) % 256;
			TR1 = 0;
		}
		else if(ClockMode == UART0_CLOCK_TIMER2)
		{
			RCAP2H = (Uart0Fsys / BaudRate) / 256;
			RCAP2L = (Uart0Fsys / BaudRate) % 256;
			TR2 = 1;
		}
	}
}

/*****************************************************
*函数名称:void UART0_SendData8(uint8_t Data)
*函数功能:UART0发送8位数据
*入口参数:uint8_t Data		发送的数据 
*出口参数:void
*****************************************************/
void UART0_SendData8(uint8_t Data)
{
	SBUF = Data;
}

/**************************************************
*函数名称:uint8_t UART0_ReceiveData8(void)
*函数功能:获得SBUF中的值
*入口参数:void
*出口参数:uint8_t
**************************************************/
uint8_t UART0_ReceiveData8(void)
{
	return SBUF;
} 

/*****************************************************
*函数名称:void UART0_SendData9(uint16_t Data)
*函数功能:UART0发送9位数据
*入口参数:uint16_t Data	发送的数据 
*出口参数:void
*****************************************************/
void UART0_SendData9(uint16_t Data)
{
	uint8_t Data_9Bit;
	Data_9Bit = (Data >> 8);
	if(Data_9Bit)
	{
		SCON |= 0X08;		
	}
	else
	{
		SCON &= 0XF7;
	}
	SBUF = (uint8_t)Data;		
}

/**************************************************
*函数名称:uint16_t UART0_ReceiveData9(void)
*函数功能:获得SBUF中的值及第九位的值
*入口参数:void
*出口参数:uint16_t
**************************************************/
uint16_t UART0_ReceiveData9(void)
{
	uint16_t Data9;
	Data9 = SBUF + ((uint16_t)(SCON & 0X04) << 6);
	SCON &= 0XFB;
	return Data9;
}

/*****************************************************
*函数名称:void UART0_ITConfig(FunctionalState NewState, PriorityStatus Priority)
*函数功能:UART0中断初始化
*入口参数:FunctionalState NewState	中断使能/关闭选择
 		   PriorityStatus Priority	中断优先级选择
*出口参数:void
*****************************************************/
void UART0_ITConfig(FunctionalState NewState, PriorityStatus Priority)
{
	//中断使能/关闭设置
	if(NewState == DISABLE)
    {
       EUART = 0;
    }
    else
    {
       EUART = 1;
    }
	
	//中断优先级设置
	if(Priority == LOW)
	{
		IPUART = 0;
	}
	else
	{
		IPUART = 1;
	}
}

/*****************************************************
*函数名称:FlagStatus UART0_GetFlagStatus(UART0_Flag_Typedef UART0_Flag)
*函数功能:获得UART0中断标志状态
*入口参数:UART0_Flag	中断标志位选择
*出口参数:FlagStatus		UART0中断标志状态	
*****************************************************/
FlagStatus UART0_GetFlagStatus(UART0_Flag_Typedef UART0_Flag)
{
	return (FlagStatus)(SCON & UART0_Flag);
}

/*****************************************************
*函数名称:void UART0_ClearFlag(UART0_Flag_Typedef UART0_Flag)
*函数功能:清除UART0中断标志状态
*入口参数:UART0_Flag	中断标志位选择
*出口参数:void	
*****************************************************/
void UART0_ClearFlag(UART0_Flag_Typedef UART0_Flag)
{
	SCON &=	(~UART0_Flag);
}

#ifndef __SC92F8003_UART0_H
#define __SC92F8003_UART0_H

#include "sc92f8003.h"

#define  UART0_BaudRate_FsysDIV12    0X00	 //仅模式0可用,串行端口在系统时钟的1/12下运行
#define  UART0_BaudRate_FsysDIV4	 0X01	 //仅模式0可用,串行端口在系统时钟的1/4下运行

typedef enum {
  UART0_PinSelection_P15P16 = (uint8_t)0x00, //UART0引脚为P15,P16
  UART0_PinSelection_P11P20 = (uint8_t)0x10  //UART0引脚为P11,P20
} UART0_PinSelection_TypeDef;

typedef enum {
	UART0_CLOCK_TIMER1 = (uint8_t)0X00,	//TIMER1做波特率发生器
	UART0_CLOCK_TIMER2 = (uint8_t)0X30	//TIMER2做波特率发生器
} UART0_Clock_Typedef;

typedef enum {
	UART0_Mode_8B  = 0X00,				//UART工作模式:8位半双工	 
	UART0_Mode_10B = 0X40,				//UART工作模式:10位全双工
	UART0_Mode_11B = 0XC0				//UART工作模式:11位全双工
} UART0_Mode_Typedef;

typedef enum {
	UART0_RX_ENABLE  = 0x10,			//允许接收数据
	UART0_RX_DISABLE = 0x00				//不允许接收数据
} UART0_RX_Typedef;

typedef enum {
	UART0_FLAG_RI = 0X01,				//接收中断标志位RI
	UART0_FLAG_TI = 0X02				//发送中断标志位TI
} UART0_Flag_Typedef;

void UART0_DeInit(void);
void UART0_PinSelection(UART0_PinSelection_TypeDef PinSeletion);
void UART0_Init(uint32_t Uart0Fsys, uint32_t BaudRate, UART0_Mode_Typedef Mode,
			   UART0_Clock_Typedef ClockMode, UART0_RX_Typedef RxMode);
void UART0_SendData8(uint8_t Data);
uint8_t UART0_ReceiveData8(void);
void UART0_SendData9(uint16_t Data);
uint16_t UART0_ReceiveData9(void);
void UART0_ITConfig(FunctionalState NewState, PriorityStatus Priority);
FlagStatus UART0_GetFlagStatus(UART0_Flag_Typedef UART0_Flag);
void UART0_ClearFlag(UART0_Flag_Typedef UART0_Flag);

#endif

#include "sc92f8003_gpio.h"
#include "sc92f8003_timer0.h"
#include "sc92f8003_timer1.h"
#include "sc92f8003_timer2.h"
#include "sc92f8003_adc.h"
#include "sc92f8003_btm.h"
#include "sc92f8003_pwm.h"
#include "sc92f8003_exti.h"
#include "sc92f8003_uart0.h"
#include "sc92f8003_ssi.h"

void EXTI0Interrupt()		interrupt 0
{

}

void Timer0Interrupt()		interrupt 1
{

}

void EXTI1Interrupt()		interrupt 2
{

}

void Timer1Interrupt()		interrupt 3
{

}

void UART0Interrupt()		interrupt 4
{
	if(UART0_GetFlagStatus(UART0_FLAG_TI))
	{
		UART0_ClearFlag(UART0_FLAG_TI);			//清除TI
	}
	else if(UART0_GetFlagStatus(UART0_FLAG_RI))
	{
		UART0_ClearFlag(UART0_FLAG_RI);			//清除RI
		UART0_SendData9(UART0_ReceiveData9());	//发送接收的数据
	}
}

void Timer2Interrupt()		interrupt 5
{

}

void ADCInterrupt()			interrupt 6
{

}

void SSIInterrupt()			interrupt 7
{
	
}

void PWMInterrupt()			interrupt 8
{

}

void BTMInterrupt()			interrupt 9
{

}

void EXTI2Interrupt()		interrupt 10
{

}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZCY5202015

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值