基于51单片机步进电机控制—9个等级

发布于:2025-05-10 ⋅ 阅读:(8) ⋅ 点赞:(0)

基于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 ;					//启动定时器0
	 ET0 = 1 ;					//开启定时器0中断
	 EA = 1 ;					//开启总中断
}
//外部中断配置函数
void ext_config(void)
{
	EX0 = 1;					//开启外部中断0
	IT0 = 1;					//外部中断为边沿触发方式
	EX1 = 1;					//开启外部中断1
	IT1 = 1;					//外部中断为边沿触发方式	
}
//外部中断0
void ext0_isr() interrupt 0 
{
	if(sec<9)
	sec++;
	else
	sec=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设计资料

        资料获取请看前面演示视频,全部资料包括仿真源文件 、程序(含注释)、设计报告等。具体内容如下,全网最全! !

操作演示请观看前面演示视频!

点赞分享一起学习成长。


网站公告

今日签到

点亮在社区的每一天
去签到