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

📄 fourchannel.c

📁 89V51RD2单片机驱动步进电机带动一个测速的四通道光电传感器,分析传感器四个通道是否正常,并在12864的显示屏上显示并用TP微打根据屏幕显示的打印.内附ProtelPCB板并已成功制作样机两台.
💻 C
📖 第 1 页 / 共 5 页
字号:
    }print(0xd0);print(0xcd);                                                                   //型
    print(0x0a);                                                                        		//打印空行
}
void pout5(uchar printrev)           	//打印转速printrev<0-6>:'转速'<0:300r/min;1:400r/min......6:1000r/min>
{   print(0x1b);print(0x40);print(0x1b);print(0x31);print(0x03);print(0x1b);print(0x20); print(0x00);	//打印初始化,行间距3点
    print(0x1b);print(0x38);print(0x04);                                                            	//设定12*12点阵
	print(0xd7);print(0xaa);print(0xcb);print(0xd9);print(0x3a);                                		//转速:
	print(0x1b);print(0x36);                                                                         	//选用字符集1                                       //选择字符集1:
	switch(printrev)
	{	case 2:printrev=3;break;
		case 3:printrev=4;break;
		case 4:printrev=5;break;
		case 5:printrev=6;break;
		case 6:printrev=7;break;
		case 7:printrev=8;break;
		case 8:print(0x31);printrev=0;break;
		//default:print(0x31);printrev=0;break; 
	}
	print(0x30+printrev);                               												//300-1000
    print(0x30);print(0x30);print(0x72);print(0x2f);print(0x6d);print(0x69);print(0x6e);print(0x0d);	//r/min
    print(0x1b);print(0x38);print(0x04);                                                            	//设定12*12点阵
}
void dout(uchar jindu)                  //显示进度条<jindu:屏幕0x89-0x8e被划分了12个区域,送入区域值,则显示>
{   uchar i;
    setxy(0x89);
    for(i=0;i<jindu;i++)dispen(0x08);
    dispen(0x10);
}
void printall(uchar dispgroup)        	//打印全部|dispgroup<1,3>:1:打印一组通道,3:打印三组通道(300,500,1000)>
{   init(); wrcommand(0x0c);
    setxy(0x80); dispen(0x07); dispen(0x04); dispen(0x04); dispen(0x04); dispen(0x04); dispen(0x04);     //显示花纹
    dispen(0x04); dispen(0x04); dispen(0x04); dispen(0x04); dispen(0x04); dispen(0x04);dispen(0x04);
    dispen(0x04); dispen(0x04); dispen(0x04);setxy(0x90); dispen(0x04);setxy(0x97); dispen(0x20);
    dispen(0x04); setxy(0x88); dispen(0x04); setxy(0x8f); dispen(0x20); dispen(0x04); setxy(0x98);
    dispen(0x04); dispen(0x04); dispen(0x04); dispen(0x04); dispen(0x04); dispen(0x04); dispen(0x04); dispen(0x04);
    dispen(0x04); dispen(0x04); dispen(0x04); dispen(0x04); dispen(0x04); dispen(0x04); dispen(0x04); dispen(0x07);      
	setxy(0x91);disphz(0xc8,0xab);disphz(0xb2,0xbf);disphz(0xb4,0xf2);disphz(0xd3,0xa1);
	disphz(0xd6,0xd0);setxy(0x89);                                             	                        //全部打印中。。。
	if(dispgroup==3)
    {	if(channeltype==2){ dout(0);pout4();dout(1);pout3(0,2);dout(2);pout2(1,2);dout(3);pout2(0,2);dout(4);pout5(8);
                            dout(5);pout3(0,1);dout(6);pout2(1,1);dout(7);pout2(0,1);pout5(4);dout(8);pout3(0,0);
                            dout(9);pout2(1,0);pout2(0,0);dout(10);pout5(2);dout(11);pout1();}          //打印三组全部双通道
	    else {  dout(0);pout4();pout3(2,2);dout(1);pout2(3,2);pout2(2,2);dout(2);pout3(0,2);pout2(1,2);dout(3);pout2(0,2);pout5(8);dout(4);
                       pout3(2,1);pout2(3,1);dout(5);pout2(2,1);pout3(0,1);dout(6);pout2(1,1);pout2(0,1);dout(7);pout5(4);
                       pout3(2,0);dout(8);pout2(3,0);pout2(2,0);dout(9);pout3(0,0);pout2(1,0);dout(10);pout2(0,0);pout5(2);pout1();dout(11); 
              }																						  	//打印三组全部四通道
    }
    else
    {   if(channeltype==2){dout(0);pout4();dout(2);pout3(0,0);dout(4);pout2(1,0);dout(6);pout2(0,0);dout(8);pout5(rev);dout(10);pout1();dout(12);}	//打印全部双通道
	    else {dout(0);pout4();dout(1);pout3(2,0);dout(3);pout2(3,0);dout(4);pout2(2,0);dout(6);pout3(0,0);dout(7);pout2(1,0);dout(8);pout2(0,0);
                dout(9);pout5(rev);dout(10);pout1();dout(11);}											//打印全部四通道
    }
}
void starovertime(void)          	    //测量超时错误
{   overtimeflag=1;overtime=10;IE|=0x82;				//初始化超时标志overtimeflag<0:超时错误标志;1:正常使用>				
	IPL=0X40;IPH=0X40;TMOD=0x01;TH0=0X00;TL0=0X00;TR0=1;
}
void stopovertime(void)            	    //停止测量超时错误
{   IE&=0x7d;TR0=0;
}
void dispmenu_0()                  	    //显示开始菜单
{   init();wrcommand(0x0c);	
    //按1234显示ABCD通道,789显示自动测量的三个转速
    init();wrcommand(0x0c);
    if(channeltype==2)										//单/双通道结果显示
    {   setxy(0x80);dispen(0x31);dispen(0x04);dispen(0x1A);dispen(0x41);disphz(0xcd,0xa8);disphz(0xb5,0xc0);
        if(DError[0]==0){disphz(0xd5,0xfd);disphz(0xb3,0xa3);}else {disphz(0xb4,0xed);disphz(0xce,0xf3);}//a通道正常/错误
        setxy(0x90);dispen(0x32);dispen(0x04);dispen(0x1A);dispen(0x42);disphz(0xcd,0xa8);disphz(0xb5,0xc0);
        if(DError[1]==0){disphz(0xd5,0xfd);disphz(0xb3,0xa3);}else {disphz(0xb4,0xed);disphz(0xce,0xf3);}//b通道正常/错误
    }
    else
    {   setxy(0x80);dispen(0x31);dispen(0x04);dispen(0x1A);dispen(0x41);disphz(0xcd,0xa8);disphz(0xb5,0xc0);
        if(DError[0]==0){disphz(0xd5,0xfd);disphz(0xb3,0xa3);}else {disphz(0xb4,0xed);disphz(0xce,0xf3);}//a通道正常/错误
        setxy(0x90);dispen(0x32);dispen(0x04);dispen(0x1A);dispen(0x42);disphz(0xcd,0xa8);disphz(0xb5,0xc0);
        if(DError[1]==0){disphz(0xd5,0xfd);disphz(0xb3,0xa3);}else {disphz(0xb4,0xed);disphz(0xce,0xf3);}//b通道正常/错误
        setxy(0x88);dispen(0x33);dispen(0x04);dispen(0x1A);dispen(0x43);disphz(0xcd,0xa8);disphz(0xb5,0xc0);
        if(DError[2]==0){disphz(0xd5,0xfd);disphz(0xb3,0xa3);}else {disphz(0xb4,0xed);disphz(0xce,0xf3);}//c通道正常/错误
        setxy(0x98);dispen(0x34);dispen(0x04);dispen(0x1A);dispen(0x44);disphz(0xcd,0xa8);disphz(0xb5,0xc0);
        if(DError[3]==0){disphz(0xd5,0xfd);disphz(0xb3,0xa3);}else {disphz(0xb4,0xed);disphz(0xce,0xf3);}//d通道正常/错误 	
    }
}
void dispmenu_1(uchar ee,uchar group)	//显示第一层菜单ee<0-3>:"显示的通道"<ABCD>group<0-2>:"显示的组"
{   init();wrcommand(0x0c);												//整体显示on;游标off ;游标闪烁off
    setxy(0x80);disphz(0xd7,0xee);disphz(0xb5,0xcd);disphz(0xb8,0xdf);disphz(0xb5,0xe7);disphz(0xc6,0xbd);dispen(0x3a); //最低高电平:
    if(Disp[group][ee].DHLevel[0]==0) dispen(0x20);else dispen(Disp[group][ee].DHLevel[0]+0x30);                        //首位为0,隐藏0.
    dispen(Disp[group][ee].DHLevel[1]+0x30);dispen(0x2e);dispen(Disp[group][ee].DHLevel[2]+0x30);dispen(0x56);          //xx.xV
    setxy(0x90);disphz(0xd7,0xee);disphz(0xb8,0xdf);disphz(0xb5,0xcd);disphz(0xb5,0xe7);disphz(0xc6,0xbd);dispen(0x3a); //最高低电平:
    dispen(Disp[group][ee].DLLevel[0]+0x30);dispen(0x2e);dispen(Disp[group][ee].DLLevel[1]+0x30);
    dispen(Disp[group][ee].DLLevel[2]+0x30);dispen(0x56);                                                               //_x.xxV
    setxy(0x88);disphz(0xd7,0xee);disphz(0xb4,0xf3);disphz(0xd5,0xbc);disphz(0xbf,0xd5);disphz(0xb1,0xc8);dispen(0x3a); //最大占空比:
    dispen(0x20);dispen(Disp[group][ee].DHDutyRatio[0]+0x30);dispen(Disp[group][ee].DHDutyRatio[1]+0x30);dispen(0x25);  //xx%
    setxy(0x98);disphz(0xd7,0xee);disphz(0xd0,0xa1);disphz(0xd5,0xbc);disphz(0xbf,0xd5);disphz(0xb1,0xc8);dispen(0x3a); //最小占空比:
    dispen(0x20);dispen(Disp[group][ee].DLDutyRatio[0]+0x30);dispen(Disp[group][ee].DLDutyRatio[1]+0x30);dispen(0x25);  //xx%
    setxy(0x80);dispen(0x41+ee);dispen(0x20);disphz(0xcd,0xa8);disphz(0xb5,0xc0);                     	                //A通道
    setxy(0x90);
    if(rev==1)
    {   switch(group)
        {   case 0:dispen(0x33);dispen(0x30);dispen(0x30);dispen(0x72);break;                                               //300r
            case 1:dispen(0x35);dispen(0x30);dispen(0x30);dispen(0x72);break;                                               //500r
            case 2:dispen(0x31);dispen(0x30);dispen(0x30);dispen(0x30);dispen(0x72);dispen(0x20);break;                     //1000r_
    	}delay();smalldelay();smalldelay();smalldelay();smalldelay();
        setxy(0x80);disphz(0xd7,0xee);disphz(0xb5,0xcd);disphz(0xb8,0xdf);                                                  //最低高
        setxy(0x90);disphz(0xd7,0xee);disphz(0xb8,0xdf);disphz(0xb5,0xcd);                                                  //最高低
    }
    else 
    switch(rev)   
        {   case 8:dispen(0x31);dispen(0x30);dispen(0x30);dispen(0x30);dispen(0x72);dispen(0x20);break;                     //1000r_
            case 2:dispen(0x33);dispen(0x30);dispen(0x30);dispen(0x72);break;                                               //300r
            case 3:dispen(0x34);dispen(0x30);dispen(0x30);dispen(0x72);break;                                               //400r
    	    case 4:dispen(0x35);dispen(0x30);dispen(0x30);dispen(0x72);break;
            case 5:dispen(0x36);dispen(0x30);dispen(0x30);dispen(0x72);break;
            case 6:dispen(0x37);dispen(0x30);dispen(0x30);dispen(0x72);break;
            case 7:dispen(0x38);dispen(0x30);dispen(0x30);dispen(0x72);break;
	    }delay();smalldelay();smalldelay();smalldelay();smalldelay();
        setxy(0x80);disphz(0xd7,0xee);disphz(0xb5,0xcd);disphz(0xb8,0xdf);                                                  //最低高
        setxy(0x90);disphz(0xd7,0xee);disphz(0xb8,0xdf);disphz(0xb5,0xcd);                                                  //最高低
}
void dispmenu_2(uchar ee,uchar group)   //显示第二层菜单
{  	init();wrcommand(0x0c);												//整体显示on;游标off ;游标闪烁off
    if(ee<3){setxy(0x80);dispen(0x41);dispen(0x42);disphz(0xd7,0xee);disphz(0xb4,0xf3);disphz(0xcf,0xe0);disphz(0xb2,0xee);dispen(0x3a);            //最大相差:
            if(Disp[group][ee].DHPhaseDiff[0]==0) dispen(0x20); else dispen(Disp[group][ee].DHPhaseDiff[0]+0x30);
                      dispen(Disp[group][ee].DHPhaseDiff[1]+0x30);dispen(Disp[group][ee].DHPhaseDiff[2]+0x30);disphz(0xb6,0xc8);                  //xx度
            setxy(0x90);dispen(0x41);dispen(0x42);disphz(0xd7,0xee);disphz(0xd0,0xa1);disphz(0xcf,0xe0);disphz(0xb2,0xee);dispen(0x3a);             //最小相差:
            if(Disp[group][ee].DLPhaseDiff[0]==0) dispen(0x20); else dispen(Disp[group][ee].DLPhaseDiff[0]+0x30);
                      dispen(Disp[group][ee].DLPhaseDiff[1]+0x30);dispen(Disp[group][ee].DLPhaseDiff[2]+0x30);disphz(0xb6,0xc8);                	//xx度
            setxy(0x88);dispen(0x20);dispen(0x41);disphz(0xcd,0xa8);disphz(0xb5,0xc0);disphz(0xc2,0xf6);disphz(0xb3,0xe5);dispen(0x3a);dispen(0x20);//A通道脉冲:
            dispen(Disp[group][ee].PlusCount[0]+0x30);dispen(Disp[group][ee].PlusCount[1]+0x30);dispen(Disp[group][ee].PlusCount[2]+0x30);       //200
            setxy(0x98);dispen(0x20);dispen(0x42);disphz(0xcd,0xa8);disphz(0xb5,0xc0);disphz(0xc2,0xf6);disphz(0xb3,0xe5);dispen(0x3a);dispen(0x20);//B通道脉冲:
            dispen(Disp[group][ee].PlusCount[0]+0x30);dispen(Disp[group][ee].PlusCount[1]+0x30);dispen(Disp[group][ee].PlusCount[2]+0x30);}      //200
    else{   setxy(0x80);dispen(0x43);dispen(0x44);disphz(0xd7,0xee);disphz(0xb4,0xf3);disphz(0xcf,0xe0);disphz(0xb2,0xee);dispen(0x3a);             //最大相差:
            if(Disp[group][ee].DHPhaseDiff[0]==0) dispen(0x20); else dispen(Disp[group][ee].DHPhaseDiff[0]+0x30);
                      dispen(Disp[group][ee].DHPhaseDiff[1]+0x30);dispen(Disp[group][ee].DHPhaseDiff[2]+0x30);disphz(0xb6,0xc8);                  //xx度
            setxy(0x90);dispen(0x43);dispen(0x44);disphz(0xd7,0xee);disphz(0xd0,0xa1);disphz(0xcf,0xe0);disphz(0xb2,0xee);dispen(0x3a);             //最小相差:
            if(Disp[group][ee].DLPhaseDiff[0]==0) dispen(0x20); else dispen(Disp[group][ee].DLPhaseDiff[0]+0x30);
                      dispen(Disp[group][ee].DLPhaseDiff[1]+0x30);dispen(Disp[group][ee].DLPhaseDiff[2]+0x30);disphz(0xb6,0xc8);                  //xx度
            setxy(0x88);dispen(0x20);dispen(0x43);disphz(0xcd,0xa8);disphz(0xb5,0xc0);disphz(0xc2,0xf6);disphz(0xb3,0xe5);dispen(0x3a);dispen(0x20);//C通道脉冲:
            dispen(Disp[group][ee].PlusCount[0]+0x30);dispen(Disp[group][ee].PlusCount[1]+0x30);dispen(Disp[group][ee].PlusCount[2]+0x30);       //200
            setxy(0x98);dispen(0x20);dispen(0x44);disphz(0xcd,0xa8);disphz(0xb5,0xc0);disphz(0xc2,0xf6);disphz(0xb3,0xe5);dispen(0x3a);dispen(0x20);//D通道脉冲:
            dispen(Disp[group][ee].PlusCount[0]+0x30);dispen(Disp[group][ee].PlusCount[1]+0x30);dispen(Disp[group][ee].PlusCount[2]+0x30);}      //200
}
void menu_main1(uchar dispgroup)    	//主显示函数|dispgroup<1,3>:"自动测量(三组通道)/手动测量(一组通道)"1:一组通道;3:三组通道
{   uchar data displayer=0;    	//displayer<0-2>:"显示菜单"共有三层菜单dispmenu_0-2,<0:显示开始菜单1:显示第一层菜单2:显示第二层菜单>
    uchar idata ee=0;           //ee<0-3>:"显示通道"共有四个通道A,B,C,D
    uchar printtop=0;     		//printtop<0,1>:"打印信息头,尾"
    uchar printrev;				//printrev<1-8>:"当前要打印的转速"1自动;2:300r/min...8:1000r/min
	uchar data group=0;      	//group<0-2>:"自动测量的三组通道"0:300r/min;1:500r/min;2:1000r/min
    uchar idata ps;             //ps<0-15>:"键盘缓存"
    uchar remeasure=1;          //remeasure<0,1>:"重测标记"0:回到开始菜单;1:继续menu_main1的菜单
    uchar printexitflag=1;		//printexit<0,1>退出打印菜单1:菜单内循环0:退出打印菜单
	dispmenu_0();                                                           //显示开始菜单
    if(dispgroup==3) {group=0;printrev=2;} else {group=0;printrev=rev;}
	while(remeasure)
    {   smalldelay();smalldelay();smalldelay();smalldelay();
		while((ps=key())==15){;}								            //等待用户输入将用显示的通道号(0,1,2,3)
        switch(ps)
        {   case 1: ee=0; displayer=1; break;                               //显示通道
            case 2: ee=1; displayer=1; break;
            case 3: if(channeltype==4){ee=2; displayer=1;} break;
            case 4: if(channeltype==4){ee=3; displayer=1;} break;
            case 7: if(dispgroup==3) {group=0;printrev=2;} else {group=0;printrev=rev;} break;	//自动测量中300转显示
            case 8: if(dispgroup==3) {group=1;printrev=4;} else {group=0;printrev=rev;} break; 	//自动测量中500转显示
            case 9: if(dispgroup==3) {group=2;printrev=8;} else {group=0;printrev=rev;} break;	//自动测量中1000转显示
            case 10:break;
            case 11:switch(displayer)                             	                        //下一层显示
                    {	case 0:displayer=1; break;                                          //现在处在0层,将显示第一层
                        case 1:if(ee==0||ee==2){displayer=1; ++ee;} else displayer=2; break;//显示第二层
                        case 2:if(++ee>=channeltype) ee=0; displayer=1; break;	     	    //循环显示下一通道的第一层
                    }break;
            case 12:switch(displayer)                                 	                    //下一层显示
                    {	case 0:displayer=1;break;                                           //现在处在0层,将显示第一层
                        case 1:if(ee==0||ee==2){displayer=1; ++ee;}else displayer=2; break;	//显示第二层
                        case 2:if(++ee>=channeltype) ee=0; displayer=1; break;	    	    //循环显示下一通道的第一层
                    }break;
            case 13:init();wrcommand(0x0c);                                                 //确定:重测  其他:取消
                    setxy(0x80); dispen(0x07); dispen(0x07); dispen(0x07); dispen(0x07); dispen(0x07); dispen(0x07);    //显示花纹
                    dispen(0x07); dispen(0x07); dispen(0x07); dispen(0x07); dispen(0x07); dispen(0x07);dispen(0x07);
                    dispen(0x07); dispen(0x07); dispen(0x07);setxy(0x90); dispen(0x07);setxy(0x97); dispen(0x20);
                    dispen(0x07); setxy(0x88); dispen(0x07); setxy(0x8f); dispen(0x20); dispen(0x07); setxy(0x98);
                    dispen(0x07); dispen(0x07); dispen(0x07); dispen(0x07); dispen(0x07); dispen(0x07); dispen(0x07); dispen(0x07);
                    dispen(0x07); dispen(0x07); dispen(0x07); dispen(0x07); dispen(0x07); dispen(0x07); dispen(0x07); dispen(0x07);      
                    setxy(0x91);disphz(0xc8,0xb7);disphz(0xb6,0xa8);dispen(0x0a);dispen(0x20);disphz(0xd6,0xd8);disphz(0xb2,0xe2);	//确定:重测
                    setxy(0x89);disphz(0xc6,0xe4);disphz(0xcb,0xfc);disphz(0xbc,0xfc);disphz(0xc8,0xa1);disphz(0xcf,0xfb);          //其他键取消
                    smalldelay();smalldelay();smalldelay();smalldelay();smalldelay();smalldelay();
                    while((ps=key())==15){;}
                    switch(ps)                                 	                
                    {   case 12:remeasure=0;break;                                          		//按下取消进入此项,再按确认返回开始界面 	
                    	case 13:break;
						default:break;
					}break;
            case 14:printexitflag=1;																	//设定打印菜单循环条件

⌨️ 快捷键说明

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