⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xiugai.c

📁 基于stc 8052单片机 的步进电机的控制 包扩加速 减速 显示
💻 C
字号:

/*****************************************************************************************************************
2009年3月5日14:58:54
下面的程序已经实现了步进电机的基本控制很好。现在要实现附加的功能
*****************************************************************************************************************/
#include <AT89X51.h> 
#define uint unsigned int;
#define uchar unsigned char
//以下定义LED片选信号
sbit LED_1 = P3^0; 
//定义输入按键的序号
sbit K_1 = P1^0;
sbit K_2 = P1^1;
sbit K_3 = P1^2;
sbit K_4 = P1^3;
sbit K_5 = P1^4;
sbit K_6 = P1^5;
//以下定义共阴极LED的显示代码,0~9
uchar code tab[10] = 
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//以下定义M1驱动信号
sbit M1_1  = P2^0;
sbit M1_2  = P2^1;
sbit M1_3  = P2^2;
sbit M1_4  = P2^3;

static unsigned int count; //计数 
static int step_index; //步进索引数,值为0-7 即是到该转哪一步了 
static bit turn; //步进电机转动方向 turn=1 反向  turn=0 正向
static bit stop_flag; //步进电机停止标志 
static int speedlevel; //步进电机转速参数,数值越大速度越慢,最小值为1,速度最快 
static int spcount; //步进电机转速参数计数 
void delay(unsigned int endcount); //延时函数,延时为endcount*0.5毫秒 
void gorun(); //步进电机控制步进函数 
//主函数开始
void main(void) 
{ 

LED_1 = 0;//显示第一个LED,既M1的状态
count = 0; 
step_index = 0;
speedlevel =2; 
spcount = 0;
stop_flag = 1;//这里一开始设定为  stop_flag = 0 表示开机即进行运转,stop_flag = 1则表示停止
P2_0 = 0; 
P2_1 = 0; 
P2_2 = 0; 
P2_3 = 0; 
EA = 1; //允许CPU中断 
TMOD = 0x11; //设定时器0和1为16位模式1 
ET0 = 1; //定时器0中断允许 

TH0 = 0x50; //BEFORE  FE0C
TL0 = 0x00; //设定时每隔65.53ms中断一次 
TR0 = 1; //开始计数 

delay(10000);

} 
//定时器0中断处理 在这个中断中完成步进电机的步进功能的
void timeint(void) interrupt 1 
{ 
TH0=0x50; 
TL0=0x00;//设定时每隔65.536ms中断一次 
TR0 = 1;
count++; 
spcount--;
if(spcount<=0) //速度调整,SPEEDLEVEL越大,延时越长(延时约为1MS*SPEEDLEVEL),// 频率越小,速度越慢
{
spcount = speedlevel;  

gorun();
}
K_1 = 1;//读数前先置1
if (K_1 == 0) stop_flag = 1; 
K_2 = 1;//读数前先置1
if (K_2 == 0) stop_flag = 0 ;
K_3 = 1;//读数前先置1
if (K_3 == 0) turn = 1 ;
K_4 = 1;//读数前先置1
if (K_4 == 0) turn= 0 ;
K_5 = 1;//读数前先置1
if (K_5 == 0) 
{

speedlevel+=1;
}
K_6 = 1;//读数前先置1
if (K_6 == 0) 
{
speedlevel-=1;
}
} 

void delay(unsigned int endcount) 
{ 
count=0; 
do{}while(count<endcount); 
} 

void gorun() 
{ 
if (stop_flag==1) 
{ 
P2_0 = 0; 
P2_1 = 0; 
P2_2 = 0; 
P2_3 = 0; 
P0	  = tab[0];
return; 
} 
else if (stop_flag==0)
{
if (turn==0)
P0	  = tab[1];
else
P0	  = tab[2];
}

switch(step_index) 
{ 
case 0: //0 
P2_0 = 0; 
P2_1 = 0; 
P2_2 = 0; 
P2_3 = 1; 
break; 
case 1: //0、1 
P2_0 = 0; 
P2_1 = 0; 
P2_2 = 1; 
P2_3 = 1; 
break; 
case 2: //1 
P2_0 = 0; 
P2_1 = 0; 
P2_2 = 1; 
P2_3 = 0; 
break; 
case 3: //1、2 
P2_0 = 0; 
P2_1 = 1; 
P2_2 = 1; 
P2_3 = 0; 
break; 
case 4: //2 
P2_0 = 0; 
P2_1 = 1; 
P2_2 = 0; 
P2_3 = 0; 
break; 
case 5: //2、3 
P2_0 = 1; 
P2_1 = 1; 
P2_2 = 0; 
P2_3 = 0; 
break; 
case 6: //3 
P2_0 = 1; 
P2_1 = 0; 
P2_2 = 0; 
P2_3 = 0; 
break; 
case 7: //3、0 
P2_0 = 1; 
P2_1 = 0; 
P2_2 = 0; 
P2_3 = 1; 
} 
if (turn==0) 
{ 
step_index++; 
if (step_index>7) 
step_index=0; 
} 
else 
{ 
step_index--; 
if (step_index<0) 
step_index=7; 
} 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -