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