|
本帖最后由 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);
}
}
|
|