|
用電感式接近開關(guān)做的尋鐵絲小車
單片機(jī)源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit P0_4 = P0^4; //后輪輸入口
- sbit P0_5 = P0^5;
- sbit P0_6 = P0^6;
- sbit P0_7 = P0^7;
- sbit P0_0 = P0^0; //前輪輸入口
- sbit P0_1 = P0^1;
- sbit P0_2 = P0^2;
- sbit P0_3 = P0^3;
-
- sbit Left_moto_pwm = P3^6; //電機(jī)使能
- sbit Right_moto_pwm = P3^7;
- sbit Left_moto_pwm2 = P3^5;
- sbit Right_moto_pwm2 = P3^4;
- sbit P20 = P2^0; //金屬檢測器I/O口 //左
- sbit P21 = P2^1; // 中
- sbit P22 = P2^2; //右
-
- sbit rw=P2^5; //1602
- sbit rs=P2^6;
- sbit en=P2^7;
- sbit beep=P2^4;//蜂鳴器
- uchar code table[]="Distance";
- uchar code table1[]="Time";
- unsigned int motor1=0; //計左電機(jī)碼盤脈沖值 (碼盤值為20)
- unsigned int motor2=0; //計右電機(jī)碼盤脈沖值
- // #define Left_moto_pwm P3_6 //接驅(qū)動模塊ENA 使能端,輸入PWM信號調(diào)節(jié)速度 (左馬達(dá)調(diào)節(jié)PWM) 前
- // #define Right_moto_pwm P3_7 //接驅(qū)動模塊ENB (右馬達(dá)調(diào)節(jié)PWM)
- // #define Left_moto_pwm2 P3_5 //接驅(qū)動模塊ENA 使能端,輸入PWM信號調(diào)節(jié)速度 (左馬達(dá)調(diào)節(jié)PWM) 后
- // #define Right_moto_pwm2 P3_4 //接驅(qū)動模塊ENB (右馬達(dá)調(diào)節(jié)PWM)
- #define Left_moto_go {P0_4=0,P0_5=1;} // 左電機(jī)前進(jìn) 前 P0_4=0,P0_5=1;
- #define Left_moto_back {P0_4=1,P0_5=0;} // 左電機(jī)后退 前 P0_4=1,P0_5=0
- #define Right_moto_go {P0_6=1,P0_7=0;} //右電機(jī)前轉(zhuǎn) 后 P0_6=1,P0_7=0;
- #define Right_moto_back {P0_6=0,P0_7=1;} //右電機(jī)后退 后 P0_6=0,P0_7=1
- #define Left_moto_go2 {P0_2=0,P0_3=1;} //左電機(jī)前進(jìn) P0_2=0,P0_3=1
- #define Left_moto_back2 {P0_2=1,P0_3=0;} //左電機(jī)后退 P0_2=1,P0_3=0 前左
- #define Right_moto_go2 {P0_0=1,P0_1=0;} //右電機(jī)前轉(zhuǎn) P0_0=1,P0_1=0 前右
- #define Right_moto_back2 {P0_0=0,P0_1=1;} //右電機(jī)后退 P0_0=0,P0_1=1
- #define Left_moto_stop22 {P0_2=0,P0_3=0;} //左電機(jī)后退 P0_2=0,P0_3=0
- #define Right_moto_stop22 {P0_0=0,P0_1=0;} //右電機(jī)前轉(zhuǎn) P0_0=0,P0_1=0
- #define Left_moto_stop21 {P0_4=0,P0_5=0;} // 左電機(jī)后退 后 P0_4=0,P0_5=0
- #define Right_moto_stop21 {P0_6=0,P0_7=0;} //右電機(jī)前轉(zhuǎn) 后 P0_6=0,P0_7=0;
- unsigned char pwm_val_left =0;//變量定義
- unsigned char push_val_left =0;// 左電機(jī)占空比N/20 推動 //計算占空比時N的值(人工改變值)
- unsigned char pwm_val_right =0; //通過它來實(shí)現(xiàn)PWM的改變(通過FOR循環(huán))
- unsigned char push_val_right=0;// 右電機(jī)占空比N/20
- unsigned char pwm_val_left2 =0;//變量定義
- unsigned char push_val_left2 =0;// 左電機(jī)占空比N/20 推動 //計算占空比時N的值(人工改變值)
- unsigned char pwm_val_right2 =0; //通過它來實(shí)現(xiàn)PWM的改變(通過FOR循環(huán))
- unsigned char push_val_right2=0;// 右電機(jī)占空比N/20
- bit Right_moto_stop=1;
- bit Left_moto_stop =1;
- bit Right_moto_stop2=1;
- bit Left_moto_stop2 =1;
- unsigned int time=0;
- uchar num2,shi=0,fen=0,miao=0; //num2用于時鐘部分
- uint num,num1,num3,sum,num7; //num,num1,num3用于距離處理部分
- unsigned long num6,S=0,S1=0,S2=0;
- uchar jc; //檢測
- /**************************1602顯示**********************************************/
- void delayms(uint xms)//延時函數(shù)
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- void write_com(uchar com)
- {
- rs=0;
- en=0;
- P1=com;
- delayms(5);
- en=1;
- delayms(5);
- en=0;
- }
- void write_date(uchar date)
- {
- rs=1;
- en=0;
- P1=date;
- delayms(5);
- en=1;
- delayms(5);
- en=0;
- }
- void write_sfm(uchar add,uchar date)
- {
- uchar shi,ge;
- shi=date/10;
- ge=date%10;
- write_com(0x80+0x00+add);
- write_date(0x30+shi);
- write_date(0x30+ge);
- }
- void write_juli(uchar add,uchar date)
- {
- uchar shi,ge;
- shi=date/10;
- ge=date%10;
- write_com(0x80+0x40+add);
- write_date(0x30+shi);
- write_date(0x30+ge);
- }
- void led_1602_init() //1602初始化函數(shù)
- {
- rw=0;
- en=0;
- write_com(0x38);
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
-
- }
- void timer1()interrupt 3
- {
- TH1=(65536-45872)/256;
- TL1=(65536-45872)%256;
- num2++;
- if(num2==20)
- {
- num2=0;
- miao++;
- }
- if(miao==60)
- {
- miao=0;
- fen++;
- }
- if(fen==60)
- {
- fen=0;
- shi++;
- }
- if(shi==24)
- {
- shi=0;
- }
-
- }
- void deal_juli() //測距函數(shù)
- {
- // S=S1*100+S2;
- // uint sum;
- sum=motor1+motor2; // 求和
- num=sum/2.0; // 求平均值
- num1=num/160.0;//求輪子旋轉(zhuǎn)圈數(shù)
- num3=num1*22.5;//輪子走過的距離 算出來的是cm
- S2=num3;
- S=S2/100;
- S1=S2%100;
- // write_juli(9,S);
- // write_juli(12,S1);
- }
- /*********************************************************************************************
- 蜂鳴器
- /********************************************************************************************/
- //void sound()
- //{
- // uint i;
- // for(i=4;i>0;i--)
- // {
- // beep=~beep;
- // delayms(100); //控制蜂鳴器的頻率
- // }
- //}
- /*********************************************************************************************
- 外部中斷INT0計算電機(jī)1的脈沖
- /********************************************************************************************/
- void intersvr1(void) interrupt 0 using 1
- {
- motor1++;
- if(motor1>=9999)
- motor1=0;
- }
- /*********************************************************************************************
- 外部中斷INT1計算電機(jī)2的脈沖
- /********************************************************************************************/
- void intersvr2(void) interrupt 2 using 3
- {
- motor2++;
- if(motor2>=9999)
- motor2=0;
- }
- /************************************************************************/
- void run(void) //前進(jìn)函數(shù)
- {
- //// TR1=1;
- // push_val_left =4; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- // push_val_right =4; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- //
- // push_val_left2 =4; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- // push_val_right2 =4; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- if(P20==0&&P21==0&&P22==0) //全測到
- {
- TR1=0;
- Left_moto_stop21 ; //左電機(jī)
- Right_moto_stop21 ; //右電機(jī)
- Left_moto_stop22 ; //左電機(jī)
- Right_moto_stop22 ; //右電機(jī)
- }
- else if(P20==1&&P21==0&&P22==1) //中間測到 //前進(jìn)函數(shù)
- {
- TR1=1;
- push_val_left =9; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- push_val_right =9; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- push_val_left2 =9; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- push_val_right2 =9; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- Left_moto_go ; //停止
- Right_moto_go ;
- Left_moto_go2 ;
- Right_moto_go2 ;
- push_val_left =4; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- push_val_right =4; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- push_val_left2 =4; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- push_val_right2 =4; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- Left_moto_go ; //停止
- Right_moto_go ;
- Left_moto_go2 ;
- Right_moto_go2 ;
-
- }
- else if(P20==0&&P21==1&&P22==1) //左邊測到
- {
- TR1=1;
- push_val_left =7; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- push_val_right =7; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- push_val_left2 =7; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- push_val_right2 =7; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- Right_moto_go;
- Right_moto_go2;
- Left_moto_back;
- Left_moto_back2;
-
- }
- else if(P20==1&&P21==1&&P22==0) //右邊測到
- {
- TR1=1;
- push_val_left =7; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- push_val_right =7; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- push_val_left2 =7; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- push_val_right2 =7; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- Right_moto_back;
- Right_moto_back2;
- Left_moto_go;
- Left_moto_go2;
-
- }
- else if(P20==0&&P21==0&&P22==1) //左兩測到
- {
- TR1=1;
- push_val_left =8; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- push_val_right =8; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- push_val_left2 =8; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- push_val_right2 =8; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- Left_moto_go ; //停止
- Right_moto_go ;
- Left_moto_go2 ;
- Right_moto_go2 ;
- push_val_left =3; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- push_val_right =3; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- push_val_left2 =3; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- push_val_right2 =3; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- Left_moto_go ; //停止
- Right_moto_go ;
- Left_moto_go2 ;
- Right_moto_go2 ;
- }
- else if(P20==1&&P21==0&&P22==0) //右兩測到
- {
- TR1=1;
- push_val_left =8; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- push_val_right =8; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- push_val_left2 =8; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- push_val_right2 =8; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- Left_moto_go ; //停止
- Right_moto_go ;
- Left_moto_go2 ;
- Right_moto_go2 ;
- push_val_left =3; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- push_val_right =3; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- push_val_left2 =3; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- push_val_right2 =3; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個值可以改變其速度
- Left_moto_go ; //停止
- Right_moto_go ;
- Left_moto_go2 ;
- Right_moto_go2 ;
- }
- }
- /************************************************************************/
- /* PWM調(diào)制電機(jī)轉(zhuǎn)速 */
- /************************************************************************/
- /* 左電機(jī)調(diào)速 */
- /*調(diào)節(jié)push_val_left的值改變電機(jī)轉(zhuǎn)速,占空比 */
- void pwm_out_left_moto(void)
- {
- if(Left_moto_stop)
- {
- if(pwm_val_left<=push_val_left)
- Left_moto_pwm=1;
- else
- Left_moto_pwm=0;
- if(pwm_val_left>=20)
- pwm_val_left=0;
- }
- else Left_moto_pwm=0;
- }
- /******************************************************************/
- /* 右電機(jī)調(diào)速 */
- void pwm_out_right_moto(void)
- {
- if(Right_moto_stop)
- {
- if(pwm_val_right<=push_val_right)
- Right_moto_pwm=1;
- else
- Right_moto_pwm=0;
- if(pwm_val_right>=20)
- pwm_val_right=0;
- }
- else Right_moto_pwm=0;
- }
- /************************************************************************/
- /* 222222 2PWM調(diào)制電機(jī)轉(zhuǎn)速2 */
- /************************************************************************/
- /* 左電機(jī)調(diào)速 */
- /*調(diào)節(jié)push_val_left的值改變電機(jī)轉(zhuǎn)速,占空比 */
- void pwm_out_left_moto2(void)
- {
- if(Left_moto_stop2)
- {
- if(pwm_val_left2<=push_val_left2)
- Left_moto_pwm2=1;
- else
- Left_moto_pwm2=0;
- if(pwm_val_left2>=20)
- pwm_val_left2=0;
- }
- else Left_moto_pwm2=0;
- }
- /******************************************************************/
- /* 右電機(jī)調(diào)速 */
- void pwm_out_right_moto2(void)
- {
- if(Right_moto_stop2)
- {
- if(pwm_val_right2<=push_val_right2)
- Right_moto_pwm2=1;
- else
- Right_moto_pwm2=0;
- if(pwm_val_right2>=20)
- pwm_val_right2=0;
- }
- else Right_moto_pwm2=0;
- }
- /***************************************************/
- ///*TIMER0中斷服務(wù)子函數(shù)產(chǎn)生PWM信號*/
- void timer0()interrupt 1 using 2
- {
- TH0=0Xfe; //0.1Ms定時
- TL0=0Xa3;
- time++;
- pwm_val_left++;
- pwm_val_right++;
- pwm_out_left_moto();
- pwm_out_right_moto();
- pwm_val_left2++;
- pwm_val_right2++;
- pwm_out_left_moto2();
- pwm_out_right_moto2();
- }
- /***************************************************/
- /**********************循跡程序*****************************/
- void main(void)
- {
- TMOD=0X11;
- TH0= 0Xfe; //0.1ms定時
- TL0= 0Xa3;
- TH1=(65536-45872)/256;
- TL1=(65536-45872)%256;
- EA = 1; //中斷總開關(guān)
- TR0= 1;
- ET0= 1;
- // TR1=1;
- ET1=1;
-
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
yyb.zip
(3.08 KB, 下載次數(shù): 88)
2017-12-4 19:51 上傳
點(diǎn)擊文件名下載附件
用到測速,電感式接近開關(guān),pwm調(diào)速 下載積分: 黑幣 -5
|
評分
-
查看全部評分
|