单片机/MCUwilliam hill官网
直播中

禾苗m

8年用户 48经验值
擅长:嵌入式技术 CRF/无线 处理器/DSP MEMS/传感技术
私信 关注
[问答]

光电开关和超声波小车。。。

左右两个光电开关检测小车前方是否有障碍墙(光电开关用键控代替)。超声波让小车微调,走赛道的正中间。舵机控制小车前轮的左右转动(两个程序通过控制舵机左右蔽障),两个程序分开都能用,但和在一起后舵机不动了(keil软件提示没有警告和错误)。求大神看看我的程序是不是有哪里不对~~

PS:单片机用的是89c52.
已退回10积分

回帖(13)

禾苗m

2016-11-16 19:20:59
以下是程序:
举报

禾苗m

2016-11-16 19:21:20
到底哪里错了?!!!!
举报

禾苗m

2016-11-16 19:21:40
急求回复!
举报

禾苗m

2016-11-16 19:24:35
有人不??
举报

王栋春

2016-11-16 21:34:21
现在的坛友非常珍惜自己的积分 楼主还是将程序截图上传吧
举报

禾苗m

2016-11-17 15:44:35
主程序:
#include                 //器件配置文件
#include
#include "delay.h"
#include"count.h"
#include"duozhuan.h"

***it P1_0 = P1^0;   // PWM  脉冲输出
unsigned char counter = 0;  // 计数的
unsigned char Set_PWM0=14;
unsigned char flag;
unsigned char tt1;
uint S,time;

/********************************************************/
void time1()interrupt 3 using 2
{
TH1=(65536-100)/256; //100US定时
TL1=(65536-100)%256;
counter++;
  if(counter >= 200) counter=0;   // PWM  16级  可以修改
  if(counter >= Set_PWM0) P1_0 = 0; else P1_0 = 1;
}
/********************************************************/
     void Timer0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  {
    flag=1;                                                         //中断溢出标志
  }

/*********************************************************/
void main(void)
{               
        while(1)
        {
         TMOD=0x11;                   //设T0为方式1,GATE=1;
         TH0=0;
         TL0=0;
         TH1=(65536-100)/256;
         TL1=(65536-100)%256;
     TR1= 1;
     ET1= 1;
     ET0= 1;
     EA = 1;
    delay(100);       
        Set_PWM0=14; //舵机归中
        while(1)
          {
          leftrun();
          rightrun();
          zheng();
          COMM();
         }         
        }
}
举报

禾苗m

2016-11-17 15:45:04
舵机子程序:
#include                 //器件配置文件
#include
#include "delay.h"
#include"count.h"
#include"duozhuan.h"

void Conut(void)
{
         time=TH0*256+TL0;
         TH0=0;
         TL0=0;
         S=(time*1.56672)/100;    //晶振11.0592算出来是CM
}

     void  StartModule()                          //启动模块
  {
          Trig=1;                                             //启动一次模块
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          Trig=0;
  }

/********************************************************/
void COMM(void)
{
             StartModule();
             while(!Echo);                //当Echo为零时等待
             TR0=1;                            //开启计数
             while(Echo);                        //当Echo为1计数并等待
             TR0=0;                                //关闭计数
         Conut();                        //计算
                 delay(80);                //80MS
                 if(S>50)
                 {
            rightweirun();
         }
                 if(S>120)
                 {
                   leftweirun();
                 }
}
举报

禾苗m

2016-11-17 15:45:35
引用: 禾苗m 发表于 2016-11-17 15:45
舵机子程序:
#include                 //器件配置文件
#include

这是超声波的
举报

禾苗m

2016-11-17 15:45:57
超声波头文件:
#ifndef        __COUNT_H__
#define __COUNT_H__


#define uchar unsigned char
#define uint unsigned int

***it Echo = P2^1;         //        回波引脚           rx
***it Trig=P2^0;
extern uint S,time;
void Conut(void);
void  StartModule();
void COMM(void);



#endif
举报

禾苗m

2016-11-17 15:46:25
舵机控制子程序:
#include                 //器件配置文件
#include
#include "delay.h"
#include"duozhuan.h"

/********************************************************/
                                /*左微调 */
void rightweirun(void)
{
Set_PWM0=Set_PWM0+6;
delay(400);
Set_PWM0=Set_PWM0-6;
}
/*****************************************************/
                /*右微调 */
void leftweirun(void)
{
                Set_PWM0=Set_PWM0-6;
                delay(4000);
                Set_PWM0=Set_PWM0+6;
}
/*********************************************************/
              /*左转回正*/
void leftrun(void)
  {
   if(key10==0&& tt1==0)
    {
      delay(3);
          if(key10==0&& tt1==0)
          {       
            tt1=1;   
                Set_PWM0=Set_PWM0+6;
                delay(4000);
                Set_PWM0=Set_PWM0-6;
                delay(4000);
                Set_PWM0=Set_PWM0-6;
                delay(4000);
                Set_PWM0=Set_PWM0+6;
          }
    }            
   }
/*********************************************************/
               /*右转回正*/
void rightrun(void)
{
  if(key11==0&& tt1==0 )
   {
       delay(3);
          if(key11==0&& tt1==0)
          {         
            tt1=1;   
                Set_PWM0=Set_PWM0-6;
                delay(4000);
                Set_PWM0=Set_PWM0+6;
                delay(4000);
                Set_PWM0=Set_PWM0+6;
                delay(4000);
                Set_PWM0=Set_PWM0-6;
          }
   }
}
/*********************************************************/
                 /*无高信号回来*/
void zheng(void)
{
if(key10==1 && key11==1) tt1=0;
}
/*********************************************************/
举报

禾苗m

2016-11-17 15:47:09
舵机控制头文件:
#ifndef        __DUOZHUAN_H__
#define __DUOZHUAN_H__


#define uchar unsigned char
#define uint unsigned int

extern unsigned char Set_PWM0; // 占空比调整
extern unsigned char tt1;
***it key10=P3^2;
***it key11=P3^3;
void rightweirun(void);
void leftweirun(void);
void leftrun(void);
void rightrun(void);
void zheng(void);


#endif
举报

禾苗m

2016-11-19 09:08:35
没人来!!!!!!!!!!!!!!!!!!!!!!!!
举报

杨春宇

2016-11-23 00:02:59
应该是电源问题,我之前遇到过,分别可以工作,连起来经常出问题
举报

更多回帖

发帖
×
20
完善资料,
赚取积分