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

📄 jiben_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 SLOW 	 1
#define BALANCE	 2
#define GO_ON 	 3
#define PAUSE 	 4
#define RETURN 	 5
#define END 	 6
uchar   flag=0;

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

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

uchar SS1='A';		//状态
uchar SS2=0x7e;
uchar SS3='C';
uchar SS4=' ';

#define r 45	//1伏为45度
uchar 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++;	//时间
			sec1++;		//分段时间
		}
	
	switch(flag)
		{	case 	START:		STK_CP=~STK_CP;		//快速	
								steps++;
								if(steps>=4440)
									flag=SLOW;
								break;

			case 	SLOW:		if(flag_stop==0)
									{	T_ms2_2++;			//慢速找平衡
										if(T_ms2_2==30)	 //60ms
											{	T_ms2_2=0;
												STK_CP=~STK_CP;
											}
									}
								if(flag_stop==1)
									{	T_ms2_1++;
										if(T_ms2_1==300)	//0.6s
											{	T_ms2_1=0;
												flag_stop=0;
												flag_pinghen++;
												if(flag_pinghen==5)
													{	flag=BALANCE;	//平衡处
														sec1=0;			//开始计时

														p20=0;	//LED
														p21=1;	//SPEAK	
												
														SS1='B';
									  					SS2='A';
									 					SS3='L';
														SS4=' ';
													}
											  }
								   	}

			case	BALANCE:		if(sec1==6)			//平衡处//要显示5s
										{	sec1=0;
											steps=0;
											flag=GO_ON;									
											STK_DIR1=0;		//电机前转
											STK_DIR2=1;		

											p20=1;	//LED
											p21=0;	//SPEAK	

											TR0=0;	//关AD

											SS1='C';
						  					SS2=0x7e;
						 					SS3='B';
											SS4=' ';
										}
									break;

			case	GO_ON:			STK_CP=~STK_CP;		//继续前进								
									steps++;
									if(steps>=3990)
										{	sec1=0;
											flag=PAUSE;
											SS1=' ';
						  					SS2='P';
						 					SS3=' ';
											SS4=' ';
										}
									break;

			case	PAUSE:			if(sec1==6)			//暂停
										{	sec1=0; 
											steps=0;						
											flag=RETURN;//返回
											STK_DIR1=1;		//电机反转
											STK_DIR2=0;	
											SS1='B';
						  					SS2=0x7e;
						 					SS3='A';
											SS4=' ';
										}
									break;

			case	RETURN:			STK_CP=~STK_CP;		//返回						
									steps++;
									if(steps==8450)
										{	flag=END;
											SS1='S';
					  						SS2='T';
						 					SS3='O';
											SS4='P';
										}
									break;

			case	END:			TR1=0;
									break;

			default:				break;
	  	}
}

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

void AD_chuli()		//A/D信号处理
{	long int 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*1961;
	da=da*r;	
	du[0]=da/100000%10;
	du[1]=da/1000000%10;
	da1=du[1]*10+du[0];
	
	if(flag==SLOW)
		{	if(flag_fuhao==0)	// 正
				{	if(da1>4)//(da1>7)
						{	STK_DIR1=0;	//电机前转
							STK_DIR2=1;					
						 }
					if(da1<3)//(da1<5)
						{	STK_DIR1=1;	//电机反转
							STK_DIR2=0;						
						 }
				   if(	(da1==3) || (da1==5) )	
				   		flag_stop=1;
				   if( (da1<2) || (da1>5) )
				   		flag_pinghen=0;
				 }
			if(flag_fuhao==1)	//负 
				{	STK_DIR1=1;	//电机反转
					STK_DIR2=0;	
					flag_pinghen=0;
				}
	  	}
				
	AD_OE=0;			//D7~D0对外成高阻态
	
	AD_START=0;			//下降沿又开始A/D
}

void Lcd_Display()
{	uchar s1[5],s2[5],s4[5],*ps;//s3[5];

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

	s2[0]='t';	s2[1]=':'; s2[2]=Lcd_Code[sec1/10]; s2[3]=Lcd_Code[sec1%10]; s2[4]='\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行
*/
	s4[0]=SS1;	s4[1]=SS2; s4[2]=SS3; s4[3]=SS4; s4[4]='\0';//总时间显示
	ps=&s4;
	Lcd_WS(ps,8,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 + -