2# 大道至简 2# 大道至简 软件吗?应该不会吧!
#include <c8051f410.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P0^4;
sbit key2=P0^5;
sbit key3=P0^6;
sbit key4=P0^7;
uchar code CCW[]={0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1,0xf9}; //逆时钟旋转相序表
uchar code CW[]={0xf9,0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8}; //正时钟旋转相序表
uchar num=4;
/********************延时********************************/
void delayms(uint z) //延时ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=10;y>0;y--);
}
void f410_init()
{
PCA0MD=0X00;
OSCICN=0XC0;//设置时钟振荡,为内部时钟,并且为16分频
XBR0=0X00;
XBR1=0X40;//交叉开关使能,弱上拉使能。
//XBARE=1;//使能交叉开关。
P0MDOUT=0xff;
P0MDIN=0XF0;
}
/*********************/
uchar keyscan()
{
if(key1==0)
{
delayms(2);
if(key1==0)
{
num=0; //正转45
}
while(!key1);
}
if(key2==0)
{
delayms(2);
if(key2==0)
{
num=1; //正转90
}
while(!key2);
}
if(key3==0)
{
delayms(2);
if(key3==0)
{
num=2; //反转45
}
while(!key3);
}
if(key4==0)
{
delayms(2);
if(key4==0)
{
num=3; //反转90
}
while(!key4);
}
return num;
}
/*********************/
void zheng()
{
uint b,a,i,j=100;
for(a=0;a<25;a++)
{
for(i=0;i<8;i++)
{
delayms(j);
P0=CCW;
if(b<8)
{
b++;
j=j-10;
}
else {j=10;b=10;}
}
}
}
/********************/
void zheng1()
{
uint b,a,i,j=100;
for(a=0;a<150;a++)
{
for(i=0;i<8;i++)
{
delayms(j);
P0=CCW;
if(b<8)
{
b++;
j=j-10;
}
else {j=10;b=10;}
}
}
}
/**********************/
void fan()
{
uint b,a,i,j=100;
for(a=0;a<50;a++)
{
for(i=0;i<8;i++)
{
delayms(j);
P0=CW;
if(b<8)
{
b++;
j=j-10;
}
else {b=10;j=10;}
}
}
}
/**********************/
void fan1()
{
uint b,a,i,j=100;
for(a=0;a<25;a++)
{
for(i=0;i<8;i++)
{
delayms(j);
P0=CW;
if(b<8)
{
b++;
j=j-10;
}
else {b=10;j=10;}
}
}
}
/**********************/
void ting()
{
P0=0Xf0;
}
/**********************/
void zhuansu(uchar c)
{
switch(c)
{
case 0:zheng();num=4;break;
case 1:zheng1();num=4;break;
case 2:fan();num=4;break;
case 3:fan1();num=4;break;
case 4:ting();break;
default:break;
}
}
/**********************/
void main()
{
f410_init();
while(1)
{
zhuansu(keyscan());
}
}
这个是我写的一个按键控制步进电机转过角度的程序,可是电机就只是来回的抖动,
软件的话我也用了“加减速”的方法。 |