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

📄 pio.c

📁 基于80C51F020的16路开关量两路模拟量控制通用程序
💻 C
📖 第 1 页 / 共 2 页
字号:
{
	if(TI0)
	{
		TI0=0;
		TEST=~TEST;
		if(++AnsPoint0<=7)
		{
			SBUF0=TXsave0[AnsPoint0];
		}
    }
	if(RI0)
	{
		RI0=0;
		TEST=~TEST;
		ConTime02=0;
		if(!ComInfoAvalible0)
		{
			if (SBUF0==SOIofAnalog)
			{
			    CommoIni0();
				RXstatus0=StartCom;
			}
			switch( RXstatus0)
			{
				case NunCom:
					break;
				case StartCom:
					if (SBUF0!=EOIofAnalog)
					{
						RXsave0[PCom0]=SBUF0;
						if(++PCom0>maxCom-1)
						{
							CommoIni0();
							RXstatus0=NunCom;	
						}
					}
					else
					{
						RXstatus0=NunCom;
						ComInfoAvalible0=1;		//when com completed,the PCom point to the EOI
					}
					break;
			}
		}
	}
}
//------------------------------------------------------------------------------------
// 串口1中断服务例程(用于DIO通讯)
//------------------------------------------------------------------------------------
void UART1_ISR (void) interrupt 20
{
	if ((SCON1&0x02)==0x02)		       	//if TI1=1
	{
		SCON1 &= 0xfd;		       		//TI1=0
		TEST=~TEST;
		if(Send1LastBit)
		{
			Send1Complete=1;
		}
		if (Send1Complete==0)
		{
			SBUF1=TXsave1[++AnsPoint1];
			if(TXsave1[AnsPoint1]==0x0D)
			{
				Send1LastBit=1;
			}
		}
	}
	if ((SCON1&0x01)==0x01)		       	//if RI1=1
	{
		SCON1 &= 0xfe;		       		//RI1=0
		TEST=~TEST;
		ConTime12=0;
		if(!ComInfoAvalible1)
		{
			if ((SBUF1==SOIofDigitalChk)|(SBUF1==SOIofDigitalCon))
			{
			    CommoIni1();
				RXstatus1=StartCom;
			}
			switch( RXstatus1)
			{
				case NunCom:
					break;
				case StartCom:
					if (SBUF1!=EOIofDigital)
					{
						RXsave1[PCom1]=SBUF1;
						if(++PCom1>maxCom-1)
						{
							CommoIni1();
							RXstatus1=NunCom;	
						}
					}
					else
					{
						RXstatus1=NunCom;
						ComInfoAvalible1=1;		//when com completed,the PCom point to the EOI
					}
					break;
			}
		}

   	}
}
//-----------------------------------------------------------------------------
// ADC0中断服务例程
//-----------------------------------------------------------------------------
void ADC0_ISR (void) interrupt 15  using 3
{
	unsigned int tempt;
	AD0INT = 0;                         // clear ADC0 conversion complete indicator
	tempt=ADC0/8;
	TXsave0[6]=0x30+tempt%10;
	tempt=tempt/10;
	TXsave0[5]=0x30+tempt%10;
	tempt=tempt/10;
	TXsave0[3]=0x30+tempt%10;
	tempt=tempt/10;
	TXsave0[2]=0x30+tempt%10;
	AnsPoint0=0;
	SBUF0=TXsave0[AnsPoint0];
}
//--------------------------------------------------------------------
//AIO 通讯参数初始化
//--------------------------------------------------------------------
void CommoIni0(void)
{
	ComInfoAvalible0=0;
	PCom0=0;
}
//--------------------------------------------------------------------
//DIO 通讯参数初始化
//--------------------------------------------------------------------
void CommoIni1(void)
{
	ComInfoAvalible1=0;
	PCom1=0;
}
//--------------------------------------------------------------------
//启动ADC0采样通道0
//--------------------------------------------------------------------
void SendAD0(void)
{
	while (AD0BUSY)
   	{
   	}
	ADC0CF &= ~0x07;                    // PGA gain = 1
	AMX0SL = 0x00;                      // Select AIN0 as ADC mux output
	AD0BUSY = 1;						//Start the ADC0
}
//--------------------------------------------------------------------
//启动ADC0采样通道2
//--------------------------------------------------------------------
void SendAD1(void)
{
	while (AD0BUSY)
   	{
   	}
	ADC0CF &= ~0x07;                    // PGA gain = 1
	AMX0SL = 0x02;                      // Select AIN2 as ADC mux output
	AD0BUSY = 1;						//Start the ADC0
}
//--------------------------------------------------------------------
//DIO输出变换
//输入:欲输出对应值
//--------------------------------------------------------------------
void IOoutChange(unsigned char OutChar)
{
	unsigned char tempt;
	tempt=0;
	if (OutChar & 0x01 )
	{
		tempt |=0x01;
	}
	if (OutChar & 0x02)
	{
		tempt |=0x04;
	}
	if (OutChar & 0x04)
	{
		tempt |=0x80;
	}
	if (OutChar & 0x08)
	{
		tempt |=0x40;
	}
	if (OutChar & 0x10)
	{
		tempt |=0x02;
	}
	if (OutChar & 0x20)
	{
		tempt |=0x08;
	}
	if (OutChar & 0x40)
	{
		tempt |=0x10;
	}
	if (OutChar & 0x80)
	{
		tempt |=0x20;
	}
	OutBackUp=tempt;
	P2=OutBackUp;
}
//--------------------------------------------------------------------
//DIO输入采样(2.56ms间隔)
//--------------------------------------------------------------------
void IOinSample(void)
{
	if (P7 & 0x20)     //P7.5 <->L9
	{
		In0Sum++;
	}
	else
	{
		In0Sum--;
	}
	if (P7 & 0x80)     //P7.7 <->L10
	{
		In1Sum++;
	}
	else
	{
		In1Sum--;
	}
	if (P3 & 0x20)     //P3.5 <->L11
	{
		In2Sum++;
	}
	else
	{
		In2Sum--;
	}
	if (P3 & 0x80)     //P3.7 <->L12
	{
		In3Sum++;
	}
	else
	{
		In3Sum--;
	}
	if (P7 & 0x10)     //P7.4 <->L13
	{
		In4Sum++;
	}
	else
	{
		In4Sum--;
	}
	if (P7 & 0x40)     //P7.6 <->L14
	{
		In5Sum++;
	}
	else
	{
		In5Sum--;
	}
	if (P3 & 0x10)     //P3.4 <->L15
	{
		In6Sum++;
	}
	else
	{
		In6Sum--;
	}
	if (P3 & 0x40)     //P3.6 <->L16
	{
		In7Sum++;
	}
	else
	{
		In7Sum--;
	}
}
//--------------------------------------------------------------------
//DIO输入变换
//--------------------------------------------------------------------
void IOinChange(void)
{
	if (In0Sum>(128+InSampleSetTimes-10))     //P7.5 <->L9
	{
		InBackUp |=0x01;
	}
	if (In0Sum<(128-InSampleSetTimes+10))
	{
		InBackUp &=~0x01;
	}
	if (In1Sum>(128+InSampleSetTimes-10))     //P7.7 <->L10
	{
		InBackUp |=0x02;
	}
	if (In1Sum<(128-InSampleSetTimes+10))
	{
		InBackUp &=~0x02;
	}
	if (In2Sum>(128+InSampleSetTimes-10))     //P3.5 <->L11
	{
		InBackUp |=0x04;
	}
	if (In2Sum<(128-InSampleSetTimes+10))
	{
		InBackUp &=~0x04;
	}
	if (In3Sum>(128+InSampleSetTimes-10))     //P3.7 <->L12
	{
		InBackUp |=0x08;
	}
	if (In3Sum<(128-InSampleSetTimes+10))
	{
		InBackUp &=~0x08;
	}
	if (In4Sum>(128+InSampleSetTimes-10))     //P7.4 <->L13
	{
		InBackUp |=0x10;
	}
	if (In4Sum<(128-InSampleSetTimes+10))
	{
		InBackUp &=~0x10;
	}
	if (In5Sum>(128+InSampleSetTimes-10))     //P7.6 <->L14
	{
		InBackUp |=0x20;
	}
	if (In5Sum<(128-InSampleSetTimes+10))
	{
		InBackUp &=~0x20;
	}
	if (In6Sum>(128+InSampleSetTimes-10))     //P3.4 <->L15
	{
		InBackUp |=0x40;
	}
	if (In6Sum<(128-InSampleSetTimes+10))
	{
		InBackUp &=~0x40;
	}
	if (In7Sum>(128+InSampleSetTimes-10))     //P3.6 <->L16
	{
		InBackUp |=0x80;
	}
	if (In7Sum<(128-InSampleSetTimes+10))
	{
		InBackUp &=~0x80;
	}
	In0Sum=128;
	In1Sum=128;
	In2Sum=128;
	In3Sum=128;
	In4Sum=128;
	In5Sum=128;
	In6Sum=128;
	In7Sum=128;
}
//--------------------------------------------------------------------
//DIO设置值BCD到二进制变换
//输入:两位BCD码
//输出:对应十六进制值
//--------------------------------------------------------------------
unsigned char IOsetChange(unsigned char a,unsigned char b)
{
	unsigned char temptChar1;
	unsigned char temptChar2;
	if (a>0x39)
	{
		if (a>0x46)
		{
			temptChar1=a-0x57;		//a~f
		}
		else
		{
			temptChar1=a-0x37;		//A~F
		}
	}
	else
	{
		temptChar1=a-0x30;			//0~9	
	}
	if ((0x0f-temptChar1)>9)
	{
		infoBackH = (0x0f-temptChar1)-10+0x41;
	}
	else
	{
		infoBackH = (0x0f-temptChar1)+0x30;
	}
	if (b>0x39)
	{
		if (b>0x46)
		{
			temptChar2=b-0x57;		//a~f	
		}
		else
		{
			temptChar2=b-0x37;		//A~F
		}
	}
	else
	{
		temptChar2=b-0x30;			//0~9	
	}
	if ((0x0f-temptChar2)>9)
	{
		infoBackL = (0x0f-temptChar2)-10+0x41;
	}
	else
	{
		infoBackL = (0x0f-temptChar2)+0x30;
	}
	return((temptChar1<<4)+temptChar2);
}
//--------------------------------------------------------------------
//十六进制到ASCII变换
//输入:十六进制值
//输出:对应ASCII码
//--------------------------------------------------------------------
unsigned int getASCIIfromHEX(unsigned char hexvalue)
{
	unsigned char temptvalueL,temptvalueH;
	temptvalueL=hexvalue&0x0f;
	if (temptvalueL>9)
	{
		temptvalueL=temptvalueL+0x37;
	}	
	else
	{
		temptvalueL=temptvalueL+0x30;
	}
	temptvalueH=(hexvalue&0xf0)>>4;
	if (temptvalueH>9)
	{
		temptvalueH=temptvalueH+0x37;
	}	
	else
	{
		temptvalueH=temptvalueH+0x30;
	}
	return((temptvalueH<<8)+temptvalueL);
}
//--------------------------------------------------------------------
// 输入:无
// 输出:无
// 功能:保护程序被非法读出
//---------------------------------------------------------------------
void FlashProtect(void)
{
	unsigned char xdata *pwrite; 	// pointer in CODE space
	FLSCL = 0x81;
	PSCTL = 0x01;	
	pwrite=0xfdff;
	*pwrite=0x80;	
	FLSCL = 0x80;
	PSCTL = 0x04;
}
//--------------------------------------------------------------------
//主程序初始化例程
//--------------------------------------------------------------------
void MainIni(void)
{
	PCom0=0;
	PCom1=0;
	AnsPoint0=0;
	AnsPoint1=0;
	ComInfoAvalible0=0;
	ComInfoAvalible1=0;
	RXstatus0=NunCom;
	RXstatus1=NunCom;

	ConTime00=0;
	ConTime01=0;
	ConTime02=0;
	ConTime10=0;
	ConTime11=0;
	ConTime12=0;

	Send1Complete=1;
	Send1LastBit=0;
	
	TXsave0[0]='>';
	TXsave0[1]='+';
	TXsave0[4]='.';
	TXsave0[7]=0x0D;
	WorkStatus=Sta0;
	InSampleCon=0;

	infoBackL = 0xF;
	infoBackH = 0xF;
}
//--------------------------------------------------------------------
//延时例程
//--------------------------------------------------------------------
void delay(unsigned char n)
{
	unsigned char t;
	while (!(n==0))
	{
		t=200;
		n--;
		while(!(t==0))
		{
			t--;
		}
	}
}

⌨️ 快捷键说明

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