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

📄 serial1.c

📁 C8051F120 _AD开发过程中的一些代码和文档
💻 C
字号:
#include <string.h>
#include "C8051f.h"
#include "intrins.h"
#include "serial1.h"
#include "Timer.h"

extern unsigned char RecCh;
extern unsigned char RecFlag;

bit CommRecDataOverflowFlag1,FlagRecComm1,SendItComm1;

unsigned char CommSendBufferHead1, CommSendBufferTail1;
unsigned char CommRecBufferHead1, CommRecBufferTail1;

unsigned char xdata CommSendBuffer1[DB_SENDMAXSIZE1];
unsigned char xdata CommRecBuffer1[DB_RECMAXSIZE1]; 

void ClearCommRecBuffer1(void)
{
	unsigned char i;
	CommRecBufferHead1=CommRecBufferTail1=0;
	CommSendBufferHead1=CommSendBufferTail1=0;
	FlagRecComm1=0;
	for (i=0;i<DB_SENDMAXSIZE1;i++)
	{
		CommSendBuffer1[i]=0;
	}
	for (i=0;i<DB_RECMAXSIZE1;i++)
	{
		CommRecBuffer1[i]=0;
	}
}

void init_serial1(unsigned int baudr)
{
	ClearCommRecBuffer1();
	OpenComm1(baudr);
}

void OpenComm1(unsigned int baudr) 
{
	PCON |= 0x10;		// 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;

	RCAP4H=(65536-(SYSCLK/baudr/32))/256;
	RCAP4L=(65536-(SYSCLK/baudr/32))%256;
	TH4=RCAP4H;
	TL4=RCAP4L;

//	CT2=0;				//T2:timer mode
	T4CON |=0x34;
//	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])
	CommSendBufferHead1 = CommSendBufferTail1=0; // set the head and tail to the base of the ring buffer
	CommRecBufferHead1 = CommRecBufferTail1=0;
	FlagRecComm1=0;
//	RI0=0;					// Clear HW_UART receive and transmit
//	TI0=0;					// complete indicators.
//	SCON1 &=0xfc;
	SCON1 = 0x50;			// Configure UART0 for mode 1, receiver enabled.
//	ES0=1; 					// allow the serial interrupt
	EIE2 |=0x40;
	SendItComm1=1;
}

void PutChar1(unsigned char Ch)
{
	SBUF1 = Ch;
    while((SCON1 & 0x02) == 0x0)
    ;
    SCON1 = SCON1 & 0xfd;
}

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

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

void serial_send(unsigned char *base)
{
	SendCommString1(base);
}

void CommISR1(void) interrupt 20
{
	if ((SCON1&0x01)==0x01)
	{
		SCON1 &=0xfe;	
		RecCh = SBUF1;
		RecFlag = 0x01;
	}

}

//从接收缓冲区读数据 ,无数据返回0,有数据返回1
bit GetCommChar1(unsigned char  *ch)      
{ 
	if (CommRecBufferTail1 == CommRecBufferHead1) 
	{
		return 0;
	}     
	*ch = CommRecBuffer1[CommRecBufferHead1];

	CommRecBufferHead1++;
	if (CommRecBufferHead1 == DB_RECMAXSIZE1)
	{
		CommRecBufferHead1 = 0;
	}
	if (CommRecBufferTail1 == CommRecBufferHead1) 
	{
		FlagRecComm1 = 0;
	}
	return 1;
}

⌨️ 快捷键说明

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