触摸屏下位机测试直流电机速度 读P1.0 P1.1AD值

/***触摸屏下位机测试直流电机速度 读P1.0 P1.1 ***/    
/***STC15W404AS 板L265 CODE 18182021 2 8显示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 封装         ***/
/*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
              #define      FOSC 11059200L
              #define      T1MS (65536-FOSC/1000)      //1T模式
              sfr          P1ASF=0x9D;          //P1口第2功能控制寄存器
              uint         ADvalue_x,ADvalue_y; //存放AD转换返回的结果
              #define      ADC_SPEEDLL 0x00     //540个时钟  
              sbit         INTPUT1=P5^4;        //X轴启动
              sbit         INTPUT2=P5^5;        //Y轴启动
              sbit         INTPUT3=P1^4;        //X轴速度刷新
              sbit         INTPUT4=P1^5;        //Y轴速度刷新
              sbit         OUT1=P3^2;            //32
              sbit         OUT2=P3^3;            //33
              sbit         P_WM1=P3^6;             //36
              sbit         P_WM2=P3^7;             //37
              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轴高电平计数器
              uchar        kcounter,kstatus;     //按键计数标志 按键状态标志
              uint         a[10];             //定义数组a 存储串口数据串
              uint            val=0;
/*---------------延时子程序----------------*/
              void delay1 (uint ms)
              {
              uint i,j;
              for(i=0;i<ms;i++)
              for(j=0;j<2000;j++)
              ;
              }
/*---------------延时子程序----------------*/
              void delay (uint ms)
              {
              uint i,j;
              for(i=0;i<ms;i++)
              for(j=0;j<10;j++)
              ;
              }
/*************关所有输出*******************************/             
               void reset_io()
               {
               P_WM1=1;
               P_WM2=1;
               INTPUT1=1;                      //
               INTPUT2=1;                      //
               }
/****************按键计数器状态寄存器归零*************/
               void RstKey()
               {
               kcounter=0;                       //按键计数器归零
               kstatus=0;                        //状态寄存器归零
               }
/*****************按键低电平检测函数*****************/
               void   LowVoltKey(void)           //按键计数器状态标志加一
               {
               kcounter++;                       
               kstatus++;     
               delay(5);                         //延时                  
               }
/*****************按键高电平检测函数*****************/
               void    HighVoltKey(void)         //按键计数器加一 状态标志归零
               {
               kcounter++;                       //按键计数器加一
               kstatus=0;                        //按键状态标志归零
               delay(5);                         //延时
               }
/*****************************************/
              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|=0X00;                      //0000 0000
               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 timer0() interrupt 1
               {
               val++;
               if(val>100)
               {
               val=0;
               OUT1=~OUT1;                     //将测试口取反
               }
//X轴电机高低电平切换
               if(MOTORX_RUN==1)                 //X轴电机开启标志
                {
                 P_WM1=0;                         //开X轴输出
                 if(MotorX_LowFlag==1)             //低电平计数标志等于1
                 {
                 MotorX_LowCounter++;
                 if(MotorX_LowCounter>=ADvalue_x)//
                 {
                  MotorX_LowFlag=0;              //低电平计数标志等于0高电平开始计数
                  MotorX_HighCounter=102-ADvalue_x;//赋高电平占空比值
                 }
                 }
                 else
                 {
                  P_WM1=1;                         //关X轴输出
                  MotorX_HighCounter++;
                  if(MotorX_HighCounter>=ADvalue_x)//
                  {
                   MotorX_LowFlag=1;             //低电平计数标志等于1低电平开始计数
                   MotorX_LowCounter=ADvalue_x;     //低电平计数器
                  }
                 }
                }
//Y轴电机高低电平切换
                if(MOTORY_RUN==1)                 //X轴电机开启标志
                {
                 P_WM2=0;                         //开Y轴输出
                  if(MotorY_LowFlag==1)             //低电平计数标志等于1
                 {
                 MotorY_LowCounter++;
                 if(MotorY_LowCounter>=ADvalue_y)//
                 {
                  MotorY_LowFlag=0;              //低电平计数标志等于0高电平开始计数
                  MotorY_HighCounter=102-ADvalue_y;//赋高电平占空比值
                 }
                 }
                 else
                 {
                  P_WM2=1;                         //关Y轴输出
                  MotorY_HighCounter++;
                  if(MotorY_HighCounter>=ADvalue_y)//
                  {
                   MotorY_LowFlag=1;             //低电平计数标志等于1低电平开始计数
                   MotorY_LowCounter=ADvalue_y;     //
                  }
                 }
                }
               }
/*************************************************/
              void   main( )                      /*主程序开始*/
              {
               reset_io();
               AUXR=0X80;                        //STC系列的1T 设置
               P_SW1=0x00;                       //RXD/P3.0, TXD/P3.1
               TMOD = 0x00;                    //设置定时器为模式0(16位自动重装载)
               TL0 = T1MS;                     //初始化计时值
               TH0 = T1MS >> 8;
               TR0 = 1;                        //定时器0开始计时
               ET0 = 1;                        //使能定时器0中断
               
               MotorX_LowCounter=0;                 //电机X轴低电平计数器
               MotorX_HighCounter=0;             //电机Y轴高电平计数器
               MotorY_LowCounter=0;              //电机X轴低电平计数器
               MotorY_HighCounter=0;             //电机Y轴高电平计数器
               MOTORX_RUN=0;                     //X轴启动标志
               MOTORY_RUN=0;                     //Y轴启动标志
               P1M0=0X00;
               P1M1=0X00;
               P3M0=0X00;
               P3M1=0X00;
               P5M0=0X00;
               P5M1=0X00;
               while(1)                             //
               {
                 delay1(10);
/***************低电平X轴启动*************/
                 RstKey();                         //按键复位
                 for(;kcounter<5;)              //按键循环5次
                  {
                   if(!INTPUT1)                  //按键低电平
                   {
                   LowVoltKey();
                   }
                   else if(~!INTPUT1)            //按键高电平
                   {
                   HighVoltKey();
                   }
                  }
                  if(kstatus>=4)                 /*按键状态标志大于等于3为有效值*/
                  {                              /*循环检测 */
                  MOTORX_RUN=1;                     //X轴启动启动标志
                  MotorX_LowCounter=ADvalue_x;
                  MotorX_LowFlag=1;              //定时器启动先发低电平 标志置1,内部循环切换
                  }
/***************高电平X轴停止*************/
                 RstKey();                         //按键复位
                 if(MOTORX_RUN==1)
                 {    
                 for(;kcounter<5;)               //按键循环5次
                  {
                   if(~!INTPUT1)                  //按键高电平
                   {
                   LowVoltKey();
                   }
                   else if(!INTPUT1)             //按键低电平
                   {
                   HighVoltKey();
                   }
                  }
                  if(kstatus>=4)                 /*按键状态标志大于等于3为有效值*/
                  {                              /*循环检测 */
                   MOTORX_RUN=0;                     //X轴启动启动标志
                  }
                 }
/***************Y轴启动************/
                 RstKey();                         //按键复位
                 for(;kcounter<5;)              //按键循环5次
                  {
                   if(!INTPUT2)                  //按键低电平
                   {
                   LowVoltKey();
                   }
                   else if(~!INTPUT2)            //按键高电平
                   {
                   HighVoltKey();
                   }
                  }
                  if(kstatus>=4)                 /*按键状态标志大于等于3为有效值*/
                  {                              /*循环检测 */
                  MOTORY_RUN=1;
                  MotorY_LowCounter=ADvalue_y;     //
                  MotorY_LowFlag=1;              //定时器启动先发低电平 标志置1,内部循环切换
                  }
/***************高电平Y轴停止*************/
                   RstKey();    
                 if(MOTORY_RUN==1)
                 {                                 //按键复位
                  for(;kcounter<5;)              //按键循环5次
                  {
                   if(~!INTPUT2)                  //按键高电平
                   {
                   LowVoltKey();
                   }
                   else if(!INTPUT2)             //按键低电平
                   {
                   HighVoltKey();
                   }
                  }
                  if(kstatus>=4)                 /*按键状态标志大于等于3为有效值*/
                  {                              /*循环检测 */
                  MOTORY_RUN=0;                     //Y轴启动启动标志
                  }
                 }
/***************更新X轴电机速度***********************/
                  RstKey();    
                  for(;kcounter<5;)              //按键循环5次
                  {
                   if(!INTPUT3)                  //按键低电平
                   {
                   LowVoltKey();
                   }
                   else if(~!INTPUT3)            //按键高电平
                   {
                   HighVoltKey();
                   }
                  }
                  if(kstatus>=4)                 /*按键状态标志大于等于3为有效值*/
                  {                              /*循环检测 */
                   ADvalue_x=ADC_P10()/10;         //
                   }
/***************更新Y轴电机速度***********************/
                  RstKey();    
                  for(;kcounter<5;)              //按键循环5次
                  {
                   if(!INTPUT4)                  //按键低电平
                   {
                   LowVoltKey();
                   }
                   else if(~!INTPUT4)            //按键高电平
                   {
                   HighVoltKey();
                   }
                  }
                  if(kstatus>=4)                 /*按键状态标志大于等于3为有效值*/
                  {                              /*循环检测 */
                   ADvalue_y=ADC_P11()/10;         //
                  }
/**************************************/
                }     
               }                    //L334  CODE 1995    2021 2 28
                                             

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值