音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

控制步進電機正反轉(zhuǎn)的實際應(yīng)用程序

作者:songcong1026 欄目:單片機

控制步進電機正反轉(zhuǎn)的實際應(yīng)用程序

/*這是一個控制步進電機正反轉(zhuǎn)的實際應(yīng)用程序*/
/*選用的是三相步進電機驅(qū)動器,p14口線用做步進電機的脈沖控制*/
/*p13口線用做步進電機的方向控制。p15,p16,p17是光耦開關(guān)量輸入*/
/*信號端,p20,p21,p22,p23與X25045.html">X25045看門狗存儲器相連*/
/*k7,k8鍵是設(shè)定步進電機轉(zhuǎn)動速度參數(shù)的加減鍵*/
/*k9是啟動運行鍵,按一下k9,步進電機開始運行,直到p17口線有信號輸入才停止*/
/*k10是停止鍵,任何時候按下k10都將停止步進電機當前的運行*/
/*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.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); /*十位數(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.html">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 口線上有信號輸入,則運行標志置0 (停止運行)*/
p13=1; /* 置步進電機正向運轉(zhuǎn) */
call time(200);
call dog;
do while ok=1; /* 當運行標志為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;

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
[分享]用AT89C51設(shè)計智能流量顯示儀
C51全局變量的問題
有沒有用過PROTEUS德,可否給小弟指點一下?
單片機的Proteus仿真教程
[求助]用AT89C51測電能的程序???
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號