//-----------------------------------------------------------------
// 名称:步进电机(28BYJ-48)程序
//---1~9档的转速------------------------------------------------
//DEE4 定时时间 8.476ms , 转速 1.73r/min
//E1EC 定时时间 7.7ms , 转速 1.90r/min
//E5D4 定时时间 6.7ms, 转速 2.19r/min
//E9BC 定时时间 5.7ms, 转速 2.57r/min
//EDA4 定时时间 4.7ms, 转速 3.12r/min
//F18C 定时时间 3.7ms, 转速 3.96r/min
//F574 定时时间 2.7ms, 转速 5.43r/min
//F95C 定时时间 1.7ms, 转速 8.62r/min
//FC18 定时时间 1ms , 转速 14.65r/min
//-----------------------------------------------------------------
//转一圈需要节拍数:360/(5.625/64) = 4096 个节拍
//转速r/min = (60*1000) / (4096 * 定时时间)
//-----------------------------------------------------------------
#include "Key.h"
//0~9 的共阳数码管段码,最后一个是黑屏
const uchar SEG_CODE[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};
//输出励磁序列的频率参数{TH1,TL1}
const uchar Timer[9][2]={{0xDE,0xE4},{0xE1,0xEC},{0xE5,0xD4},{0xE9,0xBC}, //8.476 ~ 1ms
{0xEd,0xA4},{0xF1,0x8C},{0xF5,0x74},{0xF9,0x5C},{0xFC,0x18}};
//步进电机正转的励磁序列
const uchar FFW[] = {0x1F,0x3F,0x2F,0x6F,0x4F,0xCF,0x8F,0x9F}; //DCBAXXXX
//步进电机反转的励磁序列
const uchar REV[] = {0x9F,0x8F,0xCF,0x4F,0x6F,0x2F,0x3F,0x1F}; //DCBAXXXX
//枚举变量--正反转标志
typedef enum
{FwdRun, RevRun} RunFlag;
RunFlag flag1 = FwdRun;
uchar speed = 0;
//函数声明
void T0_Init(); //定时器0初始化函数声明
void T1_Init(); //定时器1初始化函数声明
void KeyService(); //按键服务函数声明
void delay_ms(uint t); //毫秒延时函数声明
//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
void main()
{
T0_Init(); //定时器0初始化
T1_Init(); //定时器1初始化
FWD_LED = 0; //正转指示灯亮,默认初始化是正转
delay_ms(500); //延时500ms,待各个模块上电稳定
EA = 1; //开启中断
while(1)
{
KeyService(); //按键服务程序
}
}
//-----------------------------------------------------------------
// Timer0 初始化,模式1,允许中断,1ms定时
// Timer0 用于按键扫描
//-----------------------------------------------------------------
void T0_Init()
{
TMOD &= 0xF0;
TMOD |= 0x01; //T0工作于模式1,16位定时器
TH0 = (65536 - 1000) >> 8; //1ms定时
TL0 = (65536 - 1000) & 0xFF;
ET0 = 1; //允许T0中断
TR0 = 1; //启动T0
}
//-----------------------------------------------------------------
// Timer1 初始化,模式1,允许中断
// Timer1 用于改变步进电机转速
//-----------------------------------------------------------------
void T1_Init()
{
TMOD &= 0x0F;
TMOD |= 0x10; //定时器1工作于模式1,16位定时器
TH1 = Timer[speed][0];
TL1 = Timer[speed][1]; //定时器1,定时用于步进电机转速控制
ET1 = 1; //允许T1中断
PT1 = 1; //定时器1优先级高
TR1 = 0; //关闭定时器1
}
//-----------------------------------------------------------------
// Timer0 中断服务程序
//-----------------------------------------------------------------
void InterruptTime0() interrupt 1
{
TH0 = (65536 - 1000) >> 8; //1ms
TL0 = (65536 - 1000) & 0xFF;
KeyScan(); //按键扫描
}
//-----------------------------------------------------------------
// Timer1 中断服务程序
//-----------------------------------------------------------------
void InterruptTime1() interrupt 3
{
static step1 = 0;
static step2 = 0;
TH1 = Timer[speed - 1][0]; //根据不同的转速档位,给定时器1赋定时器值
TL1 = Timer[speed - 1][1];
//按照定时器1的频率循环发送正转励磁序列的脉冲给步进电机,使其不停地转动
if(flag1 == FwdRun)//正转
{
MotorDriver = FFW[step1++];
if(step1 == 8) step1 = 0;
}
//按照定时器1的频率循环发送反转励磁序列的脉冲给步进电机,使其不停地转动
else if(flag1 == RevRun)
{
MotorDriver = REV[step2++];
if(step2 == 8) step2 = 0;
}
}
//-----------------------------------------------------------------
// 按键服务程序
//-----------------------------------------------------------------
void KeyService()
{
switch (KeyCode)
{
case 1: flag1 = FwdRun; //正转
FWD_LED = 0; REV_LED = 1; //正转指示灯亮
KeyCode = 0;
break;
case 2: flag1 = RevRun; //反转
FWD_LED = 1; REV_LED = 0; //反转指示灯亮
KeyCode = 0;
break;
case 3: speed++; //速度加
if(speed == 10) speed = 1;
SpeedShow = SEG_CODE[speed];
if(TR1 == 0) TR1 = 1;
KeyCode = 0;
break;
case 4: speed--; //速度减
if(speed == 0 || speed == -1 ) speed = 9;
SpeedShow = SEG_CODE[speed];
if(TR1 == 0) TR1 = 1;
KeyCode = 0;
break;
case 5: TR1 = 0; //停止
SpeedShow = 0xFF;
MotorDriver = 0x00;
KeyCode = 0;
break;
default: ;
}
}
//-----------------------------------------------------------------
//函数名称: void delay_ms(uint t)
//函数功能: 延时ms程序(粗略)
//调用子函数: 无
//输入参数: t
//返回值: 无
//-----------------------------------------------------------------
void delay_ms(uint t)
{
uchar i; while(t--) for(i = 0; i < 125; i++);
}
没有合适的资源?快使用搜索试试~ 我知道了~
基于51单片机的步进电机正反转调速系统控制_仿真+源程序+详细教程.zip
共42个文件
pdf:8个
png:4个
pdsbak:3个
2星 需积分: 5 64 下载量 176 浏览量
2021-01-07
11:10:44
上传
评论 18
收藏 30.59MB RAR 举报
温馨提示
基于51单片机的步进电机正反转调速系统控制_仿真+源程序+详细教程
资源详情
资源评论
资源推荐
收起资源包目录
步进电机正反转调速系统设计.rar (42个子文件)
步进电机正反转调速系统设计
06_芯片手册及对应参考资料
ULN2003A.pdf 66KB
28BYJ48规格书.pdf 254KB
STC89C52RC.pdf 2.79MB
28BYJ48参数特性(步进电机).pdf 88KB
减速步进电机28BYJ-48拆机图.doc 984KB
01_源代码
步进电机C51源程序
Include
Config.h 924B
Key.h 900B
步进电机_uvproj.bak 14KB
步进电机.uvproj 15KB
步进电机_uvopt.bak 6KB
Objects
步进电机.lnp 119B
步进电机.build_log.htm 1KB
ExtDll.iex 19B
步进电机.plg 287B
Key.obj 4KB
main.obj 8KB
步进电机 11KB
步进电机.hex 2KB
步进电机.uvopt 7KB
步进电机.uvgui.Administrator 91KB
Listings
步进电机.m51 12KB
Key.lst 5KB
main.lst 9KB
Source
Key.c 2KB
main.c 5KB
03_原理图
步进电机(pdf版).pdf 41KB
07_使用说明及功能介绍
使用说明及功能介绍.pdf 158KB
效果视频.flv 19.94MB
02_Proteus仿真图
Last Loaded 步进电机.pdsbak 21KB
步进电机.pdsprj.PC-20190529RBQY.Administrator.workspace 2KB
步进电机.pdsprj 21KB
Backup Of 步进电机.pdsbak 21KB
Last Loaded 步进电机.fv8.5.pdsbak 21KB
步进电机.pdsprj.User-PC.Administrator.workspace 2KB
05_制作实物详解(含焊接)
制作实物参考(焊接前必看).pdf 1.53MB
反面.png 1.32MB
焊接技巧(焊接前必看).pdf 1MB
正面.png 772KB
04_实物图及元器件清单
反面.png 1.32MB
正面.png 772KB
使用前必读.docx 16KB
8_答辩常见问题汇总
答辩常见问题合集.docx 25KB
共 42 条
- 1
perseverance52
- 粉丝: 16w+
- 资源: 68
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1