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

📄 fourchannel.c

📁 89V51RD2单片机驱动步进电机带动一个测速的四通道光电传感器,分析传感器四个通道是否正常,并在12864的显示屏上显示并用TP微打根据屏幕显示的打印.内附ProtelPCB板并已成功制作样机两台.
💻 C
📖 第 1 页 / 共 5 页
字号:
			{	case 0x70:kv=6;break;
				case 0xb0:kv=5;break;
				case 0xd0:kv=4;break;
				case 0xe0:kv=14;break;//print
				default:kv=15;}
				break;
		case 4:switch(line)
			{	case 0x70:kv=3;break;
				case 0xb0:kv=2;break;
				case 0xd0:kv=1;break;
				default:kv=15;}
				break;
	}
	return (kv);
}
void lcd_busy(void)				        //忙判断
{	p_di=0;p_rw=1;
	P0=0xff;
	while(1)//while(1)
	{	p_e=1;
		if(P0<0x80){break;}
		p_e=0;
	}
	p_e=0;
}
void pwmthreeoutup(uchar outvalue)      //电机升速驱动outvalue<0-7>
{   uint data ede;
    TH1=0Xf0; TL1=0XC0;
    IE|=0x88; TMOD|=0x10;	
    T2MOD=0X02; TR1=1;
    TR2=0;pwml=RCAP2H;pwmh=RCAP2L;TR2=1;
    ede=(uint)(5606742/(0xffff-pwma));
    while(1)
    {   ede=ede+10;
        pwma=0xffff-(uint)(5606742/ede);	            //计算T2初值
        while(pwmtimeover){;}                	        //等到T1溢出中断(4MS)
        TR2=0;RCAP2H=pwml;RCAP2L=pwmh;TR2=1;
        pwmtimeover=1;                               	//清中断时间到标志
        if(pwm[outvalue][1]<ede) break;
    }
    pwma=pwm[outvalue][0];
    TR2=0;RCAP2H=pwml;RCAP2L=pwmh;TR2=1;
    TR1=0;IE&=0x77; 
}
void pwmoutup(uchar outvalue)	        //启动电机
{   uint data ede=86; 
    TH1=0Xf0; TL1=0XC0;
    IE|=0x88; TMOD|=0x10;	
    T2MOD=0X02; TR1=1;
    while(1)
    {	pwma=0xffff-(uint)(5606742/ede); 	        	//计算T2初值 
        ede=ede+4;
        while(pwmtimeover){;}                           //等到T1溢出中断(4MS)
        TR2=0;RCAP2H=pwml;RCAP2L=pwmh;TR2=1;
        pwmtimeover=1;                                 	//清中断时间到标志
        if(ede>2400) break;                        	    //判断是否到循环次数
    }
    pwmthreeoutup(outvalue);
}
void pwmoutdown()			            //pwm降速驱动输出
{   uint data ede;
    TH1=0Xf0; TL1=0XC0;
    IE|=0x88; TMOD|=0x10;TR1=1;
    TR2=0; pwml=RCAP2H; pwmh=RCAP2L; TR2=1;
    ede=(uint)(5606742/(0xffff-pwma));
    while(1)
    {   ede=ede-10;
        pwma=0xffff-(uint)(5606742/ede); 	                //计算T2初值
        while(pwmtimeover){;}                               //等到T1溢出中断(4MS)
        TR2=0; RCAP2H=pwml; RCAP2L=pwmh; TR2=1;
        pwmtimeover=1;                                      //清中断时间到标志
        if(11>ede) break;
    }
    TR1=0; IE&=0xf7; 
    T2CON=0x00; T2MOD=0x00; pwmplus=0;		//关闭T1定时,关闭pwm输出管
}
void setxy(uchar xy)					//lcd地址设定
{	lcd_busy();p_di=0;p_rw=0;P0=0x80|xy;p_e=1;p_e=0;	
}
void wrcommand(uchar u)					//写lcd命令
{	lcd_busy();
	p_di=0;
    p_rw=0;p_e=1;P0=u;p_e=0;
}
void disphz(uchar valuh,uchar valul)	//lcd显示汉字<valuh:汉字内码高位>
{	lcd_busy();p_di=1;p_rw=0;P0=valuh;p_e=1;p_e=0;lcd_busy();p_di=1;p_rw=0;P0=valul;p_e=1;p_e=0;
}
void dispen(uchar valuen)				//lcd显示英文<valuen:asicii码>
{	lcd_busy();p_di=1;p_rw=0;P0=valuen;p_e=1;p_e=0;
}
void init(void)							//lcd初始化※清屏
{	//wrcommand(0x08);//整体显示off;游标off ;游标闪烁off
	wrcommand(0x01);//清除显示屏幕,把ddram位址计数器调整为“00h”
	wrcommand(0x02);//把ddram位址计数器调整为“00h”,游标回原点,该功能不影响显示ddram
	wrcommand(0x06);//设定光标右移,整体显示不移动
	wrcommand(0x14);//整体显示左右移动,光标跟随移动,ac值不变
	wrcommand(0x0e);//整体显示on游标on游标位置on
}
void print(uchar prin)					//打印函数,汉字应调用两次本函数,高位在前
{	uchar data i=5;			            //延时
	busy=1;stb=0;
	while(busy);
	P0=prin;while(i--);
	stb=1;busy=1;		                //设busy为输入线
}
void pout1(void)						//打印头文件
{   print(0x1b);print(0x38);print(0x04);			                                                //打印初始化,设定12*12点阵
    print(0x1b);print(0x31);print(0x03);print(0x1b);print(0x20); print(0x00);                    	//行间距3点
    print(0xb1);print(0xe0);print(0xba);print(0xc5);print(0x3a);
	print(0x30+numbers[0]);print(0x30+numbers[1]);print(0x30+numbers[2]);print(0x30+numbers[3]);	//编号:7434
    print(0x0d);print(0xd0);print(0xcd);print(0xba);print(0xc5);print(0x3a);                      	//型号:
    switch(type)
    {		case 1:print(0x54);print(0x51);print(0x47);print(0x39);print(0x42);print(0x20);break;  	//tqg9b_双通道
		    case 2:print(0x54);print(0x51);print(0x47);print(0x31);print(0x35);print(0x42);break;   //tqg15b_双通道
		    case 3:print(0x44);print(0x46);print(0x38);print(0x20);print(0x20);print(0x20);break;   //df8_双通道
		    case 4:print(0x54);print(0x51);print(0x47);print(0x31);print(0x35);print(0x44);break;   //tqg15d_四通道
		    case 5:print(0x44);print(0x46);print(0x31);print(0x36);print(0x20);print(0x20);break;   //df16_四通道	
    }print(0xd0);print(0xcd);                                                                       //型
     print(0x0a);print(0x0a);print(0x0a);print(0x0a);			                                 	//留出空白便于撕纸
}
void pout2(uchar ree,uchar group)		//打印信息1ree:'通道号'<0-3>;group'组'<0-2>
{   print(0x1b);print(0x40);print(0x1b);print(0x38);print(0x04);			                                                                //打印初始化,设定12*12点阵
    print(0x1b);print(0x31);print(0x03);print(0x1b);print(0x20); print(0x00);                                                               //行间距3点
    print(0xd7);print(0xee);print(0xd0);print(0xa1);print(0xd5);print(0xbc);print(0xbf);print(0xd5);print(0xb1);print(0xc8);                //最小占空比:
    print(0x3a);print(Disp[group][ree].DLDutyRatio[0]+0X30);print(Disp[group][ree].DLDutyRatio[1]+0X30);print(0x25);print(0x0d);            //xx%
    print(0xd7);print(0xee);print(0xb4);print(0xf3);print(0xd5);print(0xbc);print(0xbf);print(0xd5);print(0xb1);print(0xc8);                //最大占空比:
    print(0x3a);print(Disp[group][ree].DHDutyRatio[0]+0X30);print(Disp[group][ree].DHDutyRatio[1]+0X30);print(0x25);print(0x0d);            //xx%
    print(0xd7);print(0xee);print(0xb8);print(0xdf);print(0xb5);print(0xcd);print(0xb5);print(0xe7);print(0xc6);print(0xbd);                //最高低电平
    print(0x1b);print(0x36);                                                                                                                //选择字符集1:
    print(0x3a);if(Disp[group][ree].DLLevel[0]==0) print(Disp[group][ree].DLLevel[0]+0X30);print(0x2e);print(Disp[group][ree].DLLevel[1]+0X30);
    print(Disp[group][ree].DLLevel[1]+0X30);print(0x56);       	                                                                	      	// x.xxv		
    print(0x1b);print(0x38);print(0x04);                                                                                   	                //切换字符集到汉字12*12
    print(0xd7);print(0xee);print(0xb5);print(0xcd);print(0xb8);print(0xdf);print(0xb5);print(0xe7);print(0xc6);print(0xbd);                //最低高电平
    print(0x1b);print(0x36);                                                                                                                //选择字符集1:
    print(0x3a);if(Disp[group][ree].DHLevel[0]==0) print(0x20);else print(Disp[group][ree].DHLevel[0]+0X30);print(Disp[group][ree].DHLevel[1]+0X30);
    print(0x2e);print(Disp[group][ree].DHLevel[2]+0X30);print(0x56);print(0x0d);                                                            //xx.xv;
    print(0x1b);print(0x38);print(0x04);                                                                                   	                //切换字符集到汉字12*12
    print(0x41+ree);print(0x20);print(0xc2);print(0xf6);print(0xb3);print(0xe5);print(0xca);print(0xfd);print(0x3a);//A/B/C/D:脉冲数:
    if(Disp[group][ree].PlusCount[0]!=0){print(Disp[group][ree].PlusCount[0]+0X30);}print(Disp[group][ree].PlusCount[1]+0X30);
    print(Disp[group][ree].PlusCount[2]+0X30);print(0x0d);            	                                                                    //200
    print(0x1b);print(0x38);print(0x04);                                                                                   	                //切换字符集到汉字12*12
}
void pout3(uchar ree,uchar group)		//公共通道打印	ree  0123代表abcd通道
{   print(0x1b);print(0x40);print(0x1b);print(0x38);print(0x04);			                                                                //打印初始化,设定12*12点阵
    print(0x1b);print(0x31);print(0x03);print(0x1b);print(0x20); print(0x00);                                                               //行间距3点
   	if(ree==0||ree==1)
	{	print(0xcd);print(0xa8);print(0xb5);print(0xc0);print(0x42);print(0x3a);		//通道B:  
		if(DError[1]==0){print(0xd5);print(0xfd);print(0xb3);print(0xa3);}
		else 			{print(0xb4);print(0xed);print(0xce);print(0xf3);}print(0x0d);	//正常/错误
   		print(0xcd);print(0xa8);print(0xb5);print(0xc0);print(0x41);print(0x3a);		//通道A:
		if(DError[0]==0){print(0xd5);print(0xfd);print(0xb3);print(0xa3);}
		else 			{print(0xb4);print(0xed);print(0xce);print(0xf3);}print(0x0d);	//正常/错误
	}
	else
	{	print(0xcd);print(0xa8);print(0xb5);print(0xc0);print(0x44);print(0x3a);		//通道D:
		if(DError[3]==0){print(0xd5);print(0xfd);print(0xb3);print(0xa3);}
		else 			{print(0xb4);print(0xed);print(0xce);print(0xf3);}print(0x0d);	//正常/错误
   		print(0xcd);print(0xa8);print(0xb5);print(0xc0);print(0x43);print(0x3a);		//通道C:
		if(DError[2]==0){print(0xd5);print(0xfd);print(0xb3);print(0xa3);}
		else 			{print(0xb4);print(0xed);print(0xce);print(0xf3);}print(0x0d);	//正常/错误
	}
	print(0xd7);print(0xee);print(0xd0);print(0xa1);print(0xcf);print(0xe0);print(0xb2);print(0xee);print(0x3a);                            //最小相差
	if(Disp[group][ree].DLPhaseDiff[0]!=0)print(Disp[group][ree].DLPhaseDiff[0]+0X30);else print(0x20);
    print(Disp[group][ree].DLPhaseDiff[1]+0X30);print(Disp[group][ree].DLPhaseDiff[2]+0X30);print(0xb6);print(0xc8);print(0x0d);      	  	//xx 度:
	print(0xd7);print(0xee);print(0xb4);print(0xf3);print(0xcf);print(0xe0);print(0xb2);print(0xee);print(0x3a);                            //最大相差:
    if(Disp[group][ree].DHPhaseDiff[0]!=0)print(Disp[group][ree].DHPhaseDiff[0]+0X30);else print(0x20);
    print(Disp[group][ree].DHPhaseDiff[1]+0X30);print(Disp[group][ree].DHPhaseDiff[2]+0X30);print(0xb6);print(0xc8);print(0x0d);            //xx 度
}
void pout4(void)                        //打印信息尾
{   print(0x1b);print(0x40);print(0x1b);print(0x38);print(0x04);print(0x1b);print(0x36);    	//打印初始化,设定12*12点阵,选用字符集1
    print(0x1b);print(0x31);print(0x03);print(0x1b);print(0x20); print(0x00);               	//行间距3点,字间距0点
    print(0x1b);print(0x36);                                                                	//使用字符集1
    print(0x32);print(0x30);print(0x30+date[0]);print(0x30+date[1]);print(0x8c);            	//2005年
    if(date[2]!=0) {print(0x30+date[2]);}print(0x30+date[3]);print(0x8d);                   	//06月
    if(date[4]!=0) {print(0x30+date[4]);}print(0x30+date[5]);print(0x8e);      					//15日
    if(date[6]!=0) {print(0x30+date[6]);} else print(0x20); print(0x30+date[7]);
	print(0x3a);print(0x30+date[8]);print(0x30+date[9]);print(0x0d); 							//15:40 当时间15:40中的1为零时不显示
    print(0x1b);print(0x38);print(0x04);                                                    	//切换字符集到汉字12*12
    print(0xb4);print(0xab);print(0xb8);print(0xd0);print(0xc6);print(0xf7);                	//传感器
    if(DError[0]||DError[1]||DError[2]||DError[3]){print(0xb2);print(0xbb);print(0xba);print(0xcf);print(0xb8);print(0xf1);}
    else {    print(0xba);print(0xcf);print(0xb8);print(0xf1);}print(0x0d);                 	//不合格,合格
    print(0xb1);print(0xe0);print(0xba);print(0xc5);print(0x3a);print(0x30+numbers[0]);
    print(0x30+numbers[1]);print(0x30+numbers[2]);print(0x30+numbers[3]);print(0x0d);       	//编号:743
    print(0xd0);print(0xcd);print(0xba);print(0xc5);print(0x3a);                            	//型号:
    switch(type)
    {	case 1:print(0x54);print(0x51);print(0x47);print(0x39);print(0x42);print(0x20);break;   //tqg9b_双通道
		case 2:print(0x54);print(0x51);print(0x47);print(0x31);print(0x35);print(0x42);break;   //tqg15b_双通道
		case 3:print(0x44);print(0x46);print(0x38);print(0x20);print(0x20);print(0x20);break;   //df8_双通道
		case 4:print(0x54);print(0x51);print(0x47);print(0x31);print(0x35);print(0x44);break;  	//tqg15d_四通道
		case 5:print(0x44);print(0x46);print(0x31);print(0x36);print(0x20);print(0x20);break;   //df16_四通道	

⌨️ 快捷键说明

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