導航:首頁 > 操作系統 > 51單片機步進電機c程序

51單片機步進電機c程序

發布時間:2022-12-22 04:20:04

① 步進電機驅動程序C語言

步進電機控製程序(c語言+51單片機)

#include<reg51.h>

#define uint unsigned int
#define uchar unsigned char
#define ms *77
// f = 12 M
#define LEDLen 4
#define Dj_star() {IE=0x81; pri_dj=0; }
#define Dj_stop() {IE=0x00; pri_dj=1; P1=0xff; shache="0"; delay(800ms); delay(800ms);delay(400ms); shache = 1; }
#define Chilun_Num 8
/* 齒輪數 8 個*/
#define set_display_num() { LEDBuf[0] = tmp / 1000; LEDBuf[1] = tmp / 100 % 10; \
LEDBuf[2] = tmp / 10 % 10; LEDBuf[3] = tmp % 10; }
uchar LEDBuf[LEDLen] = {0,0,0,0};
void read_num (); /* 讀播碼盤 到 set_round_num * 8 */
void display ();
void delay(uint delay_time) { uint i; for (i=0; i < delay_time ; i++) ; }
void run ();
void fx_run();

uint round_num = 0; /* 記錄已轉的 齒輪數 , 中斷1次 加 1*/
uint set_round_num = 0; /* 播碼盤設置 圈數 */
uint set_pwm_width = 0; /* 播碼盤設置 步進電機 正向速度 */
bit one_round_flg = 0;
sbit led_1000 = P0^7; //use for display
sbit led_100 = P0^6; //use for display
sbit led_10 = P0^5; //use for display
sbit led_1 = P0^4; //use for display

sbit key_start = P3^0;
sbit key_puse = P3^0;
sbit key_clear = P3^1;
/* P3^2 接齒輪感測器 中斷 */
sbit bujin_zx_stop = P3^3; /* 接步進電機 ,正向到位感測器 ,為 0 停機 */
sbit bujin_fx_stop = P3^4; /* 接步進電機 ,反向到位感測器 ,為 0 停機 */

sbit shache = P3^5; /* 接剎車控制繼電器 0 電位有效 */
sbit pri_dj = P3^6; /* 接主電機控制繼電器 0 電位有效 */

void main(){
TCON = 0x01;
display();
while(1) {
IE="0x00";
round_num = 0;
display();
if ( bujin_fx_stop ) fx_run();
while ( key_start );
delay ( 8ms );
if(!key_start){
read_num();
//set_round_num = 8;
while ( !key_start );
run ();
fx_run();
}
}
}

void run () {
#define Delay_time 180
/* 轉一圈 50 次循環,每循環 4 步 ,50 * 4 = 200 , 200 * 1。8 = 360 */
uchar i ;
P1 = 0xff;
set_pwm_width = 15 + set_pwm_width / 10;
while ( 1 ) {

while( !shache | !key_start );
Dj_star();
for ( i="0" ; bujin_zx_stop & !pri_dj;i++ ){
P1 = 0xf9;
delay ( Delay_time ); // bujin_zx_stop = P3^3;
P1 = 0xfc; // bujin_fx_stop = P3^4;
delay ( Delay_time); // key_puse = P3^0;
P1 = 0xf6; // key_clear = P3^1;
delay ( Delay_time ); // shache = P3^5;
P1 = 0xf3; // pri_dj = P3^6;
delay ( Delay_time );
if( i == set_pwm_width ) { P1 = 0xff; i = 0; one_round_flg = 0; while ( !one_round_flg & key_puse );}
if(!key_puse) { delay(4ms); if(!key_puse) break; }
}

P1 = 0xff;
if ( pri_dj ) break;

if ( !key_puse ) {
delay ( 8ms );
if ( !key_puse ) {
Dj_stop();
while ( !key_puse );
// next pree key
while( !shache );

while(1){
while ( key_puse & key_clear );
delay ( 8ms );
if ( !key_clear ) { round_num = 0; display(); }
if ( !key_puse ) break;
}
while( !key_puse );
delay(8ms);
while( !key_puse );
}
}
}
}
void ext_int0(void) interrupt 0 { /* 主電機 齒輪 中斷 */
uint tmp;
EA = 0;
if( !pri_dj ){
round_num ++;
if (round_num % Chilun_Num == 0 ){
one_round_flg = 1;
tmp = round_num / Chilun_Num ;
set_display_num();
P0 = 0xf0;
P0 = P0 | LEDBuf[0] ;
led_1000 = 0;
P0 |= 0xf0;

P0 = 0xf0;
P0 = P0 | LEDBuf[1] ;
led_100 = 0;
P0 |= 0xf0;

P0 = 0xf0;
P0 = P0 | LEDBuf[2] ;
led_10 = 0;
P0 |= 0xf0;

P0 = 0xf0;
P0 = P0 | LEDBuf[3] ;
led_1 = 0;
P0 |= 0xf0;

P0 = 0xf0;
}
if ( round_num >= set_round_num ) Dj_stop();
}
EA = 0x81;
}

void display(){
uchar i;
uint tmp = 0;
tmp = round_num / Chilun_Num ;
set_display_num();
for(i = 0; i < LEDLen ; i ++){
P0 = 0xf0;
P0 = P0 | LEDBuf[i] ;
if(i==0) led_1000 = 0; //P0^4
if(i==1) led_100 = 0; //P0^5
if(i==2) led_10 = 0; //P0^6
if(i==3) led_1 = 0; //P0^7
P0 |= 0xf0;
}
P0 = 0xf0;
}

void read_num(){
/* 讀播碼盤 到 set_round_num ,set_pwm_width */
uchar tmp;
P2 = 0xFF;
P2 = 0xEF; // 1110 1111
delay ( 1ms );
tmp = ~(P2 | 0xF0);

P2 = 0xDF; // 1101 1111
delay ( 1ms );
tmp = (~(P2 | 0xF0 )) * 10 + tmp;
set_round_num = tmp;

P2 = 0xBF; // 1011 1111
delay ( 1ms );
tmp = (~(P2 | 0xF0));

P2 = 0x7F; // 0111 1111
delay ( 1ms );
tmp = (~(P2 | 0xF0)) * 10 + tmp;

set_round_num = set_round_num + tmp * 100;
set_round_num = set_round_num * Chilun_Num;

P2 = 0xFF;
P1 = 0xbF; // 0111 1111
delay ( 1ms );
tmp = ~(P2 | 0xF0) ;

P1 = 0xFF;
P2 = 0xFF;
P1 &= 0x7F; // 1011 1111
delay ( 1ms );
tmp = (~(P2 | 0xF0)) * 10 + tmp ;
set_pwm_width = tmp ;

P1 = 0xFF;
P2 = 0xFF;
}

void fx_run(){
#define f_Delay_time 180
while ( bujin_fx_stop ) { /* 反向 回車 直到 感測器 動作*/
P1 = 0xf3; //0011
delay ( f_Delay_time );
P1 = 0xf6; //0110
delay ( f_Delay_time );
P1 = 0xfc; //1100
delay ( f_Delay_time );
P1 = 0xf9; //1001
delay ( f_Delay_time );
}
P1 = 0xff;
}

② 求51單片機控制步進電機程序

;//****************************************************************
;//*文件名: StepM FOR 51MCU
;功能: 開關控制步進電機的正轉、反轉和停止。
;接線: 用導線對應連接步進電機模塊的SMA~SMD到CPU模塊的P10~P13,
; 八位邏輯電平輸出的K0~K2對應連接CPU模塊的P15~P17。
;//****************************************************************
;K0——停止
;K1——正轉
;K2——反轉
ORG 0000
LJMP START
ORG 0100H
START:
LOOP: MOV P1,#00H ; 步進電機停止
ORL P1,#0E0H
MOV A,P1
JNB ACC.5,STOP ; 停止
JNB ACC.6,FOR ; 正轉
JNB ACC.7,rev ; 反轉
JMP LOOP ;

FOR: MOV R0, #00H ; 正轉到tab取碼指針初值
for1: MOV A,R0 ; 取碼
MOV DPTR,#TABLE ;
MOVC A,@A+DPTR
JZ LOOP ; 是否到了結束碼00h
CPL A ;把acc反向
MOV P1,A ;輸出到p1開始正轉
CALL DELAY ;轉動的速度
INC R0 ;取下一個碼
JMP FOR1 ;繼續正轉

rev: MOV R0,#0AH ;反轉到tab取碼指針初值
rev1: MOV A,R0
MOV DPTR,#TABLE ;取碼
MOVC A,@A+DPTR
JZ LOOP ;是否到了結束碼00h
CPL A ;把acc反向
MOV P1,A ;輸出到p1開始反轉
CALL DELAY ;轉動的速度
INC R0 ;取下一個碼
JMP REV1 ;繼續反轉

stop:
MOV P1, #00H
JMP LOOP

DELAY: MOV R1,#150 ;步進電機的轉速20ms
D1: MOV R2,#248
DJNZ R2,$
DJNZ R1,D1
RET
TABLE:
db 01h,03h,02h,06h,04h,0ch,08h,09h ;正轉表
db 00 ;正轉結束
db 01h,09h,08h,0ch,04h,06h,02h,03h ;反轉
db 00 ;反轉結束
END

③ 請教51單片機C語言的步進電機延時程序

延時函數很常見:
Delay1mS(unsigned int tt) //延時1ms
{
unsigned char i;
while(tt--) for(i = 113; i > 0; i--);
}
反復多次調用即可。
但是,用軟體延時,觀察起來,就像死機一樣,經常會誤事的。

④ 51單片機步進電機正反轉程序

單片機控制步進電機,我想你說的是兩相步進電機,一般是控制其相序分配的順逆從而控制正反轉,一般而言,步進電機相序分配你可以做成一個數組比如step[]={0x03,0x06,0x0c,0x09},這樣來說可以假設P0口是步進電機控制口,那麼可以按如下方式來控制: while(1) { for(i=0;i<4;i++) { if(fx==1)P0=step[i]; //正向 else P0=step[3-i]; //反向 delay(x); //x大小決定電機速度。
根據電機相數買個驅動器。然後用單片機產生脈沖來控制電機的轉動以及正反轉。單片機產生脈沖的方法和單片機控制流水燈是一樣的。ULN2003D 是驅動步進電機的驅動晶元,主要是匹配電機所需的電流。 由於是四相電機,步進電機之所以可以轉動就需要給相繞組提供連續的脈沖,所以需要4個埠來控制四相繞組的工作狀態(P15應該是不需要的),具體的編碼要看電機的拍數; 一旦明白這些,你就可以很容易編寫代碼來控制電機的轉動了,還有在脈沖間你可以設置不同的延時時間來調節電機的轉速。

⑤ 一個51單片機同時控制2個步進電機的C語言程序

分類:C/C++
|
瀏覽2次
它們帶有啟動和急停功能(啟動和急停按鈕同時控制2個步機電機),2個步進電機分別具有加減速和數碼管顯示功能。其中1個有換向功能(碰到行程開關或光電開關換向)
您的回答被採納後將獲得系統獎勵20(財富值+經驗值)
+15分鍾內解答獎勵20(財富值+經驗值)[離結束還有14分41秒]

⑥ 求一份51單片機控制步進電機的綜合 C程序

/*-----------------------------------------------
名稱:步進電機
內容:本程序用於測試4相步進電機常規驅動
含正反轉
使用1相勵磁
------------------------------------------------*/
#include
<reg52.h>
sbit
A1=P1^0;
//定義步進電機連接埠
sbit
B1=P1^1;
sbit
C1=P1^2;
sbit
D1=P1^3;
#define
Coil_A1
{A1=1;B1=0;C1=0;D1=0;}//A相通電,其他相斷電
#define
Coil_B1
{A1=0;B1=1;C1=0;D1=0;}//B相通電,其他相斷電
#define
Coil_C1
{A1=0;B1=0;C1=1;D1=0;}//C相通電,其他相斷電
#define
Coil_D1
{A1=0;B1=0;C1=0;D1=1;}//D相通電,其他相斷電
#define
Coil_AB1
{A1=1;B1=1;C1=0;D1=0;}//AB相通電,其他相斷電
#define
Coil_BC1
{A1=0;B1=1;C1=1;D1=0;}//BC相通電,其他相斷電
#define
Coil_CD1
{A1=0;B1=0;C1=1;D1=1;}//CD相通電,其他相斷電
#define
Coil_DA1
{A1=1;B1=0;C1=0;D1=1;}//D相通電,其他相斷電
#define
Coil_OFF
{A1=0;B1=0;C1=0;D1=0;}//全部斷電
unsigned
char
Speed;
/*------------------------------------------------
uS延時函數,含有輸入參數
unsigned
char
t,無返回值
unsigned
char
是定義無符號字元變數,其值的范圍是
0~255
這里使用晶振12M,精確延時請使用匯編,大致延時
長度如下
T=tx2+5
uS
------------------------------------------------*/
void
DelayUs2x(unsigned
char
t)
{
while(--t);
}
/*------------------------------------------------
mS延時函數,含有輸入參數
unsigned
char
t,無返回值
unsigned
char
是定義無符號字元變數,其值的范圍是
0~255
這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
void
DelayMs(unsigned
char
t)
{
while(t--)
{
//大致延時1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
主函數
------------------------------------------------*/
main()
{
unsigned
int
i=512;//旋轉一周時間
Speed=8;
Coil_OFF
while(i--)
//正向
{
Coil_A1
//遇到Coil_A1
用{A1=1;B1=0;C1=0;D1=0;}代替
DelayMs(Speed);
//改變這個參數可以調整電機轉速
,
//數字越小,轉速越大,力矩越小
Coil_B1
DelayMs(Speed);
Coil_C1
DelayMs(Speed);
Coil_D1
DelayMs(Speed);
}
Coil_OFF
i=512;
while(i--)//反向
{
Coil_D1
//遇到Coil_A1
用{A1=1;B1=0;C1=0;D1=0;}代替
DelayMs(Speed);
//改變這個參數可以調整電機轉速
,
//數字越小,轉速越大,力矩越小
Coil_C1
DelayMs(Speed);
Coil_B1
DelayMs(Speed);
Coil_A1
DelayMs(Speed);
}
}

⑦ 關於51單片機控制步進電機編程(c語言),求助

#include<reg52.h>

#defineucharunsignedchar

#defineuintunsignedint

ucharkey_l,key,i;

ucharcodetemp1[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};

ucharcodetemp2[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};

ucharcodeaa[16]=":";

ucharcodesmg[]="";

sbite=P2^6;

sbitrs=P2^4;

sbitrw=P2^5;

voiddelay(inttt)

{

while(tt--);

}

voidw_cmd(uchardd)

{

rs=0;

rw=0;

e=0;

delay(50);

P0=dd;

e=1;

delay(50);

e=0;

delay(50);

}

voidw_dat(uchardd)

{

rs=1;

rw=0;

e=0;

delay(50);

P0=dd;

e=1;

delay(50);

e=0;

}

voidinit(ucharsmg4[],uchartime[])

{

w_cmd(0x38);

delay(2000);

w_cmd(0x38);

delay(500);

w_cmd(0x38);//注意順序,設置工作方式,顯示模式設置

delay(500);

w_cmd(0x08);//注意順序,關閉顯示

w_cmd(0x01);//清屏

w_cmd(0x07);//游標·畫面滾動模式設置

w_cmd(0x0c);//顯示及游標模式設置

w_cmd(0x80);//

for(i=0;i<16;i++)

w_dat(time[i]);

w_cmd(0x80+0X40);

for(i=0;i<16;i++)

w_dat(smg4[i]);

}

voidTb(ucharsmg[],ucharn,uchars,ucharl,uchard)

{

unsignedcharm;

w_cmd(0x82);

for(m=n;m<s;m++)

w_dat(smg[m]);

w_cmd(0x80+0X42);

for(m=l;m<d;m++)

w_dat(smg[m]);

}

voidmain()

{

init(aa,aa);

while(1)

{

P1=0xf0;

key_l=P1;

if(key_l!=0xf0)

{

delay(100);

if(key_l!=0xf0)

{

P1=key_l|0x0f;

key=P1;

}

}

switch(key)

{

case0xee:Tb(smg,0,10,11,21);

for(i=0;i<8;i++)

{

P2=temp1[i];

delay(500);

}

break;

case0xde:Tb(smg,0,10,19,29);

for(i=0;i<8;i++)

{

P2=temp1[i];

delay(300);

}

break;

case0xbe:Tb(smg,0,10,30,40);

for(i=0;i<8;i++)

{

P2=temp1[i];

delay(100);

}

break;

case0x7e:P2=0xff;Tb(smg,0,10,39,49);break;

case0xed:Tb(smg,50,60,11,21);

for(i=0;i<8;i++)

{

P2=temp2[i];

delay(200);

}

break;

case0xdd:Tb(smg,50,60,19,29);

for(i=0;i<8;i++)

{

P2=temp2[i];

delay(120);

}

break;

case0xbd:P2=0xff;Tb(smg,50,60,40,50);break;

}

}

}

⑧ 51單片機C語言程序按鍵控制步進電機轉速

sbit K1=P1^0;
sbit K2=P1^1;
char y=0;
while(1)
{
pangan();
for(i=0;i<4;i++) //4相
{
/*P1=F_Rotation[i]; //輸出對應的相 可以自行換成反轉表格
Delay(500); //改變這個參數可以調整電機轉速
Delay(5000);*/
P1=B_Rotation[i];
Delay(265+y);
P1=F_Rotation[i];
Delay(265+y);

}
}
void pangan()
{
if(K1==0)
{ y++; //加
while(~k1)
}
if(K2==0)
{ y--;
while(~k2); //減
}
}
}
沒有下上限 要是調的話 需要判斷顯示延時時間

⑨ 51單片機驅動帶有驅動器的步進電機C語言編程

#include<reg51.h>
#defineucharunsignedchar
sbitkey=P3^2;
sbitdir=P0^3;
sbitpluse=P0^2;
sbiten=P0^4;
voiddelay(inta)
{
while(a--);
}
main()
{
uchari;
en=0;
pluse=0;
while(1)
{
if(key==0)
{
delay(1000);
if(key==0);
{
while(key==0);
for(i=0;i<200;i++)
{
dir=0;
en=1;
pluse=~pluse;
delay(800);
}
}
}
dir=1;
en=0;
pluse=0;
}
}

閱讀全文

與51單片機步進電機c程序相關的資料

熱點內容
at89c51編程器 瀏覽:341
項目經理叫醒程序員 瀏覽:342
autocad旋轉命令 瀏覽:660
手機版wpsoffice怎麼打包文件夾 瀏覽:579
在成都學車用什麼app 瀏覽:818
grep命令管道 瀏覽:426
java修改重啟 瀏覽:567
單片機供電方案 瀏覽:770
airpodspro一代怎麼連接安卓 瀏覽:218
豌豆莢app上有什麼游戲 瀏覽:283
公路商店app標簽選什麼 瀏覽:339
linuxoracle命令行登錄 瀏覽:227
android深度休眠 瀏覽:173
php微信開發例子 瀏覽:846
醫得app登錄密碼是什麼 瀏覽:142
spring開發伺服器地址 瀏覽:413
伺服器上如何查看伺服器的埠 瀏覽:678
單片機伺服器編譯 瀏覽:770
單口usb列印機伺服器是什麼 瀏覽:859
戰地五開伺服器要什麼條件 瀏覽:956