STC单片机直流电机调速控制

/***触摸屏下位机测试直流电机速度 读P1.0 P1.1ADpast***/    
/***STC15W404AS 板L361 CODE2298 2021 3 25显示0----102*/
/***STC ADC_CONTR寄存器 调节电位器按下按键速度改变***/
/***bit 7 ADC POWER 启动AD=0***********/    
/***bit 6 SPEED1**(1 1) 90个时钟***(1 0)180个时钟*****/
/***bit 5 SPEED0**(0 1)360个时钟***(0 0)540个时钟*****/
/***bit 4 ADC FLAG*=1 转换结束标志位,软件清零*********/
/***bit 3 ADC START*=1开始转换,结束后转0**************/
/***bit 2 CHS2**000 001 010 011***P1.0**********/
/***bit 1 CHS1**100 101 110 111***P1.7**********/
/***bit 0 CHS0*SOP16 封装 定时器0,2AD程序        ***/
/*P1.1 P1.0 P3.7 P3.6 P3.3 P3.2 P3.1 P3.0*******/
/*P1.2 P1.3 P1.4 P1.5 P5.4 VCC  P5.5 GND********/      
              #include     <REG52.H>  
              #include     <intrins.h>
              #include     <string.h>
              #include     "stdio.h"
              #include     <stdlib.h>
              #define      uint unsigned int
              #define      uchar unsigned char
              typedef      unsigned char BYTE;
              typedef      unsigned int WORD;
              sbit         OUT0=P3^2;             //    
              sbit         OUT1=P3^3;              //    
              sbit         MTPWM1=P3^6;              //
              sbit         MTPWM2=P3^7;            //
              sbit         INTPUT1=P1^4;
              sbit         INTPUT2=P1^5;
              sbit         INTPUT3=P5^4;
              sbit         INTPUT4=P5^5;
              uint         aa=0;                  /****RUN FLAG****/
              uint         a[10];                //定义数组a  
              uchar        i;                    //串口接收计数器
              uchar        k;                    //信号输入高电平计数器
              sfr          P1ASF=0x9D;          //P1口第2功能控制寄存器
              uint         ADvalue_x,ADvalue_y; //存放AD转换返回的结果
              #define      ADC_SPEEDLL 0x00     //540个时钟
              bit           Receive_Flag;
              uchar        kcounter,kstatus;     //按键计数标志 按键状态标志
              bit          MOTORX_RUN;             //X轴启动标志
              bit          MOTORY_RUN;             //Y轴启动标志
              bit          MotorX_LowFlag;         //电机X轴低电平计数标志
              bit          MotorY_LowFlag;         //电机Y轴低电平计数标志
              uint         MotorX_LowCounter;     //电机X轴低电平计数器
              uint         MotorX_HighCounter;     //电机X轴高电平计数器
              uint         MotorY_LowCounter;    //电机X轴低电平计数器
              uint         MotorY_HighCounter;     //电机X轴高电平计数器
/*------------------------------------------*/
              void delay(uint t)
              {
              uint i,j;
              for(i=0;i<t;i++)
              for(j=0;j<1000;j++);
              }
/********************************************/             
              void resrt_io()
              {
              P1M0=0X00;
              P1M1=0X00;
              P3M0=0X00;
              P3M1=0X00;
              P5M0=0X00;
              P5M1=0X00;
              OUT0=1;
              OUT1=1;
              MTPWM1=1;
              MTPWM2=1;
              }
/*****************************************/
              unsigned int ADC_P10()             //
              {
               uint i;
               uchar status=0;                   //AD转换结束标志
               uint  AD_Dat=0;                   //10位AD转换值
               ADC_CONTR|=0X80;                  //打开ADC转换电源,第一次使用时要打开内部电源
               for(i=0;i<10000;i++)              //等待电源稳定1ms
               P1ASF|=0X01;                      //0000 0001
               ADC_CONTR=0XE0;                   //1110 0000    通道P1.0
               for(i=0;i<1000;i++)               //如果多通道测量,更换通道后延时200us
               ADC_CONTR|=0X08;                  //启动AD转换  0000 1000ADC_START
                while(status==0)                 //等待AD转换结束
                {
                status=ADC_CONTR&0X10;           //判断ADC_FLAG是否等于1,
                }
                ADC_CONTR&=0XE7;                 //将ADC_FLAG清零
                AD_Dat=(ADC_RES<<2)|(ADC_RESL&0X03);    //
                return AD_Dat;                   //
               }      
/*****************************************/
              unsigned int ADC_P11()             //
              {
               uint i;
               uchar status=0;                   //AD转换结束标志
               uint  AD_Dat=0;                   //10位AD转换值
               ADC_CONTR|=0X80;                  //打开ADC转换电源,第一次使用时要打开内部电源
               for(i=0;i<10000;i++)              //等待电源稳定1ms
               P1ASF|=0X02;                      //0000 0010
               ADC_CONTR=0XE1;                   //1110 0001  BIT 7电源    6 5速度90个时钟 001 P1.1
               for(i=0;i<1000;i++)               //如果多通道测量,更换通道后延时200us
               ADC_CONTR|=0X08;                  //启动AD转换
                while(status==0)                 //等待AD转换结束
                {
                status=ADC_CONTR&0X10;           //判断ADC_FLAG是否等于1,
                }
                ADC_CONTR&=0XE7;                 //将ADC_FLAG清零
                AD_Dat=(ADC_RES<<2)|(ADC_RESL&0X03); //
                return AD_Dat;                   //
               }
/****************按键计数器状态寄存器归零*************/
               void RstKey()
               {
               kcounter=0;                       //按键计数器归零
               kstatus=0;                        //状态寄存器归零
               }
/*****************按键低电平检测函数*****************/
               void   LowVoltKey(void)           //按键计数器状态标志加一
               {
               kcounter++;                       
               kstatus++;     
               delay(5);                         //延时                  
               }
/*****************按键高电平检测函数*****************/
               void    HighVoltKey(void)         //按键计数器加一 状态标志归零
               {
               kcounter++;                       //按键计数器加一
               kstatus=0;                        //按键状态标志归零
               delay(5);                         //延时
               }
/*------------初始化串口---------------------*/
              void InitUart()
              {
              SCON=0X50;                         //8位数据,可变波特率
              AUXR|=0x01;                        //串口1选择定时器2为波特率发生器
              AUXR|=0X04;                        //定时器2时钟为Fosc,即1T
              T2L=0XE0;                          //设置定时器处置  110592》9600
              T2H=0XFE;                          //设置定时器处置  110592》9600
              AUXR|=0X10;                        //启动定时器2
              TI=1;
              ES=1;                        //
              EA=1;
              }
/**************串口中断*************************/
              void Uart() interrupt 4 using 1
              {
               if(RI)
               {
                if(SBUF==0XFA||SBUF==0XFF)                     //触摸屏结束码
                {
                Receive_Flag=1;                     //接收数据标志置一
                RI=0;                             //
                i=0;                             //数组计数器归零
                }
                else
                {
                a[i]=SBUF;                       //数组下标位置的数据等于SBUF
                RI=0;                             //
                i++;
                }
               }
              }
/**************定时中断*************************/
               void timer0() interrupt 1
               {
               aa++;
               if(aa>=300)
                   {
                OUT1=~OUT1;
                aa=0;
                   }
                //X轴电机高低电平切换
               if(MOTORX_RUN==1)                 //X轴电机开启标志
                {
                 MTPWM1=0;                         //开X轴输出
                 if(MotorX_LowFlag==1)             //低电平计数标志等于1
                 {
                 MotorX_LowCounter++;
                 if(MotorX_LowCounter>=ADvalue_x)//
                 {
                  MotorX_LowFlag=0;              //低电平计数标志等于0高电平开始计数
                  MotorX_HighCounter=102-ADvalue_x;//赋高电平占空比值
                 }
                 }
                 else
                 {
                  MTPWM1=1;                         //关X轴输出
                  MotorX_HighCounter++;
                  if(MotorX_HighCounter>=ADvalue_x)//
                  {
                   MotorX_LowFlag=1;             //低电平计数标志等于1低电平开始计数
                   MotorX_LowCounter=ADvalue_x;     //低电平计数器
                  }
                 }
                }
//Y轴电机高低电平切换
                if(MOTORY_RUN==1)                 //X轴电机开启标志
                {
                 MTPWM2=0;                         //开Y轴输出
                 if(MotorY_LowFlag==1)             //低电平计数标志等于1
                 {
                 MotorY_LowCounter++;
                 if(MotorY_LowCounter>=ADvalue_y)//
                 {
                  MotorY_LowFlag=0;              //低电平计数标志等于0高电平开始计数
                  MotorY_HighCounter=102-ADvalue_y;//赋高电平占空比值
                 }
                 }
                 else
                 {
                  MTPWM2=1;                         //关Y轴输出
                  MotorY_HighCounter++;
                  if(MotorY_HighCounter>=ADvalue_y)//
                  {
                   MotorY_LowFlag=1;             //低电平计数标志等于1低电平开始计数
                   MotorY_LowCounter=ADvalue_y;     //
                  }
                 }
                }
               }
/*************************************************/
              void   main( )                     /*主程序开始*/
              {
               resrt_io();
               AUXR=0X80;                        //STC系列的1T 设置
               TMOD=0X00;                         //自动重载16位定时器/计数器
               TL0=0XDD;
               TH0=0XDD;
               ET0=1;
               TR0=1;
               P_SW1=0x00;                       //RXD/P3.0, TXD/P3.1
               Receive_Flag=0;    
               InitUart();                       //初始化串口
               delay(300);
               printf("0XFF,0XFF,0XFF");
               i=0;                              //数据接收计数器等于0
               delay(30);
               ADvalue_x=ADC_P10()/10;         //
               printf("n0.val=%d\xff\xff\xff",ADvalue_x);  //
               delay(30);
               printf("n0.val=%d\xff\xff\xff",ADvalue_x);  //
               ADvalue_y=ADC_P11()/10;         //
               printf("n1.val=%d\xff\xff\xff",ADvalue_y);  //
               delay(30);
               printf("n1.val=%d\xff\xff\xff",ADvalue_y);  //
               while(1)                             //INTPUT1
               {
/***************AD1*************/
                 RstKey();                         //按键复位
                  for(;kcounter<5;)              //按键循环5次
                  {
                   if(!INTPUT1)                  //按键低电平
                   {
                   LowVoltKey();
                   }
                   else if(~!INTPUT1)            //按键高电平
                   {
                   HighVoltKey();
                   }
                  }
                  if(kstatus>=4)                 /*按键状态标志大于等于3为有效值*/
                  {                              /*循环检测 */
                   ADvalue_x=ADC_P10()/10;         //
                   printf("n0.val=%d\xff\xff\xff",ADvalue_x);  //
                   delay(30);
                   printf("n0.val=%d\xff\xff\xff",ADvalue_x);  //
                  }
/***************AD2*************/
                 RstKey();                         //按键复位
                  for(;kcounter<5;)              //按键循环5次
                  {
                   if(!INTPUT2)                  //按键低电平
                   {
                   LowVoltKey();
                   }
                   else if(~!INTPUT2)            //按键高电平
                   {
                   HighVoltKey();
                   }
                  }
                  if(kstatus>=4)                 /*按键状态标志大于等于3为有效值*/
                  {                              /*循环检测 */
                   ADvalue_y=ADC_P11()/10;         //
                   printf("n1.val=%d\xff\xff\xff",ADvalue_y);  //
                   delay(30);
                   printf("n1.val=%d\xff\xff\xff",ADvalue_y);  //
                  }
/***************低电平X轴启动*************/
                 RstKey();                         //按键复位
                 for(;kcounter<5;)              //按键循环5次
                  {
                   if(!INTPUT3)                  //按键低电平
                   {
                   LowVoltKey();
                   }
                   else if(~!INTPUT3)            //按键高电平
                   {
                   HighVoltKey();
                   }
                  }
                  if(kstatus>=4)                 /*按键状态标志大于等于3为有效值*/
                  {                              /*循环检测 */
                  MOTORX_RUN=1;                     //X轴启动启动标志
                  MotorX_LowCounter=ADvalue_x;
                  MotorX_LowFlag=1;              //定时器启动先发低电平 标志置1,内部循环切换
                  }
/***************高电平X轴停止*************/
                 RstKey();                         //按键复位
                 for(;kcounter<5;)               //按键循环5次
                  {
                   if(~!INTPUT3)                  //按键高电平
                   {
                   LowVoltKey();
                   }
                   else if(!INTPUT3)             //按键低电平
                   {
                   HighVoltKey();
                   }
                  }
                  if(kstatus>=4)                 /*按键状态标志大于等于3为有效值*/
                  {                              /*循环检测 */
                   MOTORX_RUN=0;                 //X轴启动启动标志
                   MTPWM1=1;                     //关X轴输出
                  }
/***************Y轴启动************/
                 RstKey();                       //按键复位
                 for(;kcounter<5;)               //按键循环5次
                  {
                   if(!INTPUT4)                  //按键低电平
                   {
                   LowVoltKey();
                   }
                   else if(~!INTPUT4)            //按键高电平
                   {
                   HighVoltKey();
                   }
                  }
                  if(kstatus>=4)                 /*按键状态标志大于等于3为有效值*/
                  {                              /*循环检测 */
                  MOTORY_RUN=1;
                  MotorY_LowCounter=ADvalue_y;     //
                  MotorY_LowFlag=1;              //定时器启动先发低电平 标志置1,内部循环切换
                  }
/***************高电平Y轴停止*************/
                 RstKey();                       //按键复位
                  for(;kcounter<5;)              //按键循环5次
                  {
                   if(~!INTPUT4)                  //按键高电平
                   {
                   LowVoltKey();
                   }
                   else if(!INTPUT4)             //按键低电平
                   {
                   HighVoltKey();
                   }
                  }
                  if(kstatus>=4)                 /*按键状态标志大于等于3为有效值*/
                  {                              /*循环检测 */
                  MOTORY_RUN=0;                  //Y轴启动启动标志
                  MTPWM2=1;                      //关Y轴输出
                  }
                 }
                }         //L361 CODE2298 2021 3 25
            

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年五一杯高校数学建模竞赛(A题)|钢板切割问题 | 建模解析,小鹿学长带队指引全代码文章与思路

我是鹿鹿学长&#xff0c;就读于上海交通大学&#xff0c;截至目前已经帮200人完成了建模与思路的构建的处理了&#xff5e; 本篇文章是鹿鹿学长经过深度思考&#xff0c;独辟蹊径&#xff0c;通过路径优化解决钢板切割问题。结合贪心算法&#xff0c;Floyd-Warshall等多元算法…

STM32G030F6P6TR 芯片TSSOP20 MCU单片机微控制器芯片

STM32G030F6P6TR 在物联网&#xff08;IoT&#xff09;设备中的典型应用案例包括但不限于以下几个方面&#xff1a; 1. 环境监测系统&#xff1a; 使用传感器来监测温度、湿度、气压等环境因素&#xff0c;并通过无线通信模块将数据发送到中央服务器或云端平台进行分析和监控。…

Ansys Speos|进行智能手机镜头杂散光分析

本例的目的是研究智能手机Camera系统的杂散光。杂散光是指光向相机传感器不需要的散光光或镜面光&#xff0c;是在光学设计中无意产生的&#xff0c;会降低相机系统的光学性能。 在本例中&#xff0c;光学透镜系统使用Ansys Zemax OpticStudio (ZOS)进行设计&#xff0c;并使用…

字符串函数、内存函数——补充

目录 前言 1、strchr函数 1-1 函数介绍 1-1-1 函数功能 1-1-2 函数原型 1-1-3 函数参数 1-1-4 所属库 1-1-5 函数返回值 1-2 函数简单使用 1-3 函数使用场景 1-4 函数的使用总结 1-4-1 注意事项 2、strrchr函数 2-1 函数介绍 2-1-1 函数功能 2-1-2 函数原型 2…

ubuntu入门

基础命令 cd 切换命令 ls 查看当前目录下所有的文件 cp a.c b.c 拷贝a.c 到 b.c touch a.c 创建a.c文件 mkdir file 创建文件夹file rm file 删除文件 rmdir 删除test文件夹 rmdir test/ mv 移动文件 mv a.c b.c 把a.c 替换成b.c ifconfig 查看电脑网络信息 rm xx 删…

人工电销机器人在销售行业中的重要性和作用,以及未来市场的发展前景

在追求更高效、更智能的时代&#xff0c;各行各业都在积极寻求新技术、新应用来提升业务流程的效率和质量。对于销售行业而言&#xff0c;人工电销机器人已经成为越来越受欢迎的工具之一。我们将深入探讨人工电销机器人在销售行业中的重要性和作用&#xff0c;以及未来市场的发…

31.Gateway网关-跨域问题

跨域 1.域名不同&#xff1a;www.baidu.com和www.taobao.com,www.taobao.org 2.域名相同&#xff0c;端口不同。localhost:8080和localhost:8081 跨域问题 浏览器禁止请求的发起者与服务端发生跨域ajax请求&#xff0c;请求被浏览器拦截的问题。 解决方案 CORS 浏览器询…

linux安装Redis 7.2.4笔记

一.保姆级安装 1.下载Redis 7.2.4安装包 sudo wget https://download.redis.io/releases/redis-7.2.4.tar.gz2.解压&#xff0c;可以指定 sudo tar -zvxf redis-7.2.4.tar.gz 3.检测并安装 GCC 编译器&#xff1a; yum 是基于 Red Hat 的 Linux 发行版&#xff08;如 CentOS、…

【webrtc】MessageHandler 5: 基于线程的消息处理:以PeerConnection信令线程为例

peerconn的信令是通过post 消息到自己的信令线程消息来处理的PeerConnectionMessageHandler 是具体的处理器G:\CDN\rtcCli\m98\src\pc\peer_connection_message_handler.hMachinery for handling messages posted to oneself PeerConnectionMessageHandler 明确服务于 signalin…

分布式与一致性协议之Raft算法(四)

Raft算法 Raft是如何解决成员变更问题的 在日常工作中&#xff0c;你可能会遇到服务器故障的情况&#xff0c;这时你需要替换集群中的服务器。如果遇到需要改变数据副本数的情况&#xff0c;则需要增加或移除集群中的服务器。总的来说&#xff0c;在日常工作中&#xff0c;集…

进一步了解android studio 里 AGP,gradle等关系

目录 &#xff08;1&#xff09; gradle是什么 &#xff08;2&#xff09; 工程的jdk版本&#xff0c;及引用包的编译版本的关系 实践 问题与解决 编译成功与运行成功 编译成功 运行成功 &#xff08;1&#xff09; gradle是什么 Gradle是一个构建工具&#xff0c;它是…

Mac 版 安装NVM

优质博文IT-BLOG-CN NVM&#xff08;Node Version Manager&#xff09;是一个用于管理多个Node.js版本的工具。它允许开发者在同一台机器上安装和切换不同版本的Node.js&#xff0c;以便在不同的项目中使用不同的Node.js版本。macOS用户可以使用homebrew来安装NVM。 一、安装h…

Swagger3.0(Springdoc)日常使用记录

文章目录 前言一、默认地址二、注解OperationTag 三、SpringBoot基础配置四、Swagger导入apifox五、Swagger其他配置六 knife4j 参考文章 前言 本文并不是Swagger的使用教程&#xff0c;只是记录一下本人的操作&#xff0c;感兴趣的可以看下 一、默认地址 http://localhost:…

Scala 多版本下载指南

Scala&#xff0c;这一功能丰富的编程语言&#xff0c;结合了面向对象和函数式编程的精华&#xff0c;为开发者提供了强大的工具来构建高效、可扩展的应用程序。随着Scala社区的不断壮大和技术的演进&#xff0c;多个版本的Scala被广泛应用于不同的项目与场景中。本文旨在为您提…

Redis集群模式:高可用性与性能的完美结合!

【更多精彩内容,欢迎关注小米的微信公众号“软件求生”】 大家好,我是小米,一个积极活泼、喜好分享技术的29岁程序员。今天我们来聊聊Redis的集群模式,以及它是如何实现高可用的。 什么是Redis集群模式? Redis的集群模式是为了避免单一节点负载过高导致不稳定的一种解决…

Rust Web开发实战:构建高效稳定的服务端应用

如果你厌倦了缓慢、占用大量资源且不稳定的模板化Web开发工具&#xff0c;Rust就是你的解决方案。Rust服务提供了稳定的安全保证、非凡的开发经验&#xff0c;以及能够自动防止常见错误的编译器。 《Rust Web开发》教你使用Rust以及重要的Rust库(如异步运行时的Tokio、用于Web…

3.C++动态内存管理(超全)

目录 1 .C/C 内存分布 2. C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free 3. C内存管理方式 3.1 new/delete操作内置类型 3.2 new和delete操作自定义类型 3.3 operator new函数 3.4 定位new表达式(placement-new) &#xff08;了解&#xff09; 4. 常…

公共 IP 地址与私有 IP 地址区别有哪些?

​  IP 地址是分配给互联网上每个设备的唯一数字 ID。 IP 地址可以在 Internet 上公开使用&#xff0c;也可以在局域网 (LAN)上私有使用。本文&#xff0c;我们主要探讨公共 IP 地址和私有 IP 地址之间的区别。 公共IP地址&#xff1a;公共IP地址是用于访问Internet的向外的I…

极简shell制作

&#x1f30e;自定义简单shell制作 &#xff08;ps: 文末有完整代码&#xff09; 文章目录&#xff1a; 自定义简单shell制作 简单配置Linux文件 自定义Shell编写 命令行解释器       获取输入的命令       字符串分割       子进程进行进程替换 内建命令…

WebP格式:图片压缩的新标准

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…
最新文章