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

📄 main.c

📁 小车跷跷板源程序
💻 C
字号:
#include<reg51.h>
sbit p1_0=P1^0;//电机旋转控制
sbit p1_1=P1^1;//电机旋转控制
sbit p1_2=P1^2;//电机使能控制
sbit p1_3=P1^3;//电机旋转控制
sbit p1_4=P1^4;//电机旋转控制
sbit p1_5=P1^5;//电机使能控制
sbit E_CLK=P1^6;//LCD显示。时钟输入
sbit RW_SID=P1^7;//LCD显示。数据输入
sbit p2_0=P2^0;//前进循迹方向信号
sbit p2_1=P2^1;//前进循迹方向信号
sbit p2_2=P2^2;//前进循迹方向信号
sbit p2_3=P2^3;//跷跷板平衡信号
sbit p2_4=P2^4;//跷跷板平衡信号
sbit p2_5=P2^5;//跷跷板平衡信号
sbit p2_6=P2^6;//后退循迹方向信号
sbit p2_7=P2^7;//避障传感器信号
sbit p3_2=P3^2;//温度传感器信号
sbit p3_4=P3^4;//蜂鸣器信号控制
sbit p3_6=P3^6;//状态切换键信号
sbit p3_7=P3^7;//暂停/开始键信号


/****************************************显示用变量*************************************************************/
char sec1=48/*显示,秒十分位*/,sec2=48/*显示,秒个位*/,sec3=48/*显示,秒十位*/,sec4=48/*显示,秒百位*/;
char sd1=48/*显示,速度十分位*/,sd2=48/*显示,速度个位*/,sd3=48/*显示,速度十位*/,sd4=48/*显示,速度百位*/;
char lc1=48/*显示,路程百分位*/,lc2=48/*显示,路程十分位*/,lc3=48/*显示,路程个位*/,lc4=48/*显示,路程十位*/;
int xszt1=0xD1/*显示,状态*/,xszt2=0xAD/*显示,状态*/,xszt3=0xBC/*显示,状态*/,xszt4=0xA3/*显示,状态*/;

/****************************************跷跷板平衡用变量*******************************************************/
long qj=10/*前进参数*/,ht=1/*后退参数*/,tz=0/*平衡状态参数*/,bf=600/*步进*/;
int cs=0/*跷跷板翻的次数*/,fdd=6/*防抖动系数*/,fx=0/*前一次运动方向,标志*/,ph=0/*平衡的持久度*/;
int fy=0/*反应时间*/,cf=1/*冲锋标志*/,bc=0/*是否补偿,标志*/,phzt=0/*平衡状态*/,dd=0/*等待时间*/;

/****************************************通用变量****************************************************************/
int a/**/,b/**/,l/**/,r/**/,i/**/,j,m=0/**/,k/**/,zt=1/*循迹、避障、平衡状态标志*/;
int setnumber=8/*PWM占空比调整*/,n/*一秒种转了几圈*/,t/*计时用,每0.1秒判断标志,及时间传递显示的过度量*/;
int tk/*时间计数*/,vt/*速度传递显示的过渡量*/,st/*路程传递显示的过渡量*/,yx/*小车运行标志*/,TC=1/*停车标志*/;
float s/*路程计算量*/,c=0.9742647/*轮子1/4圈的长度(cm)*/;
double v/*速度计算量*/;

#define uchar unsigned char
#include<delay1ms.c>
#include<xianshi.c>
#include<xunji.c>
#include<htxunji.c>
#include<pheng.c>
#include<bizhang1.c>
#include<lcd3.c>

timer0() interrupt 1 using 1
{	TH0=0xFc;
	TL0=0x18;
	r++;
	t++;
if(TC==1)
{	if(b==1)
	{
		if(m<setnumber)
		{	p1_2=0;
			p1_5=0;
		}
	else
		{	p1_2=1;
			p1_5=1;
		}
    	if (m>=10)
		m=0;
		m++;
	}
	else if(b==0)
	{		if(l<setnumber+1)
		{	p1_2=0;
			p1_5=0;
		}
		else
		{	p1_2=1;

		}
		if (l>setnumber+2)
		p1_5=1;

    	if (l>10)
	l=0;
    l++;
	}
	}
		if(t==100)
		{		if(phzt!=1&&phzt!=3||zt!=3)
					tk++;
				else			 //若在状态3(跷跷板平衡状态)的平衡停表情况
					dd++;		 //
				if(dd==50)		 //
				{	if(phzt==1)	 //
						phzt=2;	 //
					if(phzt==3)	 //
						phzt=4;	 //打破平衡,准备下跷跷板
					tk=0;		 //重新计时
					dd=0;
				}

                if (tk>=10000)		//每
                	tk=0;			//0.1
                t=tk;				//秒
                sec4=(t/1000)+0x30;	//累
                t=t%1000;			//加
                sec3=(t/100)+0x30;	//时
                t=t%100;			//间
                sec2=(t/10)+0x30;	//一
                t=t%10;				//次
                sec1=t+0x30;		//
                t=0;				//
		}
	if(r==1000)
		{		r=0;				//每
				v=n*c;				//一
				v=v*10;				//秒
                vt=v;				//计
				if(vt>=10000)		//算
				vt=9999;			//速
                sd4=(vt/1000)+0x30;	//度
                vt=vt%1000;			//一
                sd3=(vt/100)+0x30;	//次
                vt=vt%100;			//
                sd2=(vt/10)+0x30;	//
                vt=vt%10;			//
                sd1=vt+0x30;		//
 			    n=0;				//
		}

}


timer1() interrupt 3 using 2
 {      if(a==3)					//在前进的时候。轮子每1/4周累加路程一次
 		{        n++;				//在后退的时候。轮子每1/4周减少路程一次
				s=s+c;				//
		 }							//
		 else if(a==4)				//
		 		s=s-c;				//
				if(s>=10000||s<=0)	//
				s=0;				//
                st=s;				//
                lc4=(st/1000)+0x30;	//
		        st=st%1000;			//
                lc3=(st/100)+0x30;	//
                st=st%100;			//
                lc2=(st/10)+0x30;	//
                st=st%10;			//
                lc1=st+0x30;		//
		 
}

main()
{	yx=0;/*是否运行,标志位*/
	kaiji();
	TMOD=0x61;       /**************************/
	TH0=0xFC;        /*					       */
	TL0=0x18;        /*                        */
	TL1=-1;          /*定时计数器,装初值,打开*/
	TH1=-1;          /*                        */
	IP=0x08;         /*                        */
	EA=0;ET0=1;ET1=1;/*                        */
	TR0=1;TR1=1;     /**************************/ 
	initlcm();/*显示初始化*/   
	for(;;)
	{	xianshi();
	    if(p3_7==0)//暂停(启动)?
		   {
		   		yx++;     /*******************/
				yx=(yx%2);/*                 */
				EA=yx;    /*                 */
				TC=yx;    /*切换暂停/启动状态*/
				p1_2=!yx; /*                 */
				p1_5=!yx; /*******************/
				delay1ms(50,1000);/*延时防抖动*/
		   }
		 if(p3_6==0)//切换状态?
		 {		yx=0;  //停
				EA=0;  //止
				TC=0;  //运
				p1_2=1;//行
				p1_5=1;//
				if(zt<3)  /**********/
					zt++; /*切换状态*/
				else zt=1;/**********/
	  			if(zt==1)
				{	xszt1=0xD1;//
					xszt2=0xAD;//切
					xszt3=0xBC;//换
					xszt4=0xA3;//显
				}			   //示
				if(zt==2)	   //状
				{	xszt1=0xB1;//态
					xszt2=0xDC;//
					xszt3=0xD5;//
					xszt4=0xCF;//
				}			   //
				if(zt==3)	   //
				{	xszt1=0xC6;//
					xszt2=0xBD;//
					xszt3=0xBA;//
					xszt4=0xE2;//
				}
				delay1ms(50,1000);/*延时防抖动*/
		 }
		 if(yx==1)//运行
		 {		if(zt==1)
					xunji();//状态1,则循迹
				else if(zt==2)
					bizhang();//状态2,则避障
				else if(zt==3)
					pheng();//状态3,则跷跷板平衡
		 }
	}
}

⌨️ 快捷键说明

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