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

📄 oledwinch.c

📁 一种深度和拉力测量系统
💻 C
📖 第 1 页 / 共 4 页
字号:
	real_time.Month   = Buf[6];
	real_time.Date    = Buf[7];
//	real_time.ctr_reg = 0x93;
	Init_RealDate();
	SCISendACK(0xff);
}
///-----------------------
void InitTime(void)
{
	real_time.Hours   = Buf[5];
	real_time.Minutes = Buf[6];
	real_time.Seconds = Buf[7];
//	real_time.ctr_reg = 0x93;
	Init_RealTime();
	SCISendACK(0xff);
}
///----------------------
void ShowTime(void)
{
	Get_RealTimeClock();
	putch(0xff);
	putch(0xff);

	CSUM = 0x37;
	SCISend(0x37);

	CSUM = CSUM ^ 0xa1;
	SCISend(0xa1);

	CSUM = CSUM ^ 0x00;
	SCISend(0x00);	

	CSUM = CSUM ^ 0x07;
	SCISend(0x07);

	CSUM = CSUM ^ real_time.Year;
	SCISend(real_time.Year);
	CSUM = CSUM ^ real_time.Month;
	SCISend(real_time.Month);
	CSUM = CSUM ^ real_time.Date;
	SCISend(real_time.Date);
	CSUM = CSUM ^ real_time.Hours;
	SCISend(real_time.Hours);
	CSUM = CSUM ^ real_time.Minutes;
	SCISend(real_time.Minutes);
	CSUM = CSUM ^ real_time.Seconds;
	SCISend(real_time.Seconds);

	SCISend(CSUM);
}

void InitPorts(void)
{

	TRISA = 0xFF;
 	TRISB = 0xE3;
 	TRISC = 0xfe;
	TRISD = 0x00;
	TRISE = 0x00;
	TRISF = 0x00;
	PORTF = 0x00;

	ADCON1=0xff;// PortA I/O enable

	SPBRG1=1;//115200
//	SPBRG1=3;//57600
	TXSTA1bits.BRGH=1;
	TXSTA1bits.TXEN=1;
	RCSTA1bits.CREN=1;
	RCSTA1bits.SPEN=1;

	in=Buf;
	out=Buf;
	PIE1bits.RC1IE=1;
	INTCONbits.PEIE=1;
	INTCONbits.GIE = 1;

	INTCONbits.GIEL=1;
	RCONbits.IPEN=1;
//	INTCONbits.GIEH=1;
	IPR1bits.RCIP=0;
	

//MEM
	MEM_CE=0;
//
	Res1 = 0;
	Res2 = 0;

	Out_MEM = 0;
	AlarmSign.u=0;
}
void InitLCD(void)
{
///	lcd_init();
	OLED_CLR(0x00);
	DisUnit();
}
//=====================
//------采样主函数
//=====================
//================
//----时钟初始化--
//================
void RTCInit(void)
{
	TL=0x00;
	time.l=totalsec;
//	TMR1H=0x80;
}
//-----------------
void GetProgram(void)
{
//	char line;
	int i;

	if(PSEG==5){PSEG=0;line=line+1;}
	Init_FLASH_MEM();						
	MEM_ReadLine(0,2,0,line);

	i=(16*PSEG);
		SMU   = DataPack[i];
		SMV   = DataPack[i+1];
		SMH   = DataPack[i+2];
		SML   = DataPack[i+3];
		AMH   = DataPack[i+4];
		AML   = DataPack[i+5];

	for(i=0;i<=63;i++) {			
		DataPack[i] = 0x00;
	}

	Alarm_Time = (unsigned int)AMH*256 + 
	       		  (unsigned int)AML;

	AD_CYC = Alarm_Time;

//	if(AD_CYC >= 1800) { DisWrong(2); }

	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;
		for(i=0;i<8;i++){	buf[i]=0x20;}//0x20:Space
        lcdnum = depth.u;
		lcdnum = lcdnum*10/n.i[1];
	    format(lcdnum, buf, 1);
		DisNum(0,buf);
		//	    Depth Alarm = RF0
		lcdnum /= 10;
		for(i=0;i<8;i++){	buf[i]=0x20;}
		lcdnum = speed;
//		lcdnum = lcdnum*2000/n.i[1]; // sample rate: 0.5s.
		lcdnum = (lcdnum*2/n.i[1]); // sample rate: 0.5s.
	    format(lcdnum, buf, 0);
		DisNum(2,buf);
		for(i=0;i<8;i++){	buf[i]=0x20;}
		lcdnum = force;
        lcdnum = (lcdnum*n.i[3]*11)/(n.i[4]*9);//weiyang 结构系数
	    format(lcdnum, buf, 3);
		DisNum(4,buf);
		for(i=0;i<8;i++){	buf[i]=0x20;}
		lcdnum = delta;
		lcdnum = (lcdnum*n.i[3]*11)/(n.i[4]*9);//weiyang 结构系数
	    format(lcdnum, buf, 3);
		DisNum(6,buf);
}

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


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

	if(AlarmSign.u!=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;
	AlarmSign.u=0;
}


void ADCone(void)
{
		TRISD = 0x00;
		for(i=0;i<8;i++){	buf[i]=0x20;}
        lcdnum = depth.u;
		lcdnum = (lcdnum*10/n.i[1]);
	    format(lcdnum, buf, 1);
		DisNum(0,buf);
// Depth Alarm = RF0
		lcdnum /= 10;

    	if(speed>0){
        	if((lcdnum>n.i[5])&(lcdnum<(n.i[5]+10))) AlarmSign.c[0]=1;
				else AlarmSign.c[0]=0;
   		}
    	if(speed<0) { 
			if((lcdnum>(n.i[6]-10))&(lcdnum<n.i[6])) AlarmSign.c[0]=1;
				else AlarmSign.c[0]=0;
	   	}
		for(i=0;i<8;i++){	buf[i]=0x20;}
		lcdnum = speed;
//		lcdnum = (lcdnum*2000/n.i[1]); // sample rate: 0.5s.
		lcdnum = (lcdnum*20/n.i[1]); // sample rate: 0.5s.
	    format(lcdnum, buf, 1);
		DisNum(2,buf);

// Speed Alarm = RF1
  		if(lcdnum>n.i[7]) AlarmSign.c[1]=1;
        	else AlarmSign.c[1]=0;
	//		if(Fristlove==0){lcdnum=10; force=0; delta=0; Fristlove=1;}
		for(i=0;i<8;i++){	buf[i]=0x20;}
		lcdnum = force;
        lcdnum = (lcdnum*n.i[3]*11)/(n.i[4]*9);//weiyang 结构系数
	    format(lcdnum, buf, 3);
		DisNum(4,buf);

// Force Alarm = RF2
	   	if(lcdnum>n.i[8]) AlarmSign.c[2]=1;
			else AlarmSign.c[2]=0;
		for(i=0;i<8;i++){	buf[i]=0x20;}
		lcdnum = delta;
		lcdnum = ((lcdnum*n.i[3]*11)/(n.i[4]*9));//weiyang 结构系数
	    format(lcdnum, buf, 3);
		DisNum(6,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);
//OLED_Dis1(0,6,48,800);
//OLED_Dis1(1,6,56,352);
	f0 = f1;
	f1 = force;
	delta = f1 - f0;
	js++;
	startADC();
	ADCone();
//OLED_Dis1(0,6,48,800);
//OLED_Dis1(1,6,56,256);
//	while(!rdyADC());
	WaitrdyADC();
   	force = (getADC()+n.i[2]);//
//			if(Fristlove==0){ f1=0; force=0; delta=0; Fristlove=1;}
	Recorddepth();
	if(PORTAbits.RA5==0) { depth1.u=0;depth2.u=0;depth.u=0; }	
	Nop();
	Nop();
}
void ShowAlarmname(void)
{
//最大深度
	OLED_Dis2(0,0,0,448);
	OLED_Dis2(0,0,16,480);
	OLED_Dis2(0,0,32,0);
	OLED_Dis2(0,0,48,96);
//最小深度
	OLED_Dis2(0,2,0,448);
	OLED_Dis2(0,2,16,512);
	OLED_Dis2(0,2,32,0);
	OLED_Dis2(0,2,48,96);
//最大速度
	OLED_Dis2(0,4,0,448);
	OLED_Dis2(0,4,16,480);
	OLED_Dis2(0,4,32,64);
	OLED_Dis2(0,4,48,96);
//最大张力
	OLED_Dis2(0,6,0,448);
	OLED_Dis2(0,6,16,480);
	OLED_Dis2(0,6,32,128);
	OLED_Dis2(0,6,48,160);
}
void ShowAlarm(void)
{
	char a1,a2;
	int j,t;
	int c[3];

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

OLED_CLR(0x00);

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;

}
	ShowAlarmname();
	do{
		for(j=0;j<8;j++) { buf[j]=0; }
	    format(c[0], buf, 0);
		DisNum2(0,buf);
		for(j=0;j<8;j++) { buf[j]=0; }
	    format(c[1], buf, 0);
		DisNum2(2,buf);
		for(j=0;j<8;j++) { buf[j]=0; }
	    format(c[2], buf, 0);
		DisNum2(4,buf);
		for(j=0;j<8;j++) { buf[j]=0; }
	    format(c[3], buf, 0);
		DisNum2(6,buf);
	}while(PORTAbits.RA4==0);

	InitLCD();
	return;
}
void OtherSample(void)
{
		long lt;
		int a=0;
		OLED_Dis1(1,0,56,336);	// m +
		while(final!=0xff){
			do{
				do{
					do{
					lt = time.l;
					ADNow();
					if((PORTAbits.RA4==0)&(FristTime==1)) { 
						ShowAlarm(); 
 						OLED_Dis1(1,0,56,336); // m +   
						}
					if(depth.u!=tp.u) {	Sample();  }//深度不增加不存,10分钟1存
//				}while(TL == 0 & INTCONbits.TMR0IF == 0);
				}while( time.l==lt & INTCONbits.TMR0IF == 0);
//				a=a+1;	
			}while((time.l%20)!=0);	
//			}while(a<20);		//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;
	OLED_Dis1(1,0,56,320); //m ?
 //  T0CONbits.TMR0ON=0;
		do{
			lt = time.l;
  			ADNow();
   			if((PORTAbits.RA4==0)&(FristTime==1)) { 
				ShowAlarm();     
				OLED_Dis1(1,0,56,320);  // m ?
			}
 		  	 if(depth.u != tp.u) { Sample(); }
	 	  	 if(PORTAbits.RA5==0){ depth1.u=0;depth2.u=0;depth.u=0;}
	  }while( time.l==lt & INTCONbits.TMR0IF == 0);
	 a=a+1;		
 //	}while(a<30);
// }while((time.l%30)!=0);
//  T0CONbits.TMR0ON=1;	
	OtherSample();
}
void OnlyDepthAD(void)
{
		TRISD = 0x00;
		for(i=0;i<8;i++){	buf[i]=0x20;}
        lcdnum = depth.u;
		lcdnum = (lcdnum*10/n.i[1]);
	    format(lcdnum, buf, 1);
		DisNum(0,buf);
// Depth Alarm = RF0
		lcdnum /= 10;

    	if(speed>0){
        	if((lcdnum>n.i[5])&(lcdnum<(n.i[5]+10))) AlarmSign.c[0]=1;
				else AlarmSign.c[0]=0;
   		}
    	if(speed<0) { 
			if((lcdnum>(n.i[6]-10))&(lcdnum<n.i[6])) AlarmSign.c[0]=1;
				else AlarmSign.c[0]=0;
	   	}
		for(i=0;i<8;i++){	buf[i]=0x20;}
		lcdnum = speed;
//		lcdnum = (lcdnum*2000/n.i[1]); // sample rate: 0.5s.
		lcdnum = (lcdnum*2/n.i[1]); // sample rate: 0.5s.
	    format(lcdnum, buf, 0);
		DisNum(2,buf);
// Speed Alarm = RF1
  		if(lcdnum>n.i[7]) AlarmSign.c[1]=1;
        	else AlarmSign.c[1]=0;
/////报警控制
  	 	if(FristTime==1) Alarm();

}

void NoSaveSample(void)
{
	InitPorts();
//	RTCInit();
	Newlcd_init();
	OLED_CLR(0x00);

	SampleInit();
	if(n.i[0]==0)	Readrecord();///如果深度预制为0,则读取掉电前的值
	Nop();
	Nop();
	speed = 0;
	force = 0;
	Delay10KTCYx(100);
	InitLCD();

	if(ErrNo==1024){
	while(1){	
		OnlyDepthAD(); 
		Recorddepth();
		if(PORTAbits.RA5==0) { depth1.u=0;depth2.u=0;depth.u=0; }	
		if(PORTAbits.RA4==0) { ShowAlarm(); }
		OLED_Dis1(0,6,48,ErrNo);
	}
 }

	while(1){
		f0 = f1;
		f1 = force;
		delta = f1 - f0;
  		startADC();
		ADCone();
//	while(!rdyADC());
		WaitrdyADC();
    	force = (getADC()+n.i[2]);//
//		if(Fristlove==0){ f1=0; force=0; delta=0; Fristlove=1;}
		Recorddepth();
		if(PORTAbits.RA5==0) { depth1.u=0;depth2.u=0;depth.u=0; }	
		if(PORTAbits.RA4==0) { ShowAlarm(); }
		OLED_Dis1(0,6,48,ErrNo);
		Nop();
		Nop();	
	}
}


void Sample(void)
{
//   lcd_putrs((unsigned rom char *)"深度        m   ");
//	InitLCD();
	long lt;
	OLED_Dis1(1,0,56,352);  // 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

///			if(FristTime==1){ Dectime();	DostoUnix(); }
			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);
    OpenRB2INT (PORTB_CHANGE_INT_ON & PORTB_PULLUPS_ON & RISING_EDGE_INT);

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

	depth1.u = n.i[0];
	depth1.u *= n.i[1];
	depth2.u = n.i[0];
	depth2.u *= n.i[1];
	speed = 0;

	initADC();

	RCONbits.IPEN = 1;    
	INTCONbits.GIEH = 1; 

//	depth1.u = depth2.u = depth.u;

///从Sample()中调过来的
	final=0x00;
	PSEG=0;
//	SamplInit();

	tp.u=depth.u;////
}
//------------------------
void ADCMode(void)
{
	OLED_CLR(0x00);
	DisLogMode();
	Version(32,80);////-------------
//	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();
}
////-----
void Version(int c1,int c2)
{
	OLED_Dis2(1,4,16,272);
	OLED_Dis2(1,4,24,288);
	OLED_Dis2(1,4,32,304);
	OLED_Dis2(1,4,40,c1);
	OLED_Dis2(1,4,48,256);
	OLED_Dis2(1,4,56,16);
	OLED_Dis1(1,4,0,c2);
}
///
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;
	ErrNo = 0;
//	Fristlove=0;
	InitPorts();
///	PORTAbits.RA5==1;   //深度清0
	Init_MEM();
	RST=0;
	RST=1;
	Newlcd_init();
//    if(PORTAbits.RA5==0) PMode=2;
////---------------
if(PMode==1){///1是采样
	Init_HowSPM();
	ADCMode();
	}
else	{
		SwapMode = 0;
	OLED_CLR(0x00);
	DisComcMode();
	Version(32,80);///
	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 + -