|
智能小車超聲波跟隨
單片機(jī)源程序如下:
- #include<reg51.h>
- #define reload_count_1200bps 0xe8
- #define reload_count_2400bps 0xf4
- #define reload_count_4800bps 0xfa
- #define reload_count_9600bps 0xfd
- //定義智能小車電機(jī)驅(qū)動(dòng)芯片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;
- //左電機(jī)占空比調(diào)節(jié) ,調(diào)節(jié)值在0到20之間,調(diào)節(jié)此值可調(diào)節(jié)小車速度。
- unsigned char pwmval_right_init = 10;
- //右電機(jī)占空比調(diào)節(jié) ,調(diào)節(jié)值在0到20之間,調(diào)節(jié)此值可調(diào)節(jié)小車速度。
- bit right_pwm = 1; //右電機(jī)PWM開關(guān),為1時(shí)打開
- bit left_pwm = 1; //左電機(jī)PWM開關(guān),為1時(shí)打開
- 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) //定義延時(shí)函數(shù)
- {
- int i,j;
- for(i=0;i<In;i++)
- {
- for(j=0;j<Out;j++)
- {;}
- }
- }
- void forward(void) //前進(jìn)
- {
- 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; //左車輪的正轉(zhuǎn)
-
- IN3 = 1;
- IN4 = 0;
- } //右車輪的正轉(zhuǎn)
- forward_flag = 1;
- }
- void backward(void) //前進(jìn)
- {
- 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; //左車輪的正轉(zhuǎn)
-
- IN3 = 0;
- IN4 = 1;
- } //右車輪的正轉(zhuǎn)
- backward_flag = 1;
- }
- void stop(void) //停車
- {
- IN1 = 0;
- IN2 = 0; //左電機(jī)不動(dòng)
-
- 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; //智能小車左車輪正轉(zhuǎn)
-
- IN3 = 0;
- IN4 = 1; //智能小車右車輪反轉(zhuǎn)
- }
- 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定時(shí)
- TL0 = 0x66;
- pwmval_left = pwmval_left + 1;
- pwmval_right = pwmval_right + 1;
- left_moto();
- right_moto();
- }
- void timer_init()
- {
- TMOD=0x01;
- TH0= 0xfc; //1ms定時(shí)
- TL0= 0x66;
- TR0= 1;
- ET0= 1;
- EA = 1; //開總中斷
- }
- void serial_port_initial(char TH,char TL)
- {
- SCON = SCON | 0x50; //0101,0000 8位可變波特率,無奇偶校驗(yàn)位
- TMOD = TMOD | 0x20; //0011,0001 設(shè)置定時(shí)器1為8位自動(dòng)重裝記數(shù)器
- PCON = PCON | 0x00;
- TH1 = TH; //設(shè)置定時(shí)器1自動(dòng)重裝數(shù)
- TL1 = TL;
-
- ES = 1; //允許串口中斷
- EA = 1; //開總中斷
- TR1 = 1; //開定時(shí)器1
- }
- void send_UART(unsigned char i) //發(fā)送一節(jié)函數(shù)
- {
- ES = 0; //關(guān)串 口中斷
- TI = 0; //清零串口發(fā)送完成中斷請(qǐng)求標(biāo)志
- SBUF = i;
- while(TI==0); // 等特?cái)?shù)據(jù)傳送
- TI = 0; // 清除數(shù)據(jù)傳送標(biāo)志
- ES = 1;
- }
- char UARTReceive(void)
- {
- char ch;
- ch = SBUF;
- return (ch); //暫存接收到的數(shù)據(jù)
- }
- 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();
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
智能小車超聲波跟隨程序.zip
(35.23 KB, 下載次數(shù): 122)
2018-7-13 09:54 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|