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

📄 easy2416.c

📁 嵌入式PLC,基于8051F020,在KEIL上开发,可实现自定义PLC功能
💻 C
字号:
/*****************************************************************************
						EASY2416外围接口驱动程序
							编译软件:KEILC51
							编写:科威自控
							时间:2005/06/22
						    
*****************************************************************************/
#include	"user_datac.h"

/*****************************************************************************					
				用户端口初始化
*****************************************************************************/
void	init_configc()
{
	SFRPAGE=0x0f;
	P3MDOUT=0x0ff;
	P2MDOUT=0x0ff;
	P1MDOUT=0xff;
	P4MDOUT=0x0f|P4MDOUT;
	P0MDOUT=P0MDOUT|0x80;
	P0MDOUT=P0MDOUT|0x04;	
}

/*****************************************************************************						
				用户上电初始化
*****************************************************************************/
void	init_startc()
{
	Ram_py[0]=0;
	Ram_py[1]=0;
	Input_cnt=8;
}

/*****************************************************************************						
				用户运行初始化
*****************************************************************************/
void	init_runc()
{
	;
}

/*****************************************************************************						
				用户设置初始化
*****************************************************************************/
void	init_setc()
{
	;
}

/*****************************************************************************						
				指令周期扫描
*****************************************************************************/
void	stepc()
{
	;
}
/*****************************************************************************
			 内核2.5ms中断程序调用的函数
*****************************************************************************/
void	tmsc()	using	REGBANK//选用0组寄存器.
{	
	uint8 xdata len[8];
	len[0]=cpye_reg[0];//将工作寄存器0组保存
	len[1]=cpye_reg[1];
	len[2]=cpye_reg[2];
	len[3]=cpye_reg[3];
	len[4]=cpye_reg[4];
	len[5]=cpye_reg[5];
	len[6]=cpye_reg[6];
	len[7]=cpye_reg[7];
	user_display(Xlamp);//刷新显示
	if(Input_cnt-- >0)		
	{
		if(Input_cnt > 7)	Input_cnt=7;					
		user_sampl(Input_cnt,Xinput);// 输入采样		
		P1MDOUT=0xff;
	}
	SFRPAGE=0x0f;
	user_out(Xoutput);	// 输出刷新
	cpye_reg[0]=len[0];//恢复工作寄存器的值.
	cpye_reg[1]=len[1];
	cpye_reg[2]=len[2];
	cpye_reg[3]=len[3];
	cpye_reg[4]=len[4];
	cpye_reg[5]=len[5];
	cpye_reg[6]=len[6];
	cpye_reg[7]=len[7];
}

/*****************************************************************************
						指令周期扫描SCAN
*****************************************************************************/
void	scanc()	
{
	if(Input_cnt <= 0)	
	{
		user_scan_i(Ram_px);//输入值滤波
		Input_cnt=8;
	}
	user_scan_o(Xoutput,Ram_py);//求输出刷新值
	user_scan_lamp();//显示赋值;
	user_scan_signal();//ERR,RUN指示灯赋值.	
}

/************************输出刷新******************************/
void	put_delay()
{
	nop;
	nop;
	nop;
}
void	user_out(uint8 xdata	*point)	
{
	P_g1u7=1;
	P_g1u6=1;
	P1=point[0];
	P4=P4|0x01;
	P_dir1u8=1;
	P4=P4|0x04;
	put_delay();
	P4=P4&0xfb;

	P1=Xoutput[1];
	P4=P4|0x02;
	put_delay();
	P4=P4&0xfd;
	nop;
	nop;
	P_dir1u8=0;
}
/*****************输入采样********************/
//每组输入信号采样8次.
void	user_sampl(uint8 count,uint8 xdata *point)
{
	SFRPAGE=0x0f;
	P1MDOUT=0;
	P1=0xff;
	P_dir1u8=0;
	nop;
	nop;
	nop;
	P_g1u7=0;
	put_delay();
	point[count]=P1;
	P_g1u7=1;
	nop;
	nop;
	nop;
	P_g1u6=0;
	put_delay();
	count+=8;
	point[count]=P1;
	P_g1u6=1;

	P_g1u10=0;
	put_delay();
	count+=8;
	point[count]=P1;
	P_g1u10=1;	
}

/****************刷新显示*********************/
void	user_display(uint8 xdata *point)//
{
	static	uint8	code	chip_elect[5]={4,1,2,0x10,8};//片选值	
	static	uint8	Dislamp_cnt=0;//片选序号
	if(Dislamp_cnt++ >4)	Dislamp_cnt=0;	
	P3=P3&0xe0;
	P2=~(point[Dislamp_cnt]);
	P3=P3|chip_elect[Dislamp_cnt];
}

/************************输入值滤波******************************/

void	change_i0()
{
	cb10=cb2;
	cb11=cb3;
	cb12=cb0;
	cb13=cb1;
	cb14=cb5;
	cb15=cb4;
	cb16=cb7;
	cb17=cb6;
}

void	change_i1()
{
	cb10=cb5;
	cb11=cb4;
	cb12=cb7;
	cb13=cb6;
	cb14=cb1;
	cb15=cb0;
	cb16=cb3;
	cb17=cb2;
}

void	change_i2()
{
	cb10=cb1;
	cb11=cb0;
	cb12=cb3;
	cb13=cb2;
	cb14=cb5;
	cb15=cb4;
	cb16=cb7;
	cb17=cb6;
}

bit		user_scan_ls(uint8	xdata	*p)
{
	bit	sign=1;
	uint8	num;
	for(num=0;num<7;num++)
	{
		if(p[num]!=p[num+1])
		{
			num=8;
			sign=0;			
		}		
	}
	return	sign;
}
//8次采样值完全相同才能确定.
void	user_scan_i(uint8 xdata *point)//输入值滤波
{	
	if(user_scan_ls(Xinput))
	{
		Change_bit=Xinput[0];
		Change_bit1=0;
		change_i0();
		point[1]=Change_bit1;
	}
	if(user_scan_ls(&Xinput[8]))
	{
		Change_bit=Xinput[8];
		Change_bit1=0;
		change_i1();
		point[0]=Change_bit1;
	}
	if(user_scan_ls(&Xinput[16]))
	{
		Change_bit=Xinput[16];
		Change_bit1=0;
		change_i2();
		point[3]=Change_bit1;
	}	
}

/*****************求输出刷新

⌨️ 快捷键说明

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