|
#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit Trig = P3^4; //超聲波控制端
sbit Echo = P3^5; //超聲波接收端
sbit led = P1^0; //指示燈
sbit led1 = P3^2; //紅外感應(yīng)
sbit beep = P2^3; //蜂鳴器
sbit servorControl = P1^3; //舵機(jī)的控制引腳
uchar flag = 0;
uchar control = 0; //舵機(jī)控制變量
uchar servorTime =0;
unsigned char T0RH =0;
unsigned char T0RL =0;
void delay (unsigned int z)//毫秒級(jí)延時(shí)
{
unsigned int x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
//初始化定時(shí)器
void Delay_us(unsigned char t)
{
while(--t);
} //大約延時(shí)t*2+5us 超聲波模塊用
void timer0() interrupt 1
{
TH0 = 0;
TL0 = 0;
}
//中斷程序初始化賦值 重新計(jì)數(shù) 超聲波模塊用 計(jì)算時(shí)間
//void time_init()
//{
// TMOD |= 0x01;
// TH0 = 0;
// TL0 = 0;
// TR0 = 1; //啟動(dòng)定時(shí)器0
// ET0 = 1; //允許定時(shí)器0中斷
// EA = 1;
//}
void time_init()
{
EA = 1; //總中斷允許
TMOD= 0x11; //8位自動(dòng)重裝模塊
TH0 = 0;
TL0 = 0; //11.0592M晶振下占空比最大比值是256,輸出100HZ
}
void main()
{
unsigned int time,distance;
EA = 1;
ET0 = 1;
ET1 = 1;
TMOD=0x11;
TH1 =0xff;
TL1 =0x9c;
servorTime = 0;
Trig = 0;
Echo = 0; //超聲波脈沖
time_init();
while(1)
{
Trig = 1;
Delay_us (5);
Trig = 0;
while (Echo == 0);
TR0 = 1;
while (Echo);
TR0 = 0;
time = TH0*256+TL0;
distance = (int)(time*0.017); //計(jì)算路程 單位為cm
TH0 = 0;
TL0 = 0;
if (led1 == 0) //紅外 檢測(cè)到雜物
{
led = 0; //指示燈閃亮
delay(50);
led = 1;
delay(100);
control = 0; //舵機(jī)不轉(zhuǎn)動(dòng)
servorTime = 0;
TR1 = 0;
delay (200);
delay (200);
TR1 = 1;
delay (200);
delay (200);
if(led1 == 1)
led = 1;
}
else
{
if(distance>=40 && led1==1)
{
beep = 1;
control = 20; //使舵機(jī)向右擺動(dòng)
servorTime =0;
TR1 = 1;
delay(200);
delay(200);
TR1 = 0;
delay(200);
delay(200);
}
if(distance<40 && led1==1) //如果距離小于40cm 蜂鳴器響
{
control = 5; //使舵機(jī)向左擺動(dòng)
servorTime =0;
TR1 = 1;
delay(200);
delay(200);
TR1 = 0;
delay(200);
delay(200);
beep = 0;
delay (50);
beep = 1;
delay (2500);
}
}
}
}
void T1_int (void ) interrupt 3 //產(chǎn)生舵機(jī)所需要的脈沖
{
TH1 = 0xff;
TL1 = 0x9c;
servorTime++;
if(servorTime <= control)
servorControl = 1;
else
servorControl = 0;
if(servorTime >= 200)
servorTime=0;
}
|
|