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

📄 play.#2

📁 该程序是基于c8051f的红外线发射率的测量程序
💻 #2
📖 第 1 页 / 共 5 页
字号:
	    SCL=0;
		delay4us();
	    txdata<<=1;
	    SDA=CY;
	    delay4us();
	    SCL=1;
	    delay4us();
    }
    SCL=0;
	delay4us();
    SDA=1;	
	delay4us();
}
//
uchar receiverbyte (void)
{
	uchar i;
 	uchar rdata=0x00;
 	SCL=0;
	delay4us();
 	SDA=1;
	delay4us();
 	for(i=8;i>0;i--)
    {
	   SCL=1;
	   delay4us();
	   rdata=(rdata<<1)|SDA;
	   delay4us();
	   SCL=0;
	   delay4us();
    }
    SDA=1;
	delay4us();
	return(rdata);
}
//I2C end***************************************************
//*********************************************************************
//interrupt function
void EXT0() interrupt 0//断水
{
	WDTCN=0xDE;//先关看门狗
	WDTCN=0xAD;	
	ALARM(NOWATERALM);
	WRITEAI(0x15,12);//关808P表	
	while(1){}
}
//*************************
//clear the WDT and alarm the water is bad
void T0_INT() interrupt 1//此函数主要是清狗和键盘扫描
{
	float temppower;
    TL0=0x7F;
	TH0=0x60;//这样T0就在20ms内中断一次
 	//*********************
	WDTCN=0xA5;//clear WDT
	//**********************
	kbscan();//获得键值
	//**********************
	if(KEY=='M')//判断M键按下的情况
	{
		if(MANFLG)
		{
			AUTO_MAN=~AUTO_MAN;
			MANFLG=0;
		}
	}
	else
	{
		MANFLG=1;
	}
	//***********************
	AD0BUSY=1;//启动ADC0进行转换
	//***********************
	if(ES0)
	{
		AITIME++;	
		if(AITIME==20)
		{
			REN0=0;
			ES0=0;
			AIOVERFLG=1;
			TIMEFLG=1;
		}
	}
	//************************
	if(PIDEN)
	{
		temppower=1000.0*(((float)GY[GYNUM].power[SEGMENT]-(float)GY[GYNUM].power[SEGMENT-1])/(float)GY[GYNUM].time[SEGMENT]*TEMPTIME+(float)GY[GYNUM].power[SEGMENT-1]);
		PID(temppower);
	}
}
//*************************
/*void EXT1() interrupt 2//行程开关到
{
	WDTCN=0xDE;//先关看门狗,初始化完成之后再开
	WDTCN=0xAD;//
	delay5ms();	
	if(!HDISTANCE)
	{
		MOTORSTOP;
		delay200ms();
		TPFCOFF;
	}
}*/
//*************************
void UART0_INT() interrupt 4//串口0中断函数,主要是用来接收AI808P的数据的中断
{
	RI0=0;	
	AIBUF[AIDATNUM]=SBUF0;
	AIDATNUM++;
	if(AIDATNUM==10)
	{
		REN0=0;
		ES0=0;
		AIOVERFLG=1;
	}
}
//*************************
void ADC0WINDOW() interrupt 8//ADC0窗口比较中断,主要用来检测压力传感器的
{
	WDTCN=0xDE;//先关看门狗
	WDTCN=0xAD;
	AD0WINT=0;//该位必须软件清零	
	ALARM(POWERERROR);
	WRITEAI(0x15,12);//关808P表
	while(1){}
}
//*************************
void T3_INT() interrupt 14//T3 interrupt is 1S interval
{
	TF3=0;//该位必须软件清零
	T3TIME++;
	if(T3TIME >= 31)
	{	
		SAMPLEN=1;
		T3TIME=0;
	}
}
//*************************
void ADC0_INT() interrupt 15
{
	uint ad;
	AD0INT=0;//该位必须软件清零	
	ad=(ADC0H & 0x0F)*256+ADC0L;
	if(ad >= 0x0355)
	{
		REALPOWERF=72.802944*ad-49069.184256;
		if(REALPOWERF/1000.0 > 254.9999999)
		{
			REALPOWER=255;
		}
		else
		{		
			REALPOWER=(uchar)(REALPOWERF/1000.0);
		}
	}
	else
	{
		REALPOWERF=13000;
		REALPOWER=13;
	}
}
//*********************************************************************
void SYSINIT(void)
{
	//*****************************************************************	
	SFRPAGE=CONFIG_PAGE;
	//OSC Select*******************************************************	
	OSCICN=0xC3;//使用内部频率24.5MHz,不分频
	//*****************************************************************
	//I/O define*******************************************************
	XBR0 = 0x04;//select UART0
	XBR1 = 0x14;//select INT0 and INT1
	XBR2 = 0x04;//选择弱上拉,并且选择UART1
	XBR2 = 0x44;//使能交叉开关
	//*****************************************************************	
	P0MDOUT = 0x45; // Output configuration for P0 
    P1MDOUT = 0x80; // Output configuration for P1 
    P2MDOUT = 0xFF; // Output configuration for P2 
    P3MDOUT = 0x61; // Output configuration for P3 	
	SFRPAGE=LEGACY_PAGE;
	//*****************************************************************
	//RSTSRC init******************************************************	
	RSTSRC=0x06;//选择时钟丢失监测器和VDD监视器为复位源。
	//*****************************************************************	
	//电压基准**********************************************************
	REF0CN=0x03;//内部基准,2.4V,且采用偏置电压
	//*****************************************************************	
	//TCON*************************************************************
	TCON=0x05;//INT0 and INT1 are active in edge mode
	//*****************************************************************
	//UART and Timer n config******************************************
	CKCON=0x00;//define T0 clock is sysclk/12, T1 clock is sysclk/12
	TMR2CF=0x08;//T2 clock is SYSCLK
	TMR2H=0xFF;//UART0 BR is 9600
	TMR2L=0x61;
	RCAP2H=0xFF;
	RCAP2L=0x61;
	SFRPAGE=TMR3_PAGE;
	TMR3CF=0x00;//T3 clock is SYSCLK/12
	TMR3H=0x00;
	TMR3L=0x00;
	RCAP3H=0x00;
	RCAP3L=0x00;
	SFRPAGE=LEGACY_PAGE;
	//TMR4CF=0x00;//T4 clock is SYSCLK/12	
	TMOD=0x21;//Timer0 is in mode 1; Timer1 is in mode 2
	SCON0=0x40;//UART0 is in the mode 1 and REN0 is close, then UART0 can send but receive data
	SSTA0=0x05;//UART0 use T2 to be the TX and RX BR generator
	SFRPAGE=UART1_PAGE;
	SCON1=0x40;//UART1 is in the 8 bit mode and can't receive data
	SFRPAGE=LEGACY_PAGE;
	TL0=0x7F;
	TH0=0x60;//这样T0就在12ms内中断一次
	TH1=0x96;//UART1 BR is 9600
	TL1=0x96;
	TR1=1;//open the UART1 BR
	TR2=1;//open the UART0 BR	
	//*****************************************************************
	ADC0LTL=0xA0;
	ADC0LTH=0x02;//上限为4mA报警
	ADC0CF=0x58;//加大SAR时钟,1MHz
	ADC0CN=0xC0;//开ADC0并且设置为转换才跟踪方式,设置为向AD0BUSY写1判断AD0INT为1方式启动ADC0
	//*********************************************************************
	//interrupt define*************************************************
	IP=0x10;//UART0 is the highest level int
	//IE=0x07;//INT0 and T0 and INT1 are active
	IE=0x12;//uart0 and T0 are active
	//EIE1=0x04;//允许ADC0窗口比较中断
	EIE1=0x00;
	EIE2=0x40;//允许UART1中断
	TR0=1;//开始清狗
	EA=1;//open the interrupt
	//*****************************************************************
	BEEP=0;//close the beep
	MOTORSTOP;//关电机
	TPFCOFF;//关二位四通阀	
	//*****************************************************************
}
//*********************************************************************
void workshow()
{
	uint temp;
	bit ZERO=0;
	//***********************************
	READAI(0x56);
	temp=AIBUF[0]+AIBUF[1]*256;
	LCDFCOLOR(4);//前景色为红色
	LCDXY(24,1);//光标到(24,1)
	if(ZERO==0 && temp/1000==0)
	{
		LCDDAT(' ');
	}
	else
	{	
		ZERO=1;
		LCDDAT(temp/1000+0x30);
	}	
	if(ZERO==0 && temp/100%10==0)
	{
		LCDDAT(' ');
	}
	else
	{	
		ZERO=1;
		LCDDAT(temp/100%10+0x30);
	}
	if(ZERO==0 && temp%100/10==0)
	{
		LCDDAT(' ');
	}
	else
	{	
		LCDDAT(temp%100/10+0x30);
	}		
	LCDDAT(temp%10+0x30);
	//***********************************
	LCDXY(35,1);//光标到(35,1)
	LCDFCOLOR(1);//前景色为兰色
	ZERO=0;
	if(ZERO==0 && REALPOWER/100==0)
	{
		LCDDAT(' ');
	}
	else
	{	
		ZERO=1;
		LCDDAT(REALPOWER/100+0x30);
	}
	if(ZERO==0 && REALPOWER/10%10==0)
	{
		LCDDAT(' ');
	}
	else
	{	
		LCDDAT(REALPOWER/10%10+0x30);
	}
	LCDDAT(REALPOWER%10+0x30);//显示实时压力值
}
//
void workshow_temp()
{
	uint temp;
	bit ZERO=0;
	//***********************************
	READAI(0x56);
	temp=AIBUF[0]+AIBUF[1]*256;
	LCDFCOLOR(4);//前景色为红色
	LCDXY(24,1);//光标到(24,1)
	if(ZERO==0 && temp/1000==0)
	{
		LCDDAT(' ');
	}
	else
	{	
		ZERO=1;
		LCDDAT(temp/1000+0x30);
	}	
	if(ZERO==0 && temp/100%10==0)
	{
		LCDDAT(' ');
	}
	else
	{	
		ZERO=1;
		LCDDAT(temp/100%10+0x30);
	}
	if(ZERO==0 && temp%100/10==0)
	{
		LCDDAT(' ');
	}
	else
	{	
		LCDDAT(temp%100/10+0x30);
	}		
	LCDDAT(temp%10+0x30);
	//***********************************
	LCDXY(35,1);//光标到(35,1)
	LCDFCOLOR(1);//前景色为兰色
	ZERO=0;
	if(ZERO==0 && 13/100==0)
	{
		LCDDAT(' ');
	}
	else
	{	
		ZERO=1;
		LCDDAT(13/100+0x30);
	}
	if(ZERO==0 && 13/10%10==0)
	{
		LCDDAT(' ');
	}
	else
	{	
		LCDDAT(13/10%10+0x30);
	}
	LCDDAT(13%10+0x30);//显示实时压力值
}
//
void work()//进入工作状态
{
	uchar i;
	bit ZERO;
	bit first;
	uchar key;
	ulong xdata alltime;
	ulong xdata temptime;
	ulong xdata TOTALTIME;
	uint xdata temptemp;
	uint xdata tempt;
	uchar xdata temppwr;
	uchar xdata tempp;
	uchar xdata segtemp;
	uint xdata temp1,temp2,temp3;
	uint DACVALUE;
	uchar X1L[2],X1H[2],X2L[2],X2H[2],Y1L[2],Y1H[2],Y2L[2],Y2H[2];
	float scale1,scale2,scale3;
	//
	uchar temppower;
	uchar ttpp;
	//
	AISAVE();
	WRITEAI(0x0D,TEMPRATURE_lo);
	WRITEAI(0x0E,TEMPRATURE_hi);
	WRITEAI(0x00,1);
	//
again:
	PIDEN=0;
	LCDSHOW(WORKSCREEN);
	LCDASIIC();//西文方式
	LCDFCOLOR(7);//设置前景色为白色
	LCDXY(19,0);//光标到(19,0)
	if(GYNUM/10==0)
	{
		LCDDAT(' ');
	}
	else
	{
		LCDDAT(GYNUM/10+0x30);
	}	
	LCDDAT(GYNUM%10+0x30);//显示工艺序号
	for(i=1,alltime=0;i<20;i++)
	{
		if(GY[GYNUM].time[i]!=0)
		{
			alltime+=GY[GYNUM].time[i];
		}
		else
		{
			break;
		}
	}
	TOTALTIME=alltime;
	//x轴上时间刻度
	LCDFCOLOR(2);//前景色为绿色
	LCDXY(34,13);
	alltime=alltime+5;
	scale1=250.0/alltime;
	LCDDAT(alltime/600+0x30);	
	LCDDAT(alltime/60%10+0x30);
	LCDDAT(':');
	LCDDAT(alltime%60/10+0x30);
	LCDDAT(alltime%10+0x30);
	alltime=alltime/4;
	for(i=0;i<3;i++)
	{
		LCDXY(10+8*i,13);	
		temptime=alltime*(i+1);
		LCDDAT(temptime/600+0x30);
		LCDDAT(temptime/60%10+0x30);
		LCDDAT(':');
		LCDDAT(temptime%60/10+0x30);
		LCDDAT(temptime%10+0x30);
	}
	//Y轴上刻度显示
	temptemp=(TEMPRATURE_hi-TEMPRATURE_lo)/3;
	temppwr=(POWER_hi-POWER_lo)/3;
	ZERO=0;
	LCDFCOLOR(4);//前景色为红色
	LCDXY(0,3);
	if(ZERO==0 && TEMPRATURE_hi/1000==0)
	{
		LCDDAT(' ');
	}
	else
	{
		ZERO=1;
		LCDDAT(TEMPRATURE_hi/1000+0x30);
	}
	if(ZERO==0 && TEMPRATURE_hi/100%10==0)
	{
		LCDDAT(' ');
	}
	else
	{
		ZERO=1;
		LCDDAT(TEMPRATURE_hi/100%10+0x30);
	}
	if(ZERO==0 && TEMPRATURE_hi%100/10==0)
	{
		LCDDAT(' ');
	}
	else
	{
		LCDDAT(TEMPRATURE_hi%100/10+0x30);
	}	
	LCDDAT(TEMPRATURE_hi%10+0x30);
	ZERO=0;
	LCDFCOLOR(1);//前景色为兰色
	LCDXY(37,3);
	if(ZERO==0 && POWER_hi/100==0)
	{
		LCDDAT(' ');
	}
	else
	{
		ZERO=1;
		LCDDAT(POWER_hi/100+0x30);
	}
	if(ZERO==0 && POWER_hi/10%10==0)
	{
		LCDDAT(' ');
	}
	else
	{
		LCDDAT(POWER_hi/10%10+0x30);
	}	
	LCDDAT(POWER_hi%10+0x30);
	for(i=0;i<3;i++)
	{
		ZERO=0;
		LCDFCOLOR(4);//前景色为红色
		LCDXY(0,6+i*3);
		tempt=temptemp*(2-i)+TEMPRATURE_lo;
		if(ZERO==0 && tempt/1000==0)
		{
			LCDDAT(' ');
		}
		else
		{
			ZERO=1;
			LCDDAT(tempt/1000+0x30);
		}
		if(ZERO==0 && tempt/100%10==0)
		{
			LCDDAT(' ');
		}
		else
		{
			ZERO=1;
			LCDDAT(tempt/100%10+0x30);
		}
		if(ZERO==0 && tempt%100/10==0)
		{
			LCDDAT(' ');
		}
		else
		{
			LCDDAT(tempt%100/10+0x30);
		}
		LCDDAT(tempt%10+0x30);
		LCDFCOLOR(1);//前景色为兰色
		LCDXY(37,6+i*3);
		ZERO=0;
		tempp=temppwr*(2-i)+POWER_lo;
		if(ZERO==0 && tempp/100==0)
		{
			LCDDAT(' ');
		}
		else
		{
			ZERO=1;
			LCDDAT(tempp/100+0x30);
		}
		if(ZERO==0 && tempp/10%10==0)
		{
			LCDDAT(' ');
		}
		else
		{
			LCDDAT(tempp/10%10+0x30);
		}
		LCDDAT(tempp%10+0x30);		
	}
	//************
	//画温度过程基本曲线,画压力过程基本曲线
	scale2=150.0/(TEMPRATURE_hi-TEMPRATURE_lo);	
	scale3=150.0/(POWER_hi-POWER_lo);
	temp1=33;
	temp2=(uint)(197-(GY[GYNUM].temperature[0]-TEMPRATURE_lo)*scale2);
	temp3=(uint)(197-(GY[GYNUM].power[0]-POWER_lo)*scale3);
	X1L[0]=33;X1H[0]=0;
	X1L[1]=33;X1H[1]=0;
	Y1L[0]=temp2%256;Y1H[0]=temp2/256;
	Y1L[1]=temp3%256;Y1H[1]=temp3/256;	
	for(i=1,alltime=0;i<20;i++)
	{
		if(GY[GYNUM].time[i]!=0)
		{
			alltime+=GY[GYNUM].time[i];
			temp1=(uint)(33+alltime*scale1);
			temp2=(uint)(197-(GY[GYNUM].temperature[i]-TEMPRATURE_lo)*scale2);
			temp3=(uint)(197-(GY[GYNUM].power[i]-POWER_lo)*scale3);
			X2L[0]=temp1%256;X2H[0]=temp1/256;
			X2L[1]=temp1%256;X2H[1]=temp1/256;
			Y2L[0]=temp2%256;Y2H[0]=temp2/256;
			Y2L[1]=temp3%256;Y2H[1]=temp3/256;
			LCDLINE(0x04,X1L[0],X1H[0],Y1L[0],Y1H[0],X2L[0],X2H[0],Y2L[0],Y2H[0]);
			LCDLINE(0x01,X1L[1],X1H[1],Y1L[1],Y1H[1],X2L[1],X2H[1],Y2L[1],Y2H[1]);
			X1L[0]=X2L[0];X1H[0]=X2H[0];Y1L[0]=Y2L[0];Y1H[0]=Y2H[0];
			X1L[1]=X2L[1];X1H[1]=X2H[1];Y1L[1]=Y2L[1];Y1H[1]=Y2H[1];
		}
		else
		{
			break;
		}
	}
	//************
	SFRPAGE=TMR3_PAGE;
	TR3=1;
	SFRPAGE=LEGACY_PAGE;
	//************
	LCDOVERLAP(1);//覆盖方式
	//
	LCDFCOLOR(6);//前景色为黄色	
	LCDHANZ();                                       
	LCDXY(12,14);//开始烧结按确定
	LCDDAT(0xBF);  
	LCDDAT(0xAA); 
	LCDDAT(0xCA); 
	LCDDAT(0xBC);     
	LCDDAT(0xC9); 
	LCDDAT(0xD5);             

⌨️ 快捷键说明

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