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

📄 rs232.c

📁 一个完整的用用AVR单片机开发的电话交换机程序 希望对想学习AVR开发人有帮助
💻 C
字号:
/***************************************************************************
//Actpro International (SZ) Ltd
//Project :
//File		:Rs232.c										Compiler:Keil
//Editor: LIUYI
//Data:		25-12-26										Ver:可设置定时器T1、T2来产生波特率
//General Function
	1、void	rs232loop();								//串口数据循环处理函数
	2、void	Rs232Init(); 								//串口初始化
	3、void	rs232write(char watch_data);//串口发送接口
	4、void  rs232receive();						//中断接收
*/

#include <switch.h>

#define		rs_rece_buff_length	0x20
#define		rs_send_buff_length 0x20

void	rs232loop();
void	Rs232Init(); 
void	rs232write(UCHAR watch_data);
UCHAR ReadCCR(UCHAR item);
void	WriteCCR(UCHAR item,UCHAR num);
UCHAR ReadCCS(UCHAR item);
void	WriteCCS(UCHAR item,UCHAR num);
UCHAR ReadSYSTEM(UCHAR item);
void	WriteSYSTEM(UCHAR item,UCHAR num);
void	CCSInit();
void	CCRInit();

xdata	UCHAR			rs_rece_buff_readptr							_at_ 0x100;
xdata	UCHAR			rs_rece_buff_writerptr						_at_ 0x101;
xdata	UCHAR			rs_rece_buff[rs_rece_buff_length]	_at_ 0x120;

bit			    	  rs_send_wait_flag;
xdata	UCHAR		  rs_send_buff_writeptr							_at_ 0x102;
xdata	UCHAR			rs_send_buff_readptr							_at_ 0x103;
xdata	UCHAR			rs_send_buff[rs_send_buff_length] _at_ 0x140;

#define					CCS_step			8
#define					CCS_type			7
#define					CCS_command		6
#define					CCS_data5			5
#define					CCS_data4			4
#define					CCS_data3			3
#define					CCS_data2			2
#define					CCS_data1			1
#define					CCS_data0			0
xdata	UCHAR			CCS[9]														_at_ 0x160;	//发送控制命令数组

#define					CCR_step			4
#define					CCR_type			3
#define					CCR_command		2
#define					CCR_data1			1
#define					CCR_data0			0
xdata	UCHAR			CCR[5]														_at_ 0x170;	//接收控制命令数组

xdata	UCHAR			SYSTEM_PARAMETER[20]							_at_ 0x180;

/*
xdata UCHAR			test_step			_at_ 0x104;		
xdata UCHAR			test_step2		_at_ 0x105;		
xdata UCHAR			test_step3		_at_ 0x106;	
xdata UCHAR			test_step4		_at_ 0x107;								
xdata UCHAR			test_temp			_at_ 0x108;
xdata UCHAR			test_temp2		_at_ 0x109;
xdata UCHAR			test_temp3		_at_ 0x10A;
xdata UCHAR			test_temp4		_at_ 0x10B;
xdata UCHAR			test_step5		_at_ 0x10c;
xdata UCHAR			test_temp5		_at_ 0x10d;
*/
void	Rs232Init()
{
	idata UCHAR i;
	
	SCON=SCON|0x50;	    //串口工作与方式一
	PCON=PCON|0x80;	    //波特率倍频
	
#ifdef	BoradRateUse_T2
  //使用T2产生波特率
  T2CON=0X30;
	T2MOD=0;
	RCAP2H=ProfitRate_T2>>8;
	RCAP2L=ProfitRate_T2;				//DE;
	TR2=1;			//启动波特率发生器
	
#else
  //使用T1产生波特率	
	TMOD=TMOD|0x20;	    //T1为波特率发生器,工作于方式二	
	TH1=ProfitRate_T1;	      		//12M晶振,2400B/S
	TL1=ProfitRate_T1;	
  TR1=1;		      		//启动T1		
#endif

	PORT_STORE=PORT;
	RCON=RCON_Bank1;
	rs_rece_buff_readptr=0;
	rs_rece_buff_writerptr=0;
	rs_send_wait_flag=0;
	rs_send_buff_writeptr=0;
	rs_send_buff_readptr=0;

	for(i=0;i<rs_rece_buff_length;i++)
		{rs_rece_buff[i]=0;}
	for(i=0;i<rs_send_buff_length;i++)
		{rs_send_buff[i]=0;}
		
	PORT=PORT_STORE;
		
	ES=1;	  
	CCSInit();
	CCRInit();
}

void	rs232receive() interrupt 4
{
	if(TI)
		{
			TI=0; 
			rs_send_wait_flag=0;
		}
	if(RI)
		{
			RI=0;
			PORT_STORE=PORT;
			RCON=RCON_Bank1;
			rs_rece_buff[rs_rece_buff_writerptr]=SBUF;
			rs_rece_buff_writerptr++;
			if(rs_rece_buff_writerptr>=rs_rece_buff_length){rs_rece_buff_writerptr=0;}
			
			PORT=PORT_STORE;
		}
}

void	rs232loop()
{
	idata UCHAR	temp,i,j;
	if(rs_send_buff_readptr!=rs_send_buff_writeptr)
		{//发送处理
			if(!rs_send_wait_flag)
				{
					PORT_STORE=PORT;
					RCON=RCON_Bank1;
					
					SBUF=rs_send_buff[rs_send_buff_readptr];
					rs_send_wait_flag=1;
					
					rs_send_buff_readptr++;
					if(rs_send_buff_readptr>=rs_send_buff_length){rs_send_buff_readptr=0;}
					
					PORT=PORT_STORE;
				}
		}

	if(rs_rece_buff_readptr!=rs_rece_buff_writerptr)
		{//接收数据处理
			PORT_STORE=PORT;
			RCON=RCON_Bank1;
			
			temp=rs_rece_buff[rs_rece_buff_readptr];
			
			rs_rece_buff_readptr++;
			if(rs_rece_buff_readptr>=rs_rece_buff_length){rs_rece_buff_readptr=0;}
			
			PORT=PORT_STORE;			
			
			//在此处添加接收数据处理函数****************	
			//rs232write(temp);		
	if(ReadCCR(CCR_step)==0)
		{
			if(temp==0xD0)
				{//查询状态
					if(ReadSYSTEM(sp_SystemState)==c_SS_none)
						{//交换机空闲状态
							rs232write(0x21);
							WriteCCR(CCR_step,0);
							return;
						}
					if(ReadSYSTEM(sp_SystemState)==c_SS_intoautosystem)			
						{//进入智能控制系统 (动作)
							rs232write(0x03);
												
							WriteCCR(CCR_step,0);
							return;	
						}	
					if(ReadSYSTEM(sp_SystemState)==c_SS_inautosystem)
						{//处于智能控制系统
							rs232write(0x04);
							WriteCCR(CCR_step,0);
							return;
						}									
				}
		if(temp==0xD1)
			{//电话铃声
					rs232write(temp);
					WriteCCR(CCR_step,1);
					return;
			}
		if(temp==0xd2)
			{//退出智能家居
				
				WriteCCR(CCR_step,0);
				return;
			}
		if(temp==0xd3)
			{//智能家居已准备好							
				if(ReadSYSTEM(sp_SystemState)==c_SS_intoautosystem)	
					{
						WriteSYSTEM(sp_SystemState,c_SS_inautosystem);	//系统由进入状态转变为处于智能系统控制状态
					}
				rs232write(0xff);	
				WriteCCR(CCR_step,0);
				return;
			}			
		if(temp==0xd4)
			{//智能家居未准备好
				
				WriteCCR(CCR_step,0);
				return;
			}		
		if(temp==0xd5)
			{//APBUS抢险
				
				WriteCCR(CCR_step,0);
				return;
			}
				
		if(temp==0xde)//用于系统检测 语音通道
			{
				for(i=0;i<16;i++)
					{
						for(j=0;j<8;j++)
							{
								if(Readsoundway(i,j)!=0)
									{
										rs232write(0x12);
										rs232write(i);
										rs232write(j);
										rs232write(Readsoundway(i,j));
										rs232write(0x13);
									}
							}
					}					
			}
		if(temp==0xdf)//用于系统检测 分机状态
			{
				rs232write(ReadExtTelState(0));
				rs232write(ReadExtTelState(1));
				rs232write(ReadExtTelState(2));
				rs232write(ReadExtTelState(3));
				rs232write(ReadExtTelState(4));
				rs232write(ReadExtTelState(5));
				rs232write(ReadExtTelState(6));
				rs232write(ReadExtTelState(7));
			}						
		}
	if(ReadCCR(CCR_step)==1)
		{
			rs232write(temp);
			WriteCCR(CCR_step,2);
			return;					
		}
	if(ReadCCR(CCR_step)==2)
		{
			rs232write(temp);
			WriteCCR(CCR_step,0);
			
			temp=ReadCCR(CCR_data1);
			temp=(temp>>4)*10+((ReadCCR(CCR_data1)<<4)>>4);
			WriteSYSTEM(sp_TakeLineOutside,temp);	
			
			temp=ReadCCR(CCR_data0);
			temp=(temp>>4)*10+((ReadCCR(CCR_data0)<<4)>>4);						
			WriteSYSTEM(sp_TakeLineAtHome,temp);			
			
			return;					
		}	
		
	WriteCCR(CCR_step,0);	//防止出错
	return;																					
	}
}

void	rs232write(UCHAR watch_data)
{
	PORT_STORE=PORT;
	RCON=RCON_Bank1;
	
	rs_send_buff[rs_send_buff_writeptr]=watch_data;
	rs_send_buff_writeptr++;
	if(rs_send_buff_writeptr>=rs_send_buff_length){rs_send_buff_writeptr=0;}
	
	PORT=PORT_STORE;
}

void	CCSInit()
{
	idata	UCHAR	i;
	for(i=0;i<9;i++)
		{ReadCCS(i);WriteCCS(i,0);}
}		

void	CCRInit()
{
	idata	UCHAR	i;
	for(i=0;i<5;i++)
		{WriteCCR(i,0);}
}		



void	WriteSYSTEM(UCHAR item,UCHAR num)
{
	PORT_STORE=PORT;
	RCON=RCON_Bank1;
	
	SYSTEM_PARAMETER[item]=num;
	
	PORT=PORT_STORE;	
	return;
}
UCHAR ReadSYSTEM(UCHAR item)
{
	idata UCHAR temp;
	
	PORT_STORE=PORT;
	RCON=RCON_Bank1;
	
	temp=SYSTEM_PARAMETER[item];
	
	PORT=PORT_STORE;	
	return temp;	
}

void	WriteCCS(UCHAR item,UCHAR num)
{
	PORT_STORE=PORT;
	RCON=RCON_Bank1;
	
	CCS[item]=num;
	
	PORT=PORT_STORE;	
	return;
}
UCHAR ReadCCS(UCHAR item)
{
	idata UCHAR temp;
	
	PORT_STORE=PORT;
	RCON=RCON_Bank1;
	
	temp=CCS[item];
	
	PORT=PORT_STORE;	
	return temp;	
}

void	WriteCCR(UCHAR item,UCHAR num)
{
	PORT_STORE=PORT;
	RCON=RCON_Bank1;
	
	CCR[item]=num;
	
	PORT=PORT_STORE;	
	return;	
}
UCHAR ReadCCR(UCHAR item)
{
	idata UCHAR temp;
	
	PORT_STORE=PORT;
	RCON=RCON_Bank1;
	
	temp=CCR[item];
	
	PORT=PORT_STORE;	
	return temp;	
}
/*		
			if(temp==0xff){test_step=1;PORT=PORT_STORE;return;}
			if(test_step==1){test_temp=temp; test_step=2;PORT=PORT_STORE;return;}
			if(test_step==2){ConnectTowPoint(test_temp,temp);test_step=0;PORT=PORT_STORE;return;}
			
			if(temp==0xfe){test_step2=1;PORT=PORT_STORE;return;}
			if(test_step2==1){test_temp2=temp; test_step2=2;PORT=PORT_STORE;return;}
			if(test_step2==2){CutTowPoint(test_temp2,temp);test_step2=0;PORT=PORT_STORE;return;}
			
			if(temp==0xfd){test_step3=1;PORT=PORT_STORE;return;}
			if(test_step3==1){test_temp3=temp; test_step3=2;PORT=PORT_STORE;return;}
			if(test_step3==2){ConnectTowPoint_CD22100(test_temp3,temp);test_step3=0;PORT=PORT_STORE;return;}
			
			if(temp==0xfc){test_step4=1;PORT=PORT_STORE;return;}
			if(test_step4==1){test_temp4=temp; test_step4=2;PORT=PORT_STORE;return;}
			if(test_step4==2){CutTowPoint_CD22100(test_temp4,temp);test_step4=0;PORT=PORT_STORE;return;}		
			
			if(temp==0xfb){test_step5=1;PORT=PORT_STORE;return;}
			if(test_step5==1){test_temp5=temp; test_step5=2;PORT=PORT_STORE;return;}
			if(test_step5==2)
				{
					if(test_temp5==1){SetExtTelErrorSound(temp);}
					if(test_temp5==2){SetExtTelWaitSound(temp);}
					if(test_temp5==3){SetExtTelQuietSound(temp);}
					
					test_step5=0;PORT=PORT_STORE;return;
				}
			
			if(temp==0xf9){TakeOutsideLine(0);return;}
			if(temp==0xf8){HoldOutsideLine(0);return;}	
			if(temp==0xf7){TakeOutsideLine(1);return;}
			if(temp==0xf6){HoldOutsideLine(1);return;}
						
			if(temp<10){ExtTelRing(temp);}
			if((temp>0x0f)&(temp<0x1a)){ExtTelStopRing(temp-0x10);}
			if(temp==0xec){ResourceWatch();}
			if(temp==0xef){test();}
			if(temp==0xed){test2();}
*/

⌨️ 快捷键说明

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