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

📄 fourchannel.c

📁 89V51RD2单片机驱动步进电机带动一个测速的四通道光电传感器,分析传感器四个通道是否正常,并在12864的显示屏上显示并用TP微打根据屏幕显示的打印.内附ProtelPCB板并已成功制作样机两台.
💻 C
📖 第 1 页 / 共 5 页
字号:
    {   overtime=0;              	                    		//无脉冲超时错误
        CMOD=0x01;CCON=0x00;IE|=0xc0;        		                	    
        if(cnnumb==0)	                                		//测量组通道,0测量AB通道,1测量CD通道 
	    {   CCAPM0=CCAPM1=CCAPM2=CCAPM3=0;
            PlusError=0;
			PlusOver0=PlusOver1=PlusCount0=PlusCount1=0;                  
            starovertime();
			UseFlag=0; CCAPM0=0x21; CH=CL=0X00; CCON=0X40;      //单组测量,上升沿触发,中断开,清除PCA中断标记,置位CR运行PCA 
			while(overtimeflag) {if(UseFlag==1) break;}   		//首个脉冲值出现后跳出;<overtimeflag==0:无脉冲而导致超时错误,循环停止>              
            CCAPM0=CCAPM1=0X31;
            while(overtimeflag)  	                        	//上升下降沿触发;<overtimeflag==0:无脉冲而导致超时错误,循环停止> 
	        {   if(PlusOver0>2||PlusOver1>2) {PlusError=1; break;}
		        if((PlusCount0==GS)&&(PlusCount1==GS)) break;
    	    }   
            CCON=0x00;CCAPM0=CCAPM1=0X00;                       //单组通道测量完毕
            stopovertime();
			if(overtimeflag==0)
            {   init(); wrcommand(0x0c); setxy(0x89); dispen(0x41); dispen(0x42); disphz(0xcd,0xa8);
                disphz(0xb5,0xc0);disphz(0xce,0xde); disphz(0xc2,0xf6); disphz(0xb3,0xe5);   //AB无脉冲
            	delay();delay();init();wrcommand(0x0c); break;
            }
            if(PlusError==1||1==datamanage_plus(cnnumb,group))	//利用PlusError==1则后面的不执行
            {   if(errorcount++>6){break;}}
            else break;
        }					
	    else
        {   CCAPM0=CCAPM1=CCAPM2=CCAPM3=0;
            PlusError=0;
			PlusCount0=PlusCount1=PlusOver0=PlusOver1=0;                     
            starovertime();
			UseFlag=0; CCAPM2=0x21; CH=CL=0X00; CCON=0X40;    	//单组测量,上升沿触发,中断开,清除PCA中断标记,置位CR运行PCA 
	        while(overtimeflag){if(UseFlag==1) break;}			//首个脉冲值出现后跳出;<overtimeflag==0:无脉冲而导致超时错误,循环停止>                
            CCAPM2=CCAPM3=0X31;
	        while(overtimeflag)									//上升下降沿触发;<overtimeflag==0:无脉冲而导致超时错误,循环停止> 		
	        {   if(PlusOver0>2||PlusOver1>2){PlusError=1;break;}
		        if((PlusCount0==GS)&&(PlusCount1==GS)) break;
    	    }
            CCON=0x00;CCAPM2=CCAPM3=0X00;                       //单组通道测量完毕
            stopovertime();
			if(overtimeflag==0)
            {   init(); wrcommand(0x0c); setxy(0x89); dispen(0x43); dispen(0x44); disphz(0xcd,0xa8);
                disphz(0xb5,0xc0);disphz(0xce,0xde); disphz(0xc2,0xf6); disphz(0xb3,0xe5);		//CD无脉冲
                delay(); delay(); init(); wrcommand(0x0c);break;
       	    }
            if(PlusError==1||1==datamanage_plus(cnnumb,group))
            {   if(errorcount++>6) {break;}}
            else break;
        }
    }
}
void pulse(uchar group)             	//双通道,四通道切换测量
{	if(channeltype==2) cycleall(0,group);              
    else {cycleall(0,group); cycleall(2,group);}        //测量四通道
}
uchar readad(uchar chan)	            //从0809读取采样值,port将采样的通道号
{	uchar data i;
	uchar idata k;
    ad_star=0; P0=chan; ad_star=1; ad_star=1; ad_star=0; ad_star=0; P0=0xff; ad_oe=1; i=254;//P0输出通道号
    while(i--){;}      	                                //延时116uS,等待数据转换完毕.
    P0=0xff;k=P0;ad_oe=0;                               //置ad_oe=0则0809的数据端口高阻 ,k=P0;
    return(k);
}
void accon(uchar k)				        //测量AD高电平
{	uchar i,aderrorcount;
	while(1)
    {   ad_star=0; ad_oe=0;
    	starovertime();
		for(i=0;i<GS2;i++)
    	{ 	UseFlag=0;			                        //清除使用标记
    		while(UseFlag==0&&overtimeflag==1){;}	 	//通道触发沿出现,跳出循环;overtimeflag==0:跳出循环
            ComputTemp[i]=readad(k);
        }
		stopovertime();
        if(1==datamanage_del())          	            //判断脉冲电平值是否在数理统计范围内
        {   if(aderrorcount++>7){break;}  
        }
        else break;
   }     
}
void ad(uchar group)			        //ad测量
{	CCAPM0=CCAPM1=CCAPM2=CCAPM3=0x00; stb=1;
	IE|=0xc0; CCON=0x40;                                    //打开EA,ECCF(PCA中断),使用AD高低电平标记,1/6分频
	if(channeltype==4)  
	{   CCAPM2=0x21; accon(2); Disp[group][2].HLevel=(uchar)(HWidth*0.5737864); CCAPM2=0x00;
	    CCAPM3=0x21; accon(3); Disp[group][3].HLevel=(uchar)(HWidth*0.5737864); CCAPM3=0x00;	//最高低电平
	    CCAPM2=0x11; accon(2); Disp[group][2].LLevel=(uchar)(LWidth*5.737864); CCAPM2=0x00;
	    CCAPM3=0x11; accon(3); Disp[group][3].LLevel=(uchar)(LWidth*5.737864); CCAPM3=0x00;}	//注意;没有'ELSE',如果'channeltype'=0,进行四通道测量
	
	{   CCAPM0=0x21; accon(0); Disp[group][0].HLevel=(uchar)(HWidth*0.5737864); CCAPM0=0x00;		
	    CCAPM1=0x21; accon(1); Disp[group][1].HLevel=(uchar)(HWidth*0.5737864); CCAPM1=0x00;
		CCAPM0=0x11; accon(0); Disp[group][0].LLevel=(uchar)(LWidth*5.737864); CCAPM0=0x00;
		CCAPM1=0x11; accon(1); Disp[group][1].LLevel=(uchar)(LWidth*5.737864); CCAPM1=0x00;}
	IE&=0xbf; CCON=0x00;                     
}
void dataconversion(uchar group)     	//屏显数据处理<group:0:人工测量;0,1,2:自动测量>
{   uchar idata i,cct,ctemp;
    if(channeltype==4)cct=4; else cct=2;       
    for(i=0;i<cct;i++)					
    {	ctemp=(uchar)(10000000/(Disp[group][i].APlusWidth*5.425276)/rev_num[mi]);	//显示脉冲个数 0屏显高位
    	if(ctemp<=202&&ctemp>=198)ctemp=200;										//微小调整
		if(ctemp!=200)DError[i]|=0x80;												//脉冲数不等于200,错误
		Disp[group][i].PlusCount[0]=ctemp/100;
		if(Disp[group][i].PlusCount[0]>9) Disp[group][i].PlusCount[0]=0;			//防止显示乱码
		ctemp=ctemp%100;
    	Disp[group][i].PlusCount[1]=ctemp/10;
    	Disp[group][i].PlusCount[2]=ctemp%10;
        
		ctemp=Disp[group][i].HDutyRatio;                                            //显示最大占空比0:十位1:个位
        if(ctemp<30||ctemp>70)DError[i]|=0x10;
		Disp[group][i].DHDutyRatio[0]=ctemp/10;
    	if(Disp[group][i].DHDutyRatio[0]>9) Disp[group][i].DHDutyRatio[0]=0;		//防止显示乱码
		Disp[group][i].DHDutyRatio[1]=ctemp%10;
        ctemp=Disp[group][i].LDutyRatio;                                            //显示最小占空比0:十位1:个位
        if(ctemp<30||ctemp>70)DError[i]|=0x06;
		Disp[group][i].DLDutyRatio[0]=ctemp/10;
    	if(Disp[group][i].DLDutyRatio[0]>9) Disp[group][i].DLDutyRatio[0]=0;		//防止显示乱码
		Disp[group][i].DLDutyRatio[1]=ctemp%10;
        
		ctemp=Disp[group][i].HPhaseDiff;											//显示最大相位差0:十位1:个位
		if(ctemp<45||ctemp>135)DError[i]|=0x04;
		Disp[group][i].DHPhaseDiff[0]=ctemp/100;
		if(Disp[group][i].DHPhaseDiff[0]>9) Disp[group][i].DHPhaseDiff[0]=0;		//防止显示乱码
		ctemp=ctemp%100;
    	Disp[group][i].DHPhaseDiff[1]=ctemp/10;
        Disp[group][i].DHPhaseDiff[2]=ctemp%10;
        ctemp=Disp[group][i].LPhaseDiff;
		if(ctemp<45||ctemp>135)DError[i]|=0x02;
		Disp[group][i].DLPhaseDiff[0]=ctemp/100;
		if(Disp[group][i].DLPhaseDiff[0]>9) Disp[group][i].DLPhaseDiff[0]=0;		//防止显示乱码
		ctemp=ctemp%100;				   											//显示最小相位差0:十位1:个位
    	Disp[group][i].DLPhaseDiff[1]=ctemp/10;
        Disp[group][i].DLPhaseDiff[2]=ctemp%10;
    	
		ctemp=Disp[group][i].HLevel;                                        		//Disp[][].HLevel定义为uchar型,并且在accon()函数中已算好.高电平0:10v    1:1v   2:0.1v	
        if(ctemp<90)DError[i]|=0x40;												//高电平<9V,错误
		Disp[group][i].DHLevel[0]=ctemp/100;
		if(Disp[group][i].DHLevel[0]>9) Disp[group][i].DHLevel[0]=0;				//防止显示乱码
		ctemp=ctemp%100;
    	Disp[group][i].DHLevel[1]=ctemp/10;
    	Disp[group][i].DHLevel[2]=ctemp%10;
    	ctemp=Disp[group][i].LLevel;                                        		//Disp[][].HLevel定义为uchar型,并且在accon()函数中已算好.低电平0:1v    1:0.1v   2:0.01v AD分压比:2.958127
        if(ctemp>200)DError[i]|=0x20;												//低电平>2V,错误
		Disp[group][i].DLLevel[0]=ctemp/100;
		if(Disp[group][i].DLLevel[0]>9) Disp[group][i].DLLevel[0]=0;				//防止显示乱码
		ctemp=ctemp%100;
    	Disp[group][i].DLLevel[1]=ctemp/10;
    	Disp[group][i].DLLevel[2]=ctemp%10;
    }
}void delay(void)				        //显示延时
{uchar delayi,delayj,delayk;			//六时钟模式
	for(delayi=12;delayi!=0;delayi--)		//每秒两个数字
		for(delayj=200;delayj!=0;delayj--)	//0.5s
			for(delayk=200;delayk!=0;delayk--){;}
}
void smalldelay(void)					//键盘延时0.5s
{uchar delayj,delayk;			//六时钟模式
	for(delayj=200;delayj!=0;delayj--)	//40ms
		for(delayk=200;delayk!=0;delayk--){;}
}uchar key(void)					        //键盘扫描,返回键值40mS
{	uchar idata line,row,fs=0xff,kv,keyvalu;
	P2=0xf0;keyvalu=P2&0xf0;            //-------键盘接线图-------//
	if(P2==0xf0)return(15);             ////////////////////////////
	else{smalldelay();keyvalu=P2&0xf0;}      // P2.0            P2.7   //
	if(keyvalu==0xf0)return(15);        // ||||      | | | |      //
	else{line=0x00;                     // ||||__null  1 2 3      //
		for(row=1;row<5;row++)          // |||___print 4 5 6      //
		{	fs=fs<<1;P2=fs;             // ||____up    7 8 9      //
		if((P2&0xf0)!=0xf0) goto attu;  // |_____down ok 0 cancel //
		}                               ////////////////////////////
		return(15);
}
attu:line=0xf0&P2;
	switch(row)
	{	case 1:switch(line)
			{	case 0x70:kv=13;break;	//cancel
				case 0xb0:kv=0; break;
				case 0xd0:kv=12;break;	//ok
				case 0xe0:kv=11;break;	//down
				default:kv=15;break;}	//null
				break;
		case 2:switch(line)
			{	case 0x70:kv=9;break;
				case 0xb0:kv=8;break;
				case 0xd0:kv=7;break;
				case 0xe0:kv=10;break;	//up	
				default:kv=15;}
				break;
		case 3:switch(line)

⌨️ 快捷键说明

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