谁有步进电机调速程序
#ifndef _STEPPER_H // 防止Stepper。h被重复引用#define _STEPPER_H#include <reg51。 h>#define uchar unsigned char#define uint unsigned int#define T 10000 // 10ms定时常量宏定义sbit M1=P2^0;sbit M2=P2^1;sbit M4=P2^2;sbit M5=P2^3;sbit EN...全部
#ifndef _STEPPER_H // 防止Stepper。h被重复引用#define _STEPPER_H#include <reg51。
h>#define uchar unsigned char#define uint unsigned int#define T 10000 // 10ms定时常量宏定义sbit M1=P2^0;sbit M2=P2^1;sbit M4=P2^2;sbit M5=P2^3;sbit EN=P2^4;sbit CWB=P2^5;sbit RET=P2^6;sbit CLK=P2^7;#endifmain。
c#include "Stepper。
h"/* 定时器0服务子程序 */void time0() interrupt 1 using 1 // 用定时器0中断来产生CLK时钟{ /* 定时10ms,产生20ms周期的时钟,也就是50Hz的时钟 */ TH0 = -T/256; TL0 = -T%256; CLK = ~CLK;}/* 键消抖延时函数 */void delay(void){ uchar i; for (i=300;i>0;i--);}/* 键扫描函数 */uchar keyscan(void){ uchar scancode,tmpcode; P1 = 0xf0; // 发全0行扫描码 if ((P1&0xf0)!=0xf0) // 若有键按下 { delay(); // 延时去抖动 if ((P1&0xf0)!=0xf0) // 延时后再判断一次,去除抖动影响 { scancode = 0xfe; while((scancode&0x10)!=0) // 逐行扫描 { P1 = scancode; // 输出行扫描码 if ((P1&0xf0)!=0xf0) // 本行有键按下 { tmpcode = (P1&0xf0)|0x0f; /* 返回特征字节码,为1的位即对应于行和列 */ return((~scancode)+(~tmpcode)); } else scancode = (scancode<<1)|0x01; // 行扫描码左移一位 } } } return(0); // 无键按下,返回值为0 }/* 主程序 */void main(){
uchar key; TMOD = 0x01; // 设置定时器0工作模式 EA = 1; ET0 = 1; /* 设置为2相激励 */ M1 = 0; M2 = 0; /* 设置为环形转向轨迹 */ M4 = 1; M5 = 1; EN = 0; // 切断驱动输出 RET = 0; // 归位输入无效 CWB = 1; // 初始设置为顺时针方向 while(1) { key = keyscan(); // 调用键盘扫描函数 switch(key) { case 0x11: // 0行0列,启动键 EN = 1; // 打开驱动输出 TH0 = -T/256; // 改变T可以改变步进电机转动速度 TL0 = -T%256; TR0 = 1; // 定时器0开始计数 break; case 0x21: // 0行1列,停止键 TR0 = 0; // 定时器0停止计数 EN = 0; // 切断驱动输出 break; case 0x41: // 0行2列,切换转向按键 CWB = ~CWB; break; case 0x81: // 0行3列,归位键 RET = 1; delay(); RET = 0; break; default:break; } }}。收起