基于51单片机步进电机控制
(仿真+程序+设计报告)
功能介绍
具体功能:
1.使用L298驱动步进电机转动,可分为9个速度等级(1级最快,9级最慢);
2.使用74HC595驱动数码管显示当前速度等级;
3.两个按键可以控制转速和正/方向;
演示视频:
基于51单片机步进电机控制—9个等级
添加图片注释,不超过 140 字(可选)
程序
//*****************************************//
//**************名称:步进电机*************//
//******** 木子单片机 *********//
//*****************************************//
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//74HC595引脚定义
sbit MOSIO=P2^1;
sbit R_CLKa=P2^2;
sbit S_CLKa=P2^0;
sbit LED = P0^0 ;
/
uchar vision_cnt = 0 ; //数码管动态扫描计数变量
bit updat = 0 ; //动态刷新标志
uint cnt = 0 ;
uchar sec = 0 ;
uint key_cnt[4];
uchar key_tab = 0 ;
uint buf_cnt = 0 ;
bit cnv = 0 ;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x40
}; //共阴极数码管显示数组0-f
uchar code table1[4]={0x10,0x20,0x40,0x80}; //反转表格,
//(P0.2-P0.5)各位分别取1,二进制码即:00000100,00001000,0001000,0010000
uchar code table2[4]={0x80,0x40,0x20,0x10}; //正转表格
/*
********************************************************************************
** 函数名称 : send595(uchar dat)
** 函数功能 : 数据输入
********************************************************************************
*/
void send595(uchar dat) //数据输入
{ uchar i; for(i=0;i<8;i++) {if((dat<<i)&0x80) MOSIO = 1 ;else MOSIO = 0 ;S_CLKa=0;S_CLKa=1; }
}
/*
********************************************************************************
** 函数名称 : out595(void)
** 函数功能 : 数据输出
********************************************************************************
*/
void out595(void) // 数据输出
{R_CLKa=0;R_CLKa=1; //上升沿
}
/*
********************************************************************************
** 函数名称 : vision(uchar dat,uchar pos)
** 函数功能 : 显示函数
********************************************************************************
*/ //在数码管某个位置上显示某个数字
void vision(uchar dat,uchar pos)
{send595(~pos);send595(table[dat]);out595();
}
//定时器初始化函数,
void timer_config(void)
{TMOD = 0x11 ; //设置定时器0和定时器1工作在方式1--16位计数模式TH0 = (65535-60000)/256 ; //设置定时器初值高位TL0 = (65535-60000)%256 ; //设置定时器初值低位TR0 = 1 ; //启动定时器0ET0 = 1 ; //开启定时器0中断EA = 1 ; //开启总中断
}
//外部中断配置函数
void ext_config(void)
{EX0 = 1; //开启外部中断0IT0 = 1; //外部中断为边沿触发方式EX1 = 1; //开启外部中断1IT1 = 1; //外部中断为边沿触发方式
}
//外部中断0
void ext0_isr() interrupt 0
{if(sec<9)sec++;elsesec=1;
}
//外部中断0
void ext1_isr() interrupt 2
{cnv = ~cnv ;
*****//完整资料
****//微信公众号:木子单片机//
}
//定时器0中断函数
void timer0_isr() interrupt 1
{TH0 = 0xfc ; //设置定时器初值高位 1ms定时TL0 = 0x17 ; //设置定时器初值低位updat = 1 ; //置位标志位if(buf_cnt<30*sec){buf_cnt++;}else{buf_cnt=0;if(cnt<3){cnt++;}else{cnt=0;}if(cnv)P1=table1[cnt];else P1=table2[cnt];}
}
硬件设计
使用元器件:
单片机:AT89C51;
(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)
设计资料
01仿真图
本设计使用Proteus7.8和Proteus8.9两个版本设计!具体如图!
添加图片注释,不超过 140 字(可选)
02程序
本设计使用Keil5版本编程设计!具体如图!
添加图片注释,不超过 140 字(可选)
03设计报告
一千字设计报告,具体如下!
添加图片注释,不超过 140 字(可选)
04设计资料
资料获取请看前面演示视频,全部资料包括仿真源文件 、程序(含注释)、设计报告等。具体内容如下,全网最全! !
操作演示请观看前面演示视频!
点赞分享一起学习成长。