IAP15W413直流电机正反转

/***触摸屏下位机测试直流电机正反转past***/    
/***IAP15W413板2020 12 18*L211 CODE1666**/    
              #include     <REG52.H>  
              #include     <intrins.h>
              #include     <string.h>
              #include     "stdio.h"
              #include     <stdlib.h>
              #define      uint unsigned int
              #define      uchar unsigned char
              sbit         INTPUT1=P3^3;
              sbit         INTPUT2=P3^2;
              sbit         OUT1=P3^4;          //四个备用输出
              sbit         OUT2=P3^5;          //四个备用输出
              sbit         OUT3=P3^6;           //四个备用输出
              sbit         OUT4=P3^7;          //四个备用输出
              sbit         P_WM1=P1^5;          //
              sbit         EN=P1^4;              //
              sbit         P_WM2=P1^3;          //
              uint         SPEED;             //速度
              uint         ZERO=0;            //
              uint         Ad_data;
              uchar        i;                 //循环总变量i
              bit           Receive_Flag;
              bit          Run_Flag;
              bit          MOTORRUN;
              uchar        kcounter,kstatus;     //按键计数标志 按键状态标志
              uint         a[10];             //定义数组a 存储串口数据串
/*---------------延时子程序----------------*/
              void delay (uint ms)
              {
              uint i,j;
              for(i=0;i<ms;i++)
              for(j=0;j<2;j++)
              OUT1=~OUT1;
              ;
              }
/*************关所有输出*******************************/             
               void reset_io()
               {
               P_WM1=1;
               P_WM2=1;
               EN=1;
               OUT1=1;                         //电机A运行指示关
               OUT2=1;                         //电机B运行指示关
               OUT3=1;                         //电机C运行指示关
               OUT4=1;                         //电机D运行指示关
               }
/****************按键计数器状态寄存器归零*************/
               void RstKey()
               {
               kcounter=0;                       //按键计数器归零
               kstatus=0;                        //状态寄存器归零
               }
/*****************按键低电平检测函数*****************/
               void   LowVoltKey(void)           //按键计数器状态标志加一
               {
               kcounter++;                       
               kstatus++;     
               delay(5);                         //延时                  
               }
/*****************按键高电平检测函数*****************/
               void    HighVoltKey(void)         //按键计数器加一 状态标志归零
               {
               kcounter++;                       //按键计数器加一
               kstatus=0;                        //按键状态标志归零
               delay(5);                         //延时
               }
/*****************/
              void MOTFORWARD()  
              {
               EN=0;
               MOTORRUN=1;
               printf("n0.val=%d\xff\xff\xff",SPEED);    //电机速度
               while(MOTORRUN)                            //电机循环标志,串口停机中断
               {
                P_WM1=0;    
                   delay(SPEED);
                P_WM1=1;
                delay(100-SPEED);
               }
               EN=1;
               printf("n0.val=%d\xff\xff\xff",ZERO);    //电机速度
              }
/*****************/
              void MOTBACK()     
              {
               EN=0;
               MOTORRUN=1;
               printf("n0.val=%d\xff\xff\xff",SPEED);    //电机速度
               while(MOTORRUN)                            //电机循环标志,串口停机中断
               {
                P_WM2=0;    
                   delay(SPEED);
                P_WM2=1;
                delay(100-SPEED);
               }
               EN=1;
               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;
              }
/*×--------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
               Receive_Flag=0;    
               InitUart();                        //初始化串口
               delay(1000);
               printf("0XFF,0XFF,0XFF");
               i=0;                               //数据接收计数器等于0
               Run_Flag=0;
               MOTORRUN=0;
               while(1)            //INTPUT1
               {
/***************开机键检测*************/
                 RstKey();                         //按键复位
                 if(!INTPUT1)                     //功能键
                 {
                  for(;kcounter<5;)              //按键循环5次
                  {
                   if(!INTPUT1)                      //按键低电平
                   {
                   LowVoltKey();
                   }
                   else if(~!INTPUT1)             //按键高电平
                   {
                   HighVoltKey();
                   }
                  }
                  if(kstatus>=4)                 /*按键状态标志大于等于3为有效值*/
                  {                              /*循环检测 */
                  OUT3=~OUT3;
                  }
                 }

               if(Receive_Flag==1)
               {
               Receive_Flag=0;            //重新接收
               i=0;                     //串口计数器等于0
               if(a[0]==0XE0)            //写时间代码
                {
                 if(a[1]==0X00)            //
                  {
                  OUT1=0;
                  OUT2=1;
                  
                  MOTFORWARD();                //前进
                  }
                  else if(a[1]==0X02)    
                  {
                  OUT1=1;
                  OUT2=0;
                 
                  MOTBACK();                //后退
                  }
                 }
                  if(a[0]==0XE1)            //速度
                  {
                  SPEED=a[3]*256+a[2];                  //
                 }
                }  
             }     
            }                    //L211  CODE 1666    2020 12 18

/***2024 测试直流电机正反转past***/    
/***2024 11 21板2024 12 14 *L1287CODE5861**/    
              #include     <REG52.H>  
              #include     <intrins.h>
              #include     <string.h>
              #include     "stdio.h"
              #include     <stdlib.h>
              #define      uint unsigned int
              #define      uchar unsigned char
              sbit         OLED_SCL=P1^1;         //
              sbit         OLED_SDA=P1^0;         //
              sbit         INTPUT1=P1^2;         //电机A左行
              sbit         INTPUT2=P1^3;         //电机A右行
              sbit         INTPUT3=P1^4;         //电机B左行
              sbit         INTPUT4=P1^5;         //电机B右行
              sbit         D1_ADD=P5^4;             //
              sbit         D1_DEC=P1^6;             //
              sbit         D2_ADD=P5^5;             //
              sbit         D2_DEC=P1^7;             //
              sbit         L1_PWM=P3^5;             //
              sbit         L1_EN=P3^4;             // 高电平使能 低电平关闭
              sbit         R1_PWM=P3^6;             //
              sbit         R1_EN=P3^7;             //
              sbit         L2_PWM=P3^2;             //
              sbit         L2_EN=P3^0;             //
              sbit         R2_PWM=P3^1;             //
              sbit         R2_EN=P3^3;             //
              bit          MOTORARUN_L;             //电机A左行启动标志 0关闭 1启动
              bit          MOTORARUN_R;             //电机A右行启动标志 0关闭 1启动
              bit          MOTORBRUN_L;             //电机B左行启动标志 0关闭 1启动
              bit          MOTORBRUN_R;             //电机B右行启动标志 0关闭 1启动
              uchar        count = 0;
              uchar        aa;
              uchar        kcounter,kstatus;     //按键计数标志 按键状态标志
              uchar        time1,time2;             //电机占空比
              uchar        timeA,timeB;             //
              #define      high 1
              #define      low 0
              #define      uint unsigned int      //
              #define      uchar unsigned char      //
              #define      CMD_IDLE     0        //空闲模式
              #define      CMD_READ     1        //IAP字节读命令
              #define      CMD_PROGRAM  2        //IAP字节编程命令
              #define      CMD_ERASE    3        //IAP扇区擦除命令
              #define      ENABLE_IAP   0x82     //if SYSCLK<20MHz
              #define      IAP_ADDRESS  0x0000   //时间 EEPROM首地址
              #define      IAP_ADDRESS1 0x0200   //时间 EEPROM首地址
              typedef      unsigned char BYTE;     //Catch_Up接上Catch_Dwon接下
              typedef      unsigned int WORD;
uchar code show1[]=
{
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*"0",0*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"1",1*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*"2",2*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,/*"3",3*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,/*"4",4*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,/*"5",5*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,/*"6",6*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,/*"7",7*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*"8",8*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,/*"9",9*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x1F,0x01,0x01,0x01,0x01,0x1F,0x00,/*"A",10*/
0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,/*"D",11*/
0x08,0xF8,0x00,0xF8,0x00,0xF8,0x08,0x00,0x00,0x03,0x3E,0x01,0x3E,0x03,0x00,0x00,/*"W",12*/
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,/*"O",13*/
0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,/*"N",14*/
};    
uchar code show2[]=
{
0x08,0x08,0x08,0x08,0x88,0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值