#include

signed long beats = 0;  //电机转动节拍总数

void KeyDriver();

void main()

{

EA = 1;       //使能总中断

TMOD = 0x01;  //设置T0为模式1

TH0  = 0xFC;  //为T0赋初值0xFC67,定时1ms

TL0  = 0x67;

ET0  = 1;     //使能T0中断

TR0  = 1;     //启动T0

while (1)

{

KeyDriver();   //调用按键驱动函数

}

}

/* 步进电机启动函数,angle-需转过的角度 */

void StartMotor(signed long angle)

{

//在计算前关闭中断,完成后再打开,以避免中断打断计算过程而造成错误

EA = 0;

beats = (angle * 4076) / 360; //实测为4076拍转动一圈

EA = 1;

}

/* 步进电机停止函数 */

void StopMotor()

{

EA = 0;

beats = 0;

EA = 1;

}

/* 按键动作函数,根据键码执行相应的操作,keycode-按键键码 */

void KeyAction(unsigned char keycode)

{

static bit dirMotor = 0;  //电机转动方向

if ((keycode>=0x30) && (keycode<=0x39))  //控制电机转动1-9圈

{

if (dirMotor == 0)

StartMotor(360*(keycode-0x30));

else

StartMotor(-360*(keycode-0x30));

}

else if (keycode == 0x26)  //向上键,控制转动方向为正转

{

dirMotor = 0;

}

else if (keycode == 0x28)  //向下键,控制转动方向为反转

{

dirMotor = 1;

}

else if (keycode == 0x25)  //向左键,固定正转90度

{

StartMotor(90);

}

else if (keycode == 0x27)  //向右键,固定反转90度

{

StartMotor(-90);

}

else if (keycode == 0x1B)  //Esc键,停止转动

{

StopMotor();

}

}

/* 按键驱动函数,检测按键动作,调度相应动作函数,需在主循环中调用 */

void KeyDriver()

{

unsigned char i, j;

static unsigned char backup[4][4] = {  //按键值备份,保存前一次的值

{1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1}

};

for (i=0; i<4; i++)  //循环检测4*4的矩阵按键

{

for (j=0; j<4; j++)

{

if (backup[i][j] != KeySta[i][j])    //检测按键动作

{

if (backup[i][j] != 0)           //按键按下时执行动作

{

KeyAction(KeyCodeMap[i][j]); //调用按键动作函数

}

backup[i][j] = KeySta[i][j];     //刷新前一次的备份值

}

}

}

}

/* 电机转动控制函数 */

void TurnMotor()

{

unsigned char tmp;  //临时变量

static unsigned char index = 0;  //节拍输出索引

unsigned char code BeatCode[8] = {  //步进电机节拍对应的IO控制代码

0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6

};

if (beats != 0)  //节拍数不为0则产生一个驱动节拍

{

if (beats > 0)  //节拍数大于0时正转

{

index++;               //正转时节拍输出索引递增

index = index & 0x07;  //用&操作实现到8归零

beats--;               //正转时节拍计数递减

}

else            //节拍数小于0时反转

{

index--;               //反转时节拍输出索引递减

index = index & 0x07;  //用&操作同样可以实现到-1时归7

beats++;               //反转时节拍计数递增

}

tmp = P1;                    //用tmp把P1口当前值暂存

tmp = tmp & 0xF0;            //用&操作清零低4位

tmp = tmp | BeatCode[index]; //用|操作把节拍代码写到低4位

P1  = tmp;                   //把低4位的节拍代码和高4位的原值送回P1

}

else  //节拍数为0则关闭电机所有的相

{

P1 = P1 | 0x0F;

}

}

/* T0中断服务函数,用于按键扫描与电机转动控制 */

void InterruptTimer0() interrupt 1

{

static bit div = 0;

TH0 = 0xFC;  //重新加载初值

TL0 = 0x67;

KeyScan();   //执行按键扫描

//用一个静态bit变量实现二分频,即2ms定时,用于控制电机

div = ~div;

if (div == 1)

{

TurnMotor();

}

}

单片机c语言控制步进电机发脉冲,单片机如何写用脉冲控制步进电机呢?相关推荐

  1. c语言流水灯仿真程序设计框图,基于单片机c语言控制的流水灯程序设计及prtes仿真图.docx...

    基于单片机c语言控制的流水灯程序设计及prtes仿真图 89c51与8个发光二极管相连流水控制 一.不同花样的控制源程序代码: /*#include #define uchar unsigned ch ...

  2. 单片机c语言电梯程序设计,基于51单片机的模拟电梯控制系统设计.doc

    摘要:本文介绍了一种电梯模拟控制系统,包括怎样利用对STC89C52进行编程从而对电梯实现自由控制的方式.该系统采用了STC89C52芯片进行控制,用单片机进行编程,能实现的功能非常多而且方便设计,并 ...

  3. c语言控制led闪烁次数,单片机C语言程序设计之定时器控制4个LED滚动闪烁

    描述 通过单片机课程设计,熟练掌握C语言的编程方法,将理论联系到实践中去,提高我们的动脑和动手的能力.通过定时器控制4只LED滚动闪烁系统的设计,掌握定时/计数器的使用方法,和简单程序的编写,最终提高 ...

  4. 51单片机C语言波特率十六进制,理解51单片机串口通信的波特率与USB转串口通信...

    RS232 在我们电脑上,一般都会有一个9针的串行接口,这个串行接口叫做RS232接口,它和UART通信有关联,但是由于现在笔记本电脑不带9针串口,所以和单片机通信越来越趋于使用USB虚拟串口. 九针 ...

  5. 单片机c语言程序设计叶俊明,单片机C语言程序设计

    本书的主要内容有51单片机的芯片引脚和*小系统.Keil C51编写软件与Proteus仿真软件的使用.C51语言.51单片机的基础实践.51单片机的中断系统.51单片机常见的接口电路以及十个实验例子 ...

  6. 单片机c语言篮球比分_基于单片机的篮球比赛计时计分器的设计

    摘 要:本系统是采用单片机AT89C51作为本设计的核心原件.利用7段共阴LED作为显示器件.在此设计中共接入了2个7段共阴LED显示器,用于记录得分和比赛时间,显示范围可以达到0到99分,基本满足赛 ...

  7. 单片机C语言稳压程序,51单片机的基于MC34063的5V稳压器的设计 -(原理图+程序)...

    题 目基于MC34063的5V稳压器的设计 研究现状:随着网络技术及通信技术的发展,便携式电子产品如个人数字助理(PDA).3G.4G手机.数码相机.笔记本电脑等个人设备的日益广泛应用,更多需求不断上 ...

  8. 51单片机c语言延时计算软件,51单片机精确延时程序大集合+初值计算工具

    在论坛上看到不少不错的延时程序,整理如下共同分享: 精确延时计算公式: 延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+5 ;延时5秒左右 DELAY5S:PUSH   04H;2个 ...

  9. 单片机C语言数据存储原理,介绍单片机中C语言的数据存储与程序编写

    一.五大内存分区: 内存分成5个区,它们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 1.栈区(stack):FIFO就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区 ...

最新文章

  1. Android------Android.mk调用shell脚本
  2. 自备干货!如何有效的做竞品迭代分析
  3. AI玩微信跳一跳的正确姿势:一不小心就超越了最高分,瞬间称霸了朋友圈~
  4. Java如何通过WSDL文件来调用这些web service
  5. Android中点击事件的四种写法
  6. 初级数据分析师需要哪些必备技能?
  7. EditPlus注册码在线生成,强大
  8. 安卓手机 Python 自动化测试
  9. c ++类成员函数_C ++编程中的数据成员和成员函数
  10. oracle+查表物理块数,查询Oracle表实际物理使用大小
  11. opencv android 车牌,OpenCV + Android +车牌号识别
  12. android号牌号码识别新能源,Android离线版车牌号识别相关问题
  13. 业务流程图是什么?怎么画?
  14. AMP Roadshow技术分享路演中国专场报名开始了!
  15. 使用R语言实现的城市空气质量分析模型
  16. 校园共享单车停放问题的调研
  17. 【随机数生成算法系列】线性同余法和梅森旋转法
  18. K近邻(K Nearest Neighbor-KNN)原理讲解及实现
  19. 交换机断网的原因分析
  20. opengl显示北斗七星源代码

热门文章

  1. 我理解的myisam引擎之二 MyISAM表(MYD)存储格式
  2. 三角形(triangle)
  3. 系统集成项目管理工程师10大管理47个过程域输入输出工具(项目范围管理)
  4. JMeter接口自动化发包与示例
  5. 来自北京大学NOIP金牌选手yxc的常用代码模板1——基础算法
  6. 深度学习 | MATLAB Deep Learning Toolbox lstmLayer 参数设定
  7. Python全栈(五)Web安全攻防之2.信息收集和sqlmap介绍
  8. Linux 测试IP和端口是否能访问
  9. 面试季,覆盖70%-80%的面经基础题(java及安卓)-------网络篇
  10. ansible第一次使用模块报错