|
开发板已经到手很长时间了(好像我是最早邮到的哦!),可因为工作太忙并没有太过深入的了解。再加上刚又出了一个月的差,原本准备用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 */
|
|