STC MCU单片机引脚封装 及多个按键低电平检测C语言

发布于:2025-07-12 ⋅ 阅读:(15) ⋅ 点赞:(0)

/***三个按键同为低电平开电机,外中断0关电机输出****/
/***2024 2 15 *L210 CODE409***********************/
              #include     <reg52.h>                //
              #include     <intrins.H>                     //工位零点完成开定时器0
              #define      uchar unsigned char      //
              #define      uint  unsigned int       //
              bit          Signauto;     //
              uchar        vala;             //
              uchar        val12;
              uchar        kcounter,kstatus;               //按键计数标志 按键状态标志
              uchar        k_counter;                       
              uchar        k_status;
              sbit         EX_INT0=P3^2;                   //电机
              sbit         IntPut2=P6^7;                     //产品检测
              sbit         IntPut3=P6^6;                     //夹具检测
              sbit         IntPut4=P6^5;                    //过桥退检测
              sbit         OutPut1=P0^0;                   //电机
              sbit         OutPut2=P0^1;                   //报警
              sbit         OutPut3=P7^4;                   //
              sbit         OutPut4=P7^5;                   //
              sbit         OutPut5=P7^6;                   //
              sbit         OutPut6=P7^7;                   //
              sbit         OutPut7=P0^3; 
              sbit         OutPut8=P0^4; 
              sbit         OutA=P6^0;                   //
              sbit         OutB=P0^5;                   //
/*------------------延时子程序------------------------*/
              void delay10ms(uint x)
              {
               uint i, j;
               for (i=0;i<x;i++)
               for (j=0;j<500;j++);
              }
/*-----------延时100ms子程序12MHz --------*/
              void Delay_100ms(uint x)          //
              {
               uint i,j;
               for(i=0;i<x;i++)
               {
               for(j=0;j<18000;j++);
               }
              }
/****************按键计数器状态寄存器归零*************/
              void RstKey()
              {
              kcounter=0;                        //按键计数器归零
              kstatus=0;                         //状态寄存器归零
              }
/*****************按键低电平检测函数*****************/
              void   LowVoltKey(void)            //按键计数器状态标志加一
              {
              kcounter++;                       
              kstatus++;     
              _nop_();                           //延时                  
              }
/*****************按键高电平检测函数*****************/
              void    HighVoltKey(void)          //按键计数器加一 状态标志归零
              {
              kcounter++;                        //按键计数器加一
              kstatus=0;                         //按键状态标志归零
              _nop_();                           //延时
              }
/****************按键计数器状态寄存器归零*************/
              void Rst_Key()
              {
              k_counter=0;                        //按键计数器归零
              k_status=0;                         //状态寄存器归零
              }
/*****************按键低电平检测函数*****************/
              void   Low_VoltKey(void)            //按键计数器状态标志加一
              {
              k_counter++;                       
              k_status++;     
              _nop_();                           //延时                  
              }
/*****************按键高电平检测函数*****************/
              void    High_VoltKey(void)          //按键计数器加一 状态标志归零
              {
              k_counter++;                        //按键计数器加一
              k_status=0;                         //按键状态标志归零
              _nop_();                           //延时
              }
/*************报警闪烁*************************/
              void Motor_Warning()
              {
               for(;vala<10;)               //按键循环10
               {
               vala++;
               OutPut2=~OutPut2;            //报警
               delay10ms(50);                 //等待外部中断0完成
               }
              }
/*************循环闪烁*************************/
              void Led_Run()
              {
               vala=0;
               for(;vala<20;)                //按键循环10
               {
               vala++;
               OutPut3=~OutPut3;             //
               OutPut4=~OutPut4;             //
               OutPut5=~OutPut5;             //
               OutPut6=~OutPut6;             //
               Delay_100ms(50);                 //                 //等待外部中断0完成
               }
               OutPut3=1;             //
               OutPut4=1;             //
               OutPut5=1;             //
               OutPut6=1;             //
              }
/*************三个端口都为低电平电机旋转****/
/*************三个端口都为低电平电机旋转****/
                void Read_Intput(uchar times,uchar val)
                {
                vala=0;
                OutA=0;                          //进入指示
                while(times)
                {
                 times--;
                 RstKey();
                 for(;kcounter<5;)              //按键循环10
                 {
                 if(!IntPut2&&!IntPut3&&!IntPut4)//过桥退 机座退 润滑退
                  {
                  LowVoltKey();                  //按键低电平 计数器加一状态标志加一
                  }
                  else if(~!IntPut2||~!IntPut3||~!IntPut4) //按键高电平
                  {
                  HighVoltKey();                 //按键计数器加一 状态计数器归零
                  }
                 }
                 if(kstatus>=4)                  /*按键状态标志大于等于8为有效值*/
                 {
                 OutPut1=0;                      //电机开
                 OutB=1;
                 Signauto=1;                     /*行程输入信号检测标志无输入为1,永久循环*/
                  do                             /*行程输入信号检测标志无输入为1,永久循环*/
                  {
                   vala++;                       //检测外部中断0超时报警退出循环
                   Delay_100ms(50);                 //
                   if(vala>=val)                 //
                   {
                   Motor_Warning();
                   Signauto=0;                   //超时退出循环
                   OutB=0;                         //外部中断0超时未输入报警
                   times=0;                         //
                   }
                  }
                  while(Signauto);               //外部中断0检测到输入信号 退出循环
                 }
                 Delay_100ms(50);                 //
                 OutPut7=~OutPut7;             //
                 OutPut8=~OutPut8;             //
                }
               OutA=1;                          //退出指示
              }
/****************************************/                            
              void exint0() interrupt 0          //INT0中断入口
              {
               Rst_Key();
               for(;k_counter<5;)                 //按键循环5次
               {
                if(!EX_INT0)                      //按键低电平
                {
                Low_VoltKey();
                }
                else if(~!EX_INT0)               //按键高电平
                {
                High_VoltKey();
                }
               }
               if(k_status>=4)                    /*按键状态标志大于等于3为有效值*/
                {                                /*循环检测 */
                Signauto=0;                      //
                OutPut1=1;                         //旋转停止
                OutB=1;
                }
              }                
/***************************************/
              void  main()                       //
              {
               P0M0=0XFF;                        //推挽输出
               P0M1=0X00;                        //推挽输出
               P1M0=0XFF;                        //推挽输出
               P1M1=0X00;                        //推挽输出
               P2M0=0X00;                        //准双向输入
               P2M1=0X00;                        //准双向输入
               P3M0=0X00;                        //准双向输入
               P3M1=0X00;                        //准双向输入
               P4M0=0XE1;                        //P4.0 4.5 4.6 4.7推挽输出
               P4M1=0X00;                        //P4.1 4.2 4.3 4.4准双向输入
               P5M0=(P5M0&~0x03)|0x3C;           //P5.2 5.3 5.4 5.5推挽输出
               P5M1&=~0x3F;                      //P5.0 5.1 准双向输入
               P6M0=0X0F;                        //P6.0 6.1 6.2 6.3推挽输出
               P6M1=0;                           //P6.4 6.5 6.6 6.7准双向输入
               P7M0=0XF0;                        //P7.4 7.5 7.6 7.7推挽输出
               P7M1=0X00;                        //P7.0 7.1 7.2 7.3准双向输入
               IT0=1;                            //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)
               EX0=1;                            //使能INT0中断
               EA=1;                             //
               val12=10;
               while(1)                            //
                {
                Read_Intput(6,val12);             //循环次数 检测超时
                Delay_100ms(50);                 //
                Led_Run();
                }                                 //
              }                                  //L210 CODE409


网站公告

今日签到

点亮在社区的每一天
去签到