1樓:tina淺絮
/*這是一個控制步進電機正反轉的實際應用程式*/
/*選用的是三相步進電機驅動器,p14口線用做步進電機的脈衝控制*/
/*p13口線用做步進電機的方向控制。p15,p16,p17是光耦開關量輸入*/
/*訊號端,p20,p21,p22,p23與x25045.html">x25045看門狗儲存器相連*/
/*k7,k8鍵是設定步進電機轉動速度引數的加減鍵*/
/*k9是啟動執行鍵,按一下k9,步進電機開始執行,直到p17口線有訊號輸入才停止*/
/*k10是停止鍵,任何時候按下k10都將停止步進電機當前的執行*/
/*k11是步進執行鍵,按一下,步進電機動一下*/
/*k12鍵是反向執行鍵,按一下,步進電機開始反向執行,知道p15口線有訊號才停止*/
/*如果p16口線有訊號輸入,則只有k12鍵才起作用,其它鍵都沒反應。*/
start:do;
$include(reg51.dcl)
declare (addrl,n,i,j,ok,ds) byte; /*定義變數*/
declare l(5) byte;
declare (dat,data) byte at (30h);
declare delay word;
declare aco(11) byte constant (05h,9fh,23h,0bh,99h,49h,/*定義led段碼錶*/
41h,1fh,01h,09h,00h);
declare si literally ''p21'',sck literally ''p20''; /*x25045囗線定義*/
declare so literally ''p22'',cs literally ''p23'';
dog:procedure; /* 初始化看門狗x25045.html">x25045 */
cs=1;
call time(1);
cs=0;
call time(1);
cs=1;
end dog;
run:procedure; /*步進電機執行脈衝輸出程式*/
if ok=1 then
call dog;
do;p14=0;
call time(1);
p14=1;
call time(1);
end;
end run;
display:procedure(l0,l10); /*顯示子程式*/
declare (l0,l10) byte; /*定義顯示二位*/
n=l10;
n=aco(n); /*十位數bcd碼譯成段碼*/
sbuf=n; /*十位數送164顯示*/
do while ti=0; /*等待傳送結束*/
call dog; /*看門狗定時器復位*/
end;
n=l0;
n=aco(n);
sbuf=n; /*個位數送164顯示*/
do while ti=0;
call dog;
end;
end display;
outbyt: procedure(da); /*向看門狗儲存器寫入一位元組*/
declare (i,da) byte;
j=da; /*將要寫入的位元組賦給臨時變數j */
do i=0 to 7; /*左移8位,送到口線si */
sck=0;
j=scl(j,1);
si=cy;
sck=1; /*每移一位資料,跟一個時鐘訊號*/
end;
end outbyt;
inbyt: procedure; /* 從看門狗儲存器讀出一位元組 */
declare (i,di) byte;
j=0;
do i=0 to 7;
sck=1;
sck=0;
cy=so;
j=scl(j,1); /*從看門狗儲存器讀出一位元組送入臨時變數j*/
end;
dat=j;
end inbyt;
wrenable: procedure; /* 置看門狗寫使能*/
sck=0;
cs=0;
; /* write enable ***mand */
>x25045 寫使能指令06h */
cs=1;
sck=0;
end wrenable;
wrdisable: procedure; /* 置看門狗寫禁止 */
sck=0;
cs=0;
; /* write disable ***mand */
call outbyt(04h);
sck=0;
cs=1;
end wrdisable;
wrregister: procedure; /* 寫狀態暫存器 */
sck=0;
cs=0;
dat=01h; /* write register ***mand */
call outbyt(dat);
; /* 00h——1.4s, 20h——200ms, 10h——600ms, 30h——disable wdog */
call outbyt(00h); /* 設定看門狗定時時間 */
;sck=0;
cs=1;
call time(200); /* wait to ***plete writting cycle */
end wrregister;
rdregister:procedure; /* 讀看門狗狀態暫存器 */
sck=0;
cs=0;
; /* register read ***mand */
call outbyt(05h);
call inbyt; /* status register read in */
sck=0;
cs=1;
end rdregister;
wbyte:procedure; /* 看門狗儲存器位元組寫入子程式 */
declare ***m byte;
sck=0;
cs=0;
***m=02h; /* 寫指令 02h */
call outbyt(***m);
call outbyt(addrl);
call outbyt(dat); /* send one byte data to x25043 */
cs=1;
sck=0;
call time(150);
end wbyte;
rbyte:procedure; /*看門狗儲存器位元組讀出子程式 */
declare ***m byte;
sck=0;
cs=0;
***m=03h; /* read ***mand */
call outbyt(***m);
call outbyt(addrl);
call inbyt; /* read one byte to */
sck=0;
cs=1;
end rbyte;
incdata: procedure; /* 引數修改——"加"鍵處理子程式 */
if p10=0 then /* 如果k7鍵按下*/
do;do while p10=0; /* 等待鍵鬆開有效 */
call dog; /* 此處必需呼叫看門狗復位子程式("喂狗"),否則程式將被看門狗復位*/
end;
data=data 1; /* 設定值 1 */
if data>99 then data=1; /* 規定設定值的上限*/
l(1)=data mod 10; /*將設定值的十位數拆出來送給十位數顯示變數l(1) */
l(2)=data/10; /*將設定值的個位數拆出來送給個位數顯示變數l(2) */
call display(l(1),l(2)); /* 將改變後的設定值送164顯示出來*/
call time(200); /* 延時 */
call dog;
call time(200);
call dog;
call wrenable; /* 置儲存器寫使能 */
addrl=00h; /* 置儲存器地址 */
dat=l(1);
call wbyte; /* 將變數l(1)的值寫入儲存器00h位置 */
call wrenable;
addrl=01h;
dat=l(2);
call wbyte; /* 將變數l(2)的值寫入儲存器01h位置 */
end;
end incdata;
decdata: procedure; /* 引數修改——-"減"鍵處理子程式- */
if p11=0 then /* k8 鍵處理子程式 */
do;do while p11=0;
call dog;
end;
data=data-1; /* 設定值-1 */
if data=0 then data=99;
l(1)=data mod 10;
l(2)=data/10;
call display(l(1),l(2));
call dog;
call time(200);
call dog;
call time(200);
call dog;
call wrenable;
addrl=00h;
dat=l(1);
call wbyte;
call wrenable;
addrl=01h;
dat=l(2);
call wbyte;
end;
end decdata;
starton: procedure; /* start */
declare sd byte;
if p12=0 then /* k9鍵處理子程式 */
do;do while p12=0;
call dog;
end;
if p17=0 then ok=0; /* 如果p17 口線上有訊號輸入,則執行標誌置0 (停止執行)*/
p13=1; /* 置步進電機正向運轉 */
call time(200);
call dog;
do while ok=1; /* 當執行標誌為1時,執行速度延時操作 */
do sd= 0 to data; /* 根據設定值 data的數值延時來確定步進電機執行時的脈衝給定速度*/
call dog;
end;
end;
end starton;
step: procedure; /* step */
declare sd byte;
p13=1; /* 置步進電機正向運轉 */
call time(200);
call dog;
if p33=0 then /* k11鍵處理子程式 */
do;if p17=0 then ok=0; /* 如果p17上有訊號輸入,則停止執行*/
do while p33=0;
do sd= 0 to data; /* 呼叫延時,調整步進電機的執行速度 */
call dog;
call time(2);
end;
call run;
call dog;
end;
end;
ok=0;
end step;
back: procedure; /* 反向執行處理子程式 */
declare sd byte;
if p34=0 then
do;do while p34=0;
call dog;
end;
if p15=0 then ok=0; /* 反向執行時,如果遇到p15上有訊號輸入,則停止步進電機執行 */
p13=0; /* 置步進電機反向執行 */
call time(200);
call dog;
do while ok=1;
do sd=0 to data; /*根據設定值調節步進電機的執行速度 */
call dog;
call time(2);
end;
call run;
if (p15=0 or p32=0 ) then ok=0; /* p15 或 p32 口線任意一個有訊號輸入,停止執行 */
end;
end;
end back;
main$program: /* 初始化主程式 */
ea=0; /* 關中斷 */
scon=00h; /*置串列埠方式0 ,序列資料輸出模式*/
pcon=00h;
tmod=11h;
et0=1;
enable; /* 開中斷 (ea=1) */
sck=0;cs=1; /* 定義儲存器口線初始狀態 */
call wrenable;
call wrregister; /* 看門狗儲存器 初始化 */
call wrenable;
call dog;
p2=0ffh; /* 初始化各個口線的狀態 */
p1=0ffh;ok=0;
p14=1;p32=1;p33=1;p34=1;
p13=1;
addrl=00h; /* 上電覆位後從儲存器中讀出設定的速度值 */
call rbyte;
l(1)=dat;
addrl=01h;
call rbyte;
l(2)=dat;
data=l(1) l(2)*10; /*將讀出的值合併成十進位制,存入變數data中 */
/* 以下是主迴圈程式 */
loop:
if p10=0 then call incdata; /* 檢測各個按鍵是否有按下 */
if p11=0 then call decdata;
if p12=0 then
do;ok=1;
call starton;
end;
if p34=0 then
do;ok=1;
call back;
end;
if p33=0 then
do;ok=1;
call step;
end;
call dog;
call display(l(1),l(2)); /* 將設定值送164顯示 */
call dog;
call time(100);
call dog;
goto loop;
end start;
步進電機怎麼改成普通的電機?只需要正反轉控制就可以了,不要用驅動器
步進電機當普通電機用是可行的,電機本身不需要改動。但必須配上脈衝發生器和驅動器。也有兩者一體的賣。可以 搜尋 步進電機脈衝發生器 來回切換對ab相的供電,切換的速度直接決定馬達速度,還不如直接做一個驅動來的實際呢 有的可以改,你圖沒有,但驅動必須要的。你要多少轉速 要求不高而且你有空的話可以手動給它...
步進電機驅動器可以控制閉環步進電機嗎
步進電機是將 copy電脈衝訊號轉變bai為角位移或線位du移的開環控制元件。在非超載的情zhi況下,電機的轉速dao 停止的位置只取決於脈衝訊號的頻率和脈衝數,而不受負載變化的影響,即給電機加一個脈衝訊號,電機則轉過一個步距角。這一線性關係的存在,加上步進電機只有週期性的誤差而無累積誤差等特點。使...
怎樣用驅動器控制步進電機正反轉接線圖
首先步進電機驅copy動器是不能bai控制步進電機正反轉,但一般傳送的du 是模擬量訊號,控zhi制步進電機正反轉的主要是dao控制器的高低電平。伺服驅動器又稱為 伺服控制器 伺服放大器 是用來控制伺服電機的一種控制器,其作用類似於變頻器作用於普通交流馬達,屬於伺服系統的一部分,主要應用於高精度的定...