2430|0

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

【PSoC4心得】雨刮器设计(暂未完成) [复制链接]

开发板已经到手很长时间了(好像我是最早邮到的哦!),可因为工作太忙并没有太过深入的了解。再加上刚又出了一个月的差,原本准备用PSoC开发的雨刮器也没有设计完。现在我把设计过程中的心得与大家分享,并会在后面附上我所编写的程序(虽然未完全调通,逐步调试中,供参考)。

心得:1、芯片的模块化设计。许多功能只需从右侧拖入相应模块(如定时器)即相当于编写了相应程序(另少量编写即可)。
          2、在线可调试。可以边改程序边调试。
          3、芯片保密性高。通一款芯片中的内容可能完全不同(应用模块不同)。
          4、例程丰富。没个功能模块均有相应例程,方便学习借鉴。

程序:
#include
unsigned char n,i,a,b,bb=0,cc=0,n1;//变量定义
unsigned char fflag,ccflag,t5flag,t10flag,protect,jxflag;//标志位定义
//unsigned char first;
unsigned char P0du;
unsigned int nmin;
void running(void);
void delay(unsigned int k)
  { while(k>0)k--;}
void running (void) //雨刮运行子程序         
{
  if (protect==1) {goto runend;}
  for(b=1;b<=2;b++){delay(15000);} //由于机械原因,需要延时
  P4=1,P5=0;    //继电器控制雨刮正转,下端点p04=1,p05=0
  P12=1,P13=0;//P12=1,P13=0
  cc=0;
  bb=0;
  delay(3000);  //84ms
  do{                        
ddd: P0du=0;
     if (P0==0) {fflag=1;}  //检测有没有点动信号(P03=0),有点动fflag置位
     if (protect==1) {goto runend;}//10秒钟定时到,退出running子程序
     }
  while (P4==0);    //没到上端点就循环(P04=0),到上端点退出循环
     delay(2000); //56ms
     P0du=0;
  if (P4==0) {goto ddd;}//P04=0
  do{
trum: P0du=0;
     if (P0==0){fflag=1;}    //检测有没有点动信号(P03=0),有点动fflag置位
     if (protect==1) {goto runend;} //10秒钟定时到,退出running子程序
     }
  while(((P4==1)&&(P5==1)); //检测到没到下端点(P04=1,P05=1),没到下端点循环,到下端点退出循环
     delay(500);//14ms
     P0du=0;
  if  ((P4==1)&&(P5==1)) {goto trum;}//去抖动
  else {
        P4=1,P5=0;    //到达下端点继电器关闭,下端点p04=1,p05=0
        P12=0,P13=0;//P12=0,P13=0
     protect=0;  //清5分钟标志位
     nmin=0;
        for(b=1;b<=2;b++){delay(15000);}  //由于机械原因,需要延时0.75s
        }
//继电器控制雨刮反转                  
  P4=0,P5=1;    //继电器控制雨刮反转,上端点p04=0,p05=1
  P12=0,P13=1;//P12=0,P13=1
  delay(3000);  //84ms
  do{                        
ddd1: P0du=0;
     if (P3==0) {fflag=1;}  //检测有没有点动信号(P03=0),有点动fflag置位
     if (protect==1) {goto runend;} //12秒钟定时到,退出running子程序
     }
  while (P5==0)); //没到上端点就循环(P05=0),到上端点退出循环
     delay(2000); //56ms
     P0du=0;
  if (P5==0) {goto ddd1;}//P05=0
  do{                  
trum1: P0du=0;
      if (P3==0) {fflag=1;}  //检测有没有点动信号(P03=0),有点动fflag置位
      if (protect==1) {goto runend;}// 12秒钟定时到,退出running子程序
     }
  while(((P4==1)&&(P5==1)); //没到上端点循环,到端点退出循环
     delay(500);//14ms
     P0du=0;
  if  (((P4==1)&&(P5==1)) {goto trum1;}//去抖动
  else{
runend: P4=0,P5=1;    //到达上端点继电器关闭,上端点p04=0,p05=1
        P12=0,P13=0;//P12=0,P13=0
   //for(b=1;b<=3;b++){delay(10000);} //由于机械原因,需要延时0.5s
   }
}
void My_C_Function()
{
  //Timer16_1_Stop();    //定时器关闭,重载
  n++;
  nmin++;
  if (n==2) {jxflag=1;}      //100ms间隙标志
  if (n==60) {t5flag=1;}      //3s
  if (n==120) {t10flag=1;}     //6s
  if (nmin==240) {protect=1;}   //12s   
  //Timer16_2_Start();//开定时器
}
void diandong (void) //分为运行时点动和单独按点动
{
diandongloop:if (fflag==1)   
              {   //如接收到标志位信号,雨刮连续运行两次
            fflag=0;
         running();
         running();
         goto diandongloop;
               }
           P0du=0;
       while (P3==0)  
           { //查询是否有电动信号触发(P03=0) 如果有就连刮三次
       delay(1000);  //去抖  28ms
             P0du=0;
             if (P3==0)  
              {  running();
                 running();
        fflag=0;
                 running();
        goto diandongloop;
          }
      }
}
main()
{
// M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
  P12=0,P13=0;    //继电器初始化//
                     //P12=0,P13=0
  //端口初始化已设置//
  P0=0;
  P1=0;
  P2=0;
  P3=0;
  P4=0;
  P5=0;
  P6=0;
  //连续p00,5s间隙p01,10s间隙p02,点动p03,位置p04、p05,爬坡p06//
//-----------中断初始化-----------------//
  M8C_DisableGInt ; //关总中断
  T1_Stop(); //关定时器0
  T1_EnableInt();//定时器中断使能
  // M8C_EnableGInt ; //开总中断
  delay(20000);//0.6s
  ccflag=0;
  protect=0;
//--------------------------------------------不正常断电复位---------------------------
      P0du=0;
if ((P4==0)&& (P5=0)) //如在复位位置(p04=p05=0),循环运行
  {  
    ccflag=1;goto loop1;}
    if(P4==0) {goto loop1;} //如在上断点(p04 =0),则爬坡
    else
  {
       T1_Start();//开定时器
       M8C_EnableGInt ; //开总中断         
       P4=0,P5=1;    //继电器控制雨刮反转,上端点p04=0,p05=1
       P12=0,P13=1;//P12=0,P13=1
fault1: do{                        
         P0du=0;
           if (protect==1) {goto runen;}//12s定时到,退出到runen
        }
       while ((P5=0)&&(P4=1));  //在下端点就循环(p05=0,p04=1),没在下端点退出
         delay(1000);//28ms
         P0du=0;
       if ((P5=0)&&(P4=1)){ goto fault1;}  //去抖延时
fault2: do{                  
        P0du=0;
           if (protect==1) {goto runen;}
        }
       while((P5=1)&&(P4=1));   //没到上端点循环(p05=1,p04=1),到上端点退出循环
     delay(1000);//28ms
        P0du=0;
       if ((P5=1)&&(P4=1)) {goto fault2;}  //去抖延时
        ccflag=0;
runen:  P12=0,P13=0;    //关电
                        //P12=0,P13=0
       // delay(15000);//由于机械原因,需要延时
     cc=0;
      }
     //-----------------------------------------------------------------------------------------
while(1){
            P0=0;
            P1=0;
            P2=0;
            P3=0;
            P4=0;
            P5=0;
            P6=0;
           delay(2);
loop1: //--------------连续档位---------------------------------  
           P0du=0;
          if (p0=0)
           { //连续信号触发(p00=0)
             ccflag=0; nmin=0; protect=0;
          delay(2000); //56ms
loop11:      P0du=0;
         if (P0==0)
          {  
         T1_Start();//开定时器
               M8C_EnableGInt ; //开总中断
               running();
               cc=0;
            goto loop11;
           }
         }
         fflag=0;
   //---------------------------5s档位------------------------------------
         P0du=PRT0DR;
        if (P1==0)
         { //5s定时信号触发(p01=0)
        delay(2000);//去抖56ms
           P0du=0;
          if (P1==1) {goto loop1;}         
       ccflag=0;
          nmin=0;
          protect=0;         
          T1_Start();//开定时器
          M8C_EnableGInt ; //开总中断
loop2:   running();//雨刮运行一次                                       
loop22:   diandong();   //判断是否有点动信号,包括运行中和静止时两种
       n=0; jxflag=0; t5flag=0; nmin=0;
loop3:   nmin=0;
          if (t5flag==1)
     { //到5s重置定时器running一次
             goto loop2;
            }
       P0du=0;
         if (P1==0)
          { //5档位依然按下P0du=PRT0DR;           
            if (p3=0) {goto loop22;}  //点动按键按下则重置定时器(p03=0),运行点动子程序
            else {goto loop3;}   //否则等待五秒到时
           }
      cc=140;
      delay(1000); //28ms
         P0du=0;
        if (P1==0) {goto loop3;} //P01==0去除抖动
     //delay(1000);
        if ((P0==1)&&( P1==1)&&( P2==1)) //没有按键按下去抖(p00=p01=p02=1)
         {
        if (jxflag==1) {goto loop2;}
           else {goto t10min;}  //运行一次去复位 直接冲上去
       }
     }
//--------------------------10s档位------------------------------------------   
    P0du=0;
      if (P2==0)  //(p02=0)
       { //10s定时信号触发
      delay(2000);   //去抖56ms
         P0du=0;
     if (P2==0) {goto loop1;}
     ccflag=0; nmin=0; protect=0;
     T1_Start();//开定时器
        M8C_EnableGInt ; //开总中断
loop4:  running();//雨刮运行一次
loop44: diandong();
     n=0; t10flag=0;jxflag=0; nmin=0;
loop5: nmin=0;
        if (t10flag==1)
         { //到10s重置定时器running一次
          goto loop4;
          }
         P0du=0;
     if (P2=0) //(p02=0)
         {              
           if (P3==0) {goto loop44;}//点动
           else {goto loop5;}
          }
     cc=140;
     delay(1000);//28ms
         P0du=0;
       if (P2==0)) {goto loop5;}     //P02==0去除抖动
      //delay(1000);
       if ((P0==1)&&( P1==1)&&( P2==1)) //没有按键按下去抖(p00=p01=p02=1)
        {
       if (jxflag==1) {goto loop4;}
          else {goto t10min;}    //运行一次去复位 直接冲上去
      }
       }
//-----------------------------点动-------------------------------------   
       P0du=0;
     if (P3==0)
      {   
        ccflag=0;  nmin=0; protect=0;
     delay(2000);//56ms
dian:  P0du=0;
        if (P3==0)
         {  
        T1_Start();//开定时器
           M8C_EnableGInt ; //开总中断 //点动档位
        running();   //连刮三次
        running();
        running();
        fflag=0;
        cc=0;
       goto dian;                     
       }
    }
  //--------------------------------------------------------------------   
t10min: if (protect==1)
         { //20s定时保护
           P12=0,P13=0;    //关电
                           //P12=0,P13=0
        M8C_DisableGInt ; //关总中断
           T1_Stop(); //关定时器0
        cc=0;
        n=0;
           P0du=0;
        if ((P4==0)) &&( P5==1))
            { //上端点卡死保护
           if((P0==0)||( P1=00)||( P2==0)||( P3==0))  //(p00=p01=p02=p03=0)
               { protect=0;nmin=0;goto loop1;}
           else { goto t10min;}
          }
           else
            { //运行中卡死保护   
              if((P0==0)||( P1=00)||( P2==0)||( P3==0))  //(p00=p01=p02=p03=0)
               { goto t10min;}
           else {protect=0;nmin=0;goto loop1;}
          }
       }
  //------------------------是否复位 -----------------
//reset: if (ccflag==1) { goto loop1;} //如已复位,继续循环
        P0du=PRT0DR;
      if (P6=0) { ccflag=1;goto loop1;}  //p06=0不复位,p06=1执行复位
      if (((P4=1)||( P5=1))  //(p04=1,或者是p05=1)
       {
      cc++;
      if (cc==150)
          { //如果没有复位,到50毫秒执行复位   
         n=0;
            P12=0;   
            P13=1;  //P12=0,P13=1
        }
     }
       P0du=0;
      if ((P4==0)&& (P5==0))  //(p04=p05=0)
       {
      delay(2000); //56ms
         P0du=0;
         if  ((P4==0)&& (P5==0))
          {
         P12=0;    //关电
            P13=0;//P12=0,P13=0
         cc=0;
         ccflag=1;
         protect=0;
         nmin=0;
         n=0;
         M8C_DisableGInt ; //关总中断
            T1_Stop(); //关定时器0
        }
        }
   }//while(1)
// Insert your main routine code here.
}
/* [] END OF FILE */
此帖出自单片机论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表