智能小车超声波跟随
单片机源程序如下:
- #include<reg51.h>
- #define reload_count_1200bps 0xe8
- #define reload_count_2400bps 0xf4
- #define reload_count_4800bps 0xfa
- #define reload_count_9600bps 0xfd
- //定义智能小车电机驱动芯片L293D输入IO口
- sbit IN1 = P1^3;
- sbit IN2 = P1^4;
- sbit IN3 = P1^5;
- sbit IN4 = P1^6;
- sbit EN1 = P1^2;
- sbit EN2 = P1^7;
- sbit BEEP_IO = P2^3; //蜂鸣器定义
- unsigned char pwmval_left = 0; //变量定义
- unsigned char pwmval_right = 0;
- unsigned char pwmval_left_init = 10;
- //左电机占空比调节 ,调节值在0到20之间,调节此值可调节小车速度。
- unsigned char pwmval_right_init = 10;
- //右电机占空比调节 ,调节值在0到20之间,调节此值可调节小车速度。
- bit right_pwm = 1; //右电机PWM开关,为1时打开
- bit left_pwm = 1; //左电机PWM开关,为1时打开
- unsigned char num = 0x00;
- unsigned char UART_REV_BUFFER;
- unsigned char one_frame_finished = 0;
- bit forward_flag = 0;
- bit backward_flag=0;
- bit left_flag = 0;
- bit right_flag = 0;
- bit back_flag = 0;
- bit stop_flag = 1;
- void delay(int In,int Out) //定义延时函数
- {
- int i,j;
- for(i=0;i<In;i++)
- {
- for(j=0;j<Out;j++)
- {;}
- }
- }
- void forward(void) //前进
- {
- if(forward_flag == 0)
- {
- ET0 = 0;
- pwmval_right = 0;
- pwmval_left = 0;
- pwmval_left_init = 20;
- pwmval_right_init = 20;
- ET0 = 1;
- IN1 = 1;
- IN2 = 0; //左车轮的正转
-
- IN3 = 1;
- IN4 = 0;
- } //右车轮的正转
- forward_flag = 1;
- }
- void backward(void) //前进
- {
- if(backward_flag == 0)
- {
- ET0 = 0;
- pwmval_right = 0;
- pwmval_left = 0;
- pwmval_left_init = 20;
- pwmval_right_init = 20;
- ET0 = 1;
- IN1 = 0;
- IN2 = 1; //左车轮的正转
-
- IN3 = 0;
- IN4 = 1;
- } //右车轮的正转
- backward_flag = 1;
- }
- void stop(void) //停车
- {
- IN1 = 0;
- IN2 = 0; //左电机不动
-
- IN3 = 0;
- IN4 = 0;
-
- forward_flag = 0;
- left_flag = 0;
- right_flag = 0;
- back_flag = 0;
- }
- void right(void) //向右
- {
- if(right_flag == 0)
- {
- ET0 = 0;
- pwmval_right = 0;
- pwmval_left = 0;
- pwmval_left_init = 20;
- pwmval_right_init = 20;
- ET0 = 1;
- IN1 = 1;
- IN2 = 0; //智能小车左车轮正转
-
- IN3 = 0;
- IN4 = 1; //智能小车右车轮反转
- }
- right_flag = 1;
- }
- void left(void) //向左
- {
- if(left_flag == 0)
- {
- ET0 = 0;
- pwmval_right = 0;
- pwmval_left = 0;
- pwmval_left_init = 20;
- pwmval_right_init = 20;
- ET0 = 1;
- IN1 = 0;
- IN2 = 1;
-
- IN3 = 1;
- IN4 = 0;
- }
- left_flag = 1;
- }
- /************************************************************************/
- void left_moto(void) //left speed adjust
- {
- if(left_pwm)
- {
- if(pwmval_left <= pwmval_left_init)
- {
- EN1 = 1;
- }
- else
- {
- EN1 = 0;
- }
- if(pwmval_left >= 20)
- {
- pwmval_left = 0;
- }
- }
- else
- {
- EN1 = 0;
- }
- }
- /******************************************************************/
- void right_moto(void)
- {
- if(right_pwm)
- {
- if(pwmval_right <= pwmval_right_init)
- {
- EN2 = 1;
- }
- else if(pwmval_right > pwmval_right_init)
- {
- EN2 = 0;
- }
- if(pwmval_right >= 20)
- {
- pwmval_right = 0;
- }
- }
- else
- {
- EN2 = 0;
- }
- }
- void timer0()interrupt 1 using 2 //
- {
- TH0 = 0xfc; //1Ms定时
- TL0 = 0x66;
- pwmval_left = pwmval_left + 1;
- pwmval_right = pwmval_right + 1;
- left_moto();
- right_moto();
- }
- void timer_init()
- {
- TMOD=0x01;
- TH0= 0xfc; //1ms定时
- TL0= 0x66;
- TR0= 1;
- ET0= 1;
- EA = 1; //开总中断
- }
- void serial_port_initial(char TH,char TL)
- {
- SCON = SCON | 0x50; //0101,0000 8位可变波特率,无奇偶校验位
- TMOD = TMOD | 0x20; //0011,0001 设置定时器1为8位自动重装记数器
- PCON = PCON | 0x00;
- TH1 = TH; //设置定时器1自动重装数
- TL1 = TL;
-
- ES = 1; //允许串口中断
- EA = 1; //开总中断
- TR1 = 1; //开定时器1
- }
- void send_UART(unsigned char i) //发送一节函数
- {
- ES = 0; //关串 口中断
- TI = 0; //清零串口发送完成中断请求标志
- SBUF = i;
- while(TI==0); // 等特数据传送
- TI = 0; // 清除数据传送标志
- ES = 1;
- }
- char UARTReceive(void)
- {
- char ch;
- ch = SBUF;
- return (ch); //暂存接收到的数据
- }
- void UART_Interrupr_Receive(void) interrupt 4
- {
- ES = 0;
- if(RI) //接引起的中断处理程序
- {
- UART_REV_BUFFER = UARTReceive();
- RI = 0;
- ES = 1;
- one_frame_finished = 1;
- }
- }
- void PROCESS(void)
- {
- if(one_frame_finished == 1)
- {
- send_UART(UART_REV_BUFFER);
- if(UART_REV_BUFFER == 0x31)
- {
- stop();
- }
- else if(UART_REV_BUFFER == 0x32)
- {
- left();
- delay(80,100);
- stop();
- }
- else if(UART_REV_BUFFER == 0x33)
- {
- right();
- delay(80,100);
- stop();
- }
- else if(UART_REV_BUFFER == 0x34)
- {
- forward();
- delay(200,100);
- stop();
-
- }
- else if(UART_REV_BUFFER==0x35)
- {
-
- backward();
- delay(100,100);
- stop();
- }
-
- else
- {
- stop();
- }
- one_frame_finished = 0;
- }
-
-
-
-
- //==================Test=====================
- /*right();
- delay(500,100);
-
- left();
- delay(500,100);
-
- backward();
- delay(500,100);
- */
-
- //forward();
- //delay(500,100);
-
-
-
-
-
-
-
- }
- void main(void)
- {
- delay(10,10);
- timer_init();
- serial_port_initial(reload_count_9600bps,reload_count_9600bps);
- BEEP_IO = 0;
- delay(100,100);
- BEEP_IO = 1;
-
- while(1)
- {
- PROCESS();
- }
- }
复制代码
所有资料51hei提供下载:
智能小车超声波跟随程序.zip
(35.23 KB, 下载次数: 122)
|