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

📄 text1.c

📁 由C8051F340单片机的两个串口收发数据,内部定义了两个缓冲区,可以发送无数个数据
💻 C
字号:
#include "C8051F340.h"
#include <stdio.h>
#include <intrins.h>
// Peripheral specific initialization functions,
// Called from the Init_Device() function

void Reset_Sources_Init(void);
void Timer_Init(void);
void  UART_Init(void);
void  EMI_Init(void);
void  Port_IO_Init(void);
void  Oscillator_Init(void);
void  Interrupts_Init(void);
void SendCommBuffer(unsigned char   *base, unsigned int  size);

#define DB_SENDMAXSIZE  10
#define DB_RECMAXSIZE   10

bit CommRecDataOverflowFlag,FlagRecComm,SendbufferOver;
unsigned int SendSize;
unsigned char CommSendBufferHead, CommSendBufferTail;
unsigned char xdata CommSendBuffer[DB_SENDMAXSIZE]; 
unsigned char CommRecBufferHead, CommRecBufferTail;
unsigned char xdata CommRecBuffer[DB_RECMAXSIZE];


void main()
{	
    	PCA0MD &= ~0x40;
    	Port_IO_Init();
    	Oscillator_Init();
    	Reset_Sources_Init();
		Timer_Init();
    	Interrupts_Init();
		UART_Init();
    	EMI_Init();

  		TR1 = 1;
		SendCommBuffer("1234567890987654\n",17);	
		SendCommBuffer("liaoww12345\n",12);
		SendCommBuffer("liqiao ai liaowuwu\n",19);	
		while(1);
}

void Reset_Sources_Init()
{
    int i = 0;
    VDM0CN    = 0x80;
    for (i = 0; i < 350; i++);  // Wait 100us for initialization
    RSTSRC    = 0x86;
}

void Timer_Init()
{
    TMOD      = 0x22;
    CKCON     = 0x00;
    TL1       = 0xD0;
    TH1       = 0xD0;
}

void UART_Init()
{
    SCON0     = 0x10;
    SBRLL1    = 0xD0;
    SBRLH1    = 0xFF;
    SCON1     = 0x10;
    SBCON1    = 0x43;
}

void EMI_Init()
{
    EMI0CF    = 0x43;
}

void Port_IO_Init()
{
    P0MDIN    = 0x3F;
    P0MDOUT   = 0x0F;
    P0SKIP    = 0xC8;
    P1SKIP    = 0xF9;
    XBR0      = 0x09;
    XBR1      = 0x70;
    XBR2      = 0x01;
}

void Oscillator_Init()
{
    int i = 0;
    OSCXCN    = 0x67;           
    for (i = 0; i < 3000; i++);  // Wait 1ms for initialization
    while ((OSCXCN & 0x80) == 0);
    CLKSEL    = 0x01;
    OSCICN    = 0xA3;   //内部振荡器使能,但不接USB时不工作
    CLKMUL    = 0x80;
    for (i = 0; i < 20; i++);    // Wait 5us for initialization
    CLKMUL    |= 0xC0;
    while ((CLKMUL & 0x20) == 0);  
    REG0CN = 0xB0; 
}

void Interrupts_Init()
{
    EIE1      = 0x02;
    EIE2      = 0x02;
    IE        = 0x90;
}

void SendCommBuffer(unsigned char  *base, unsigned int  size) 
{
    unsigned int i,k;
	unsigned char j,t;
	i = 0;
	j = 0;	
	k = DB_SENDMAXSIZE;
	if (!size) { return; }	
	SendSize = size;
	if (!(size%DB_SENDMAXSIZE))
	t = size/DB_SENDMAXSIZE;
	else
	t = size/DB_SENDMAXSIZE+1;
	for (j =0 ;j<t;j++)
	{
		while (i < k) 
		{
			CommSendBuffer[CommSendBufferTail]=base[i]; 	
			i++;
			CommSendBufferTail++; 
		}
		SBUF0=CommSendBuffer[CommSendBufferHead]; 
		while (!SendbufferOver);
		SendbufferOver = 0;
		k = DB_SENDMAXSIZE+k;
		CommSendBufferTail = 0;
	}
	CommSendBufferHead =0;
	CommSendBufferTail = 0;
}




void CommISR(void) interrupt 4
{
	if (TI0 == 1)
	{
		TI0 = 0;
		if (SendSize--)   //SendSize--和--SendSize效果一样
		{
			CommSendBufferHead++; 	
			if (CommSendBufferHead==DB_SENDMAXSIZE)
			{	 
				CommSendBufferHead=0;
				SendbufferOver = 1;
			}
			else
			{	
				SBUF0=CommSendBuffer[CommSendBufferHead];
			} 
		}
	
		else
		{
			SendbufferOver = 1;
		}
	}
	if (RI0 == 1)	
	{	 
		RI0 = 0;
		if (CommRecBufferTail==CommRecBufferHead)
		{
			CommRecDataOverflowFlag=1;				//接收缓冲区溢出
		}
		CommRecBuffer[CommRecBufferTail]=SBUF0;     //receive data           
	    CommRecBufferTail++;
	    if (CommRecBufferTail==DB_RECMAXSIZE)
	    {
	    	CommRecBufferTail=0;
	    }
		FlagRecComm=1;
   	}
}
//-----------------------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------------------

⌨️ 快捷键说明

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