|
希望能夠幫助到更多剛?cè)腴T學(xué)習(xí)51小車的愛好者
main.c主文件:
#include <car.h>
extern unsigned char Left_Speed_Ratio;
extern unsigned char Right_Speed_Ratio;
unsigned int time=0;
unsigned int HC_SR04_time=0;
extern unsigned char pwm_val_left;
extern unsigned char pwm_val_right;
bit flag =0;
extern char M_sensor;
char Work_Mode=0; //工作模式的選擇 為0時,為手機(jī)或者電腦等上位機(jī)對小車進(jìn)行藍(lán)牙遙控 ,為1時小車自動避障模式
char Work_Mode2=0;
unsigned char receive_data=0;
unsigned char receive_real_data=0;
void delay1s(void)
{
unsigned char a,b,c;
for(c=167;c>0;c--)
for(b=171;b>0;b--)
for(a=16;a>0;a--);
_nop_();
}
void delay1ms(void)
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void Timer0Init()
{
TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。
TH0=0XFC; //給定時器賦初值,定時1ms
TL0=0X18;
ET0=1;//打開定時器0中斷允許
EA=1;//打開總中斷
TR0=1;//打開定時器
}
void Timer1Init()
{
TMOD=0X11;//選擇為定時器1模式,工作方式1,僅用TR1打開啟動。選擇為定時器0模式,工作方式1,僅用TR1打開啟動
TH1=0;
TL1=0;
ET1=1;//打開定時器1中斷允許
EA=1;//打開總中斷
TR1=1;//打開定時器
}
void Timer1Init2()
{
SCON=0X50; //設(shè)置為工作方式1,8位數(shù)據(jù),可變波特率
TMOD |=0X20; //設(shè)置計(jì)數(shù)器工作方式2
PCON=0X00; //波特率不加倍
TH1=0XFd; //計(jì)數(shù)器初始值設(shè)置,9600 @11.0592MHz
TL1=0XFd;
TR1=1; //打開計(jì)數(shù)器
ES = 1; //開串口中斷
EA = 1; //開總中斷
}
void timer0()interrupt 1 using 2
{
TH0=0XFC; //給定時器賦初值,定時1ms
TL0=0X18;
time++;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
HC_SR04_time++;
if(HC_SR04_time>=500) //500ms 啟動一次超聲波測距
{
HC_SR04_time=0;
StartModule();
}
}
void Timer1() interrupt 3
{
flag=1; //若定時器1溢出則flag置1
}
void Com_Int(void) interrupt 4
{
EA = 0;
if(RI == 1) //當(dāng)硬件接收到一個數(shù)據(jù)時,RI會置位
{
LED=0;
RI = 0;
receive_data = SBUF;//接收到的數(shù)據(jù)
if(receive_data!=0)
receive_real_data=receive_data;
switch(receive_real_data)
{
case '5': Speed_add(); break;
case '6': Speed_reduce(); break;
}
SBUF=receive_real_data;//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while(!TI); //等待發(fā)送數(shù)據(jù)完成
TI=0; //清除發(fā)送完成標(biāo)志位
}
EA = 1;
}
void main()
{
Timer0Init();
Timer1Init2();
Left_Speed_Ratio=5; //設(shè)置左電機(jī)車速為最大車速的50%
Right_Speed_Ratio=5; ////設(shè)置右電機(jī)車速為最大車速的50%
while(1)
{
if(Work_Mode==1)
{
ES=0; //關(guān)閉串口中斷
if(Work_Mode2==0)
{
Timer1Init();
Work_Mode2=1;
}
if(Echo==1)
{
TH1=0;
TL1=0;
TR1=1; //開啟計(jì)數(shù)
while(Echo); //當(dāng)RX為1計(jì)數(shù)并等待
TR1=0; //關(guān)閉計(jì)數(shù)
Conut(); //計(jì)算
}
if(M_sensor==1)
{ run(); }
else
{
if(L_sensor==1)
{ left(); }
else if(R_sensor==1)
{ right() ; }
else
{ back(); }
}
}
else
{
switch(receive_real_data)
{
case '1': run(); break;
case '2': left(); break;
case '3': right(); break;
case '4': back(); break;
case '7': stop(); break;
case '8': Work_Mode=1; break;
}
LED=1;
}
}
}
car.h頭文件:
#ifndef __car_H
#define __car_H
#include <reg52.h>
#include <intrins.h>
sbit Left_moto_pwm=P1^6 ;
sbit Right_moto_pwm=P1^7;
sbit p34=P3^4;
sbit p35=P3^5;
sbit p36=P3^6;
sbit p37=P3^7;
sbit Trig= P1^4; //產(chǎn)生脈沖引腳
sbit Echo= P1^5; //回波引腳
sbit LED=P0^0;
sbit L_sensor=P2^0;
sbit R_sensor=P2^1;
void Left_moto_go() ;
void Left_moto_back() ;
void Left_moto_stp() ;
void Right_moto_go();
void Right_moto_back();
void Right_moto_stp();
void delay(unsigned int k) ;
void delay1s(void) ;
void delay1ms(void);
void pwm_out_left_moto(void) ;
void pwm_out_right_moto(void);
void run(void);
void back(void);
void left(void);
void right(void);
void stop(void);
void rotate(void);
void StartModule() ;
void Timer1Init();
void Timer0Init();
void Conut(void);
void Timer1Init2();
void Speed_add() ;
void Speed_reduce();
#endif
|
|