📄 bjmd.c
字号:
#include <STC89C51RC.h>
#include <intrins.h>
// *******************************************************
// 管脚定义
// 由P1输出驱动信息
// *******************************************************
// 变量定义
unsigned char temes; // 定时器 定时时间延长变量
unsigned char phase; // 马达驱动方式
unsigned char steps; // 设定步数
unsigned char dw; // 定位开始变量
unsigned char lr; // 定位正转或反转变量
unsigned char dw_no; // 定位时执行多少个驱动信号
// *******************************************************
// 函数声明
void init_mcu (void);
// *******************************************************
// 主函数
void main (void)
{
init_mcu ();
while (1)
{
//程序是在 定时器中断中完成的
}
}
// *******************************************************
// 单片机初始化 子函数
// 设定 寄存器、变量初值
void init_mcu (void)
{
TMOD = 0x01; //T0 工作在方式1 16位计数器
TH0 = 0x3C; // 预先 设定定时器 初值50ms
TL0 = 0xB0;
EA = 1; // 开启 总中断
ET0 = 1; // 开启定时器0的中断功能
TR0 = 1; // 启动定时器0
temes = 0; // 时间计数初值从0开始
phase=0x33; // 电机驱动方式为2相
P1=phase; // 初始化P1接口数据
steps=200; // 设定走200步为一个周期
dw=0; // dw=0表示定位处理,dw=1表示非定位处理
lr=0; // lr=0表示正转,lr=1表示反转
dw_no=4; // dw_no=4表示定位时先送出4个驱动信号
}
// *******************************************************
// 定时器0中断 子函数,产生50ms定时
void timer0 (void) interrupt 1
{
TH0 =0x3C; //重新设置定时器初值为50ms
TL0 =0xB0;
if (++temes==10) //够了500ms就开始处理过程
{
TR0=0; //关闭定时器0
temes = 0; //计数器 清零
if (dw == 0) //程序开始先执行定位程序
{
if (dw_no-->0)
{
phase=_crol_(phase,1); //循环左移一位转到下一个信号
P1=phase; //输出驱动信号
}
else
{
dw=1; //设为非定位处理
}
}
else //开始正转或反转
{
if (lr==0) // 开始正转处理
{
if (steps-->0) //正转200步
{
phase=_crol_(phase,1); //循环左移一位转到下一个信号
P1=phase; //输出驱动信号
}
else
{
lr=1; // 设为反转处理
steps=200; // 重设步数
}
}
else // 开始反转处理
{
if (steps-->0) //反转200步
{
phase=_cror_(phase,1); //循环右移一位转到下一个信号
P1=phase; //输出驱动信号
}
else
{
lr=0; // 设为正转处理
steps=200; // 重设步数
}
}
}
TR0=1; //启动定时器0
}
}
// *******************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -