欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
四步進電機,自動,手動控制,數碼管顯示速度 單片機四軸機器人程序
[打印本頁]
作者:
yangjiang1
時間:
2019-9-10 13:54
標題:
四步進電機,自動,手動控制,數碼管顯示速度 單片機四軸機器人程序
實物調試
程序
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P0^2;
sbit SDA=P0^3;
//xainshi
unsigned char z; //運行的電機
unsigned char x; //正反
unsigned char c; //數字加
uchar code FFW1[8]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90}; //四相八拍正轉編碼 前四
uchar code FFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //四相八拍正轉編碼 后四
uchar code REV1[8]={0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10}; ////四相八拍反轉編碼 前四
uchar code REV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; ////四相八拍反轉編碼 后死
sbit BEEP = P0^7; //蜂鳴器
sbit K1 = P0^4; //cwshi
sbit K111 = P1^0; //
sbit K112 = P1^1; //
sbit K121 = P1^2; //
sbit K122 = P1^3; //
sbit K131 = P1^4; //
sbit K132 = P1^5; //
sbit K141 = P1^6; //
sbit K142 = P1^7; //
sbit K166 = P0^5; //全套動作
unsigned char keyval; //定義變量儲存按鍵值
unsigned char jianzhi; //定義變量儲存按鍵值
unsigned char M1;
unsigned char i1;
unsigned char t,shi,ge,bai,dadt;
unsigned char code xsbcdbuf[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77};
/*************************************************************************
********************
LCD WRITE 模式 連續寫入數據
*************************************************************************/
/*********************************************************
*IIC_delay
*******************************************************/
void led_delay(void)
{
unsigned char j;
for(j=0;j<200;j++)
{}
}
void delay(uint t)
{
uint k;
while(t--)
{
for(k=0; k<130; k++)
{ }
}
}
//電機運轉延時函數
void delayB(uchar x) //x*0.14MS
{
uchar i;
while(x--)
{
for (i=0; i<13; i++)
{ }
}
}
//dengmingqi
void beep()
{
uchar i;
for (i=0;i<100;i++)
{
// delayB(4);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //關閉蜂鳴器
}
//一號主控電機
//正轉
void motor_ffw10()
{
uchar i;
// uint j;
// for (j=0; j<8; j++) //轉1*n圈
for (i=0; i<8; i++) //一個周期轉45度
{P2=FFW1[i]; //取數據
delay(1); //調節轉速
c=i;
// }
}
}
//反轉
void motor_rev11()
{
uchar i;
uint j;
x=0;
z=1;
// for (j=0; j<8; j++) //轉1×n圈
{
// if(K3==0)
// {break;} //退出此循環程序
for (i=0; i<8; i++) //一個周期轉45度
{
P2 = REV1[i]; //取數據
delay(1); //調節轉速
c=i;
}
}
}
//二號主控電機
//電機正轉動
void motor_ffw20()
{
uchar i;
uint j;
x=1;
z=2;
// for (j=0; j<8; j++) //轉1*n圈
{
// if(K3==0)
//{break;} //退出此循環程序
for (i=0; i<8; i++) //一個周期轉45度
{
P2 = FFW[i]; //取數據
delay(1); //調節轉速
c=i;
}
}
}
//反轉
void motor_rev21()
{
uchar i;
uint j;
x=0;
z=2;
// for (j=0; j<8; j++) //轉1×n圈
{
//if(K3==0)
// {break;} //退出此循環程序
c=8;
for (i=0; i<8; i++) //一個周期轉45度
{
P2 = REV[i]; //取數據
delay(1); //調節轉速
c=i;
}
}
}
//三號主控電機
//電機正轉動
void motor_ffw30()
{
uchar i;
uint j;
x=1;
z=3;
//for (j=0; j<8; j++) //轉1*n圈
for (i=0; i<8; i++) //一個周期轉45度
{
P3=FFW1[i]; //取數據
delay(1);
c=i; //調節轉速
}
}
//反轉
void motor_rev31()
{
uchar i;
uint j;
x=0;
z=3;
// for (j=0; j<8; j++) //轉1×n圈
// {
// if(K3==0)
// {break;}
//退出此循環程序
c=j;
for (i=0; i<8; i++) //一個周期轉45度
{
P3 = REV1[i]; //取數據
delay(1); //調節轉速
//調節轉速
}
// }
}
//四號主控電機
//電機正轉動
void motor_ffw40()
{
uchar i;
uint j;
x=1;
z=4;
// for (j=0; j<8; j++) //轉1*n圈
{
// if(K3==0)
// {break;}
//退出此循環程序
for (i=0; i<8; i++) //一個周期轉45度
{
P3 = FFW[i]; //取數據
c=i;
delay(2); //調節轉速
}
}
}
//反轉
void motor_rev41()
{
uchar i;
uint j;
x=0;
z=4;
// for (j=0; j<8; j++) //轉1×n圈
{
c=j;
for (i=0; i<8; i++) //一個周期轉45度
{
P3 = REV[i]; //取數據
delay(2); //調節轉速
}
}
}
//一號主控電機
//正轉
void motor_ffws10()
{
uchar i;
// uint j;
// for (j=0; j<8; j++) //轉1*n圈
for (i=0; i<8; i++) //一個周期轉45度
{P2=FFW1[i]; //取數據
delay(1); //調節轉速
c=i;
// }
}
}
//反轉
void motor_revs11()
{
uchar i;
uint j;
x=0;
z=1;
// for (j=0; j<8; j++) //轉1×n圈
{
// if(K3==0)
// {break;} //退出此循環程序
for (i=0; i<8; i++) //一個周期轉45度
{
P2 = REV1[i]; //取數據
delay(1); //調節轉速
c=i;
}
}
}
//二號主控電機
//電機正轉動
void motor_ffws20()
{
uchar i;
uint j;
x=1;
z=2;
// for (j=0; j<8; j++) //轉1*n圈
{
// if(K3==0)
//{break;} //退出此循環程序
for (i=0; i<8; i++) //一個周期轉45度
{
P2 = FFW[i]; //取數據
delay(1); //調節轉速
c=i;
}
}
}
//反轉
void motor_revs21()
{
uchar i;
uint j;
x=0;
z=2;
// for (j=0; j<8; j++) //轉1×n圈
{
//if(K3==0)
// {break;} //退出此循環程序
c=8;
for (i=0; i<8; i++) //一個周期轉45度
{
P2 = REV[i]; //取數據
delay(1); //調節轉速
c=i;
}
}
}
//三號主控電機
//電機正轉動
void motor_ffws30()
{
uchar i;
uint j;
x=1;
z=3;
//for (j=0; j<8; j++) //轉1*n圈
for (i=0; i<8; i++) //一個周期轉45度
{
P3=FFW1[i]; //取數據
delay(1);
c=i; //調節轉速
}
}
//反轉
void motor_revs31()
{
uchar i;
uint j;
x=0;
z=3;
// for (j=0; j<8; j++) //轉1×n圈
// {
// if(K3==0)
// {break;}
//退出此循環程序
c=j;
for (i=0; i<8; i++) //一個周期轉45度
{
P3 = REV1[i]; //取數據
delay(1); //調節轉速
//調節轉速
}
// }
}
//四號主控電機
//電機正轉動
void motor_ffws40()
{
uchar i;
uint j;
x=1;
z=4;
// for (j=0; j<8; j++) //轉1*n圈
{
// if(K3==0)
// {break;}
//退出此循環程序
for (i=0; i<8; i++) //一個周期轉45度
{
P3 = FFW[i]; //取數據
c=i;
delay(2); //調節轉速
}
}
}
//反轉
void motor_revs41()
{
uchar i;
uint j;
x=0;
z=4;
// for (j=0; j<8; j++) //轉1×n圈
{
c=j;
for (i=0; i<8; i++) //一個周期轉45度
{
P3 = REV[i]; //取數據
delay(2); //調節轉速
}
}
}
//一號主控電機
//正轉
void motor_ffwA10()
{
uchar i;
uint j;
x=1;
z=1;
for (j=0; j<50; j++) //轉1*n圈
{
for (i=0; i<8; i++) //一個周期轉45度
{
P2 = FFW1[i]; //取數據
delay(50); //調節轉速
c=i;
z=1;
}
}
}
//反轉
void motor_revA11()
{
uchar i;
uint j;
x=0;
z=1;
for (j=0; j<50; j++) //轉1×n圈
{
// if(K3==0)
// {break;} //退出此循環程序
for (i=0; i<8; i++) //一個周期轉45度
{
P2 = REV1[i]; //取數據
delay(50); //調節轉速
z=1;
c=i;
}
}
}
//二號主控電機
//電機正轉動
void motor_ffwA20()
{
uchar i;
uint j;
x=1;
z=2;
for (j=0; j<20; j++) //轉1*n圈
{
// if(K3==0)
//{break;} //退出此循環程序
for (i=0; i<8; i++) //一個周期轉45度
{
P2 = FFW[i]; //取數據
delay(50); //調節轉速
c=i;
z=2;
}
}
}
//反轉
void motor_revA21()
{
uchar i;
uint j;
x=0;
z=2;
for (j=0; j<20; j++) //轉1×n圈
{
//if(K3==0)
// {break;} //退出此循環程序
c=8;
for (i=0; i<8; i++) //一個周期轉45度
{
P2 = REV[i]; //取數據
delay(50); //調節轉速
c=i;
z=2;
}
}
}
//三號主控電機
//電機正轉動
void motor_ffwA30()
{
uchar i;
uint j;
x=1;
z=3;
for (j=0; j<50; j++) //轉1*n圈
{
for (i=0; i<8; i++) //一個周期轉45度
{
P3=FFW1[i]; //取數據
delay(1);
c=i; //調節轉速
z=3;
}
}
}
//反轉
void motor_revA31()
{
uchar i;
uint j;
x=0;
z=3;
for (j=0; j<50; j++) //轉1×n圈
{
// if(K3==0)
// {break;}
//退出此循環程序
c=j;
for (i=0; i<8; i++) //一個周期轉45度
{
P3 = REV1[i]; //取數據
delay(1); //調節轉速
//調節轉速
z=3;
}
}
}
//四號主控電機
//電機正轉動
void motor_ffwA40()
{
uchar i;
uint j;
x=1;
z=4;
for (j=0; j<30; j++) //轉1*n圈
{
// if(K3==0)
// {break;}
//退出此循環程序
for (i=0; i<8; i++) //一個周期轉45度
{
P3 = FFW[i]; //取數據
c=i;
delay(1); //調節轉速
z=4;
}
}
}
//反轉
void motor_revA41()
{
uchar i;
uint j;
x=0;
z=4;
for (j=0; j<30; j++) //轉1×n圈
{
c=j;
for (i=0; i<8; i++) //一個周期轉45度
{
P3 = REV[i]; //取數據
delay(2);
z=4;
}
}
}
void motor_ffw1A40()
{
uchar i;
uint j;
x=1;
z=4;
for (j=0; j<30; j++) //轉1*n圈
{
// if(K3==0)
// {break;}
//退出此循環程序
for (i=0; i<8; i++) //一個周期轉45度
{
P3 = FFW[i]; //取數據
c=i;
delay(1); //調節轉速
z=4;
}
}
}
//反轉
void motor_rev1A41()
{
uchar i;
uint j;
x=0;
z=4;
for (j=0; j<30; j++) //轉1×n圈
{
c=j;
for (i=0; i<8; i++) //一個周期轉45度
{
P3 = REV[i]; //取數據
delay(2);
z=4;
}
}
}
/*
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
TH0=0x00; //給定初值,這里使用定時器最大值從0開始計數一直到65535溢出
TL0=0x00;
EA=1; //總中斷打開
ET0=1; //定時器中斷打開
TR0=1; //定時器開關打開
}
*/
void init()
{
TMOD=0X01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
ET0=1;
EA=1;
TR0=1;
}
void IIC_delay(void)
{
unsigned char i;
for(i=0;i<20;i++) _nop_();
}
/*********************************************************
*
啟動IIC
*********************************************************/
void start_IIC(void)
{
SCL=1; //給芯片發送開始信號
SDA=1;
IIC_delay();
SDA=0;
IIC_delay();
SCL=0; //開始信號傳送完
IIC_delay();
}
/*******************************************************
*
停止IIC
*******************************************************/
void stop_IIC(void)
{
SCL=0;
IIC_delay();
SDA=0;
IIC_delay();
SCL=1;
IIC_delay();
SDA=1;
}
void ack_IIC()
{
SCL=0;
_nop_();_nop_();_nop_();
while(SDA);
SCL=1;
_nop_();_nop_();_nop_();
SCL=0;
}
/*******************************************************
*
寫一個字節數據
*******************************************************/
void WriteByte(unsigned char WriteData)
{
unsigned char i;
for(i=0;i<8;i++)//開始傳送8位數據,每循環一次傳送一位數據
{
SCL=0;
IIC_delay();
WriteData=WriteData>>1;
SDA=CY;
IIC_delay();
SCL=1;
IIC_delay();
}
//8位數據傳送完
ack_IIC(); //判斷芯片發過來的ACK應答信號
}
/*******************************************************
/************************************************
寫一字節數據到LEDSROM
**************************************************/
void write_LEDSROM(unsigned char addr,unsigned char WData)
{
start_IIC(); //調用開始信號
WriteByte(addr); //寫起始地址命令(0C0H),地址00H單元。
WriteByte(WData);//給顯示寄存器寫顯示數據,值可根據實參改變
stop_IIC(); //調用結束信號,一個字節命令發送完畢,可以發送下一個命令
}
/************************************************
/************************************************
*
分開寫數據到LED
**************************************************/
void xsled(void)
{
SDA=1;
SCL=1;
start_IIC(); //調用開始信號
WriteByte(0x44);//寫命令40H(數據設置)
stop_IIC(); //調用結束信號,一個字節命令發送完畢,可以發送下一個命令
write_LEDSROM(0xC0,0x00); //第一個數碼管
write_LEDSROM(0xC1,xsbcdbuf[bai]); //第二個數碼管
write_LEDSROM(0xC2,xsbcdbuf[shi]); //第三個數碼管
write_LEDSROM(0xC3,xsbcdbuf[ge]);//第四個數碼管
IIC_delay();
start_IIC(); //調用開始信號
WriteByte(0x8a); //送開屏命令,(8BH),亮度可以根據低三位調節。//顯示亮度
stop_IIC(); //調用結束信號,一個字節命令發送完畢,可以發送下一個命令
}
void jisuan()
{
bai=z ;
shi=x ;
ge=c;
//bai=dadt/100;
// shi=dadt/10%10;
// ge=dadt%10;
}
main()
{
P0=0xff;
M1=1;//chuzhi
// unsigned char z;
z=1;
//P1=0xff;
init();
while(1)
{
//motor_revA11();
//motor_revA10();
// jisuan();
// xsled();
jisuan();
xsled();
K166=0;
P2=0x00;
P3=0x00;
P1=0x00;
if(t==1000)
{
t=0;
}
//1號電機
if(K111==1)
{
// K1=1; //端口測試
// beep();
motor_ffw10(); //電機正轉
}
if(K112==1)
{
motor_rev11(); //電機反轉
}
//2號電機
if(K121==1)
{
motor_ffw20(); //電機正轉
}
if(K122==1)
{
motor_rev21(); //電機反轉
}
//3號電機
if(K131==1)
{
motor_ffw30(); //電機正轉
}
if(K132==1)
{
motor_rev31(); //電機反轉
}
//4號電機
if(K141==1)
{
motor_ffw40(); //電機正轉
}
if(K142==1)
{
motor_rev41(); //電機反轉
}
//quantao
if(K166==1)
{
uchar i;
for (i=0; i<1; i++)
{
K1=1;
{
// motor_ffwA20(); //電機正轉
motor_revA21();
jisuan();
xsled();
}
jisuan();
xsled();
delay(2000);
jisuan();
xsled();
//#############################################################shang
// if(100>t>1)
{
motor_ffwA10(); //電機正轉
jisuan();
xsled();
}
delay(2000);
jisuan();
xsled();
//######################################################################xaunzhuanzhenti
// if(30>t>25)
{
motor_ffwA30(); //電機正轉
jisuan();
xsled();
}
jisuan();
xsled();
delay(1000);
jisuan();
xsled();
//if(30>t>25)
{
motor_revA31(); //電機正轉
jisuan();
xsled();
}
delay(100);
jisuan();
xsled();
//#####################################################xuanzhaunshouwan
//下降之前展開機
//下降
//if(40>t>30)
{
jisuan();
xsled();
motor_revA41();
// motor_ffwA40(); //電機正轉
jisuan();
xsled();
}
delay(3000);
jisuan();
xsled();
// if(250>t>120) #############################################xaijiang
{
motor_ffwA20(); //電機正轉
// motor_revA21();
motor_ffwA20();
jisuan();
xsled();
}
jisuan();
xsled();
delay(2000);
jisuan();
xsled();
jisuan();
xsled();
//#####################################################jiajing
// if(40>t>30)
{
// motor_revA41(); //電機正轉
motor_ffwA40();
jisuan();
xsled();
M1=0;
}
jisuan();
xsled();
//#############################################################shang
// if(100>t>1)
{
jisuan();
xsled();
motor_revA21();
// motor_ffwA20(); //電機正轉
jisuan();
xsled();
}
delay(2000);
jisuan();
xsled();
jisuan();
xsled();
//if(20>t>13)#####################################################huizhuan
{
motor_revA11(); //電機正轉
jisuan();
xsled();
}
// delay(2000);
jisuan();
xsled();
//z =0;
// x
// if(30>t>25)
{
/// motor_ffwA30(); //電機正轉
}
jisuan();
xsled();
// delay(10000);
jisuan();
xsled();
//if(40>t>30)
{
// motor_ffwA40(); //電機正轉
}
// delay(1000);
jisuan();
xsled();
//if(20>t>13)
{
// motor_revA11(); //電機正轉
}
// delay(2000);
jisuan();
xsled();
//if(25>t>20)
{
// motor_revA21(); //電機正轉
}
// delay(2000);
jisuan();
xsled();
//if(30>t>25)
{
// motor_revA31(); //電機正轉
}
// delay(1000);
jisuan();
xsled();
// if(40>t>30)
{
// motor_revA41(); //電機正轉
M1=0;
}
jisuan();
xsled();
// delay(2000);
}
}
jisuan();
xsled();
c =0;
}
}
void T0_time() interrupt 1
{
TH0=(65535-80000)/256;
TL0=(65535-60000)%256;
// TH0 = 0x0FC;
// TL0 = 0xEC;
t++;
}
復制代碼
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1