渣渣為了湊積分,發(fā)一個以前做過的小玩意
單片機源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- /*****電機驅(qū)動*****/
- sbit IN1=P1^0;
- sbit IN2=P1^1;
- sbit IN3=P1^2;
- sbit IN4=P1^3;
- /*****紅外尋跡*****/
- sbit RSEN1=P2^1;
- sbit RSEN2=P2^2;
- sbit LSEN1=P2^3;
- sbit LSEN2=P2^4;
- /*****使能A、B*****/
- sbit ENA=P1^4;
- sbit ENB=P1^5;
- /*****電機驅(qū)動*****/
- #define Left_moto_go {IN1=1,IN2=0;}
- #define Left_moto_back {IN1=0,IN2=1;}
- #define Right_moto_go {IN3=1,IN4=0;}
- #define Right_moto_back {IN3=0,IN4=1;}
- #define Left_moto_s {IN1=0,IN2=0;}
- #define Right_moto_s {IN3=0,IN4=0;}
- uchar M; //從串口接收的數(shù)據(jù)
- uchar pwm_val_left =0;//變量定義
- uchar push_val_left=4; //左電機占空比N/20
- uchar pwm_val_right =0;
- uchar push_val_right=4;//右電機占空比N/20
- bit Right_moto_stop=1;
- bit Left_moto_stop =1;
- /********************************************
- 毫秒延時函數(shù)
- **********************************************/
- void Delay_ms(uint x) //12.000MHz
- {
- uchar a,b;
- for(a=x;a>0;a--)
- for(b=199;b>0;b--);
- }
- /*****延時*****/
- void delay50ms(void) //誤差 0us
- {
- unsigned char a,b;
- for(b=173;b>0;b--)
- for(a=143;a>0;a--);
- }
- /********************************************************************
- * 名稱 : Com_Init()
- * 功能 : 串口初始化,晶振12,波特率2400,使串口中斷
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void Com_Init(void)
- {
- PCON &= 0x00; //波特率不倍速
- SCON = 0x50; //8位數(shù)據(jù),可變波特率
- //AUXR &= 0xBF; //定時器1時鐘為Fosc/12,即12T
- //AUXR &= 0xFE; //串口1選擇定時器1為波特率發(fā)生器
- TMOD &= 0x0F; //清除定時器1模式位
- TMOD |= 0x20; //設(shè)定定時器1為8位自動重裝方式
- TL1 = 0xF3; //設(shè)定定時初值
- TH1 = 0xF3; //設(shè)定定時器重裝值
- ET1 = 0; //禁止定時器1中斷
- TR1 = 1; //啟動定時器1
- SM0 = 0;
- SM1 = 1;
- REN = 1;
- EA = 1;
- ES = 1;
- }
- /*****前進*****/
- void go()
- {
- Left_moto_go ;
- Right_moto_go ;
- }
- /*****后退*****/
- void back()
- {
- Left_moto_back ;
- Right_moto_back ;
- }
- /*****左轉(zhuǎn)*****/
- void turn_left()
- {
- Left_moto_back;
- Right_moto_go ;
- }
- /*****右轉(zhuǎn)*****/
- void turn_right()
- {
- Left_moto_go;
- Right_moto_back;
- }
- /*****急停*****/
- void stop()
- {
- Left_moto_s;
- Right_moto_s;
- }
- /*****PWM左電機*****/
- void pwm_out_left_moto(void)
- {
- if(Left_moto_stop)
- {
- if(pwm_val_left<=push_val_left)
- ENA=1;
- else
- ENA=0;
- if(pwm_val_left>=20)
- pwm_val_left=0;
- }
- else ENA=0;
- }
- /*****PWM右電機*****/
- void pwm_out_right_moto(void)
- {
- if(Right_moto_stop)
- {
- if(pwm_val_right<=push_val_right)
- ENB=1;
- else
- ENB=0;
- if(pwm_val_right>=20)
- pwm_val_right=0;
- }
- else ENB=0;
- }
- /********************************************************************
- * 名稱 : Com_Int()
- * 功能 : 串口中斷子函數(shù)
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void Com_Int(void) interrupt 4
- {
- EA = 0;
- if(RI) //當硬件接收到一個數(shù)據(jù)時,RI會置位
- {
- M = SBUF;
- RI = 0;
- }
- EA = 1;
- }
- /*TIMER0中斷服務(wù)子函數(shù)產(chǎn)生PWM信號*/
- void timer0()interrupt 1 using 2
- {
- TH0=0XFC; //1ms定時
- TL0=0X18;
- pwm_val_left++;
- pwm_val_right++;
- pwm_out_left_moto();
- pwm_out_right_moto();
- }
- /*****循跡函數(shù)*****/
- void xunji()
- {
- uchar flag;
- if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==0)&&(LSEN2==0))
- { flag=0; }//*******直行*******//
- else if((RSEN1==0)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==0))
- { flag=1;} //***右偏,左轉(zhuǎn)***//
- else if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==0))
- { flag=2;} //***左偏,右轉(zhuǎn)***//
- else if((RSEN1==1)&&(RSEN2==0)&&(LSEN1==0)&&(LSEN2==0))
- { flag=1;} //***右偏,左轉(zhuǎn)***//
- else if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==0)&&(LSEN2==1))
- { flag=2;} //***左偏,右轉(zhuǎn)***//
- else if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==0))
- { flag=1;} //***右偏,左轉(zhuǎn)***//
- else if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==1))
- { flag=2;} //***左偏,右轉(zhuǎn)***//
- else if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==1)&&(LSEN2==1))
- { flag=3; }//*******急停*******//
- switch (flag)
- {
- case 0:go();break;
- case 1:turn_left();delay50ms();break;
- case 2:turn_right();delay50ms();break;
- case 3:stop();delay50ms();break;
- default: break;
- }
- }
- /********循跡模式*******/
- void tracing()
- {
- while(1)
- {
- TMOD|=0X01;
- TH0=0XFC;//1ms定時
- TL0=0X18;
- TR0=1;
- ET0=1;
- EA =1;
- if(M == '1')
- break;
- while(1)/*無限循環(huán)*/
- {
- xunji();
- if(M == '1')
- break;
- }
- }
- }
- void main()
- {
- Delay_ms(100);
- Com_Init();//串口初始化
- while(1)
- {
- switch(M)
- {
- case 'A': go();Delay_ms(100); break;
- case 'B': back();Delay_ms(100); break;
- case 'C': turn_left();Delay_ms(100); break;
- case 'D': turn_right();Delay_ms(100); break;
- case 'F': stop();Delay_ms(100); break;
- case '2': tracing(); break;
- case '3': push_val_left =4;push_val_right =4; break;
- case '4': push_val_left =10;push_val_right =10; break;
- case '5': push_val_left =20;push_val_right =20; break;
- default:break;
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
藍牙尋跡終極.zip
(1.86 KB, 下載次數(shù): 20)
2019-9-30 11:43 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|