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

📄 xiaoche.c

📁 基于51单片机或者ARM2131的电子小车的设计
💻 C
字号:
//题目:自动往还小车
//用脉宽调制来控制小车速度
//光电传感器检测黑线
//小车以中速开始,检测到第1条黑线变为减速,
//检测到第2条黑线变为加速,检测到第3条黑线变为减速,
//检测到第4条黑线变为暂停3s,然后还回,做同上运动。
//并用数码管显示总时间和遇到的黑线数
//电机启动电流处理
//速度太快检测不到黑线
#include "reg51.h"
#define uchar unsigned char 
#define uint unsigned int

#define SEG_WORDPORT P0	//数码管位码
#define SEG_DIGPORT  P2	//数码管段码

sbit MOTOR_IN0=P1^0;	//电机输入口0//前转
sbit MOTOR_IN1=P1^1;	//电机输入口1//后转

sbit p32=P3^2;

uchar code Seg_Code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~9共阳表
uchar buf[4]={0xc0,0xc0,0xc0,0xc0};	//所要显示内容
uchar t,t_h,t_l;	//高电平时间,低高电平时间
uint  tt;			
uint  sec;			//总时间
uchar t_zanting;	//暂停时间
bit   dianping;		//高低电平标志
bit   zhuanxiang;	//转向标志,1为前转
bit   zanting;		//暂停标志
uchar heixian;		//黑线数

void Delay(uchar t1,uchar t2)
{ 	for(;t1>0;t1--);
		for(;t2>0;t2--);
}

void int0() interrupt 0
{	Delay(5,125);	//5ms消黑点
	if(p32==0)
		{	heixian++;
			switch(heixian)
				{	case 1: 	//到黑线1减速	//前进
					case 3: 	//到黑线3减速	//前进
					case 5: 	//到黑线5减速	//回走
					case 7: 	//到黑线7减速	//回走
								t_h=4;			//4ms:6ms
							 	t_l=6;
							 	t=t_h;
							 	dianping=1;		//高电平
								break;
			
					case 2: 	//到黑线2加速	//前进
					case 6: 	//到黑线6加速	//回走
								t_h=6;			//6ms:4ms
							 	t_l=4;
							 	t=t_h;
							 	dianping=1;		//高电平
								break;												

					case 4:   	zanting=1;		//暂停
								MOTOR_IN0=0;	//停止
								MOTOR_IN1=0;
								break;
			
					case 8:   	EA=0;			
								MOTOR_IN0=0;	//停止
								MOTOR_IN1=0;
								break;
					
					default: 	EA=0;			
								MOTOR_IN0=0;	//停止
								MOTOR_IN1=0;
								break;
			 	}
			
		}
}

void time0() interrupt 1	//电机前进定时
{	TR0=0;
	TH0=0Xfc; TL0=0X18;	//1ms
	TR0=1;

	tt++;		
	if(tt==1000)		//1s
		{	tt=0;
			sec++;		//计时
		}

	if(zanting==1)		//暂停
		{	t_zanting--;
			if(t_zanting==0)
				{	t_h=8;			//8ms:2ms中速回走
				 	t_l=2;
				 	t=t_h;
					zanting=0;
				 	dianping=1;		//高电平
					zhuanxiang=0;	//反向
					MOTOR_IN0=0;	//反转
					MOTOR_IN1=1;
			   	}
		}

 	else
		{	t--;
			if(t==0)
				{	if(dianping==1)		//高电平
						{	t=t_l;
							dianping=0;
							if(zhuanxiang==1)	
								MOTOR_IN0=0;	//电机前转
							else
								MOTOR_IN1=0;	//电机后转
						}
			
					else				//低电平
						{	t=t_h;
							dianping=1;
							if(zhuanxiang==1)	
								MOTOR_IN0=1;	//电机前转
							else
								MOTOR_IN1=1;	//电机后转
						}				
				}
	  	}
}

void chuli()		//结果处理
{	buf[0]=Seg_Code[sec%10];		//总时间个位
	buf[1]=Seg_Code[sec/10%10];		//总时间十位
	buf[2]=Seg_Code[sec/100%10];	//总时间百位
	buf[3]=Seg_Code[heixian%10];	//黑线数
}

void Seg_Display()	//数码管显示程序
{	uchar i;
	uchar dig=0x01;
	for(i=0;i<4;i++)
		{	SEG_WORDPORT=0xff;	 	//清屏
			SEG_DIGPORT=dig<<i;		//位码	
			SEG_WORDPORT=buf[i];	//段码
			Delay(1,100);
		}		
}

main()
{	Delay(30,125);
	
	EA=0;

	IT0=1; EX0=1;		//外部中断0

	TMOD=0X11;			//定时中断
	ET0=1; ET1=1;
	TH0=0Xfc; TL0=0X18;	//1ms	

	EA=1;

	MOTOR_IN0=1;		//前转
	MOTOR_IN1=0;
	Delay(250,250);
	Delay(250,250);
	Delay(250,250);	//给1.5s高电流启动
	 
	TR0=1;				//启动定时
	t_h=7;				//7ms:3ms中速
	t_l=3;
	t=t_h;
	dianping=1;
	zhuanxiang=1;		//前进

	while(1)
	 	{	Seg_Display();
			chuli();
		}
}

⌨️ 快捷键说明

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