欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
51單片機驅動步進電機程序 可調圈數 默認啟動一次轉100圈
[打印本頁]
作者:
xymiss
時間:
2017-7-16 22:09
標題:
51單片機驅動步進電機程序 可調圈數 默認啟動一次轉100圈
我也是剛學。用的資料改的。我自己用來繞線做特斯拉線圈使用。默認啟動一次轉100圈。需要可以自己調。
單片機源程序如下:
//download by http://down.liehuo.net
#include <reg51.h> //51芯片管腳定義頭文件
#include <intrins.h> //內部包含延時函數 _nop_();
#define uchar unsigned char
#define uint unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};
sbit K1 = P3^2; //運行與停止
sbit K2 = P3^3; //設定圈數
sbit K3 = P3^4; //方向轉換
sbit K4 = P3^5; //速率調整
sbit BEEP = P3^6; //蜂鳴器
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
bit on_off=0; //運行與停止標志
bit direction=1; //方向標志
bit rate_dr=1; //速率標志
bit snum_dr=1; //圈數標志
uchar code cdis1[ ] = {" STEPPING MOTOR "};
uchar code cdis2[ ] = {"CONTROL PROCESS"};
uchar code cdis3[ ] = {" STOP "};
uchar code cdis4[ ] = {"NUM: RATE: "};
uchar code cdis5[ ] = {" RUNNING "};
uchar m,v=0,q=0;
uint number=0,number1=0;
uchar snum=100,snum1=100; //預設定圈數
uchar rate=2; //預設定速率
uchar data_temp,data_temP1,data_temp2;
/********************************************************/
/*
/* 延時t毫秒
/* 11.0592MHz時鐘,延時約1ms
/*
/********************************************************/
void delay(uint t)
{
uchar k;
while(t--)
{
for(k=0; k<80; k++)
{ }
}
}
/********************************************************/
void delayB(uchar x) //x*0.14MS
{
uchar i;
while(x--)
{
for (i=0; i<13; i++)
{ }
}
}
/********************************************************/
void beep()
{
uchar j;
for (j=0;j<100;j++)
{
delayB(4);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //關閉蜂鳴器
delay(170);
}
/********************************************************/
/*
/*檢查LCD忙狀態
/*lcd_busy為1時,忙,等待。為0時,閑,可寫指令與數據。
/*
/********************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/********************************************************/
/*
/*寫指令數據到LCD
/*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。
/*
/********************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/********************************************************/
/*
/*寫顯示數據到LCD
/*RS=H,RW=L,E=高脈沖,D0-D7=數據。
/*
/********************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/********************************************************/
/*
/* LCD初始化設定
/*
/********************************************************/
void lcd_init()
{
delay(30);
lcd_wcmd(0x38); //16*2顯示,5*7點陣,8位數據
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x0c); //顯示開,關光標
delay(5);
lcd_wcmd(0x06); //移動光標
delay(5);
lcd_wcmd(0x01); //清除LCD的顯示內容
delay(5);
}
/********************************************************/
/*
/* 設定顯示位置
/*
/********************************************************/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80); //數據指針=80+地址變量
}
/********************************************************/
/*
/* LCD1602初始顯示子程序
/*
/********************************************************/
void LCD_init_DIS()
{
delay(10); //延時
lcd_init(); //初始化LCD
lcd_pos(0); //設置顯示位置為第一行的第1個字符
m = 0;
while(cdis1[m] != '\0')
{ //顯示字符
lcd_wdat(cdis1[m]);
m++;
}
lcd_pos(0x40); //設置顯示位置為第二行第1個字符
m = 0;
while(cdis2[m] != '\0')
{
lcd_wdat(cdis2[m]); //顯示字符
m++;
}
delay(3000); //延時
lcd_pos(0); //設置顯示位置為第一行的第1個字符
m = 0;
while(cdis3[m] != '\0')
{ //顯示字符
lcd_wdat(cdis3[m]);
m++;
}
lcd_pos(0x40); //設置顯示位置為第二行第1個字符
m = 0;
while(cdis4[m] != '\0')
{
lcd_wdat(cdis4[m]); //顯示字符
m++;
}
for(m=0;m<2;m++)
{
lcd_pos(0x0c+m); //顯示方向符號
lcd_wdat(0x3e);
}
}
/********************************************************/
/*
/*數據轉換子程序
/*
/********************************************************/
void data_conv()
{
data_temP1=data_temp/10; //高位
if(data_temP1==0)
{data_temP1=0x20;} //高位為0不顯示
else
{data_temP1=data_temP1+0x30;}
data_temp2=data_temp%10; //低位
data_temp2=data_temp2+0x30;
}
/********************************************************/
/*
/*數據顯示子程序
/*
/********************************************************/
void data_dis()
{
data_temp = snum; //顯示圈數
data_conv();
lcd_pos(0x44);
lcd_wdat(data_temP1);
lcd_pos(0x45);
lcd_wdat(data_temp2);
data_temp = rate; //顯示速率
data_conv();
lcd_pos(0x4d);
lcd_wdat(data_temP1);
lcd_pos(0x4e);
lcd_wdat(data_temp2);
}
/********************************************************
/*
/* 顯示運行方向符號
/*
/********************************************************/
void motor_DR()
{
if(direction==1) //正轉方向標志
{ for(m=0;m<2;m++)
{
lcd_pos(0x0c+m); //顯示方向符號
lcd_wdat(0x3e);
}
}
else
{ for(m=0;m<2;m++) //反轉方向標志
{
lcd_pos(0x0c+m); //顯示方向符號
lcd_wdat(0x3c);
}
}
}
/********************************************************
/*
/* 顯示運行狀態
/*
/********************************************************/
void motor_RUN()
{
if(on_off==1)
{ TR0=1;
lcd_pos(0); //設置顯示位置為第一行的第1個字符
m = 0;
while(cdis5[m] != '\0')
{ lcd_wdat(cdis5[m]); //RUNNING
m++; }
motor_DR(); //
}
else
{ TR0=0; P1 =0x0f;
lcd_pos(0); //設置顯示位置為第一行的第1個字符
m = 0;
while(cdis3[m] != '\0')
{ lcd_wdat(cdis3[m]); //STOP
m++; }
motor_DR(); //
snum=snum1; //
number1=0; //清圈數計數器
}
}
/********************************************************
*
* 主程序
*
*********************************************************/
main()
{
LCD_init_DIS();
TMOD = 0x01; //T0定時方式1
TL0 = 0x33;
TH0 = 0xf5;
EA = 1;
ET0 = 1;
P1 = 0x0f;
while(1)
{
if(K1==0)
{
beep();
while(K1==0); //等待鍵釋放
on_off=~on_off;
motor_RUN();
} //K1 end
/********************************************************/
if(K2==0)
{
beep();
if(snum_dr==1)
{ snum++;
snum1=snum;
if(snum==0x14)
{ snum_dr=~snum_dr;}
}
else
{snum--;
snum1=snum;
if(snum==0x01)
{ snum_dr=~snum_dr; }
}
} //K2 end
/********************************************************/
if(K3==0)
{
beep();
direction=~direction;
motor_DR();
}//K3 end
/********************************************************/
if(K4==0)
{
beep();
if(rate_dr==1)
{ rate++;
if(rate==0x10)
{ rate_dr=~rate_dr;}
}
else
{
rate--;
if(rate==0x01)
{ rate_dr=~rate_dr; }
}
} //K4 end
/********************************************************/
if(number1==snum1) //與設定圈數是否相等
{ number1=0;
on_off=0;
TR0=0;
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
步進電機 默認100圈.zip
(36.36 KB, 下載次數: 61)
2017-7-16 22:08 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
asusyt
時間:
2017-7-17 08:22
你好,有沒有電路圖?
作者:
longlife999
時間:
2020-1-16 10:10
學習了
作者:
毛毛的小可愛
時間:
2020-1-31 22:05
有沒有原理圖
作者:
1366093096
時間:
2020-3-29 23:35
我在CSDN也看過相同的代碼。達到預設圈數不能正常停止
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1