资讯详情

STC15W404AS 板调节电位器读P1.0 P1.1AD测试直流电机速度

/***测试直流电机的速度 读P1.0 P1.1ADpast***/ /***STC15W404AS 板L331 CODE2251 2021 1 5显示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 sfr P1ASF=0x9D; //P1口第二功能控制寄存器 uint ADvalue_x,ADvalue_y; //存放AD转换返回结果 #define ADC_SPEEDLL 0x00 //540个时钟 uint aa=0; /****RUN FLAG****/ sbit INTPUT1=P5^4; sbit INTPUT2=P5^5; sbit INTPUT3=P1^4; sbit INTPUT4=P1^5; sbit OUT1=P3^2; sbit OUT2=P3^3; sbit P_WM1=P3^6; // sbit P_WM2=P3^7; // uint SPEED; //速度 uint ZERO=0; // uint Ad_data; uchar i; ///循环总变量i bit Receive_Flag; bit Read_Flag; ///定时器计数读AD标志 bit MOTORRUN; &nbp;          uchar        kcounter,kstatus;     //按键计数标志 按键状态标志               uint         a[10];             //定义数组a 存储串口数据串 /*---------------延时子程序----------------*/               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 MOTFORWARD()                 {                MOTORRUN=1;                printf("n0.val=%d\xff\xff\xff",SPEED);    //电机速度                while(MOTORRUN)                            //电机循环标志,串口停机中断                {                 if(!INTPUT3)                     //功能键                  {                   for(;kcounter<5;)              //按键循环5次                   {                    if(!INTPUT3)                  //按键低电平                    {                    LowVoltKey();                    }                    else if(~!INTPUT3)            //按键高电平                    {                    HighVoltKey();                    }                   }                   if(kstatus>=4)                 /*按键状态标志大于等于3为有效值*/                   {                              /*循环检测 */                    ADvalue_x=ADC_P10()/10;         //                    printf("n0.val=%d\xff\xff\xff",ADvalue_x);    //电机速度                    SPEED=ADvalue_x;                   }                  }                 P_WM1=0;                        delay(SPEED);                 P_WM1=1;                 delay(102-SPEED);                }                printf("n0.val=%d\xff\xff\xff",ZERO);    //电机速度               } /*****************/               void MOTBACK()                   {                MOTORRUN=1;                printf("n0.val=%d\xff\xff\xff",SPEED);    //电机速度                while(MOTORRUN)                            //电机循环标志,串口停机中断                {                 if(!INTPUT4)                     //功能键                  {                   for(;kcounter<5;)              //按键循环5次                   {                    if(!INTPUT4)                  //按键低电平                    {                    LowVoltKey();                    }                    else if(~!INTPUT4)            //按键高电平                    {                    HighVoltKey();                    }                   }                   if(kstatus>=4)                 /*按键状态标志大于等于3为有效值*/                   {                              /*循环检测 */                    ADvalue_y=ADC_P11()/10;         //                    printf("n1.val=%d\xff\xff\xff",ADvalue_y);    //电机速度                    SPEED=ADvalue_y;                   }                  }                 P_WM2=0;                        delay(SPEED);                 P_WM2=1;                 delay(102-SPEED);                }                 printf("n0.val=%d\xff\xff\xff",ZERO);    //电机速度               } /*------------初始化串口---------------------*/               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 timer0() interrupt 1                {                TH0=0X53;                TL0=0X32;                aa++;                if(aa>=300)                    {                  ADvalue_y=ADC_P11()/10;                    //                  ADvalue_x=ADC_P10()/10;         //                   OUT1=~OUT1;                  aa=0;                  Read_Flag=1;      //计数器计数300,读AD一次                 }                } /*×--------UART 中断服务程序-------------------**/ /**×**把接收到的数据存进数组a[i]**i开机初始化****/ /***×*接收到触摸屏结束码Receive_Flag标志位置1****/ /****×主程序检测到标志码=1判断指令功能***********/               void Uart() interrupt 4 using 1               {                if(RI)                {                 if(SBUF==0XFA)                     //触摸屏结束码                 {                 Receive_Flag=1;                     //接收数据标志置一                 RI=0;                             //                 i=0;                             //数组计数器归零                 }                 else                 {                 a[i]=SBUF;                        //数组下标位置的数据等于SBUF                 RI=0;                              //                 i++;                 }                }                if(Receive_Flag==1)                  //设备停止 退出循环                {                 if(a[0]==0XE0)                     //                 {                  if(a[1]==0X04)                     //关电机输出                   {                  MOTORRUN=0;                     //电机输出                      Receive_Flag=1;                 //接收数据标志置一                  i=0;                            //串口计数器归零                  }                 }                }               } /*************************************************/               void   main( )                      /*主程序开始*/               {                reset_io();                AUXR=0X80;                         //STC系列的1T 设置                TMOD=0X01;                P_SW1=0x00;                       //RXD/P3.0, TXD/P3.1                TH0=0X53;                TL0=0X32;                ET0=1;                TR0=1;                Receive_Flag=0;                    InitUart();                        //初始化串口                printf("0XFF,0XFF,0XFF");                i=0;                               //数据接收计数器等于0                MOTORRUN=0;                Read_Flag=0;                                    //读AD标志置零                while(1)            //INTPUT1                {                  delay1(10); /***************开机键检测*************/                  RstKey();                         //按键复位                  if(!INTPUT1)                     //功能键                  {                   for(;kcounter<5;)              //按键循环5次                   {                    if(!INTPUT1)                  //按键低电平                    {                    LowVoltKey();                    }                    else if(~!INTPUT1)            //按键高电平                    {                    HighVoltKey();                    }                   }                   if(kstatus>=4)                 /*按键状态标志大于等于3为有效值*/                   {                              /*循环检测 */                   TR0=0;                   SPEED=ADvalue_x;                   MOTFORWARD();                     //前进                   }                  } /**************************************/                  RstKey();                         //按键复位                  if(!INTPUT2)                     //功能键                  {                   for(;kcounter<5;)              //按键循环5次                   {                    if(!INTPUT2)                  //按键低电平                    {                    LowVoltKey();                    }                    else if(~!INTPUT2)            //按键高电平                    {                    HighVoltKey();                    }                   }                   if(kstatus>=4)                 /*按键状态标志大于等于3为有效值*/                   {                              /*循环检测 */                    TR0=0;                    SPEED=ADvalue_y;                    MOTBACK();                     //后退                   }                  } /**************************************/                  if(Read_Flag==1)                 //定时器AD值刷新标志                  {                   ADvalue_x=ADC_P10()/10;         //                   printf("n0.val=%d\xff\xff\xff",ADvalue_y);    //电机速度                   ADvalue_y=ADC_P11()/10;                    //                   printf("n1.val=%d\xff\xff\xff",ADvalue_x);    //电机速度                   Read_Flag=0;                                    //读AD标志置零                  }                 }                     }                    //L331  CODE 2251    2021 2 7                                              

标签: 电位器l0

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台