找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机pwm和三个超声波一起,但是超声波用不了,不知道问题出在哪,求大神指点

[复制链接]
跳转到指定楼层
楼主
ID:480013 发表于 2019-3-5 22:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include"reg51.h"
#include<intrins.h>
#define PWM_T 100    //pwm周期100
unsigned char speed_L;    //左轮脉宽调值
unsigned char speed_R;     //右轮脉宽调值
unsigned char pwm_speed;  //定义自加变量
unsigned long time;     //读取时间
unsigned long s;
unsigned long s1;
unsigned long s2;    //保存计算距离
sbit DA_L=P3^6;
sbit DA_R=P3^7;          //PWM高低电平输出口
sbit L_1=P2^0;
sbit L_2=P2^1;          //左电机
sbit R_1=P2^2;
sbit R_2=P2^3;           //右电机
sbit RX=P1^0;                    //超声波接收
sbit TX=P1^1;        //超声波发送
sbit RX_1=P1^2;                    ///超声波接收
sbit TX_1=P1^3;         //超声波发送
sbit RX_2=P1^4;                    //超声波接收
sbit TX_2=P1^5;       //?超声波发送
void delay(unsigned char x)
{
  while(x--);
}            
void count()
{   
while(!RX);
TR0=1;
while(RX);
TR0=0;
    time=TH0*256+TL0;
TH0=0;
TL0=0;
s=(time*1.7)/100;
}
void count1()
{   
while(!RX_1);
TR0=1;
while(RX_1);
TR0=0;
    time=TH0*256+TL0;
TH0=0;
TL0=0;
s1=(time*1.7)/100;
}
void count2()
{   
while(!RX_2);
TR0=1;
while(RX_2);
TR0=0;
    time=TH0*256+TL0;
TH0=0;
TL0=0;
s2=(time*1.7)/100;
}
void status(unsigned char i)
{
   switch(i)
   {
     case 0: L_1=1; L_2=0; R_1=1; R_2=0;    break;     //前进
  case 1: L_1=0; L_2=1; R_1=0; R_2=1;    break;     //后退
  case 2: L_1=1; L_2=0; R_1=0; R_2=1;    break;     //右转
  case 3: L_1=0; L_2=1; R_1=1; R_2=0;    break;     //左转
  case 4: L_1=0; L_2=0; R_1=0; R_2=0;    break;     //停止
   }      
}
void main()               
{
   TMOD|=0x11;   
   TH0=0;
   TL0=0;      
   ET0=1;
   TH1=(65536-1000)/256;
   TL1=(65536-1000)%256;   
   ET1=1;
   EA=1;         
   TR1=1;     
   
      while(1)      
      {  
   TX=1;
   delay(2);
   TX=0;
   count();
   TX_1=1;
   delay(2);
   TX_1=0;
   count1();
   TX_2=1;
   delay(2);
   TX_2=0;
      count2();
   if(s<=20&&s1<=20&&s2<=20)
   {
    speed_L=100;
    speed_R=100;
    status(1);
   }
   else if(s1<=20&&s<=20&&s2>=20)
   {
    speed_L=20;
    speed_R=100;
    status(0);
   }
   else if(s1>=20&&s<=20&&s2<=20)
   {
    speed_L=100;
    speed_R=20;
    status(0);
   }
   else
   {
    speed_L=100;
    speed_R=100;
    status(0);
   }
      
   }
}
void csbyc() interrupt 1
{
}
void time0_pwm()interrupt 3   
{
  TH1=(65536-1000)/256;
  TL1=(65536-1000)%256;
  if(pwm_speed<=PWM_T)
  {
     pwm_speed++;
  }
  else
  {
    pwm_speed=0;
  }           
  if(pwm_speed<speed_L)      
  {
    DA_L=1;
  }
  else
  {
    DA_L=0;        
  }
  if(pwm_speed<speed_R)
  {
    DA_R=1;
  }
  else
  {
    DA_R=0;
  }
}              
/*加一个超声波就能用,但是两个以上就不行了,试了好多种方法了,两个以上时pwm也能用。现在是程序烧进去小车总保持第一个状态有时候改了些东西就没反应了。求大神指点下,哪里出的毛病,想好几天了,一点进展都没有。*/


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

使用道具 举报

沙发
ID:480013 发表于 2019-3-5 22:21 | 只看该作者
原程序里if中s<=20有括号括着
回复

使用道具 举报

板凳
ID:480013 发表于 2019-3-7 15:26 来自手机 | 只看该作者
求大神指点啊
回复

使用道具 举报

地板
ID:480013 发表于 2020-10-31 09:28 | 只看该作者
这个问题以前已经解决了,能用的,只是因为没有连接外设,程序被卡在了循环等待超声波返回
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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