|
#include <reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
//sfr T2MOD=0xc9;
sbit in1 =P1^0;
sbit in2 =P1^1;
sbit in3 =P1^2;
sbit in4 =P1^3;
sbit in5 =P1^4;
sbit in6 =P1^5;
sbit in7 =P1^6;
sbit in8 =P1^7;
sbit ina =P3^4; //電機(jī)PWM-A
sbit ina2 =P3^5;
sbit inb =P3^6; //電機(jī)PWM-B
sbit inb2 =P3^7;
sbit bz_l =P2^0; //避障左
sbit bz_r =P2^1; //避障右
sbit moto_pwm =P3^2;//PWM輸出腳控制舵機(jī)
unsigned int time=0;
unsigned long S=0;
sbit Trig = P0^2;
sbit Echo = P0^3;
uint tt = 0;//變量定義
uint num=0;//變量定義
uchar pwm_lefr=0;//定義 定時(shí)器自加1變量
uchar duojiguizhong=14;//舵機(jī)歸中1.5ms
uchar duojiguizhong1=14;//舵機(jī)歸中1.5ms
uchar tmp,w,sudu;
void Conut();
void StartModule();
void init() ;
void delay1(uint z)//延時(shí)函數(shù)
{
uint x,y;
for(x=z;x>0;x--)
for(y=120;y>1;y--);
}
void delay(uint z)
{
uint x,y;
for(x=0;x<z;x++)
for(y=0;y<1000;y++);
}
void pwmmaic()//產(chǎn)生PWM
{
if(pwm_lefr<=duojiguizhong)
moto_pwm=1; //舵機(jī)PWM
else
moto_pwm=0;
if(pwm_lefr>=200)
pwm_lefr=0;
}
void duoji_kz()//舵機(jī)控制
{
duojiguizhong=9;
delay(100); //轉(zhuǎn)頭時(shí)間
StartModule();
//Conut(); //測(cè)速運(yùn)行程序就卡死了
duojiguizhong=16;
delay(100);
duojiguizhong=24;
delay(100);
duojiguizhong=16;
delay(100);
}
void qianjin()
{
in1=1;in2=0;in3=1;in4=0;in5=1;in6=0;in7=1;in8=0;
}
void houtui()
{
in1=0;in2=1;in3=0;in4=1;in5=0;in6=1;in7=0;in8=1;
}
void zuozhuan()
{
in1=0;in2=1;in3=0;in4=1;in5=1;in6=0;in7=1;in8=0;
}
void youzhuan()
{
in1=1;in2=0;in3=1;in4=0;in5=0;in6=1;in7=0;in8=1;
}
void tingzhi()
{
in1=0;in2=0;in3=0;in4=0;in5=0;in6=0;in7=0;in8=0;
}
void bizhang() //避障
{
if(bz_l==1&&bz_r==1)
qianjin();
if(bz_l==0&&bz_r==1)
zuozhuan();
if(bz_l==1&&bz_r==0)
youzhuan();
if(bz_l==0&&bz_r==0)
{
tingzhi();
delay(100);
houtui();
delay(500);
zuozhuan();
delay(200);
qianjin();
}
}
void StartModule() //啟動(dòng)模塊
{
Trig=1; //啟動(dòng)一次模塊
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Trig=0;
}
void Conut()
{
while(!Echo);//當(dāng)RX為零時(shí)等待
TR0=1;//開(kāi)啟計(jì)數(shù)
while(Echo); //當(dāng)RX為1計(jì)數(shù)并等待
TR0=0;
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100; //算出來(lái)是CM
}
void init() //串口初始化
{ //關(guān)中斷
SCON =0x50; //串口模式1,允許接收
TMOD =0x20;//定時(shí)器1為模式2 8-bit自動(dòng)裝載方式用于產(chǎn)生波特率
PCON=0x00;//波特率不倍增
TH1=0xfd;//波特率9600 11.0592M
TL1=0xfd;
TH0=0;
TL0=0;
ET0=1; // T0中斷允許
TR0=1; // 啟動(dòng)T0定時(shí)器
TR1=1; // 啟動(dòng)T1定時(shí)器
EA=1;
ES=1;
duojiguizhong=16;
duojiguizhong1=16;
}
void ctrl() //接收處理函數(shù)
{
switch(tmp)
{
case 1:qianjin();break;
case 2:houtui();break;
case 3:zuozhuan();break;
case 4:youzhuan();break;
case 0:tingzhi(); break;
case 7:duoji_kz();break; //舵機(jī) C
case 8:bizhang();break; //避障 D
}
}
void tiaosu () //調(diào)速
{
switch(sudu)
{
case 5: w=40; break; //A
case 6: w=75; break; //B
}
}
void main()
{
init();
while(1)
{
ctrl();
tiaosu();
}
}
void time0() interrupt 1
{
TH0=0xfd;
TL0=0xae;
tt++;
pwm_lefr++;
pwmmaic();
if(tt<w)
{
ina=1;
ina2=1;
inb=1;
inb2=1;
}
else
{
ina=0;
ina2=0;
inb=0;
inb2=0;
}
if(tt==100)
{tt=0;
}
}
void ckzd() interrupt 4
{
ES=0;
RI=0;
tmp=SBUF;
sudu=SBUF;
ES=1;
}
問(wèn)下 Conut() 運(yùn)行無(wú)效??是定時(shí)器問(wèn)題嗎?
|
|