找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1581|回复: 0
打印 上一主题 下一主题
收起左侧

发布一些做循迹小车的程序,用单片机做的

[复制链接]
跳转到指定楼层
楼主
ID:221828 发表于 2017-7-28 13:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/***********************************************************************/
void UartInit()  //9600bps@11.0592MHz
{
SCON=0x50;   //设置为工作方式1
TMOD=0x11;   //设置计数器工作方式2
PCON=0x00;   //SMOD=1,波特率不加倍
TH1=0;   //计数器设置初值
TL1=0;
TH0=0xfe;
    TL0=0x33;    //11.0592MZ晶振,0.5ms
/*IE=0x9A; */
ES=1;
ET1=1;
ET0=1;
EA=1;
    TR0=1;                 //定时器开始
}
/************************************************************************************/
void UartInit2()  //9600bps@11.0592MHz
{
SCON=0x50;   //设置为工作方式1
TMOD=0x20;   //设置计数器工作方式2
PCON=0x00;   //SMOD=1,波特率不加倍
TH1=0xfd;   //计数器设置初值
TL1=0xfd;
ES=1;
EA=1;
TR1=1;
}  
/***********************************************************************/
void Time0_Int() interrupt 1 //T0中断程序
{
  TH0=0xfe;             //重新赋值
  TL0=0x33;
  if(count< jd)              //判断0.5ms次数是否小于角度标识
      pwm=1;                  //确实小于,PWM输出高电平
   else
      pwm=0;                  //大于则输出低电平
   count=(count+1);          //0.5ms次数加1
   count=count%40;     //次数始终保持为40 即保持周期为20ms
}
/*********************************************************************/
void timer0() interrupt 3 //T1中断
{
}
/***********************************************************************/
void Count1() //计算左侧超声波距离的函数
{
while(!RX1); //当RX1为零时等待
TR1=1; //开启计数
while(RX1); //当RX1为1计数并等待
TR1=0; //关闭计数
time=TH1*256+TL1;
TH1=0;
TL1=0;
s1=(time*1.7)/100; //算出来是CM
}
/***********************************************************************/
void delay(int i)//延时
{
  int j,k;
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}
/***********************************************************************/
/*void keyscan()              //按键扫描
{
   if(jia==0)               //角度增加按键是否按下
  {
    delay(10);              //按下延时,消抖
    if(jia==0)              //确实按下
     {
      jd=jd+2;                 //角度标识加1
      count=0;              //按键按下 则20ms周期从新开始
      if(jd==7)
        jd=5;               //已经是180度,则保持
      while(jia==0);        //等待按键放开
     }
  }
  if(jian==0)                //角度减小按键是否按下
  {
    delay(10);
    if(jian==0)
     {
      jd=jd-2;                 //角度标识减1
      count=0;
      if(jd==-1)
        jd=1;               //已经是0度,则保持
      while(jian==0);
     }
  }
} */
/************************************************************************/
void cej()
{
      TX1=1;   /*开启超声波1探测*/
        delay(1);
        TX1=0;
     Count1(); //测距
}
void main()
{
    jd=3;
    count=0;
delay(10);
while(1)
{
  if(P27==0)
  {
   delay(10);
   if(P27==0)
   {  
    UartInit();   
          delay(10000);
       while(1)
    {
     cej();
     if(s1<=16)
         {
       tingz();
         delay(10);
       jd=5;
      delay(10000);
   
      cej();
      s2=s1;
      jd=1;
      delay(10000);
   
      cej();
      s3=s1;
      if(s2>=s3)
      {
       zuoz();
      }
      if(s2<s3) youz();
      delay(50000);
      jd=3;
         delay(10000);
         }
        if(s1>10)
       {
         qianj();//前进
        }
     if(P26==0)
     {
      delay(10);
               if(P26==0) break;
     }
      }
   }
  }
  
  
  if(P26==0)
  {
   delay(10);
   if(P26==0)
   {
    UartInit2();
    delay(1000);
    while(1)
    {
     if(a==zhuanhuan)
          {
        if(P33==0&&P34==1) zuoz();
      else if(P33==1&&P34==0) youz();
      else if(P33==0||P34==0) qianj();
       }
   
   
      
       if(a==Go) qianj();//前进
          if(a==Back) hout();//后退
             if(a==Left) zuoz();//左转
          if(a==Right) youz();//右转
                if(a==Stop) tingz();//停止
       if(P27==0)
       {
         delay(10);
      if(P27==0) break;
       }
         jd=3;
         
              
    }
   }
  }
}
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表