小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 6330|回复: 6

求助:有关51单片机的超声波避障小车的代码问题

[复制链接]
发表于 2013-8-12 23:58:11 | 显示全部楼层 |阅读模式
本帖最后由 1107979819 于 2013-8-13 00:00 编辑

最近在用51单片机+超声波+舵机做个避障小车,但是遇到了个问题一直无法解决。我打算用定时器0作为超声波测距使用用,定时器1用作PWM调速和舵机的控制;问题就出现在两个定时器的同时使用上,只有关了一个定时器,另一个定时器的功能才能得以实现。为了方便测试代码,于是先去掉PWM调速的部分,用蜂鸣器函数来测试超声波测距是否工作。当定时器1没有打开的时候,超声波测距正常工作,蜂鸣器正常响起,但打开定时器1的时候,超声波就没反应了。是否要放弃PWM调速这个功能?

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define VELOCITY_30C 3495  //30摄氏度时的声速,声速V= 331.5 + 0.6*30;
#define VELOCITY_23C 3453  //23摄氏度时的声速,声速V= 331.5 + 0.6*23;
long int time;
long int distance=0;    //距离变量
uint count;
uint count0;
uint flag=0;
sbit echo = P0^7;//超声波接收端
sbit trig = P0^6;//超声波发送端
sbit Beep = P2^5;//蜂鸣器

void delayt(uint x);
void Delay_xMs(unsigned int x);
void init();
void SuperSonic();//超声波测距函数
void Alarm(uchar t);//蜂鸣器发声函数

void main()
{
init();
while(1)
{
  
  SuperSonic();//触发超声波发射
  delayt(100);
  if(flag==1)
  {
   Alarm(50);//蜂鸣器发声函数
  }
}   

}
void delayt(uint x)
{
  uchar j;
  while(x-->0)
  {
   for(j=0;j<125;j++);
  }
}
void Delay_xMs(unsigned int x)
{
    unsigned int i,j;
    for( i =0;i < x;i++ )
    {
        for( j =0;j<3;j++ );
    }
}
void init()//初始化单片机
{
TMOD = 0x11;
TH1 =(65536-100)/256;
TL1 =(65536-100)%256;  //0.1ms
  TL0= 0x66;
TH0 = 0xfc;   //1ms
    ET0 = 1;
// ET1 = 1;             //测试定时器1打开或不打开是超声波是否正常工作
   TR0  = 1;

  EA=1;  //总中断使能

  trig =1;
  echo = 1;
  count = 0;
  distance = 0;
}
void SuperSonic()//超声波函数
{
  uchar l;
  uint h,y;
  trig=1;    //发出超声波

delayt(1);
  trig=0;
  while(echo==0);
  TR0=1;
  while(echo);
  TR0 = 0;
  l = TL0;
  h = TH0;
  y =(h<<8)+l;
  y = y -0xfc66;//us部分
  time = y + 1000*count;//计算总时间
  TL0= 0x66;
  TH0 = 0xfc;
  delayt(30);
  distance=VELOCITY_30C*time/20000;      //计算障碍物距离,单位mm
tance<100)
  {
   flag = 1;       // 蜂鸣器是否工作的标志;1为工作。

(distance>=100)
  {
   flag = 0;
  }


  trig =1;
  echo = 1;
  count = 0;
  distance = 0;
}

void timer0 () interrupt 1
{
TF0 = 0;
TL0 =(65536-1000)/256;
TH0 =(65536-1000)%256;  //1ms
count0++;
if(count == 18)//超声波回声脉宽最多18ms
{
  TL0 =(65536-1000)/256;
  TH0 =(65536-1000)%256;  //1ms
  TH0 = 0xfc;
  count = 0;
}
}
void timer1() interrupt 3
{
TH1 =(65536-100)/256;
TL1 =(65536-100)%256;
count++;
if(count<speed)
{
  en=1;
}
else{
  en=0;
}
if(count==100)
{
  count = 0;
}  
}
void Alarm(uchar t)
{
uchar i;
for(i=0 ; i<t; i++)
{
  Beep = 0;
  Delay_xMs(1000);
  Beep = 1;
  Delay_xMs(1000);
}
}
回复

使用道具 举报

发表于 2013-8-14 00:35:05 | 显示全部楼层
排查一下是否中断优先级引起的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-15 14:03:32 | 显示全部楼层
liuviking 发表于 2013-8-14 00:35
排查一下是否中断优先级引起的。

写程序的时候跟着错误的思路愈陷愈深,后来放下来做其他事情的时候就恍然大悟了,是中断的优先级造成的,现在我打开一个中断的时候把另一个中断先关了,完成后再打开。谢谢管理员的回帖。。。
回复 支持 反对

使用道具 举报

发表于 2014-5-9 23:24:58 | 显示全部楼层
1107979819 发表于 2013-8-15 14:03
写程序的时候跟着错误的思路愈陷愈深,后来放下来做其他事情的时候就恍然大悟了,是中断的优先级造成的, ...

最后你把哪里改了?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-11 01:24:21 | 显示全部楼层
zxh728 发表于 2014-5-9 23:24
最后你把哪里改了?

呵呵,这么久了另忘了。。。。。。或许你从回复上看有没有答案
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-11 01:24:22 | 显示全部楼层
zxh728 发表于 2014-5-9 23:24
最后你把哪里改了?

呵呵,这么久了另忘了。。。。。。或许你从回复上看有没有答案
回复 支持 反对

使用道具 举报

发表于 2015-9-22 16:15:20 | 显示全部楼层
在初始化里加上PT0=1;就是定时器0先中断;
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-4-26 23:32 , Processed in 1.100534 second(s), 18 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

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