📄 play.#2
字号:
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 + -