|
控制步進電機正反轉(zhuǎn)的實際應(yīng)用程序 作者:佚名 /*這是一個控制步進電機正反轉(zhuǎn)的實際應(yīng)用程序*/ /*選用的是三相步進電機驅(qū)動器,p14口線用做步進電機的脈沖控制*/ /*p13口線用做步進電機的方向控制。p15,p16,p17是光耦開關(guān)量輸入*/ /*信號端,p20,p21,p22,p23與x25045看門狗存儲器相連*/ /*k7,k8鍵是設(shè)定步進電機轉(zhuǎn)動速度參數(shù)的加減鍵*/ /*k9是啟動運行鍵,按一下k9,步進電機開始運行,直到p17口線有信號輸入才停止*/ /*k10是停止鍵,任何時候按下k10都將停止步進電機當(dāng)前的運行*/ /*k11是步進運行鍵,按一下,步進電機動一下*/ /*k12鍵是反向運行鍵,按一下,步進電機開始反向運行,知道p15口線有信號才停止*/ /*如果p16口線有信號輸入,則只有k12鍵才起作用,其它鍵都沒反應(yīng)。*/ 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 */ 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); /*十位數(shù)BCD碼譯成段碼*/ sbuf=n; /*十位數(shù)送164顯示*/ do while ti=0; /*等待發(fā)送結(jié)束*/ call dog; /*看門狗定時器復(fù)位*/ end; n=L0; n=aco(n); sbuf=n; /*個位數(shù)送164顯示*/ do while ti=0; call dog; end; end display; outbyt: procedure(da); /*向看門狗存儲器寫入一字節(jié)*/ declare (i,da) byte; j=da; /*將要寫入的字節(jié)賦給臨時變量J */ do i=0 to 7; /*左移8位,送到口線si */ sck=0; j=scl(j,1); si=cy; sck=1; /*每移一位數(shù)據(jù),跟一個時鐘信號*/ end; end outbyt; inbyt: procedure; /* 從看門狗存儲器讀出一字節(jié) */ declare (i,di) byte; j=0; do i=0 to 7; sck=1; sck=0; cy=so; j=scl(j,1); /*從看門狗存儲器讀出一字節(jié)送入臨時變量j*/ end; dat=j; end inbyt; wrenable: procedure; /* 置看門狗寫使能*/ sck=0; cs=0; ; /* write enable command */ call outbyt(06h); /* x25045 寫使能指令06h */ cs=1; sck=0; end wrenable; wrdisable: procedure; /* 置看門狗寫禁止 */ sck=0; cs=0; ; /* write disable command */ call outbyt(04h); sck=0; cs=1; end wrdisable; wrregister: procedure; /* 寫狀態(tài)寄存器 */ sck=0; cs=0; dat=01h; /* write register command */ call outbyt(dat); ; /* 00h--1.4S, 20h--200MS, 10h--600MS, 30h--disable Wdog */ call outbyt(00h); /* 設(shè)定看門狗定時時間 */ ; sck=0; cs=1; call time(200); /* wait to complete writting cycle */ end wrregister; rdregister:procedure; /* 讀看門狗狀態(tài)寄存器 */ sck=0; cs=0; ; /* register read command */ call outbyt(05h); call inbyt; /* status register read in <DAT> */ sck=0; cs=1; end rdregister; wbyte:procedure; /* 看門狗存儲器字節(jié)寫入子程序 */ declare comm byte; sck=0; cs=0; comm=02h; /* 寫指令 02h */ call outbyt(comm); call outbyt(addrl); call outbyt(dat); /* send one byte data to X25043 */ cs=1; sck=0; call time(150); end wbyte; rbyte:procedure; /*看門狗存儲器字節(jié)讀出子程序 */ declare comm byte; sck=0; cs=0; comm=03h; /* read command */ call outbyt(comm); call outbyt(addrl); call inbyt; /* read one byte to <DAT> */ sck=0; cs=1; end rbyte; incdata: procedure; /* 參數(shù)修改--"加"鍵處理子程序+ */ if p10=0 then /* 如果K7鍵按下*/ do; do while p10=0; /* 等待鍵松開有效 */ call dog; /* 此處必需調(diào)用看門狗復(fù)位子程序("喂狗"),否則程序?qū)⒈豢撮T狗復(fù)位*/ end; data=data+1; /* 設(shè)定值+1 */ if data>99 then data=1; /* 規(guī)定設(shè)定值的上限*/ L(1)=data MOD 10; /*將設(shè)定值的十位數(shù)拆出來送給十位數(shù)顯示變量L(1) */ L(2)=data/10; /*將設(shè)定值的個位數(shù)拆出來送給個位數(shù)顯示變量L(2) */ call display(L(1),L(2)); /* 將改變后的設(shè)定值送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; /* 參數(shù)修改---"減"鍵處理子程序- */ IF p11=0 THEN /* k8 鍵處理子程序 */ do; do while p11=0; call dog; end; DATA=DATA-1; /* 設(shè)定值-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 口線上有信號輸入,則運行標(biāo)志置0 (停止運行)*/ p13=1; /* 置步進電機正向運轉(zhuǎn) */ call time(200); call dog; do while ok=1; /* 當(dāng)運行標(biāo)志為1時,執(zhí)行速度延時操作 */ do sd= 0 to data; /* 根據(jù)設(shè)定值 data的數(shù)值延時來確定步進電機運行時的脈沖給定速度*/ call dog; end; end; END starton; step: PROCEDURE; /* step */ declare sd byte; p13=1; /* 置步進電機正向運轉(zhuǎn) */ 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; /* 調(diào)用延時,調(diào)整步進電機的運行速度 */ 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; /*根據(jù)設(shè)定值調(diào)節(jié)步進電機的運行速度 */ 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; /* 關(guān)中斷 */ SCON=00h; /*置串口方式0 ,串行數(shù)據(jù)輸出模式*/ PCON=00h; tmod=11h; et0=1; enable; /* 開中斷 (ea=1) */ SCK=0;cs=1; /* 定義存儲器口線初始狀態(tài) */ call wrenable; call wrregister; /* 看門狗存儲器 初始化 */ call wrenable; call dog; p2=0ffh; /* 初始化各個口線的狀態(tài) */ p1=0ffh;ok=0; p14=1;p32=1;p33=1;p34=1; p13=1; ADDRL=00h; /* 上電復(fù)位后從存儲器中讀出設(shè)定的速度值 */ CALL rbyte; l(1)=dat; addrl=01h; call rbyte; l(2)=dat; DATA=L(1)+L(2)*10; /*將讀出的值合并成十進制,存入變量data中 */ /* 以下是主循環(huán)程序 */ 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)); /* 將設(shè)定值送164顯示 */ call dog; CALL TIME(100); call dog; GOTO LOOP; END START; |