本人剛學沒多久,求各位大佬幫忙看一下,看看有沒有錯誤,歡迎大家指正
步進電機驅動模塊為ULN2003,人體紅外傳感器為HC-SR501
單片機源程序如下(有注釋):
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- /*********************
- + ---- +4.5-20v //正極輸入電壓在+4.5v到20v之間
- out --- P10 //輸出接到P10端口
- - --- GND //負極接地
- IN1 ---- P00 //IN1接 P00端口 (電機驅動模塊)
- IN2 ---- P01 //IN2接 P01端口 (電機驅動模塊)
- IN3 ---- P02 //IN3接 P02端口 (電機驅動模塊)
- IN4 ---- P03 //IN4接 P03端口 (電機驅動模塊)
- + ---- +5V //正極接正5v
- - ---- GND //負極接地
- *********************/
- sbit out=P2^0 ; //對輸出out進行位定義,定義單片機I/O口 P1.0的偽名稱叫out
- sbit led1=P1^3;
- sbit led2=P1^7;
- #define MotorData P0 //對步進電機的控制接口進行定義
- #define time 500 //控制正反轉的角度'
-
- uchar phasecw[4] ={0x08,0x04,0x02,0x01};//正轉 電機導通相序 D-C-B-A
- uchar phaseccw[4]={0x01,0x02,0x04,0x08};//反轉 電機導通相序 A-B-C-D
- //ms 延時函數封裝
- void Delay_xms(uint x) //定義一個無符號整數 x (x是什么?) 帶參函數
- {
- uint i,j; //uint等價于unsigned int,無符號整數 ;定義兩個無符號整數 i和 j
- for(i=0;i<x;i++) //令 i的初始值為 0,當 i<x的時候,i=i+1
- for(j=0;j<112;j++); //令 j的初始值為 0,當 i<112的時候,j=j+1
- }
- //順時針轉動函數封裝
- void MotorCW(void) //void MotorCW(void) 不能輸入參數
- {
- uchar i; //定義一個無符號字符型 i
- for(i=0;i<4;i++) //令 i的初始值為 0,當 i<4的時候,執行{}內的程序段,然后進行 i=i+1再禁入循環
- {
- MotorData=phasecw[i]; //步進電機的控制接口輸出正轉且電機導通相序 D-C-B-A 的信號驅動步進電機工作
- Delay_xms(4); //延時函數,調節轉速 (意思是延時4毫秒嗎?)
- }
- }
- //逆時針轉動函數封裝
- void MotorCCW(void)
- {
- uchar i; //定義一個無符號字符型 i
- for(i=0;i<4;i++) //令 i的初始值為 0,當 i<4的時候,執行{}內的程序段,然后進行 i=i+1再禁入循環
- {
- MotorData=phaseccw[i]; //步進電機的控制接口輸出反轉且電機導通相序 A-B-C-D 的信號驅動步進電機工作
- Delay_xms(4); //延時函數,調節轉速(意思是延時4毫秒嗎?)
- }
- }
- //停止轉動函數封裝
- void MotorStop(void)
- {
- MotorData=0x00; //步進電機的控制接口輸出置 0信號 ,使步進電機停止工作
- }
- //程序主函數
- void main(void)
- {
- uint i; //定義一個無符號整型 i
- Delay_xms(50); //延時函數(意思是延時4s嗎?)(目的是啥?等系統穩定是嗎?)
- while(1) // 不斷循環
- {
- led1=1;
- led2=1;
- if(out == 1) //如果out等于1的話,那么執行{}內的程序
- {
- for(i=0;i<time;i++) //對于i=0,當i<time值時,執行順時針轉動函數,然后i=i+1后重新進入循環
- {
- led1=0;
- MotorCW(); //順時針轉動函數,驅動步進電機順時針轉動,直到i等于time值時結束循環
-
- }
- MotorStop(); //停止轉動函數,是步進電機停止轉動
-
- Delay_xms(1000); //延時函數,延時1000毫秒的意思是嗎?
-
- if(out == 0) //如果out等于0的話,那么執行{}內的程序
- {
- for(i=0;i<time;i++) //對于i=0,當i<time值時,執行逆時針轉動函數,然后i=i+1后重新進入循環
- {
- led2=0;
- MotorCCW(); //逆時針轉動函數,驅動步進電機逆時針轉動,直到i等于time值時結束循環
- }
- MotorStop(); //停止轉動函數,使步進電機停止轉動
- }
- }
- }
- }
復制代碼
|