📄 step motor.c
字号:
#include<regx51.h>
#define TIMER0_COUNT 0xee11
code forward[7]={0x03,0x06,0x04,0x0c,0x08,0x09,0x01}; //proteus里的步进电机控制序列 正向
code backward[7]={0x01,0x09,0x08,0x0c,0x04,0x06,0x03};
code key[4]={0xfe,0xfd,0xfb,0xf7};//第一键对应正转 第二键对应反转 第三键对应加速正转 第四键对应加速反转
unsigned char timer0_tick=0,i=0,times=100,status=1; //staus状态驱动 状态1正转 状态2反转 状态3加速正转 状态4加速反转
void delay(void)
{
int i,j;
for(i=0;i<155;i++)
for(j=0;j<155;j++);
} //按键延时消抖动
char keypad_scan()
{
char key;
P2=0xff;
while(P2!=0XFF); //P2不全高电平 就证明有键按下 开始扫描
do{
delay();
key=P2;
return(key);
}while(1);
}
char gotkey()
{
char temp,i;
temp=keypad_scan();
for(i=0;i<4;i++)
{
if(temp==key[i])return(i); //返回不同的i值对应不同的状态
}
return(4);
}
static void timer0_isr(void) interrupt TF0_VECTOR using 1
{
TR0=0;
TL0=(TIMER0_COUNT & 0x00FF);
TH0=(TIMER0_COUNT >> 8);
TR0=1;
timer0_tick++;
if(timer0_tick==2000)
{
i++;
if(i==7)i=0;
timer0_tick=0;
if(status==1)P1=forward[i];
if(status==2)P1=backward[i];
}
}
static void timer0_initialize(void)
{ //使用计时计算器Timer0之前需要对其进行设设置
EA=0; //先暂停接收所有的中断
timer0_tick=0;
TR0=0; //关闭Timer0
TMOD=0x01; //设置计时器0的工作模式
TL0=(TIMER0_COUNT & 0x00ff); //设置计时器0的计数器数值(THO与TL0的数值
TH0=(TIMER0_COUNT >> 8);
PT0=0; //设置计时器0有比较高的优先级
ET0=1; //设置接收Timer0的中断
TR0=1; //启动Timer0
EA=1; //设置系统接收中断
}
void main(void)
{
unsigned int command;
timer0_initialize();
do{
command=gotkey();
if(command==0) status=1;
if(command==1) status=2;
if(command==2) {times=50;status=1;}
if(command==3) {times=50;status=2;} //书本上的(timers>1)的条件是保证/2的条件允许可执行
if(command==4) status=0;
}while(1) ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -