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

📄 222.c

📁 AT89S52 L298N 三个LM311 循迹小车
💻 C
字号:
#include<intrins.h>
#include<reg51.h>
#include<1602.h>
unsigned char code xiaoche[] = {"xiaoche"};
unsigned char code mm[] = {"mm"};
unsigned char code distance[]={"distance"};
unsigned char code time[]={"time"};
unsigned char zkbz=0 ;    /*占空比*/
unsigned char zkby=0 ;
unsigned char t=0;        /* 定时器中断计数器 */
unsigned int juli=0;      /*距离*/
unsigned char a=0;
unsigned char sl=0;        /*时间秒*/
unsigned char sh=0;        /*时间秒*/
unsigned char fl=0;        /*时间分*/
unsigned char fh=0;        /*时间分*/
unsigned int dis=0;       /*实际距离*/
bit flag=0;               /*标志位*/
sbit gm=P2^3;             /*光敏*/

/********************************************************
            控制口定义
*********************************************************/
sbit en1  =P1^1; /* L298的Enable A */
sbit s1   =P1^0; /* L298的Input 1 */
sbit s2   =P1^2; /* L298的Input 2 */
sbit en2  =P1^4; /* L298的Enable A */
sbit s3   =P1^3; /* L298的Input 1 */
sbit s4   =P1^5; /* L298的Input 2 */
sbit Guandian0=P2^0;
sbit Guandian1=P2^1;
sbit Guandian2=P2^2;


/*******************************************************
                   外部中断 计算路程
********************************************************/
void service_int0() interrupt 0 
{
  EX0=0;
  if(flag==0)juli++;
  else juli--;
  dis=juli*5;
  DispOneChar(9,1,dis/10000);
  DispOneChar(11,1,dis/1000%10);
  DispOneChar(12,1,dis/100%10);
  EX0=1;
 }

/*************************************************************
                    定时器0服务程序
*************************************************************/

void timer0() interrupt 1 /* T0中断服务程序 */
{
 if(t<zkbz) en1=1; else en1=0; /* 产生电机1的PWM信号 */
 if(t<zkby) en2=1; else en2=0;/* 产生电机1的PWM信号 */
 t++;
 if(t>=100) t=0; /* 1个PWM信号由100次中断产生 */
}

/*************************************************************
                    定时器1服务程序
*************************************************************/
void timer1() interrupt 3       
{
 unsigned char cnt;
 TH1=(65536-50000)/256;              
 TL1=(65536-50000)%256;
 cnt++;
 if(cnt>=20)
   {
    cnt=0;
    ++sl;
    if(sl==10)
      {
       sl=0;
       ++sh;
       if(sh==6)
         {
          sh=0;
          ++fl;
          if(fl==10)
            {
             fl=0;
             ++fh;
              }
           }
       }
   }
  }

/*************************************************************
                  循迹程序
*************************************************************/
void xunji(void)
{
 switch(a)
       {
        case 0x02:flag=0;s1=0;s2=1;s3=0;s4=1;zkbz=40;zkby=40;break;
        case 0x01:flag=0;s1=0;s2=1;s3=1;s4=0;zkbz=70;zkby=15;break;
        case 0x04:flag=0;s1=1;s2=0;s3=0;s4=1;zkbz=15;zkby=70;break;
        case 0x03:flag=0;s1=0;s2=1;s3=0;s4=1;zkbz=65;zkby=15;break;
        case 0x06:flag=0;s1=0;s2=1;s3=0;s4=1;zkbz=15;zkby=75;break;
        case 0x00:flag=1;s1=1;s2=0;s3=1;s4=0;zkbz=30;zkby=30;break;
        default:break;
		}
 Delay5Ms();
 }


/**************************************************************
                   内部资源初始化
*******************************************************************/
void Init(void)
{
 TMOD=0x12;                   /* 设定T0的工作模式为2,设定T0的工作模式为1 */
 TH0=0xB6;                    /* 装入定时器的初值 */
 TL0=0xB6;
 TH1=(65536-50000)/256;              
 TL1=(65536-50000)%256;
 IT0=1;
 IP=0x03;
 EA=1;                        /* 开总中断 */
 ET0=1;                       /* 定时器0允许中断 */
 ET1=1;                       /* 定时器1允许中断 */
 TR1=1;                       /* 启动定时器1 */
 TR0=1;                       /* 启动定时器0 */
 EX0=1;                       /*开中断0*/
 }


void main(void)
{
 Init();                           /*系统初始化*/
 LcdReset();                       /*液晶初始化*/
 DisplayListChar(0,0,"time",4) ;   
 DispOneChar(7,0,':');
 DisplayListChar(0,1,"distance",8) ;
 DispOneChar(10,1,':');

 zkbz=40;
 zkby=40;
 s1=0;s2=1;s3=0;s4=1;

 do{                               /*循迹*/
    a=P2;
    a=a&0x07;
    xunji();
    }while(a!=0x07);

 zkbz=40;                          /*避障*/
 zkby=40;
 s1=0;s2=1;s3=0;s4=1;              //前
 delay(20000);
 s1=0;s2=1;s3=1;s4=0;              //左
 delay(65000);
 s1=0;s2=1;s3=0;s4=1;              //前
 delay(60000);
 s1=1;s2=0;s3=0;s4=1;              //右
 delay(50000);
 s1=0;s2=1;s3=0;s4=1;              //前
 delay(60000);
/* s1=1;s2=0;s3=0;s4=1;              //右
 delay(60000);
 s1=0;s2=1;s3=0;s4=1;              //前
 delay(60000);
 s1=0;s2=1;s3=1;s4=0;              //左
 delay(60000);*/
  s1=0;s2=1;s3=0;s4=1;             //前

 do                               /*趋光*/
  {
   a=P2;
   a=a&0x07;
   if(!gm)
     {
      zkbz=60;zkby=0;}
   else
     {zkbz=0;zkby=70;}
   delay(10000);
   }while(a==0);
   
 s1=s2=s3=s4=0;   
 s1=0;s2=1;s3=0;s4=1;
 delay(20000);

 EA=0;
 do{s1=s2=s3=s4=0;
   DispOneChar(5,0,fh+0x30);
  DispOneChar(6,0,fl+0x30);
  DispOneChar(8,0,sh+0x30);
  DispOneChar(9,0,sl+0x30);}while(1);
}

⌨️ 快捷键说明

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