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

📄 dpj.txt

📁 单片机 驱动小车自动寻迹 实现家庭只能清洁机的功能
💻 TXT
📖 第 1 页 / 共 2 页
字号:
						}
						if(xjqkq==0x03)	{jpt=0;ztsds=ytsds=40;}	//不偏
					}
*/
					{	if(((xjqk==4)|(xjqk==6))&(jpt!=1))	//尾巴左偏
						{	ztsds=49;ytsds=5;
//							if(ztsds>49)	ztsds=49;
							jpt=1;
						}
						if(((xjqk==1)|(xjqk==3))&(jpt!=2))	//尾巴右偏
						{	ztsds=5;ytsds=49;
//							if(ytsds>49)	ytsds=49;
							jpt=2;
						}
						if(xjqk==5)	{ztsds=ytsds=40;jpt=0;}	//不偏
					}
					break; 
				}
		case 13:{		//垂直前进
					if((xjqk==0)&(!kk))	
					{	kk=1;ll++;	}
					else
					{	if(xjqk==7) kk=0;}
					if(ll==2)	 		   //已寻到下一条线,应倒退9个计数
					{	zen=0;yen=0;zin=0;yin=0;zjsn=yjsn=9;	//准备临时倒退
						delay(100);
						zen=yen=1;lszt=1;ll=3;			//启动临时倒退
					}
					if((ll==3)&(!lszt)) 
					{	zen=0;yen=0;zin=1;yin=0;	//准备右转
						delay(100);
						zjs=yjs=0;ztsds=ytsds=40;zen=yen=1;xczt=4;l++;	//右转
					}
					break; 
				}
		case 14:{		//垂直后退
					if((xjqk==0)&(!kk))	
					{	kk=1;l--;	}
					else
					{	if(xjqk==7) kk=0;
					}
					if((l==1)&(!lszt))	//已退到初始线,应右转向后停车,完成任务
					{	
						zen=0;yen=0;zin=0;yin=0;zjsn=yjsn=9;	//准备临时倒退
						delay(100);
						zen=yen=1;lszt=1;lll=1;l=0;		//启动临时倒退
					 }
					 if((lll)&(!lszt))
					{
						zjs=yjs=0;zen=1;yen=1;zin=1;yin=0;xczt=4;zxrwtt=1;	//右转后即完成任务	
					}
					break; 
				}
		case 5:	{		//左转向完成后暂停
					if(l==lm)	//应垂直后退
					{	zin=0;yin=0;zen=1;yen=1;
						ztsds=40;ytsds=40;
						xczt=14;kk=0;lszt=0;
					}
					else		//应垂直前进
					{	zin=1;yin=1;zen=yen=1;
						ztsds=40;ytsds=40;
						xczt=13;kk=0;ll=0;
					}	
					break; 
				}
		case 6:	{		//右转向完成后暂停
					if(l==1)	//应停车任务完成
					{	zin=1;yin=1;zen=0;yen=0;
						xczt=0;zxrwt=0;
					}
					else		//应寻线前进
					{	zin=1;yin=1;zen=1;yen=1;
						zjsn=yjsn=0;
						ztsds=40;ytsds=40;
						xczt=11;jpt=0;wtjct=0;          //执行寻线前进  物体检验状态置0
					}	
					break; 
				}
		default:{	break;  }			// 
	}
}
/*************************************************/
uchar xjqkfx(void)
{			  //TL1543模拟通道3,4,5分别为光敏电阻的右寻迹3,左寻迹4,中寻迹5
 	uchar b=0xff,c=0,d=0,e;
	if(adsjc[4]>z0) c=1;	//左寻迹4
	c<<=1;
	if(adsjc[5]>zh0) c++;	//中寻迹5
	c<<=1;
	if(adsjc[3]>y0)  c++;	//右寻迹3
	ccc=c;
	if(adsjc[2]>qz0)  d++;  //前左寻迹1
	d<<=1;
	if(adsjc[0]>qy0)  d++;  //前右寻迹2
	e=(d<<3)|c;
	xjqkq=d;
	if(e==xjqk0) 
	{	xjqkn++;
		if(xjqkn>2) 
		{ 	b=c;
			xjqkn=3;
		}
	}
	else
	{	xjqk0=e;xjqkn=1;
	} 
	return(b);
}
/*************************************************/
uchar ezhs(uint sj)					//二进制转换为十进制
{	uchar b,c;
	uint xs;
	float x;
	c=(sj>>10);	//取整数部分
	xs=(sj&0x03ff);	//小数部分
	x=(float)(xs*9.76563e-4); 	//最低位对应的十进制值9.76563e-4
	b=x*10;	 	//取十分位数字
	c=c*10+b;
	return(c);
}
/*************************************************/
void tq2(void)						   //TQ-2气体传感器
{  	
	if((adsjc[7]>tq20)&(!fmqzt))
	{	FMQ=1;fmqzt=1;fmqxys=8;	  //启动蜂鸣器发声5秒
	}
}
/*************************************************/
void tq5(void)						   //TQ-5气体传感器
{  	
	if((adsjc[8]>tq50)&(!fmqzt))
	{	FMQ=1;fmqzt=1;fmqxys=4;		 //启动蜂鸣器发声5秒
	}	
}
/************************************************/
void fw18b20(void)					   //18b20复位
{	uchar tt=1;
	while(tt)
	{	while(tt)
		{	D18b20=1;_nop_();_nop_();
			D18b20=0;		//发复位负脉冲480us—960us
			delay2(50);		//550us
			D18b20=1;		//释放总线等待18b20的存在负脉冲
			delay2(6);		//66us
			tt=D18b20;		//读总线
		}
		delay2(45);			//500us
		tt=~D18b20;
	}
	D18b20=1;
}
/*************************************************/
void write18b20_byte(uchar val)		//写18b20一字节
{	uchar i;
	for(i=8;i>0;i--)
	{	D18b20=1;_nop_();_nop_();
		D18b20=0;_nop_();_nop_();_nop_();_nop_();_nop_();
		D18b20=val&0x01;
		delay2(6);
		val=val/2;
	}
	D18b20=1;
	delay2(1);
}
/************************************************/
void dwd(void)
{	fw18b20();						//总线复位
	write18b20_byte(0xcc);			//发Skip ROM 命令
	write18b20_byte(0xbe);			//发读命令
	wendu[0]=read18b20_byte();		//温度低8位
	wendu[1]=read18b20_byte();		//高8位
	fw18b20();						//
	write18b20_byte(0xcc);			//发Skip ROM 命令
	write18b20_byte(0x44);			//启动下次温度转换
	wdsjcl();						//去处理温度数据
}
/************************************************/
uchar read18b20_byte(void)		//写18b20一字节
{	uchar i,val=0;
	for(i=8;i>0;i--)
	{	D18b20=1;_nop_();_nop_();
		val>>=1;
		D18b20=0;_nop_();_nop_();_nop_();_nop_();
		D18b20=1;_nop_();_nop_();_nop_();_nop_();
		if(D18b20) val|=0x80;
		delay2(6);
	}
	D18b20=1;
	return(val);
}
/*************************************************/
void wdsjcl(void)				//温度数据处理
{	uchar w;
	wenduc[4]=0;				//符号位,正温度
	if(wendu[1]>127)			//负温度,求补码
	{	wendu[1]=256-wendu[1];
		wendu[0]=256-wendu[0];
		wenduc[4]=1;			//符号位,负温度
	}
	w=wendu[0]&0x0f;
	wenduc[0]=wdxs[w];			//温度小数部分查表
	w=((wendu[0]&0xf0)>>4)|((wendu[1]&0x0f)<<4);	//温度整数部分
	wenduc[3]=w/100;	//百位数字			//
	wenduc[1]=w%100;
	wenduc[2]=wenduc[1]/10;	  //十位数字
	wenduc[1]=wenduc[1]%10;	  //个位数字
	wenduf=(float)w+(float)wenduc[0]/10;
	if(wenduc[4]==1) wenduf=-wenduf;
}
/*************************************************/
void main(void)
{
	uchar i;
	xtcsh();
	init_Max7219();
	while(1)
	{
		for(i=0;i<9;i++)  					   //A/D转换的十个通道
		{	adsj[i]=adzh(i);
			adsjc[i]=ezhs(adsj[i]);
		}
		if((!dwdjz)&(xsfs==8)) { dwd();dwdjz=1; }   //显示温度时,每秒测一次温度
		if(zxrwt)	zxrw();
		jz=dhwk();
		zxml(jz);
		sxxs(xsfs);
		tq2();
		tq5();
		switch(xczt)
		{	
			case 11:	{	LED1=0;LED2=1;LED3=1;LED4=1;break;	}	//任务1寻线前进11
			case 12:	{	LED1=1;LED2=0;LED3=1;LED4=1;break;	}	//任务2寻线后退12
			case 13:	{	LED1=1;LED2=1;LED3=0;LED4=1;break;	}	//任务3垂直前进13
			case 14:	{	LED1=1;LED2=1;LED3=1;LED4=0;break;	}	//任务4垂直后退14
			case 21:	{	LED1=0;LED2=1;LED3=1;LED4=0;break;	}	//TQ-2检测到气体
			case 22:	{	LED1=1;LED2=0;LED3=1;LED4=0;break;	}	//TQ-3检测到气体
			default:	{	LED1=1;LED2=1;LED3=1;LED4=1;break;  }	// 
		}
	}
}
/*************************************************/
void t0zd(void) interrupt 1
{	
	TH0=0xfb;TL0=0xc3;	   //载入初始值
}

/*************************************************/
void t2zd(void) interrupt 5
{	TF2=0;
	if(hwkjz)
	{	hwkjzys--;
		if(hwkjzys==0) hwkjz=0;
	}
	sxjzys--;
	if(sxjzys==0) {sxjzys=200;sxjz=!sxjz;}
	n500++;
	if(n500==500)
	{	n500=0;
		if(fmqzt) 	{	fmqxys--;FMQ=!FMQ;						   //蜂鸣器正在发声状态则延时减1
						if(fmqxys==0)	{ FMQ=0;fmqzt=0;}  //延时终,蜂鸣器静
					}
	}
	n1000++;			   //一秒计数
	if(n1000==1000)
	{
	 	n1000=0;
		dwdjz=!dwdjz;
		ss++;			   //秒递加
		if(ss==60)
		{	ss=0;mm++;	   //分
			if(mm==60)
			{	mm=0;hh++;
				if(hh==24) hh=0;
			}
		}
		if((hh==gzhh)&(mm==gzmm)&(!zxrwt)) 
		{	zxrwt=1;zxrwtt=0;xczt=11;l=1;xjqk=xjqk0=0xff;xjqkn=0;jpt=0;	//定时自动启动场地扫描任务
			zjsn=yjsn=0;zen=yen=1;
			sss=0;mmm=0;
		}
		if(zxrwt)
		{	sss++;
			if(sss==60)
			{	sss=0;mmm++;	   //分
			}
		}
	}
	tsjs++;
	if(tsjs==50) tsjs=0;
	if(tsjs<ztsds) 	ztsk=1;//左电机调速端口
	else   		ztsk=0;
	if(tsjs<ytsds) 	ytsk=1;//右电机调速端口
	else   		ytsk=0;	
}
/*************************************************/
uchar dhwsj(void)
{
	uchar i,b;
	b=0;
	for(i=1;i<9;i++)
	{
		TH1=0;TL1=0;
		while(!HWK)
		{;}
		TR1=1;
		while(HWK)
		{;}
		TR1=0;
		b>>=1;
		if(TH1>=0x04)
		{
	 		b|=0x80;
		}
	}
	return(b);
}
/*************************************************/
uchar dhwk(void)   //读红外口
{
	uchar b;
	uchar c=0xff;
	HWK=1;
	if((!HWK)&(hwkjz!=1))
	{
		TH1=0;TL1=0;TR1=1;
		while(!HWK)
			{;}
		TR1=0;
		if(TH1>0x11)	//大于8ms的低电平
		{	
			EA=0;
			while(HWK)	//等待4ms高电平结束
			{;}
			b=dhwsj();	//读识别码
//			hmsm[3]=b;
			if(b==0x02)	  //识别码正确
			{	
				while(!HWK)
				{;}
				while(HWK)
				{;}
			 	b=dhwsj();	//读键值
				c=b;
//				hmsm[3]=b;
				hwkjz=1;hwkjzys=200;
			}
			EA=1;
		}
//		EX0=1;
//		EA=1;
	}
	return(c);
}
/*****************************************************/
void zxml(uchar jz)
{
	switch(jz)
	{
	 	case 0x09:	{	zen=0;yen=0;xczt=0;zxrwt=0;break; }	//停机,并取消任务/消音键MUTE
		case 0x0c:	{	if(zanting) 	//暂时停机或取消暂时停机(奇偶开关)/定时关机键OFF TIMER
						{	zen=1;yen=1;zanting=0;	}
						else
						{	zen=0;yen=0;zanting=1;	}
						break;
					}
		case 0x0e:	{	zxrwt=1;zxrwtt=0;xczt=11;l=1;xjqk=xjqk0=0xff;xjqkn=0;jpt=0; 	//开始执行场地扫描任务/开关键STANDBY
						zjsn=yjsn=0;zen=yen=1;
						sss=0;mmm=0;
						break; 
					}
		case 0x06:	{	zin=1;yin=1;zen=1;yen=1;xczt=1;break; }	//前进/亮度+BRIGHT+
		case 0x05:	{	zin=0;yin=0;zen=1;yen=1;xczt=2;break; }	//后退/亮度-BRIGHT-
		case 0x08:	{	zin=0;yin=1;zen=1;yen=1;zjs=0;yjs=0;xczt=3;break; }	//左转/色度+COLOUR+
		case 0x07:	{	zin=1;yin=0;zen=1;yen=1;zjs=0;yjs=0;xczt=4;break; }	//右转/色度-COLOUR-
		case 0x03:	{  	ztsds++;				//左加速1档/音量+VOL+
						if(ztsds>48) ztsds=48;
						break;
					}	 
		case 0x04:	{	ztsds--;				//左减速1档/音量-VOL-
						if(ztsds<10) ztsds=10;
						break;
					}	 
		case 0x01:	{  	ytsds++;			    //右加速1档/节目+PROG+
						if(ytsds>48) ytsds=48;
						break;
					}	 
		case 0x02:	{	ytsds--;				//右减速1档/节目-PROG-
						if(ytsds<10) ytsds=10;
						break;
					}	 
		case 0x10:	{	xsfs=0;break;	}	//显示实时时间/1
        case 0x11:	{	xsfs=1;break;   }	//显示左右轮转动脉冲计数/2
		case 0x12:	{	xsfs=2;break;   }	//显示调速档数/3
		case 0x13:	{	xsfs=3;break;   }	//显示左前右三路红外检测A/D转换的电压值/4
		case 0x14:	{	xsfs=4;break;   }	//显示两路光敏电阻寻迹检测A/D转换的电压值/5
		case 0x15:	{	xsfs=5;break;	}	//显示左右转向时轮转动脉冲数/6
		case 0x16:	{	xsfs=6;break;	}	//显示寻迹情况分析qkfx实时值/7
		case 0x17:	{	xsfs=7;break;	}	//显示前寻迹检测A/D转换的电压值/8
		case 0x18:	{	xsfs=8;break;	}	//显示测温值/9
		case 0x0f:	{	xsfs=9;break;	}	//显示完成任务时间/屏幕显示键DISPLAY
		case 0x1a:	{	xsfs=0;	 			//调时间小时加一/~10
					 	hh++;
						if(hh==24) hh=0;
						break;   
					}
		case 0x1b:	{	xsfs=0;	 			//调时间分加一/~20
					 	mm++;ss=0;
						if(mm==60) mm=0;
						break;   
					}
		case 0x19:	{	xsfs=1;	 			//累计计数请0/0
					 	zjsn=yjsn=0;
						break;  
					}
		default:	{	break;  }			// 其他键无效
	}
}
/*遥控板按键与其对应的键值
01H	节目+		02H	节目-	03H	音量+	04H	音量-		05H	亮度-		06H	亮度+
07H	色度-		08H	色度+	09H	消音	0CH	定时关机	0DH	TV/视频		0EH	开关
0FH	屏幕显示	10H	1		11H	2		12H	3			13H	4			14H	5
15H	6			16H	7		17H	8		18H	9			19H	0			1AH	10
1BH	20
*/
/*****************************************************/
void int0zd(void) interrupt 0		//左车轮脉冲计数
{	
	if((xczt==1)|(xczt==11))	zjsn++;	   //前进,累加
	if((xczt==2)|(xczt==12)|lszt)	zjsn--;	   //后退,减计数
	if(zjsn>65530)	zjsn=0;
	if((zjsn==0)&lszt) lszt=0;	   //临时倒退终止
	if((xczt==3)|(xczt==4)) 	   //左或右转向,临时计数
	{	zjs++;
		if(zjs==zxjs90)
		{	zen=0;yen=0;
			if(xczt==3)	xczt=5;
			if(xczt==4)	xczt=6;
			if((xczt==4)&(zxrwtt)) {zxrwt=xczt=0;zxrwtt=0;xsfs=9;}	//右转后完成任务停车并显示完成任务时间
		}
	}
}
/*****************************************************/
void int1zd(void) interrupt 2		//右车轮脉冲计数
{	
	if((xczt==1)|(xczt==11))	yjsn++;	   //前进,累加
	if((xczt==2)|(xczt==12)|lszt)	yjsn--;	   //后退,减计数
	if(yjsn>65530)	yjsn=0;
	if((yjsn==0)&lszt) lszt=0;	   //临时倒退终止
	if((xczt==3)|(xczt==4)) 	   //左或右转向,临时计数
	{	yjs++;
		if(yjs==zxjs90)
		{	zen=0;yen=0;
			if(xczt==4)	xczt=6;
			if(xczt==3)	xczt=5;
			if((xczt==4)&(zxrwtt)) {zxrwt=xczt=0;zxrwtt=0;xsfs=9;}	//右转后完成任务停车并显示完成任务时间
		}
	}
}

⌨️ 快捷键说明

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