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

📄 kouzhan_end.c

📁 基于51单片机或者ARM2131的电子小车的设计
💻 C
字号:
//先快速,再超慢速加角度传感器测平衡
//再驶向B点,并返回;
//液晶并行显示各段时间
//多个配重

//单通道单极性AD0809,人为给AD发信号
#include"reg51.h"
#include"Lcd_Display.h"

#define uchar unsigned char
#define uint unsigned int

sbit STK_DIR1=P1^0;
sbit STK_CP=P1^1;
sbit STK_DIR2=P1^2;

sbit p20=P2^0;
sbit p21=P2^1;

#define DA_LCDPORT  P0		//A/D数据口
sbit  AD_EOC=P3^4;			//A/D转换结束信号输出端
sbit  AD_CLK=P3^5;			//A/D时钟信号输入端
sbit  AD_START=P3^6;		//启动A/D转换控制信号输入端
sbit  AD_OE=P3^7;			//A/D输出允许控制端

uchar code Lcd_Code[16]={	0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,	//0~9 ASCII code
							0x41,0x42,0x43,0x44,0x45,0x46};   					//A~F

#define START 	 0	//
#define SLOW1	 1
#define SLOW2	 2
#define BALANCE  3
uchar   idata flag=0;
bit     flag_s4;

uint  tt;
uchar sec;			//总时间
uchar sec1;			//分段时间
uint  T_ms2;
uchar T_ms2_0;	
uchar T_ms2_1;
uint  T_ms2_2;

uint  steps;		//步数
bit   flag_stop;	
uchar flag_pinghen;	//检测到平衡的次数
bit   flag_fuhao;	//符号
bit   flag_ad;
uchar da2;
bit   flag_sec1;

#define r 45	//1伏为45度
uchar idata du[2];								

void time1() interrupt 3
{	TR1=0;
	TH1=0xf8;	TL1=0x30;	//2ms
	TR1=1; 

	T_ms2++;
	if(T_ms2==500)	//1s
		{	T_ms2=0;
			sec++;	//时间
			if(flag_s4==BALANCE)
				{	sec1++;		//分段时间
					if(sec1>=6)
						flag_sec1=1;
				 }
		}
	if(steps<5600)
		{	
			steps++;
		}
	if(steps==4600)
		{	
			flag=SLOW1;
		}
	switch(flag)
		{	case 	START:		STK_CP=~STK_CP;		//快速								
								break;

	  		case 	SLOW1:		T_ms2_0++;			//慢速
								if(T_ms2_0==4)	 //8ms
									{	T_ms2_0=0;
										STK_CP=~STK_CP;
									}
								break;

			case 	SLOW2:		if(flag_stop==0)
									{	T_ms2_1++;			//超慢速找平衡
										if(T_ms2_1==22)	 //44ms
											{	T_ms2_1=0;
												STK_CP=~STK_CP;
											}
									}
								if(flag_stop==1)
									{	T_ms2_2++;
										if(T_ms2_2==250)	//0.5s
											{	T_ms2_2=0;
												flag_stop=0;
												flag_pinghen++;
												if(flag_pinghen==7)
													{	sec1=0;			//开始计时
														flag_s4=BALANCE;
														p20=0;	//LED
														p21=1;	//SPEAK												
													}
											  }
								   	}	
								break;
			default:			break;
	  	}
}

void time0() interrupt 1	//50us
{	AD_CLK=~AD_CLK; 	//A/D时钟信号	
}

void AD_chuli()		//A/D信号处理
{	long int idata da;
	uchar da1;
	AD_START=1;			//又上升沿复位内部寄存器
	AD_OE=1;			//OE为高电平时,转换结果出现在D7~D0
	DA_LCDPORT=0xff;
	da=DA_LCDPORT;

	 if(da<127)
		{	flag_fuhao=1;//负数
			da=128-da;			
		}
			
    else
		{	flag_fuhao=0;
			da=da-127;	
		}
	da=da*196;
	da=da*r;	
	du[0]=da/10000%10;
	du[1]=da/100000%10;
	da1=du[1]*10+du[0];

	if( (steps>4000) && (steps<6000) )
		{	if(flag_fuhao==1)	//负 
				{	STK_DIR1=1;	//电机反转
					STK_DIR2=0;	
					flag=SLOW2;
					flag_ad=1;
					flag_pinghen=0;
					flag_s4=0;
					flag_sec1=0;
				}
		}

	if(flag_ad==1)
		{	if( (flag_fuhao==1) && (da>3) )	//<-3 
				flag=SLOW2;

			if(flag_fuhao==0)	// 正
				{	if(da1>5)	//+6
						{	STK_DIR1=0;	//电机前转
							STK_DIR2=1;								
						 }
					if(da1<3)	//+4
						{	STK_DIR1=1;	//电机反转
							STK_DIR2=0;								
						 }

					if(da1>8)	//+9
						{	if(flag_sec1==0)
								{	flag_pinghen=0;
									flag_s4=0;
								}
						}
				   if(  (da1==3) || (da1==4) || (da1==5) )		
				   			flag_stop=1;
				 }

		 	if( (flag_fuhao==1) && (da>=1) )	//-1 
						{	if(flag_sec1==0)
								{	flag_pinghen=0;
									flag_s4=0;
								}
						}
			
		 }
		
	if( (sec1>=8) && (flag_s4==BALANCE) &&( (flag_fuhao==0) && (da1>7) ) )//正数
		{	flag=SLOW1;
			STK_DIR1=0;	//电机正转
			STK_DIR2=1;	
			flag_sec1=0;
			flag_pinghen=0;
			flag_s4=0;
			p20=1;	//LED
			p21=0;	//SPEAK	
		}

	AD_OE=0;			//D7~D0对外成高阻态
	
	AD_START=0;			//下降沿又开始A/D
}

void Lcd_Display()
{	uchar s1[7],s2[6],s4[8],*ps;

	s1[0]='T';	s1[1]=':'; s1[2]=Lcd_Code[sec/100%10]; s1[3]=Lcd_Code[sec/10%10]; s1[4]=Lcd_Code[sec%10]; s1[5]='S'; s1[6]='\0';//总时间显示
	ps=&s1;
	Lcd_WS(ps,0,0);		//Lcd第1行

	s2[0]='t';	s2[1]=':'; s2[2]=Lcd_Code[sec1/10%10]; s2[3]=Lcd_Code[sec1%10]; s2[4]='S'; s2[5]='\0';//各段时间显示
	ps=&s2;
	Lcd_WS(ps,8,0);		//Lcd第1行
/*
	if(flag_fuhao==1)	
		s3[0]='-';
	else
		s3[0]='+';
	s3[1]=Lcd_Code[du[1]]; s3[2]=Lcd_Code[du[0]]; s3[3]=0xdf; s3[4]='\0';//角度显示//转换成ASCII  
	ps=&s3;
	Lcd_WS(ps,0,1);		//Lcd第2行
*/	
	if(flag_s4==BALANCE)
		{	s4[0]='b';	s4[1]='a'; s4[2]='l';	s4[3]='a'; s4[4]='n'; s4[5]='c'; ;s4[6]='e'; s4[7]='\0';}//状态显示
	if(flag_s4==0)
		{	s4[0]=' ';	s4[1]=' '; s4[2]=' ';	s4[3]=' '; s4[4]=' '; s4[5]=' '; ;s4[6]=' '; s4[7]='\0';}
			ps=&s4;
			Lcd_WS(ps,4,1);		//Lcd第1行			
}

void main(void)
{	Delay(1,30);
	TMOD=0x12; 
	TH0=206; TL0=206;		//须定时50us左右
	TR0=1; ET0=1; 	
	PT0=1;					//优先级

	TH1=0xf8;	TL1=0x30;	//2ms
	TR1=1; 		ET1=1;
			
	EA=1;

	STK_DIR1=0;		//电机前转
	STK_DIR2=1;	
	
	p20=1;
	p21=0;

	AD_OE=0;		//D7~D0对外成高阻态
	Lcd_Init();		//LCD初始化

	AD_START=0;	
	AD_START=1;		//上升沿复位内部寄存器
	AD_START=0;		//下降沿开始A/D

	while(1)
		{ 	if(AD_EOC)	
				AD_chuli();	//查询法
				Lcd_Display();	//数码管显示
		}
}
	

	



⌨️ 快捷键说明

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