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

📄 serial_int_3.c

📁 基于ARM的时钟中断程序
💻 C
字号:
//文件名:serial_int_3.c
//说明:中断法串口通讯程序
//可以使用串口调试助手测试
//编写:王晓荣
//日期:20080403
#include <REGX51.H>

#define  OUTBUF_LENGTH  20              //输出缓冲区大小
unsigned char  arOutbuf[OUTBUF_LENGTH]; //输出缓冲区
unsigned char *pOutlast = arOutbuf;     //输出缓冲区中已发送数据位置指针            
unsigned char *pPutlast = arOutbuf;     //输出缓冲区中已存放数据位置指针

#define  INBUF_LENGTH   20              //输入缓冲区大小 
unsigned char arInbuf[INBUF_LENGTH];    //输入缓冲区    
unsigned char *inlast  = arInbuf;       //输入缓冲区中已接收数据位置指针
unsigned char *getlast = arInbuf;       //输入缓冲区中已读取数据位置指针 
                 
bit   sendFlg;   		//一组数据的启动发送标志
bit   outbufEmptyFlg;   //输出缓冲区空标志              
bit   inbufEmptyFlg;    //输入缓冲区空标志
bit   inbufFullFlg;     //输入缓冲区满标志

putbyte(char c);	                     //存一个字节到输出缓冲区
putbytes(unsigned char *,unsigned char); //存多个字节到输出缓冲区
putstring(unsigned char *);	             //存字符串到输出缓冲区
unsigned char getbyte ();						//从输入缓冲区中读取一个字节数据
void getbytes (unsigned char *, unsigned char);	//从输入缓冲区中读取多个字节数据
void getstring (unsigned char *, unsigned char);//从输入缓冲区中读取字符串
//////////////////////////////////////////////////////////////////////////////////////////

//测试用主函数  
void main( )
{
	//unsigned char i;
	unsigned char free[20];
	sendFlg = 1;              //一组数据的启动发送标志
	outbufEmptyFlg = 1;       //输出缓冲区空              
	inbufEmptyFlg = 1;        //输入缓冲区空
	serial_init ();
	IE = 0X90;
	//for(i = 0; i < 10; i ++)
		//free[i] = i + 0x30;	
	//getstring(free, 10);
	//putstring(free);
	//putbytes(free,10);
	//getbytes(free, 10);
	//putbytes(free);	
	getstring(free, 10);
	putstring(free);
	putstring("ready!");	
	while(1);
}///////////////////////////////////////////////////////////////////////////////////                                   

  
//存一个字节到输出缓冲区
putbyte(char c)       
{  	                    
	//等待,防止写入数据时发生套圈现象
	while ((pOutlast == pPutlast + 2) || 
		   (OUTBUF_LENGTH + pOutlast == pPutlast + 2));	
	ES=0;                     //暂停串行中断
    *pPutlast = c;            //存数据
     pPutlast ++;             //已存放数据位置指针调整	 
    if (pPutlast == arOutbuf + OUTBUF_LENGTH)  
		pPutlast = arOutbuf;  //指针到了顶部换到底部
    outbufEmptyFlg = 0;	      //输出缓冲区标志为非空
    if (sendFlg)              //如果是第1个数据,启动发送
	{
		sendFlg = 0;
		TI = 1;               //启动发送  
	}  
    ES = 1;
}///////////////////////////////////////////////////////////////////////


//存多个字节到输出缓冲区
putbytes(unsigned char *pOutput,unsigned char length) 
{ 	
	unsigned char i;
	for(i = 0; i < length; i++)
	{
		putbyte(*pOutput);
	 	pOutput ++;
	}
}//////////////////////////////////////////////////////////// 


//存字符串到输出缓冲区
putstring(unsigned char  *pString)
{
	for (;*pString != 0; pString++)   //遇到停止符0结束
		putbyte(*pString);
}//////////////////////////////////////////////////////////

//从输入缓冲区中读取一个字节数据
unsigned char getbyte ()      
{ 
	unsigned char ch ;
	while (inbufEmptyFlg);   //如果缓冲区空,则等待
	ES = 0;  
	ch = *getlast;           //读取输入缓冲区数据 
	getlast ++;              //调整已读取数据位置指针
	inbufFullFlg = 0;        //输入缓冲区未满 	  
	if (getlast == arInbuf + INBUF_LENGTH) 
		getlast = arInbuf;	 //地址到顶部回到底部	
	if (getlast == inlast) 	 //如果缓冲区数据已读取完 
		inbufEmptyFlg = 1;       
	ES = 1;
	return (ch);             //取回数据
}//////////////////////////////////////////////////////////////////////////////////

//从输入缓冲区中读取多个字节数据
//参数         接收数据存放位置,   接收数据长度   
void getbytes (unsigned char *pline, unsigned char length)  
{
	unsigned char i;
	for(i = 0; i < length; i++)
	{
		*pline = getbyte ();                 
		pline ++;	 	
	} 		
}/////////////////////////////////////////////////////////////////////////

//从输入缓冲区中读取字符串
//参数         接收数据存放位置,   接收数据长度   
void getstring (unsigned char *pline, unsigned char length)  
{ 
	unsigned char i;
	for(i = 0; i < length; i++)
	{
		*pline = getbyte (); 
		if( *pline == 0x00)
			break;               
		pline ++;	 	
	} 
	*pline = 0x00;     //加上停止符0
}/////////////////////////////////////////////////////////////////////////

//串口中断处理
serial () interrupt 4 
{   
	if (TI ) 
    { 	
		TI = 0;  
    	if (!outbufEmptyFlg)              
    	{
			SBUF = *pOutlast;         //未发送完继续发送
	    	pOutlast++ ;              //最后传出去的字节位置加一
    		if (pOutlast == arOutbuf + OUTBUF_LENGTH) 
				pOutlast = arOutbuf;  //地址到顶部回到底部
    		if (pPutlast == pOutlast) 
				outbufEmptyFlg = 1;   //数据发送完置发送缓冲区空标志                    
     	} 
   	    else 
			sendFlg = 1;
    }
    if (RI)  
    {  
		RI = 0;	
    	if(!inbufFullFlg)
    	{
	    	*inlast = SBUF;           //放入数据            
	    	inlast ++;                //最后放入的位置加一 
	        inbufEmptyFlg = 0; 		  //输入缓冲区非空
	    	if (inlast == arInbuf + INBUF_LENGTH) 
				inlast = arInbuf;     //地址到顶部回到底部
	    	if (inlast == getlast)	
				inbufFullFlg = 1;     //输入缓冲区满	    	  
    	}
    }
}//////////////////////////////////////////////////////////////////////////////////

//串口初始化                
serial_init ()  
{
	TMOD = 0x20;			
	TH1 = 256 - 12; //1.5: 波特率19200; 3: 波特率9600; 6:波特率4800; 12:波特率2400   
	TL1 = 256 - 12;	
	SCON = 0x50;	//工作方式1		 
	PCON &= 0xef;	// 波特率不倍增					
	TR1 = 1;
}//////////////////////////////////////////////////////////////////////////////////





⌨️ 快捷键说明

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