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

基于51单片机步进电机控制

(仿真+程序+设计报告)

功能介绍

具体功能:

1.使用L298驱动步进电机转动,可分为9个速度等级(1级最快,9级最慢);

2.使用74HC595驱动数码管显示当前速度等级;

3.两个按键可以控制转速和正/方向;

​演示视频:

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

添加图片注释,不超过 140 字(可选)

程序

cs 复制代码
//*****************************************//
//**************名称:步进电机*************//
//********          木子单片机    *********//
//*****************************************//
#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设计资料

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

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

点赞分享一起学习成长。

相关推荐
森焱森37 分钟前
无人机三轴稳定控制(2)____根据目标俯仰角,实现俯仰稳定化控制,计算出升降舵输出
c语言·单片机·算法·架构·无人机
白鱼不小白41 分钟前
stm32 USART串口协议与外设(程序)——江协教程踩坑经验分享
stm32·单片机·嵌入式硬件
S,D1 小时前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
小林C语言3 小时前
C语言 | 判断是否为回文数
c语言
芯岭技术4 小时前
PY32F002A单片机 低成本控制器解决方案,提供多种封装
单片机·嵌入式硬件
youmdt5 小时前
Arduino IDE ESP8266连接0.96寸SSD1306 IIC单色屏显示北京时间
单片机·嵌入式硬件
嘿·嘘5 小时前
第七章 STM32内部FLASH读写
stm32·单片机·嵌入式硬件
Meraki.Zhang5 小时前
【STM32实践篇】:I2C驱动编写
stm32·单片机·iic·驱动·i2c
myloveasuka6 小时前
信号操作集函数
linux·运维·服务器·c语言·c++·vscode
Mr_Xuhhh7 小时前
网络基础(1)
c语言·开发语言·网络·c++·qt·算法