📄 xiugai.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 + -