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

📄 serial.c

📁 本人写的测试CS5530芯片代码,大部分功能和CS5532相同
💻 C
字号:
#include "Serial.h"
#include "STC89C51RC_RD_PLUS.H"
//串口中断服务程序,仅需做简单调用即可完成串口输入输出的处理
//出入均设有缓冲区,大小可任意设置。
//可供使用的函数名:
//char getbyte(void);从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。
//************************************************************************* 
bit m_bSendEnd = 0;
#define  ILEN  30                     /* size of serial receiving buffer */
xdata   unsigned char  inbuf[ILEN]; 
xdata uchar xdata *inlast=inbuf;  //最后由中断进入接收缓冲区的字节位置
xdata uchar xdata *getlast=inbuf;  //最后取走的字节位置
bit   inbufsign;      //接收缓冲区非空标志   有=1
bit   inbufful;       //输入缓冲区满标志  满=1

//#define StateIO StateIO_3
//#define bSerialRSLed bSerialRSLed_3
//char bdata StateIO _at_ 0x20;
//sbit bSerialRSLed = StateIO^5;

//串口初始化 晶振为11.0592M 方式1 波特率300-57600
void InitCom(uchar BaudRate)
{
	uchar THTL;
	switch (BaudRate)
	{
	case 1: THTL = 64; break; //波特率300
	case 2: THTL = 160; break; //600
	case 3: THTL = 208; break; //1200
	case 4: THTL = 232; break; //2400
	case 5: THTL = 244; break; //4800
	case 6: THTL = 250; break; //9600
	case 7: THTL = 253; break; //19200
	case 8: THTL = 255; break; //57600
	default: THTL = 208;
	}
	
	SCON = 0x50; //串口方式1,允许接收
	TMOD |= 0x20; //定时器1定时方式2
	TCON |= 0x40; //设定时器1开始计数 
	TH1 = THTL;
	TL1 = THTL;
	PCON = 0x80; //波特率加倍控制,SMOD位
	RI = 0; //清收发标志
	TI = 0;
	TR1 = 1; //启动定时器
	ES = 1;
}

//串口发送
void Send(uchar sdata)
{
	//bSerialRSLed = 1;
	SBUF = sdata;
	m_bSendEnd = 1;
	while(m_bSendEnd){};
}

bit SerialCheck()
{
	return inbufsign;
}
//从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。
uchar Getbyte (void)      
{ 
	char idata c ;
	while (!inbufsign);     //缓冲区空等待
	ES=0;  
	c= *getlast;            //取数据 
	getlast++;              //最后取走的数据位置加一
	inbufful=0;            //输入缓冲区的满标志清零   
	if (getlast==inbuf+ILEN) getlast=inbuf; //地址到顶部回到底部
	if (getlast==inlast) inbufsign=0;       //地址相等置接收缓冲区空空标志,再取数前要检该标志
	ES=1;
	return (c);        //取回数据
}

//****************************
void putinbuf(uchar c)
{
	ES=0;	
	if(!inbufful)
 	{
     	*inlast= c;            //放入数据            
    	inlast++;                    //最后放入的位置加一  
    	if (inlast==inbuf+ILEN) inlast=inbuf;//地址到顶部回到底部
    	if (inlast==getlast)	inbufful=1;  //接收缓冲区满置满标志
    	inbufsign=1;     
	}
	ES=1;
}

xdata unsigned long IspReset = 0;
//串行中断程序
void int_s(void) interrupt 4 {
	if (TI ) 
    {
    	TI = m_bSendEnd = 0;
    }
    if (RI)  
    {  
		//bSerialRSLed = 1;
		RI = 0;	
		//---ISP重启
		if(SBUF == 0x12)
		{
			IspReset = 0;
		}
		IspReset += SBUF;
		if(SBUF == 0x78&&IspReset == 0x114)
		{
			unsigned long	j;
			for(j=0;j<60000;j++);for(j=0;j<60000;j++);
			ISP_CONTR = 0x60;
		}
		//-----------------------------------------------
    	if(!inbufful)
    	{
			*inlast= SBUF;            //放入数据
	    	inlast++;                    //最后放入的位置加一 
	        inbufsign=1; 
	    	if (inlast==inbuf+ILEN) inlast=inbuf;//地址到顶部回到底部
	    	if (inlast==getlast)	inbufful=1;  //接收缓冲区满置满标志
    	}
    }
}

⌨️ 快捷键说明

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