《智能小车源代码9885.pdf》由会员分享,可在线阅读,更多相关《智能小车源代码9885.pdf(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-.z.#include#include /#includelcd.h sbit T*=P27;sbit R*=P26;sbit PWM=P14;sbit Beep=P37;sbit led1=P33;sbit led2=P34;sbit led3=P35;/*蓝牙切换按键*/sbit k1=P36;/*自定义一些数据,注意这些数据对应“51 智能车蓝牙无线遥控.e*e”软件上的数据设置*/#define leftdata 0*11#define rightdata 0*22#define forwarddata 0*33#define backdata 0*44#define stopdat
2、a 0*55#define uchar unsigned char#define uint unsigned int unsigned char receiveData,high_velosity,low_velosity;void UsartConfiguration();/*电机端口定义*/sbit IN1=P10;/为高电平时,左电机后转 sbit IN2=P11;/为高电平时,左电机正转 sbit IN3=P12;/为高电平时,右电机正转 sbit IN4=P13;/为高电平时,右电机后转/*无线遥控模块定义*/sbit Key_A=P20;/B 键信号端对应 D0 sbit Key_
3、B=P21;/D 键信号端对应 D1 sbit Key_C=P22;/C 键信号端对应 D2 sbit Key_D=P23;/C 键信号端 void delay0(int a);void delay15us(void);void delay1ms(int z);void di();/蜂鸣器函数声明 unsigned int time;/用于存放定时器时间值 unsigned int S;/用于存放距离的值 char flag=0;/量程溢出标志位 char f1,f2,f3,f4,n0;int a;int n;/运行次数判断标志 int s_left,s_right;void Delay10u
4、s(unsigned char i)-.z.unsigned char j;do j=10;do _nop_();while(-j);while(-i);/*/*电机程序*/*/void loop()IN1=1;/左电机 IN2=0;IN3=1;/右电机 IN4=0;void runfront()IN1=1;/左电机 IN2=0;IN3=0;/右电机 IN4=1;/小车后退函数 void runback()IN1=0;/左电机 IN2=1;IN3=1;/右电机 IN4=0;/小车左转 void runleft()IN1=0;/左电机 IN2=0;IN3=0;/右电机 IN4=1;/小车右转 v
5、oid runright()-.z.IN1=1;/左电机 IN2=0;IN3=0;/右电机 IN4=0;/小车左后转/void runbackleft()/IN1=0;/左电机/IN2=0;/IN3=0;/右电机/IN4=1;/小车右后转/void runbackright()/IN1=1;/左电机/IN2=0;/IN3=0;/右电机/IN4=0;/小车停止函数 void stop()IN1=0;/左电机 IN2=0;IN3=0;/右电机 IN4=0;/*/*蓝牙程序*/*/void delay(unsigned int a)unsigned int b;for(;a0;a-)for(b=3;
6、b0;b-);/左电机转 void left_motor_runfront(unsigned int a)IN1=1;/左电机 IN2=0;-.z.delay(a);IN1=0;IN2=0;delay(100-a);void right_motor_runfront(unsigned int a)IN3=0;/右电机 IN4=1;delay(a);IN3=0;IN4=0;delay(100-a);void left_motor_back(unsigned int a)IN1=0;/左电机 IN2=1;delay(a);IN1=0;IN2=0;delay(100-a);void right_mo
7、tor_back(unsigned int a)IN3=1;/右电机 IN4=0;delay(a);IN3=0;IN4=0;delay(100-a);void left_motor_stop()IN1=0;/左电机 IN2=0;void right_motor_stop()IN3=0;/左电机 IN4=0;/PWM 调速 void PWM_RUNFRONT(unsigned int a,unsigned int b)/a 属于 0100-.z.left_motor_runfront(a);right_motor_runfront(b);void PWM_RUNBACK(unsigned int
8、 a,unsigned int b)/a 属于 0100 left_motor_back(a);right_motor_back(b);void PWM_RUNLEFT(unsigned int a)/a 属于 0100 right_motor_runfront(a);left_motor_stop();void PWM_RUNRIGHT(unsigned int a)/a 属于 0100 right_motor_stop();left_motor_runfront(a);void bluestop()left_motor_stop();right_motor_stop();void Usar
9、tConfiguration()SCON=0*50;/设置为工作方式 1 TMOD=TMOD|0*21;/设置计数器工作方式 2 PCON=0*80;/波特率加倍 TH1=0*FA;/计数器初始值设置,注意波特率是 4800 的 TL1=0*FA;ES=1;/打开接收中断 EA=1;/打开总中断 TR1=1;TH0=0;TL0=0;ET0=1;/打开计数器 /*函数名 :Delay(unsigned int i)*函数功能 :延时函数*输入 :无*输出 :无*/-.z.void Usart()interrupt 4 receiveData=SBUF;/出去接收到的数据 RI=0;/清除接收中断
10、标志位 if(receiveData=0*66)low_velosity=1;high_velosity=0;/write_(0*80);if(receiveData=0*77)low_velosity=0;high_velosity=1;/*/*舵机程序*/*/void delay*(int t)char j;for(;t0;t-)for(j=19;j0;j-);void degree0()int i;for(i=0;i10;i+)PWM=1;delay*(10);/1ms PWM=0;delay*(390);/19ms void degree90()int i;for(i=0;i10;i+
11、)PWM=1;delay*(24);/50 PWM=0;-.z.delay*(376);/18.5ms void degree180()int i;for(i=0;i15;i+)PWM=1;delay*(40);/1.5ms PWM=0;delay*(360);/18.5ms /*/*超声波程序*/*/*A 键被按下后,前进*/void Count1(void)time=TH1*256+TL1;TH1=0;TL1=0;S=(time*1.7)/100;n+;if(S30&n=1)led1=1;runfront();n=0;if(n=2)s_left=S;degree180();di();if(
12、n=3)-.z.s_right=S;degree90();di();n=0;/标志位清零 if(s_lefts_right)led2=1;delay1ms(50);led2=0;delay1ms(50);runright();delay*(1250);else led3=1;delay(800);led3=0;delay(500);runleft();delay*(1250);/*超声波高电平脉冲宽度计算程序*/void Timer_Count(void)TR1=1;/开启计数 while(R*);/当 R*为 1 计数并等待 TR1=0;/关闭计数 /Count1();/计算 /*/void
13、 StartModule()/启动模块 T*=1;/启动一次模块 Delay10us(2);T*=0;/*/*主程序*/*/void main(void)UsartConfiguration();while(1)if(k1=0&n0=0)delay1ms(20);if(k1=0)-.z.n0+;else if(k1=0&n0=1)delay1ms(20);if(k1=0)n0-;if(n0=0)if(Key_B=0&Key_D=0&Key_C=0&Key_A=1)/A 键被按下 f1=1;f2=0;f3=0;f4=0;di();else if(Key_A=0&Key_D=0&Key_B=1&K
14、ey_C=0)/B 键被按下 f1=0;f2=1;f3=0;f4=0;di();else if(Key_B=0&Key_D=0&Key_A=0&Key_C=1)/C 键被按下 f1=0;f2=0;f3=1;f4=0;di();else if(Key_D=1&Key_B=0&Key_A=0&Key_C=0)/D 键被按下 f1=0;f2=0;f3=0;f4=1;di();if(f1)StartModule();for(a=951;a0;a-)if(R*=1)Timer_Count();Count1();if(f2)-.z.runback();if(f3)loop();if(f4)stop();i
15、f(n0=1)if(low_velosity)switch(receiveData)case leftdata:PWM_RUNLEFT(30);break;case rightdata:PWM_RUNRIGHT(30);break;case forwarddata:PWM_RUNFRONT(64,70);break;case backdata:PWM_RUNBACK(64,70);break;case stopdata:bluestop();break;if(high_velosity)switch(receiveData)case leftdata:PWM_RUNLEFT(50);break;case rightdata:PWM_RUNRIGHT(50);break;case forwarddata:PWM_RUNFRONT(94,100);break;case backdata:PWM_RUNBACK(94,100);break;case stopdata:stop();break;/*蜂鸣器*/void di()int i;for(i=0;i 0;i-)for(j=200;j 0;j-);void delay1ms(int z)/延时 1ms int*,y;for(*=z;*0;*-)for(y=110;y0;y-);
限制150内