UART
2014-01-12 13:20
197 查看
//-----------------------------------------------------------------------------
// UART0.c
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <C8051F330.h> // SFR declarations
#include "public.h"
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
#define BAUDRATE 9600 // Baud rate of UART in bps
//-----------------------------------------------------------------------------
// Global Variables
//-----------------------------------------------------------------------------
#define UART_BUFFERSIZE 5 //一帧数据包括5个字节
uchar UART_Rx_Buf[5];
uchar UART_Buffer_Size = 0;
uchar UART_Input_First = 0;
uchar UART_Output_First = 0;
uchar TX_Ready =1,RX_Ready=0;
//-----------------------------------------------------------------------------
// UART0_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.
//-----------------------------------------------------------------------------
void UART0_Init (void)
{
SCON0 = 0x10; // SCON0: 8-bit variable bit rate
// level of STOP bit is ignored
// RX enabled!
// ninth bits are zeros
// clear RI0 and TI0 bits
if (SYSCLK/BAUDRATE/2/256 < 1) {
TH1 = -(SYSCLK/BAUDRATE/2); //106
CKCON &= ~0x0B; // T1M = 1; SCA1:0 = xx,SYSCLK
CKCON |= 0x08;
} else if (SYSCLK/BAUDRATE/2/256 < 4) {
TH1 = -(SYSCLK/BAUDRATE/2/4); //78.125
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01,SYSCLK/4
CKCON |= 0x01;
} else if (SYSCLK/BAUDRATE/2/256 < 12) {
TH1 = -(SYSCLK/BAUDRATE/2/12);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00,SYSCLK/12
} else {
TH1 = -(SYSCLK/BAUDRATE/2/48);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10,SYSCLK/48
CKCON |= 0x02;
}
TL1 = TH1; // init Timer1
TMOD &= ~0xF0; // TMOD: timer 1 in 8-bit autoreload
TMOD |= 0x20;
TR1 = 1; // START Timer1
TX_Ready = 1; // Flag showing that UART can transmit
IP |= 0x10; // Make UART high priority
ES0 = 1; // Enable UART0 interrupts
}
/*
void Uart_Send2(uchar Uart_Data[])
{
uchar i;
REN0=0; //发送数据时禁止串口接收数据
for(i=0;i<5;i++){
SBUF0 = *(Uart_Data+i);
while(TI0==0);
TI0 = 0;
}
REN0=1; //串口接收允许
} //*/
void Uart_Send(uchar Uart_Data[], uchar Length)
{
uchar i;
REN0=0; //发送数据时禁止串口接收数据
for(i=0;i<Length;i++){
SBUF0 = Uart_Data[i];
while(TI0==0);
TI0 = 0;
}
REN0=1; //串口接收允许
}
//-----------------------------------------------------------------------------
// Interrupt Service Routines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// UART0_Interrupt
//-----------------------------------------------------------------------------
//
// This routine is invoked whenever a character is entered or displayed on the
// Hyperterminal.
//
//-----------------------------------------------------------------------------
extern uchar xdata UART_Tx_Buf[5];
void UART0_Interrupt (void) interrupt 4
{
if (RI0 == 1){
if(UART_Buffer_Size == 0) // If new word is entered
UART_Input_First = 0;
RI0 = 0; // Clear interrupt flag
if (UART_Buffer_Size < UART_BUFFERSIZE){
UART_Rx_Buf[UART_Input_First++] = SBUF0; // Store in array and Update counter
UART_Buffer_Size++; // Update array's size
if(UART_Rx_Buf[0]!=0x7E){
// Check if the head is 0x7E
UART_Buffer_Size=0;
UART_Input_First=0;
RX_Ready=0;
}else if(UART_Buffer_Size==UART_BUFFERSIZE){
//receive a frame data
UART_Buffer_Size=0;
UART_Input_First=0;
RX_Ready=1;
}
}
}
}
//-----------------------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------------------
// UART0.c
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <C8051F330.h> // SFR declarations
#include "public.h"
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
#define BAUDRATE 9600 // Baud rate of UART in bps
//-----------------------------------------------------------------------------
// Global Variables
//-----------------------------------------------------------------------------
#define UART_BUFFERSIZE 5 //一帧数据包括5个字节
uchar UART_Rx_Buf[5];
uchar UART_Buffer_Size = 0;
uchar UART_Input_First = 0;
uchar UART_Output_First = 0;
uchar TX_Ready =1,RX_Ready=0;
//-----------------------------------------------------------------------------
// UART0_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.
//-----------------------------------------------------------------------------
void UART0_Init (void)
{
SCON0 = 0x10; // SCON0: 8-bit variable bit rate
// level of STOP bit is ignored
// RX enabled!
// ninth bits are zeros
// clear RI0 and TI0 bits
if (SYSCLK/BAUDRATE/2/256 < 1) {
TH1 = -(SYSCLK/BAUDRATE/2); //106
CKCON &= ~0x0B; // T1M = 1; SCA1:0 = xx,SYSCLK
CKCON |= 0x08;
} else if (SYSCLK/BAUDRATE/2/256 < 4) {
TH1 = -(SYSCLK/BAUDRATE/2/4); //78.125
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01,SYSCLK/4
CKCON |= 0x01;
} else if (SYSCLK/BAUDRATE/2/256 < 12) {
TH1 = -(SYSCLK/BAUDRATE/2/12);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00,SYSCLK/12
} else {
TH1 = -(SYSCLK/BAUDRATE/2/48);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10,SYSCLK/48
CKCON |= 0x02;
}
TL1 = TH1; // init Timer1
TMOD &= ~0xF0; // TMOD: timer 1 in 8-bit autoreload
TMOD |= 0x20;
TR1 = 1; // START Timer1
TX_Ready = 1; // Flag showing that UART can transmit
IP |= 0x10; // Make UART high priority
ES0 = 1; // Enable UART0 interrupts
}
/*
void Uart_Send2(uchar Uart_Data[])
{
uchar i;
REN0=0; //发送数据时禁止串口接收数据
for(i=0;i<5;i++){
SBUF0 = *(Uart_Data+i);
while(TI0==0);
TI0 = 0;
}
REN0=1; //串口接收允许
} //*/
void Uart_Send(uchar Uart_Data[], uchar Length)
{
uchar i;
REN0=0; //发送数据时禁止串口接收数据
for(i=0;i<Length;i++){
SBUF0 = Uart_Data[i];
while(TI0==0);
TI0 = 0;
}
REN0=1; //串口接收允许
}
//-----------------------------------------------------------------------------
// Interrupt Service Routines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// UART0_Interrupt
//-----------------------------------------------------------------------------
//
// This routine is invoked whenever a character is entered or displayed on the
// Hyperterminal.
//
//-----------------------------------------------------------------------------
extern uchar xdata UART_Tx_Buf[5];
void UART0_Interrupt (void) interrupt 4
{
if (RI0 == 1){
if(UART_Buffer_Size == 0) // If new word is entered
UART_Input_First = 0;
RI0 = 0; // Clear interrupt flag
if (UART_Buffer_Size < UART_BUFFERSIZE){
UART_Rx_Buf[UART_Input_First++] = SBUF0; // Store in array and Update counter
UART_Buffer_Size++; // Update array's size
if(UART_Rx_Buf[0]!=0x7E){
// Check if the head is 0x7E
UART_Buffer_Size=0;
UART_Input_First=0;
RX_Ready=0;
}else if(UART_Buffer_Size==UART_BUFFERSIZE){
//receive a frame data
UART_Buffer_Size=0;
UART_Input_First=0;
RX_Ready=1;
}
}
}
}
//-----------------------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------------------
相关文章推荐
- 串口通讯基础及S3C2410 UART控制器(www.taoydy.com)
- UART
- SPI,UART,I2C都有什么区别,及其各自的特点
- 什么是UART ?
- 我所知道的EC====>Uart
- 一点关于UART (转载)
- void Uart_Printf(char *fmt,...) 解释
- Using the uart to load the uboot
- UART的CTS与RTS
- 浅析arm平台上uart在kernel上注册和使用的上、下流程
- [转]Uart_Printf()
- LPC2000 UART串口使用心得
- UART0串口编程系列(三)(转)
- console,uart,tty的关联关系
- 基于FPGA/CPLD设计与实现UART
- UART,串口,RS232,RS485等等,之间有什么联系和区别?
- Serial UART information
- linux设备模型之uart驱动架构分析
- Linux-2.6.32.2内核在mini2440上的移植(十八)---将UART2更成普通串口驱动
- ARM-Linux s3c2440 之UART分析(五)