找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2108|回复: 0
收起左侧

STC89C52 双电机测速寻迹程序

[复制链接]
ID:190116 发表于 2017-5-9 14:15 | 显示全部楼层 |阅读模式
#include <reg52.h>            // 引用标准库的头文件
#include <intrins.h>   

#define uchar unsigned char
#define uint  unsigned int  
//=================电机驱动=====================
sbit    dianji_r = P3^0;  //右边电机控制口,低电平转?
sbit    dianji_l = P3^7;  //左边电机控制口,低电平转  
//=============循迹感应接口======================
sbit    xjmk_r    =    P3^2;// 右边寻迹模块检测口 INT0
sbit    xjmk_l  =    P3^3;// 左边寻迹模块检测口 INT1     


void    check_righet();//右边时候检测到黑线测试程序
void    check_left();//左边时候检测到黑线测试程序   

void delay_50us(uint t);
void delayms(uint Ms);   


uchar r_count;//右边传感器检测到的次数计数单元
uchar l_count;
uint time;  
//***********************主程序******************************
main()   
{     
  time=50;            dianji_r=0;//上电时右侧电机运行
    dianji_l=0;//上电时左侧电机运行        EA=1;
    EX1=1;
    EX0=1;
    IT1=0;
    IT0=0;

   xjmk_r=1;//置IO为1,准备读取数据
     xjmk_l=1;
     _nop_();
     r_count=0;
     l_count=0;
      while(1)
      {
             _nop_();
       //  check_righet();//调用右边寻迹检测传感器     
      //   check_left();//
        if(r_count>=1)
          {

                 delayms(time);
                 dianji_r=0;
                 dianji_l=0;
                 r_count=0;
               _nop_();
          }
          if(l_count>=1)
          {  

                  delayms(time);
                  dianji_r=0;
                  dianji_l=0;
                  l_count=0;
                  _nop_();
           }



        }

  }
  void init0int() interrupt 2
  {
       l_count=5;
       dianji_l=1;
       dianji_r=0;
       if(r_count>0)
       {   EX0=0;
           delayms(20);
           if(time>=20)time-=19;
           EX0=0;
        }
      return;

  }

  void init1int() interrupt 0
  {
      r_count=5;
     dianji_r=1;          dianji_l=0;
     if(l_count>0)
     { EX1=0;
      delayms(20);
      if(time>=20)time-=19;
      EX1=1;}
     return;  }  //*******************************************************************************
  //函数名称:
  //功能:左边边时候检测到黑线测试程序
void    check_left()
{
    if(xjmk_l==0)//检测右边的传感器是否感应到黑线
         {                 delay_50us(1);//延时,去除机械振动
                _nop_();                if(xjmk_l==0)//再次检测
               {                                     delay_50us(1);//延时,去除机械振动
                  if(xjmk_l==0)                             {
                     l_count++;
                     xjmk_l=1;                       }
               }
          }
}   //*******************************************************************************  //函数名称:
        //功能:右边时候检测到黑线测试程序
        void    check_righet()
        {
            if(xjmk_r==0)//检测右边的传感器是否感应到黑线                          {
               delay_50us(1);//延时,去除机械振动
               if(xjmk_r==0)//再次检测
               {
                  delay_50us(1);//延时,去除机械振动                                          if(xjmk_r==0)
                  {
                     r_count++;
                     xjmk_r=1;
                    }
               }
          }
}  //*******************************************************************************
//函数名称:void delay_50US(unsigned int t)
//功能:延时50*t(us)
void delay_50us(uint t)
{
    uchar j;
    for(;t>0;t--)
    {
       for(j=19;j>0;j--);
    }
}
/*====================================================================
设定延时时间:x*1ms  ====================================================================*/
void delayms(uint Ms)
{
   uint i,TempCyc;
   for(i=0;i<Ms;i++)
   {
     TempCyc =70;
     while(TempCyc--);
   }
}  


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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