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

📄 mywinch.c

📁 一种深度和拉力测量系统
💻 C
📖 第 1 页 / 共 4 页
字号:
	AD_CYC = Alarm_Time;
	Prog_Time = (unsigned long)SMU*65536*256 + 
	       	  	 (unsigned long)SMV*65536 + 
	       		 (unsigned long)SMH*256 + 
	       		 (unsigned long)SML;

	Prog_Time=Prog_Time+time.l;
	return;
}

void ADtemp(void)
{
		TRISD = 0x00;
        lcdnum = depth.u;
		lcdnum = lcdnum*10/n.i[1];
	    format(lcdnum, buf, 1);
        lcd_goto(2);
        lcd_puts(buf);
		//	    Depth Alarm = RF0
		lcdnum /= 10;

		lcdnum = speed;
		lcdnum = lcdnum*2000/n.i[1]; // sample rate: 0.5s.
	    format(lcdnum, buf, 3);
        lcd_goto(18);
        lcd_puts(buf);		

		lcdnum = force;
        lcdnum = (lcdnum*n.i[3]*11)/(n.i[4]*9);//weiyang 结构系数
	    format(lcdnum, buf, 3);
        lcd_goto(10);
        lcd_puts(buf);

		lcdnum = delta;
		lcdnum = (lcdnum*n.i[3]*11)/(n.i[4]*9);//weiyang 结构系数
	    format(lcdnum, buf, 3);
        lcd_goto(26);
        lcd_puts(buf);

}

void ADShow(void)
{
//		Delay10KTCYx(25);
		f0 = f1;
		f1 = force;
		delta = f1 - f0;
   		startADC();
		ADtemp();
		while(!rdyADC());
       	force = getADC()+n.i[2];
		Recorddepth();
		if(PORTAbits.RA5==0) {	depth.u=0; 	}	
		Nop();
		Nop();
}


void Alarm(void)
{
	timep.l=time.l;
	timep.l=(timep.l+10);

	if(LATF!=0) {
		do{
			ADShow();//
//			ADonce();//
			Delay10KTCYx(10);
	    	PORTCbits.RC0=1;
			Delay10KTCYx(10);
			PORTCbits.RC0=0;
			Delay10KTCYx(10);
		}while(time.l<timep.l);
	}
	else PORTCbits.RC0=0;
	LATF=0;
}


void ADCone(void)
{
		TRISD = 0x00;
        lcdnum = depth.u;
		lcdnum = (lcdnum*10/n.i[1]);
	    format(lcdnum, buf, 1);
        lcd_goto(2);
        lcd_puts(buf);
// Depth Alarm = RF0
		lcdnum /= 10;

    	if(speed>0){
        	if((lcdnum>n.i[5])&(lcdnum<(n.i[5]+10))) LATFbits.LATF0=1;
				else LATFbits.LATF0=0;
   		}
    	if(speed<0) { 
			if((lcdnum>(n.i[6]-10))&(lcdnum<n.i[6])) LATFbits.LATF0=1;
				else LATFbits.LATF0=0;
	   	}

		lcdnum = speed;
		lcdnum = (lcdnum*2000/n.i[1]); // sample rate: 0.5s.
	    format(lcdnum, buf, 3);
        lcd_goto(18);
        lcd_puts(buf);		
// Speed Alarm = RF1
  		if(lcdnum>n.i[7]) LATFbits.LATF1=1;
        	else LATFbits.LATF1=0;
//		if(Fristlove==0){lcdnum=10; force=0; delta=0; Fristlove=1;}
		lcdnum = force;
        lcdnum = (lcdnum*n.i[3]*11)/(n.i[4]*9);//weiyang 结构系数
	    format(lcdnum, buf, 3);
        lcd_goto(10);
        lcd_puts(buf);
// Force Alarm = RF2
	   	if(lcdnum>n.i[8]) LATFbits.LATF2=1;
			else LATFbits.LATF2=0;
		lcdnum = delta;
		lcdnum = ((lcdnum*n.i[3]*11)/(n.i[4]*9));//weiyang 结构系数
	    format(lcdnum, buf, 3);
        lcd_goto(26);
        lcd_puts(buf);
/////报警控制
  	if(FristTime==1) Alarm();
}
void delay(long int i)
{
	long int j;
	for(j=0;j<i;j++);
	putch(0xbb);
}

void ADNow(void)
{
//	Delay10KTCYx(25);
	f0 = f1;
	f1 = force;
	delta = f1 - f0;

	startADC();
	ADCone();
	while(!rdyADC());
   	force = (getADC()+n.i[2]);//
//	if(Fristlove==0){ f1=0; force=0; delta=0; Fristlove=1;}
	Recorddepth();
	if(PORTAbits.RA5==0) { depth.u=0; }	
	Nop();
	Nop();
}
void ShowAlarm(void)
{
	char a1,a2;
	int j,t;
	int c[3];

union eep { 
	unsigned char c[2];
	unsigned int i;
}mc;
	lcd_clear();

for(j=5;j<9;j++){
	t=j*2;
	if(eeget(0) == 0x55 && eeget(1) == 0xaa) {
			 mc.c[0] = eeget(0x10+t);
			 mc.c[1] = eeget(0x10+t+1);
	}
	c[j-5]=mc.i;

}

    lcd_goto(0);
    lcd_putrs((unsigned rom char *)"最大深度");
    lcd_goto(0x10);
    lcd_putrs((unsigned rom char *)"最小深度");
    lcd_goto(8);
    lcd_putrs((unsigned rom char *)"最大速度");
    lcd_goto(0x18);
    lcd_putrs((unsigned rom char *)"最大张力");

	do{
	    format(c[0], buf, 0);
        lcd_goto(4);
        lcd_puts(buf);
	    format(c[1], buf, 0);
        lcd_goto(20);
        lcd_puts(buf);
	    format(c[2], buf, 0);
        lcd_goto(12);
        lcd_puts(buf);
	    format(c[3], buf, 0);
        lcd_goto(28);
        lcd_puts(buf);
}while(PORTAbits.RA4==0);

	InitLCD();
	return;
}
void OtherSample(void)
{
	long lt;
//		InitLCD();
	int a=0;
    lcd_goto(0);
    lcd_putrs((unsigned rom char *)"深度        m  +");

		while(final!=0xff){
			do{
				do{
					do{
						lt = time.l;
						ADNow();
						if((PORTAbits.RA4==0)&(FristTime==1)){ 
							ShowAlarm();     
							lcd_goto(0);
  					 		lcd_putrs((unsigned rom char *)"深度        m  +");
						}
					if(depth.u!=tp.u) {	Sample();  }//深度不增加不存,10分钟1存
//				}while(TL == 0 & INTCONbits.TMR0IF == 0);
				}while(lt == time.l & INTCONbits.TMR0IF == 0);
//					a=a+1;		
//			}while(a<600);		//while((time.l%60)!=0);
		}while((time.l%60)!=0);
//				a=0;
				DataSave();		// Data save
    			tp.u=depth.u;
		}while(Prog_Time>time.l);
		PSEG = PSEG + 1;
		GetProgram();
		final=(SMU&SMV&SMH&SML);
	}
}

void manytimes(void)
{
	long lt;
	int a=0;
    lcd_goto(0);
    lcd_putrs((unsigned rom char *)"深度        m  ?");
   
//  T0CONbits.TMR0ON=0;

	do{
		do{
		lt = time.l;
  		ADNow();
   		if((PORTAbits.RA4==0)&(FristTime==1)) { 
			ShowAlarm();     
			lcd_goto(0);
 		   lcd_putrs((unsigned rom char *)"深度        m  ?");
		}
	   if(depth.u != tp.u) { Sample(); }
	   if(PORTAbits.RA5==0){ depth.u=0; }
	}while(lt == time.l & INTCONbits.TMR0IF == 0);
	a=a+1;		
 }while(a<30);
// }while((time.l%30)!=0);
//  T0CONbits.TMR0ON=1;	
	OtherSample();
}

void Sample(void)
{
	long lt;
    lcd_goto(0);
    lcd_putrs((unsigned rom char *)"深度        m   ");

		while(final!=0xff){

			do{
				do{
					do{
						lt = time.l;
					 ADNow();
					 if((PORTAbits.RA4==0)&(FristTime==1)) { ShowAlarm(); }
					 if((depth.u==tp.u)&(delta<25)&(FristTime==1)) {  manytimes(); }//深度不增加不存,1分钟1存
//				}while(TL == 0 & INTCONbits.TMR0IF == 0);
				}while(lt == time.l & INTCONbits.TMR0IF == 0);
			}while((time.l%AD_CYC)!=0);
			
			DataSave();		// Data save
			tp.u=depth.u;
		}while(Prog_Time>time.l);
		PSEG = PSEG + 1;
		GetProgram();
		FristTime=1;
		final=(SMU&SMV&SMH&SML);
	}
}

void SampleInit(void)
{
//initial Timer0;
    OpenTimer0(TIMER_INT_ON&T0_16BIT&T0_SOURCE_INT&T0_PS_1_8);
//initial RB1;
    OpenRB1INT (PORTB_CHANGE_INT_ON & PORTB_PULLUPS_ON & FALLING_EDGE_INT);

	cmdinit();//// 读取E2PROM中的预置值
	depth.u = n.i[0];
    depth.u *= n.i[1];

	speed = 0;

	initADC();

	RCONbits.IPEN = 1;    
	INTCONbits.GIEH = 1; 
///从Sample()中调过来的
	final=0x00;
	PSEG=0;
//	SamplInit();
	tp.u=depth.u;////
}
//------------------------
void ADCMode(void)
{
	lcd_clear();
    lcd_goto(0x10);
    lcd_putrs((unsigned rom char *)"记录模式 >>");
	Version();
//	Init_FLASH_MEM();
//	MEM_FindFirst();
//	MEM_LableFirst();
//	Init_MEM();
	RTCInit();
	SampleInit();
	if(n.i[0]==0)	Readrecord();///如果深度预制为0,则读取掉电前的值
	Nop();
	Nop();

	speed = 0;
	force = 0;
	Delay10KTCYx(100);

	InitLCD();
	Sample();
}
//////

/*
//接收应答
char SCIGetRec(char TSum)	// Get a data packet from host
{
 static unsigned char x;
  unsigned char Rec;

	do{
		do {
			Res1 = getch();			
		}while(Res1 != TSum);

		Rec = getch();

		for(i=1;i<=63;i++) {
			Buf[4+i] = getch();		// get data
		}
    	x=getch(); // get checksum
	} while(x!=0xFF);

//	return;
}
//检测USB设备
void TestUSB(void)
{
	int i;
	SCISend(0xaa);
	SCISend(0xbb);
	SCISend(0x01); //检测命令字
	for(i=0;i<63;i++)
	{	SCISend(0x20);	}
}
//创建文件
char CreatFile(char name)
{
	int i;
//	char name1,name2,name3;
	SCISend(0xaa);
	SCISend(0xbb);
	SCISend(0x07);//创建文件命令字
	SCISend(0x00);//文件名
	SCISend(0x00);
	SCISend(name);
	for(i=0;i<5;i++)
	{	SCISend(0x20);	}
	SCISend(0x70);//文件后缀pse
	SCISend(0x73);
	SCISend(0x65);
	for(i=0;i<11;i++)
	{	SCISend(0x00);	}
	SCISend(0x00);///????
	SCISend(0x74);
	SCISend(0x08);
	SCISend(0x33);
	for(i=0;i<37;i++)
	{	SCISend(0x00);	}
}
//打开(选定)文件
char OpenFile(char name)
{
	int i;
//	char name1,name2,name3;
	SCISend(0xaa);
	SCISend(0xbb);
	SCISend(0x06);//打开文件命令字
	SCISend(0x00);//文件名
	SCISend(0x00);
	SCISend(name);
	for(i=0;i<5;i++)
	{	SCISend(0x20);	}
	SCISend(0x70);//文件后缀pse
	SCISend(0x73);
	SCISend(0x65);
	for(i=0;i<52;i++)
	{	SCISend(0x20);	}
}
//设置文件指针
void SetFliePointer(void)
{
	int i;
	SCISend(0xaa);
	SCISend(0xbb);
	SCISend(0x15);//设置指针命令字
	for(i=0;i<5;i++)
	{	SCISend(0x00);	}
	for(i=0;i<56;i++)
	{	SCISend(0x20);	}

	SCIGetRec(0x25);
}
//发送存储数据
void SendToFile(void)
{
	SCISend(0xaa);
	SCISend(0xbb);
	SCISend(0x09);//打开文件命令字
	SCISend(0x00);//固定字节
	SCISend(0x00);
	SCISend(0x01);//准备写入7680字节
	for(i=0;i<60;i++)
	{	SCISend(0x00);	}
}

//写文件
char WriteFile(char block)
{
	int i,j,k;

	MEM_sector = (0x00 & 0x0f);
	MEM_block  =  block;
//	MEM_page   =  Buf[7];
//	MEM_line   =  Buf[8];

    SetFliePointer();

	CSUM = 0;

	for(i=0;i<=15;i++) {
		for(j=0;j<=7;j++) {
			if(j==0|j==5) SendToFile();
			MEM_ReadLine(MEM_sector,MEM_block,i,j);
			for(k=0;k<=63;k++) {
				CSUM = CSUM ^ DataPack[k];
				putch(DataPack[k]);			// send to host
			if(j==3|j==7) SCIGetRec(0x0C);
			}
		}
	}
	putch(CSUM);
}
//下载数据主函数
void DownData(void)
{
	char a,j;
	a=1;
  for(j=4;j<=DataCout;j++){
       CreatFile(a);
			WriteFile(j);
     	      a++;
	}

	lcd_clear();
    lcd_goto(0x10);
    lcd_putrs((unsigned rom char *)"USB 已完成");

}

void ToUSB(void)
{
	SPBRG1=3;//57600

	lcd_clear();
    lcd_goto(0x10);
    lcd_putrs((unsigned rom char *)"USB 传输中 >>");
    lcd_goto(8);
    lcd_putrs((unsigned rom char *)"目前测试中...");
	MEM_FindFirst();
	DataCout = MEM_block;//需要发送的块数
	TestUSB();
while(1);
}
*/
//////
void Version(void)
{
    lcd_goto(8);
    lcd_putrs((unsigned rom char *)"Ver 2.08c");
}
void main(void)
{
		
	TRISC = 0x18;
	OpenI2C(MASTER,SLEW_OFF);				// Open I2C Bus
	SSPADD = 9;								// 100kHz clock (3.6864MHz)
	Dectime();
	DostoUnix();
	PMode=1;

	if(PORTAbits.RA4==0) PMode=0; //模式键(S2)判断
	FristTime=0;
	InitPorts();
///	PORTAbits.RA5==1;   //深度清0
	Init_MEM();
	lcd_init();
//    if(PORTAbits.RA5==0) PMode=2;
////---------------
if(PMode==1){///1是采样
	ADCMode();
	}
/*
else if(PMode==2){
	ToUSB();
}
*/
else	{
		SwapMode = 0;
	lcd_clear();
    lcd_goto(0x10);
    lcd_putrs((unsigned rom char *)"通讯模式 >>");
	Version();
	do{
		in=Buf;
		out=Buf;
		SCIGetPack();			// Get a data packet
		SCISendACK(0xa1);				// send ACK
		switch(pcmd)
			{
			case 1:
				SCISendACK(0xa1);break;		// Send acknowledge[SendNull]	
			case 2:
				SCIData();break;		// Send a sample[GetSample] 
			case 4:
				SCIErase();break;		// EraseBlock
			case 8:
				SCIFormat();break;		// FormatTool<<<<<-------
			case 16:
				SCIRead();break;		// ReadLine
			case 32:
				SCIWrite();	break;		// WriteLine
			case 64:
				SCIBlock();break;		// ReadBlock
			case 80:
				ShowAllParameter();break; //显示所有设置参数
			case 81:				
				SetParameter();break;	  //设置参数	
			case 82:
				ReadParameter();break;	  //读取参数	
			case 83:
				ShowTime();break;					
			case 84:
				InitDate();break;		//预制日期(年/月/日) 
			case 85:
				InitTime();break;		//预制时间(24时/分/秒)	
			default:break;
			}
	}while(SwapMode!=1);
	SwapMode = 0;
  }
}

//-----End of Program-----

//=============
//----NOTE-----
//=============

//+++++++ Function Map +++++++
//----中断服务程序(2级中断模式)
//----实时时钟
//----存储器代码
//----LCD显示
//----7714代码
//----响应与应答
//----PC接口函数
//----Log Mode
//----初始化
//----模式转换
//----main()

⌨️ 快捷键说明

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