步进电机调速原理

/*-----------------------------------------------

  内容:本程序用于测试4相步进电机常规驱动 2个按键 调节速度 
        使用1-2相励磁
        数码管显示 1-5速度等级,数字越大,速度越小
 ------------------------------------------------*/

#include <reg52.h>

#define KeyPort P3
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
sbit LATCH2=P2^3;//                 位锁存

unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsigned char TempData[8]; //存储显示值的全局变量

sbit A1=P1^0; //定义步进电机连接端口
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;


#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电

unsigned char Speed=1;
bit StopFlag;
void Display(unsigned char FirstBit,unsigned char Num);
void Init_Timer0(void);
unsigned char KeyScan(void);
/*------------------------------------------------
 uS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
 长度如下 T=tx2+5 uS 
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
 while(--t);
}
/*------------------------------------------------
 mS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
     
 while(t--)
 {
     //大致延时1mS
     DelayUs2x(245);
     DelayUs2x(245);
 }
}
/*------------------------------------------------
                    主函数
------------------------------------------------*/
main()
{
 unsigned int i=512;//旋转一周时间
 unsigned char num;
 Init_Timer0();
 Coil_OFF
 while(1)  //正向
  { 
   num=KeyScan();    //循环调用按键扫描
   if(num==1)//第一个按键,速度等级增加
      {
       if(Speed<5)
       Speed++;
      }    
   else if(num==2)//第二个按键,速度等级减小
      {
       if(Speed>1)
       Speed--;
      }    
 
  TempData[1]=dofly_DuanMa[Speed%10];
  }
}

/*------------------------------------------------
 显示函数,用于动态扫描数码管
 输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
 如输入0表示从第一个显示。
 Num表示需要显示的位数,如需要显示99两位数值则该值输入2
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
      static unsigned char i=0;
      

       DataPort=0;   //清空数据,防止有交替重影
       LATCH1=1;     //段锁存
       LATCH1=0;

       DataPort=dofly_WeiMa[i+FirstBit]; //取位码 
       LATCH2=1;     //位锁存
       LATCH2=0;

       DataPort=TempData[i]; //取显示数据,段码
       LATCH1=1;     //段锁存
       LATCH1=0;
       
       i++;
       if(i==Num)
          i=0;


}
/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
 TMOD |= 0x01;      //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响             
 //TH0=0x00;          //给定初值
 //TL0=0x00;
 EA=1;            //总中断打开
 ET0=1;           //定时器中断打开
 TR0=1;           //定时器开关打开
 PT0=1;           //优先级打开
}
/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 
{
 static unsigned char times,i;
 TH0=(65536-1000)/256;          //重新赋值 1ms
 TL0=(65536-1000)%256;
 
 Display(0,8);

  if(times==Speed)
   {
   times=0;
   switch(i)
       {
        case 0:Coil_A1;i++;break;
        case 1:Coil_AB1;i++;break;
        case 2:Coil_B1;i++;break;
        case 3:Coil_BC1;i++;break;
        case 4:Coil_C1;i++;break;
        case 5:Coil_CD1;i++;break;
        case 6:Coil_D1;i++;break;
        case 7:Coil_DA1;i++;break;
        case 8:i=0;break;
        default:break;
       }
    }
  else
     times++;
 
}

/*------------------------------------------------
            按键扫描函数,返回扫描键值
------------------------------------------------*/
unsigned char KeyScan(void)
{
 unsigned char keyvalue;
 if(KeyPort!=0xff)
   {
    DelayMs(10);
    if(KeyPort!=0xff)
       {
        keyvalue=KeyPort;
        while(KeyPort!=0xff);
        switch(keyvalue)
        {
         case 0xfe:return 1;break;
         case 0xfd:return 2;break;
         case 0xfb:return 3;break;
         case 0xf7:return 4;break;
         case 0xef:return 5;break;
         case 0xdf:return 6;break;
         case 0xbf:return 7;break;
         case 0x7f:return 8;break;
         default:return 0;break;
        }
      }
   }
   return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/599473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运维工程师的困境和解困之道

运维工程师是指负责维护和管理企业IT基础设施的专业人员。他们需要确保从应用程序到服务器、网络等所有层面的运行顺畅&#xff0c;以支持企业的日常业务运营。运维工程师的工作涉及到诸多领域&#xff0c;包括系统管理、网络管理、存储管理、安全管理和自动化等。 业务部门对I…

在Fiber中处理请求和响应

掌握GoLang Fiber中请求和响应管理的艺术&#xff0c;以实现高效的Web开发 在Web开发领域&#xff0c;有效地处理请求和响应是构建既用户友好又高效的Web应用的基石。该过程涉及管理传入的HTTP请求、解析数据和参数、构建适当的响应、处理不同的响应类型以及优雅地处理错误。对…

微机原理14练习题答案

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案。) 1,下面寻址方式的操作数不在存储器中的是(C) A. 堆栈寻址 B. 寄存器间址 C.寄存器寻址 D. 直接寻址 2,条件转移指令JNE的条件是(C) A. CF=0 B. CF=1 C. ZF=0 D. ZF=1 3…

湖仓架构的演进

1.数据仓库架构的历史演进 起初&#xff0c;业界数据处理首选方式是数仓架构。通常数据处理的流程是把一些业务数据库&#xff0c;通过ETL的方式加载到Data Warehouse中&#xff0c;再在前端接入一些报表或者BI的工具去展示。 数据仓库概念是 Inmon 于 1990 年提出并给出了完…

求实创新 不断探索 浙江移动基于亚信科技AntDB数据库率先完成CRM系统全域改造

12日20日&#xff0c;中国信息通信研究院&#xff08;简称&#xff1a;信通院&#xff09;和中国通信标准化协会大数据库技术推进委员会&#xff08;CCSA TC601&#xff09;共同组织的2023年大数据库“星河&#xff08;Galaxy&#xff09;”案例评选结果发布。中国移动通信集团…

【Bootstrap学习 day13】

Bootstrap5 下拉菜单 下拉菜单通常用于导航标题内&#xff0c;在用户鼠标悬停或单击触发元素时显示相关链接列表。 基础的下拉列表 <div class"dropdown"><button type"button" class"btn btn-primary dropdown-toggle" data-bs-toggl…

亚马逊速卖通eBay测评补单:批量注册买家账号如何保证成功率

在当今的电商领域&#xff0c;测评如同一面镜子&#xff0c;为商家展现出产品的真实面貌。对于商家而言&#xff0c;自行养号进行测评的重要性日益凸显。 与依赖国外买手或测评服务商相比&#xff0c;自行搭建账号具有以下优势&#xff1a; 一&#xff0c;可以避免买家账号资…

win10电脑提示“KBDSG.DLL文件缺失”,软件游戏无法启动运行,快速修复方法

很多用户在日常使用电脑的时候&#xff0c;或多或少都遇到过&#xff0c;在启动游戏或软件的时候&#xff0c;Windows桌面会弹出错误提示框“KBDSG.DLL文件缺失&#xff0c;造成软件无法启动或运行&#xff0c;请尝试重新安装解决”。 不少用户&#xff0c;会根据提示重装游戏或…

Leetcode-105.从前序与中序遍历序列构造二叉树

题目链接 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def buildTree(self, preorder: List[int], inor…

相机解析驱动小记

用过了几款相机&#xff0c;对使用相机也有了一点心得&#xff0c;在此记录。 当你得到一款相机&#xff0c;你需要做的&#xff1a; 第一件事&#xff1a;在datasheet中阅读配置单&#xff0c;知道怎么配置、配置完输出来是什么。 配置输出尺寸&#xff1b;传输模式&#xf…

linux-nohup、区别

一、nohup 忽略挂断信号SIGHUP&#xff08;比如&#xff1a;端口shell连接&#xff09;&#xff0c;底层是将进程转为守护进程&#xff0c;还可以重定向输入&#xff0c;比如将日志输出到指定文件 二、& 忽略中断信号&#xff0c;比如ctrlc&#xff0c; 三、&#xff1…

STM32疑难杂症

1.keil的奇怪问题 创建的数组分配内存到0x10000000地址的时候,数据总是莫名其妙的出现问题,取消勾选就正常了 stm32f407内部有一个CCM内存,这部分内存只能由内核控制,任何外设都不能够进行访问。这样问题就来了,如果使用keil5进行编程时勾选了这个选项(下图),则编译的…

[每周一更]-(第50期):Go的垃圾回收GC

参考文章&#xff1a; https://juejin.cn/post/7111515970669117447https://draveness.me/golang/docs/part3-runtime/ch07-memory/golang-garbage-collector/https://colobu.com/2022/07/16/A-Guide-to-the-Go-Garbage-Collector/https://liangyaopei.github.io/2021/01/02/g…

2023年终总结(脚踏实地,仰望星空)

回忆录 2023年&#xff0c;经历非常多的大事情&#xff0c;找工作、实习、研究生毕业、堂哥结婚、大姐买车、申博、读博、参加马拉松&#xff0c;有幸这一年全家人平平安安&#xff0c;在稳步前进。算是折腾的一年&#xff0c;杭州、赣州、武汉、澳门、珠海、遵义来回跑。完成…

软件测试|SQL AND和OR运算符解析

简介 在SQL&#xff08;Structured Query Language&#xff09;中&#xff0c;AND和OR是两个常用的逻辑运算符。它们用于组合条件来构建复杂的查询语句&#xff0c;帮助我们更精确地过滤和检索数据。本文将详细介绍SQL中的AND和OR运算符&#xff0c;包括其语法、用法以及使用时…

nginx原理和配置项详解

一、nginx原理 Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理服务器。其工作原理和配置项如下&#xff1a; 工作原理&#xff1a; 反向代理&#xff1a;Nginx可以作为反向代理服务器&#xff0c;接收客户端的请求&#xff0c;然后将请求转…

企业级实践为“燃料”,大模型助推Kyligence产品力向上

回顾2023年&#xff0c;最火热的科技话题无疑是生成式AI。 从ChatGPT横空出世&#xff0c;到“千模大战”如火如荼&#xff0c;AIGC正式破圈&#xff0c;成为企业数字化转型的新关键词。 在红杉中国《2023企业数字化年度指南》中&#xff0c;通过调研235家企业可知&#xff0…

VR与数字孪生:共同构筑未来的虚拟世界

随着科技的不断发展&#xff0c;数字孪生和VR已经成为当今热门的科技话题。作为山海鲸可视化软件的开发者&#xff0c;我们对这两者都有深入的了解。在此&#xff0c;我们将详细探讨数字孪生与VR的区别和联系。 首先&#xff0c;数字孪生&#xff08;Digital Twin&#xff09;…

光明源@智慧厕所技术:优化生活,提升卫生舒适度

在当今数字科技飞速发展的时代&#xff0c;我们的日常生活正在经历一场革命&#xff0c;而这场革命的其中一个前沿领域就是智慧厕所技术。这项技术不仅仅是对传统卫生间的一次升级&#xff0c;更是对我们生活品质的全方位提升。从智能感应到数据分析&#xff0c;从环保设计到舒…

BFS、SPFA、Dijkstra算法中vis数组的用法对比

先上代码&#xff1a; BFS&#xff1a; bool vis[MAXN]; int dis[MAXN];void bfs(int s) {queue<int> Q;Q.push(s);vis[s] true;while(!Q.empty()){int u Q.front();Q.pop();for(int e first[u]; e; e nxt[e]){int v go[e];if(vis[v]) continue;dis[v] dis[u] 1…