『壹』 一個關於單片機控制步進電機的C語言程序 想請高人幫我把每一步都注釋出來
C語言程序源代碼
#include <REGX51.H> // 51寄存器定義
#include "intrins.h"
#define control P1 //P1_0:A相,P1_1:B相,P1_2:C相,P1_3:D相
#define discode P0 //顯示代碼控制埠
#define uchar unsigned char //定義無符號型變數
#define uint unsigned int
sbit en_dm=P3^0; //顯示代碼鎖存控制
sbit en_wk=P3^1; //位控鎖存控制
uchar code corotation[4]= {0x03,0x06,0x0c,0x09};//電機正轉
uchar code rollback[4]={0x0c,0x06,0x03,0x09}; //電機反轉
uchar code tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//顯示欄位
uint code Levspeed[5]={500,400,300,200,100};//電機速度等級
uchar Hscan,speedcount;//Hscan行掃描,speedcount 速度等級計數
uint uu; //頻率計數
uint step,setstep; //step:電機步伐計數,setstep:手動設置電機步伐
uint speed=500; //電機初始速度
uchar count;
uchar flag[5];
uchar butcount; //按鍵次數
//****************************************
//flag[0] 正轉標志
//flag[1] 反轉標志
//flag[2] 加速標志
//flag[3] 減速標志
//flag[4] 設置標志
//****************************************
Delay1mS(unsigned int tt) //延時1ms 「Delay1mS」延時子程序,用循環語句延時。
{
unsigned char i;
while(tt--)
for(i=113;i>0;i--);
}
keyscan() //鍵盤掃描 「keyscan」鍵盤掃描子程序,用於尋找是否有按鍵按下。
{
P2=0xf0; //把oxfe賦值給P2口 //將按鍵控制口置於未按鍵的狀態.單片機輸出//口假設不是按鍵按下狀態.
if(P2!=0xf0) //如果P2口的值不等於0xfe //檢查是否有按鍵按下.如果有,處理{}內的事
{ //有按鍵按下.
Delay1mS(150);//調用延時函數//有按鍵按下,避開無效讀碼值的時間.,或者是脈沖長度
Hscan=0xfe; //將Hscan賦值,初始遙控值是要置高電平的.
P2=Hscan; //
while((Hscan&0x10)!=0) //檢查X10口是否有鍵按下。未按下是1,
//在這顯示出你的按鍵口是P2_4.即檢查P2_4是高電平,無//鍵按下,低電平有鍵按下。
{
P2=Hscan;
if((P2&0xf0)!=0xf0) //檢查按鍵脈沖是否是變化,
return P2;
else Hscan=(Hscan<<1)|0x01; //這里在存碼值,應該是遙控輸入。將碼值存入Hscan
//這里是讀取碼值的關鍵,如果來的脈沖不管是高電平//還是低電平,靠左移一位保存脈沖的狀態值.
}
}
else return 0;
}
key_val() //按鍵處理函數 //這里是讀取將存好的碼值進行處理.看是什麼代碼值
{
uchar key;
key= keyscan(); //這里是讀取碼值並存放在key里
switch(key) //這里是對比讀取的碼值
{
case 0xee: //按鍵『7』 //讀取的碼值=0xEE,則是按鍵「7」的代碼
//while(P2==0xee);
setstep=setstep*10+7; //步伐數 //這里是輸入」setstep +7」 步伐數對比讀取的碼值, //setstep原來可能是有數字的。
step=setstep;
butcount++; //計數,看輸入拉幾個數字
if(butcount>=5) //輸入的數字超過5個就置0,無效
{
butcount=0;
setstep=0;
}
break;
case 0xde: //按鍵『8』 //讀取的碼值=0xdE,則是按鍵「8」的代碼
//其他同」7」
//while(P2==0xde);
setstep=setstep*10+8;
butcount++;
step=setstep;
if(butcount>=5)
{
butcount=0;
setstep=0;
}
break;
case 0xbe: //按鍵『9』 //同上」7」
//while(P2==0xbe);
setstep=setstep*10+9;
butcount++;
step=setstep;
if(butcount>=5)
{
butcount=0;
setstep=0;
}
break;
case 0x7e: //按鍵『正轉 //正轉按鍵識別
while(P2==0x7e); //等待按鍵松開//一值按住電機是不轉的,放開後才轉.有檢查//P2口的狀態值
flag[0]=0xff; //開啟正轉標志,關閉反轉//置正轉標志.
flag[1]=0x00; //清除反轉標志.
butcount=0;
speedcount=0;
speed=500; //置電機的轉速.
if(!flag[4]) step=0;
TR0=1;
break;
case 0xed: //按鍵『4』 //同上」7」
while(P2==0xed);
setstep=setstep*10+4;
butcount++;
step=setstep;
if(butcount>=5)
{
butcount=0;
setstep=0;
}
break;
case 0xdd: //按鍵『5』 //同上」7」
//while(P2==0xdd);
setstep=setstep*10+5;
step=setstep;
butcount++;
if(butcount>=5)
{
butcount=0;
setstep=0;
}
break;