++全套资料包含:Proteus仿真源文件+keil C语言源程序+AD原理图+流程图+元器件清单+说明书等++
资料下载:
通过网盘分享的文件:资料分享
链接: 百度网盘 请输入提取码 提取码: tgnu
目录
[四、Keil c语言程序源代码](#四、Keil c语言程序源代码)
项目功能:
基于51单片机的步进电机控制系统
由STC89C52单片机+单体数码管+LED指示灯+ULN2003驱动芯片+DC-5V步进电机构成
具体功能:
(1)实现按键控制步进电机正转、反转、加速、减速、停止;
(2)2个发光二极管显示正反转,1位7段LED数码管显示当前转速档位(共9个档位);
(3)4个红色LED,指示电机的转速。
项目文件:
一、Proteus仿真源文件
二、AD原理图文件
二、报告说明书

三、系统流程图
四、器件清单
1.万用板9*15
2.DC电源插口
3.自锁开关
4.2.2K电阻*7
5.STC89C52单片机
6.40脚IC座
7.钮扣电池
8.电池座
9.ULN2003驱动芯片
10.1位7段LED数码管
11.10K排阻(103)
12.10K电阻*1
13.10uF电容
14.按键*6
15.12M晶振
16.30Pf瓷片电容*2
17.DC-5V步进电机
18.导线
19.焊锡
20.USB电源线或电池盒
21.LED灯*7
五、Keil c语言程序源代码(部分)
#include "reg52.h"
/*
按键控制步进电机:正转、反转、加1档、减1档、停止
数码管显示步进电机档位,总共有9档
LED灯显示正转、反转、转速
*/
/*宏定义*/
#define SpeedShow P0 //数码管显示接口
#define MotorDriver P2 //步进电机驱动接口
typedef unsigned char uchar; // 8位有符号整数
typedef unsigned int uint; //16位有符号整数
typedef unsigned long ulong; //32位有符号整数
#define KEY_TIME_SHORT 20 //短按的按键去抖动延时的时间
//---加入全局变量--//
extern uchar KeyCode;
extern uint KeyTimeCnt[5]; //按键去抖动延时计数器,分别对应KEY1/2/3/4/5
extern uchar KeyLock[5]; //按键触发后自锁的变量标志,分别对应KEY1/2/3/4/5
//-----------------------------------------------------------------
// 相关函数声明
//-----------------------------------------------------------------
void KeyScan(); //按键扫描函数 放在定时中断里
void Delay10ms(); //延时函数
//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;
uchar KeyCode = 0; //按键编码值
//共5个独立机械按键,通过短按实现5种按键编码值
uint KeyTimeCnt[5] = {0,0,0,0,0}; //按键去抖动延时计数器,分别对应KEY1/2/3/4/5
uchar KeyLock[5] = {0,0,0,0,0}; //按键触发后自锁的变量标志,分别对应KEY1/2/3/4/5
/* IO引脚分配*/
sbit KEY1 = P1^2; //按键1
sbit KEY2 = P1^3; //按键2
sbit KEY3 = P1^4; //按键3
sbit KEY4 = P3^5; //按键4
sbit KEY5 = P3^6; //按键5
sbit FWD_LED = P1^0; //正转指示灯
sbit REV_LED = P1^1; //反转指示灯
//函数声明
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
}
//-----------------------------------------------------------------
// 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 KeyScan()
//函数功能: 按键扫描程序,放在定时中断里,可较快实现按键响应
//调用子函数: 无
//输入参数: 无
//返回值: 无,说明:返回的按键编码值保存在KeyCode变量里
//-----------------------------------------------------------------
void KeyScan()
{
//------KEY1实现-------------------------------------------------
if(KEY1 == 1) //IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
{ KeyLock[0] = 0; //按键自锁变量标志清零
KeyTimeCnt[0] = 0; //按键去抖动延时计数器清零
}
else if(KeyLock[0] == 0)
{
KeyTimeCnt[0]++;
if(KeyTimeCnt[0] > KEY_TIME_SHORT)
{
KeyTimeCnt[0] = 0;
KeyLock[0] = 1; //自锁按键置位,避免一直触发
KeyCode = 1;
}
}
//------KEY2实现-----------------------------------
if(KEY2 == 1)
{ KeyLock[1] = 0;
KeyTimeCnt[1] = 0;
}
else if(KeyLock[1] == 0)
{
KeyTimeCnt[1]++;
if(KeyTimeCnt[1] > KEY_TIME_SHORT) //消抖
{
KeyTimeCnt[1] = 0; //按键去抖动延时计数器清零
KeyLock[1] = 1; //自锁按键置位,避免一直触发
KeyCode = 2;
}
}
//------KEY3实现-----------------------------------
if(KEY3 == 1)
{ KeyLock[2] = 0;
KeyTimeCnt[2] = 0;
}
else if(KeyLock[2] == 0)
{
KeyTimeCnt[2]++;
if(KeyTimeCnt[2] > KEY_TIME_SHORT)
{
KeyTimeCnt[2] = 0;
KeyLock[2] = 1;
KeyCode = 3;
}
}
//------KEY4实现-----------------------------------
if(KEY4 == 1)
{ KeyLock[3] = 0;
KeyTimeCnt[3] = 0;
}
else if(KeyLock[3] == 0)
{
KeyTimeCnt[3]++;
if(KeyTimeCnt[3] > KEY_TIME_SHORT)
{
KeyTimeCnt[3] = 0;
KeyLock[3] = 1;
KeyCode = 4;
}
}
//------KEY5实现-----------------------------------
if(KEY5 == 1)
{ KeyLock[4] = 0;
KeyTimeCnt[4] = 0;
}
else if(KeyLock[4] == 0)
{
KeyTimeCnt[4]++;
if(KeyTimeCnt[4] > KEY_TIME_SHORT)
{
KeyTimeCnt[4] = 0;
KeyLock[4] = 1;
KeyCode = 5;
}
}
}
//-----------------------------------------------------------------
//函数名称: void delay_ms(uint t)
//函数功能: 延时ms程序(粗略)
//调用子函数: 无
//输入参数: t
//返回值: 无
//-----------------------------------------------------------------
void delay_ms(uint t)
{
uchar i; while(t--) for(i = 0; i < 25; i++);
}
六、全套资料包含
七:项目资源获取
需要完整的资料可以点击下面的名片关注,回复"资料"!
↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓