⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serial0.c

📁 cygnal上的数据采集的程序(带实时时钟)
💻 C
字号:
//-----------------------------------------------------------------------------
// Net SERIAL.C
//
// This module handles RS-232 messages and associated tasks
//-----------------------------------------------------------------------------
#include <string.h>
#include "C8051f.h"
#include "intrins.h"
#include "serial0.h"
#include "Func.h"


bit CommRecDataOverflowFlag,FlagRecComm,SendItComm;

unsigned char CommSendBufferHead, CommSendBufferTail;
unsigned char CommRecBufferHead, CommRecBufferTail;

unsigned char xdata CommSendBuffer[DB_SENDMAXSIZE] _at_ 0 ; //串行口缓冲区定位在内部4K XRAM中
unsigned char xdata CommRecBuffer[DB_RECMAXSIZE] _at_ DB_SENDMAXSIZE; 

void Delay1ms(unsigned char T);

void ClearCommRecBuffer0(void)
{
	unsigned char i;
	CommRecBufferHead=CommRecBufferTail=0;
	CommSendBufferHead=CommSendBufferTail=0;
	FlagRecComm=0;
	for (i=0;i<DB_SENDMAXSIZE;i++)
	{
		CommSendBuffer[i]=0;
	}
	for (i=0;i<DB_RECMAXSIZE;i++)
	{
		CommRecBuffer[i]=0;
	}
}

void init_serial0(unsigned int BaudRate)
{
	ClearCommRecBuffer0();
	OpenComm0(BaudRate);
}

void OpenComm0(unsigned int BaudRate) 
{
	PCON |= 0x80;		// SMOD=1 (HW_UART uses Timer 1 overflow with no divide down).
	TMOD |= 0x20;		// Configure Timer 1 for use by UART0
	CKCON |= 0x10;		// Timer 1 derived from SYSCLK

//	RCAP2H=(65536-(SYSCLK/BAUDRATE0/32))/256;
//	RCAP2L=(65536-(SYSCLK/BAUDRATE0/32))%256;
	RCAP2H=(65536-(SYSCLK/BaudRate/32))/256;
	RCAP2L=(65536-(SYSCLK/BaudRate/32))%256;
	TH2=RCAP2H;
	TL2=RCAP2L;

	CT2 = 0;				//T2:timer mode	
	TR2 = 1;

	TCLK = 1;
	RCLK = 1;		//说明:52,对于SIO0,可选择T1(TCLK=0,RCLK=0)或T2(TCLK=1,RCLK=1)作为波特率发生器
					    //            SIO1只能用T1作为波特率发生器
					    //baud=OSC/(32*(65536-[RCAP2H,RCAP2L])
	CommSendBufferHead=CommSendBufferTail=0; // set the head and tail to the base of the ring buffer
	CommRecBufferHead=CommRecBufferTail=0;

	FlagRecComm=0;
	RI0 = 0;					// Clear HW_UART receive and transmit
	TI0 = 0;					// complete indicators.
	SCON0 = 0x50;			// Configure UART0 for mode 1, receiver enabled.
	ES0 = 1; 					// allow the serial interrupt
	SendItComm = 1;
}



void PutChar0(unsigned char Ch)
{
	SBUF0 = Ch;
    while(!TI0)
    ;
    TI0 = 0;
}

void SendCommString0(unsigned char *base) 
{
    unsigned int len;
    unsigned char i;

    len = strlen(base);
    for(i = 0; i<len; i++)
    {
        PutChar0(base[i]);
        Delay1ms(1);
    }
}

void serial_send_(unsigned char *base)
{
	SendCommString0(base);
}

void CommISR0(void) interrupt 4
{
	if (_testbit_(RI0))	
	{	 
		RI0=0;
		if (CommRecBufferTail==CommRecBufferHead)
		{
			CommRecDataOverflowFlag=1;				//接收缓冲区溢出
		}
		CommRecBuffer[CommRecBufferTail]=SBUF0;     //receive data           
	    CommRecBufferTail++;
	    if (CommRecBufferTail==DB_RECMAXSIZE)
	    {
	    	CommRecBufferTail=0;
	    }
		FlagRecComm=1;
   	}
}

//从接收缓冲区读数据 ,无数据返回0,有数据返回1
bit GetCommChar0(unsigned char  *ch)      
{ 
	if (CommRecBufferTail==CommRecBufferHead) return 0;     
	*ch=CommRecBuffer[CommRecBufferHead];
	CommRecBufferHead++;
	if (CommRecBufferHead==DB_RECMAXSIZE)
	{
		CommRecBufferHead=0;
	}
	if (CommRecBufferTail==CommRecBufferHead) FlagRecComm=0;
	return 1;
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -