感謝51黑論壇給予我的幫助,我自己總結了前輩們的代碼,寫了一個42步進電機藍牙控制的代碼,能實現(xiàn)前后左右控制;尋跡,避障lcd1602顯示功能還不齊全。
170ABB2975F0D0AC8A842E1B78957C1D.png (240.11 KB, 下載次數(shù): 31)
下載附件
2019-8-1 16:44 上傳
單片機源程序如下:
- #include "42moto.h"
- #include "lcd1602.h"
- /**********************************************
- * IO設置
- *
- *
- *************************************************/
- /**************紅外引腳定義*******************/
- sbit HY_R = P1^4; //右邊紅外傳感器定義
- sbit HY_Z = P1^5; //中間紅外傳感器定義
- sbit HY_L = P1^6; //左邊紅外傳感器定義
- /*************尋跡引腳定義*******************/
- sbit XJ_R = P1^0; //右邊尋跡傳感器定義
- sbit XJ_Z = P1^1; //中間尋跡傳感器定義
- sbit XJ_L = P1^2; //左邊尋跡傳感器定義
- /************電機控制引腳定義*****************/
- //sbit ENA_R = P1^2; // 右電機使能
- sbit PUL_L = P2^0; // 左電機脈沖
- sbit DIR_L = P2^2; // 左電機方向
- sbit PUL_R = P2^3; // 右電機脈沖
- sbit DIR_R = P2^4; // 右電機方向
- //sbit ENA_L = P2^2; // 左電機使能
- #define MotorTabNum 5
- unsigned char T0_NUM;
- signed char g_MotorNum = 0;
- unsigned char MotorTab[6] = {6, 5, 4, 3, 2, 1};
- void T0_Init();//中斷定義
- void delay(xms);
- void hongwai(void);
- void xunji(void);
- /********************************延時函數(shù)***********************************************************/
- void delay(xms)
- {
- unsigned int x,y;
- for(x=xms;x>0;x--)
- for(y=110;y>0;y--);
- }
- /*************定時器初始化***********************************************************/
- void T0_Init()
- {
- TMOD = 0x01;
- TH0 = (65535-100)/256; // 1ms
- TL0 = (65535-100)%256;
- EA = 1;
- ET0 = 1;
- }
- ////延時n毫秒
- //void delay_ms(unsigned int n)
- //{
- // unsigned int i=0,j=0;
- // for(i=0;i<n;i++)
- // for(j=0;j<123;j++);
- //}
- /*************定時器中斷************************/
- void T0_time() interrupt 1
- {
- // TR0 = 0;
- TH0 = (65535-100)/256;
- TL0 = (65535-100)%256;
- T0_NUM++;
- if(T0_NUM >= MotorTab[g_MotorNum]) // 增加按鍵g_MotorNum++ 減小按鍵g_MotorNum--
- {
- T0_NUM = 0;
- // PUL_R =PUL_R^0x01; // 輸出脈沖
- // PUL_L =PUL_L^0x01; // 輸出脈沖
- }
-
- }
- /******42步進電機運動函數(shù)*******************************
- DIR_R ^= 1; //=1后退
- DIR_R ^= 1;
- DIR_L ^= 0; //=0前進
- DIR_L ^= 0;
- 因為兩邊電機的安裝是一樣的,所以DIR的方向有所不同
- 可以根據(jù)該電機接線的方式改變電機的方向
- ***********************************************/
- void RUN(void) //前進
- {
- DIR_R ^= 0; //右前進
- DIR_L ^= 0; //左后退就是前進
- PUL_R =PUL_R^0x01; // 輸出脈沖
- PUL_L =PUL_L^0x01; // 輸出脈沖
-
- }
- void RIGHT(void)//右轉
- {
-
- DIR_L ^= 1; //右轉,就讓左邊的電機前進,右邊后退
- DIR_R ^= 0; //右前進
- PUL_R =PUL_R^0x01; // 輸出脈沖
- PUL_L =PUL_L^0x01; // 輸出脈沖
-
- }
- void LEFT(void) //左轉
- {
- DIR_L ^= 0; //左后退就是前進
- DIR_R ^= 1; //左轉,就讓右邊前進,左邊后退
- PUL_R =PUL_R^0x01; // 輸出脈沖
- PUL_L =PUL_L^0x01; // 輸出脈沖
- }
- void BACK(void) //后退
- {
-
- DIR_R ^= 1; //這里就和前進相反就可以了
- DIR_L ^= 1;
- PUL_R =PUL_R^0x01; // 輸出脈沖
- PUL_L =PUL_L^0x01; // 輸出脈沖
- }
- void STOP(void) //停止
- {
- EA=0; //讓所有中斷都關閉,
- PUL_R =PUL_R^0x00; // 輸出脈沖
- PUL_L =PUL_L^0x00; // 輸出脈沖
- }
- /********************按鍵控制*********************/
- //void anjian()
- //{
- //
- //}
- /********************尋跡傳感控制*********************/
- void hongwai(void)
- {
- //有信號為0 沒有信號為1
- //if(HY_R==1&&HY_Z==1&&HY_L==1)//都沒有信號就前進
- if(HY_R==1&&HY_Z==1&&HY_L==1)//都沒有信號就前進
- {
- EA=1;
- //lcd_init1(); //顯示RUN運行
- DIR_R ^= 0; //右前進
- DIR_L ^= 0; //左后退就是前進
- PUL_R =PUL_R^0x01; // 輸出脈沖
- PUL_L =PUL_L^0x01; // 輸出脈沖
- TR0 = 1;
- }
-
- else
- {
- //有信號為0 沒有信號為1
- if(HY_R==0&&HY_Z==1&&HY_L==1)//右邊有信號說明右障礙物,所以電機停止1S,然后后退1S,左電機后退,右電機轉動
- {
- // lcd_init2();
- DIR_L ^= 1; //右轉,就讓左邊的電機前進,右邊后退
- DIR_R ^= 0; //右前進
- PUL_R =PUL_R^0x01; // 輸出脈沖
- PUL_L =PUL_L^0x01; // 輸出脈沖
- }
- //有信號為0 沒有信號為1
- if(HY_R==1&&HY_Z==1&&HY_L==0)//左邊有信號說明左障礙物,所以電機停止1S,然后后退1S,右電機后退,左電機轉動
- {
-
- // lcd_init3();
- DIR_L ^= 0; //右轉,就讓左邊的電機前進,右邊后退
- DIR_R ^= 1; //右前進
- PUL_R =PUL_R^0x01; // 輸出脈沖
- PUL_L =PUL_L^0x01; // 輸出脈沖
-
- }
- //有信號為0 沒有信號為1
- if(HY_R==1&&HY_Z==0&&HY_L==1)//中間有信號就后退
- {
- // lcd_init4();
- DIR_R ^= 1; //這里就和前進相反就可以了
- DIR_L ^= 1;
- PUL_R =PUL_R^0x01; // 輸出脈沖
- PUL_L =PUL_L^0x01; // 輸出脈沖
-
- }
- //有信號為0 沒有信號為1
- if(HY_R==0&&HY_Z==0&&HY_L==0)//當然全部有信號就停止
- {
- //lcd_init5();
- EA=0;
- }
- }
- }
- /*************************尋跡傳感控制**********************/
- void xunji(void)
- {
- //有信號為0 沒有信號為1
- //if(HY_R==1&&HY_Z==1&&HY_L==1)//都沒有信號就前進
- if(XJ_R==1&&XJ_Z==1&&XJ_L==1)//都沒有信號就前進
- {
- EA=1;
- lcd_init1(); //顯示RUN運行
- delay(10); // 軟件延時消抖
- RUN();
- TR0 = 1;
- }
-
- else
- {
- //有信號為0 沒有信號為1
- if(XJ_R==0&&XJ_Z==1&&XJ_L==1)//右邊有信號說明右障礙物,所以電機停止1S,然后后退1S,左電機后退,右電機轉動
- {
- lcd_init2();
- delay(10); // 軟件延時消抖
- RIGHT();
-
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
42步進電機模塊化2LY.rar
(55.16 KB, 下載次數(shù): 22)
2019-8-1 16:43 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|