单片机c语言控制步进电机发脉冲,单片机如何写用脉冲控制步进电机呢?
#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语言控制步进电机发脉冲,单片机如何写用脉冲控制步进电机呢?相关推荐
- c语言流水灯仿真程序设计框图,基于单片机c语言控制的流水灯程序设计及prtes仿真图.docx...
基于单片机c语言控制的流水灯程序设计及prtes仿真图 89c51与8个发光二极管相连流水控制 一.不同花样的控制源程序代码: /*#include #define uchar unsigned ch ...
- 单片机c语言电梯程序设计,基于51单片机的模拟电梯控制系统设计.doc
摘要:本文介绍了一种电梯模拟控制系统,包括怎样利用对STC89C52进行编程从而对电梯实现自由控制的方式.该系统采用了STC89C52芯片进行控制,用单片机进行编程,能实现的功能非常多而且方便设计,并 ...
- c语言控制led闪烁次数,单片机C语言程序设计之定时器控制4个LED滚动闪烁
描述 通过单片机课程设计,熟练掌握C语言的编程方法,将理论联系到实践中去,提高我们的动脑和动手的能力.通过定时器控制4只LED滚动闪烁系统的设计,掌握定时/计数器的使用方法,和简单程序的编写,最终提高 ...
- 51单片机C语言波特率十六进制,理解51单片机串口通信的波特率与USB转串口通信...
RS232 在我们电脑上,一般都会有一个9针的串行接口,这个串行接口叫做RS232接口,它和UART通信有关联,但是由于现在笔记本电脑不带9针串口,所以和单片机通信越来越趋于使用USB虚拟串口. 九针 ...
- 单片机c语言程序设计叶俊明,单片机C语言程序设计
本书的主要内容有51单片机的芯片引脚和*小系统.Keil C51编写软件与Proteus仿真软件的使用.C51语言.51单片机的基础实践.51单片机的中断系统.51单片机常见的接口电路以及十个实验例子 ...
- 单片机c语言篮球比分_基于单片机的篮球比赛计时计分器的设计
摘 要:本系统是采用单片机AT89C51作为本设计的核心原件.利用7段共阴LED作为显示器件.在此设计中共接入了2个7段共阴LED显示器,用于记录得分和比赛时间,显示范围可以达到0到99分,基本满足赛 ...
- 单片机C语言稳压程序,51单片机的基于MC34063的5V稳压器的设计 -(原理图+程序)...
题 目基于MC34063的5V稳压器的设计 研究现状:随着网络技术及通信技术的发展,便携式电子产品如个人数字助理(PDA).3G.4G手机.数码相机.笔记本电脑等个人设备的日益广泛应用,更多需求不断上 ...
- 51单片机c语言延时计算软件,51单片机精确延时程序大集合+初值计算工具
在论坛上看到不少不错的延时程序,整理如下共同分享: 精确延时计算公式: 延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+5 ;延时5秒左右 DELAY5S:PUSH 04H;2个 ...
- 单片机C语言数据存储原理,介绍单片机中C语言的数据存储与程序编写
一.五大内存分区: 内存分成5个区,它们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 1.栈区(stack):FIFO就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区 ...
最新文章
- Android------Android.mk调用shell脚本
- 自备干货!如何有效的做竞品迭代分析
- AI玩微信跳一跳的正确姿势:一不小心就超越了最高分,瞬间称霸了朋友圈~
- Java如何通过WSDL文件来调用这些web service
- Android中点击事件的四种写法
- 初级数据分析师需要哪些必备技能?
- EditPlus注册码在线生成,强大
- 安卓手机 Python 自动化测试
- c ++类成员函数_C ++编程中的数据成员和成员函数
- oracle+查表物理块数,查询Oracle表实际物理使用大小
- opencv android 车牌,OpenCV + Android +车牌号识别
- android号牌号码识别新能源,Android离线版车牌号识别相关问题
- 业务流程图是什么?怎么画?
- AMP Roadshow技术分享路演中国专场报名开始了!
- 使用R语言实现的城市空气质量分析模型
- 校园共享单车停放问题的调研
- 【随机数生成算法系列】线性同余法和梅森旋转法
- K近邻(K Nearest Neighbor-KNN)原理讲解及实现
- 交换机断网的原因分析
- opengl显示北斗七星源代码
热门文章
- 我理解的myisam引擎之二 MyISAM表(MYD)存储格式
- 三角形(triangle)
- 系统集成项目管理工程师10大管理47个过程域输入输出工具(项目范围管理)
- JMeter接口自动化发包与示例
- 来自北京大学NOIP金牌选手yxc的常用代码模板1——基础算法
- 深度学习 | MATLAB Deep Learning Toolbox lstmLayer 参数设定
- Python全栈(五)Web安全攻防之2.信息收集和sqlmap介绍
- Linux 测试IP和端口是否能访问
- 面试季,覆盖70%-80%的面经基础题(java及安卓)-------网络篇
- ansible第一次使用模块报错