#define uint unsigned int
#define uchar unsigned char
#define N 9
__CONFIG(0X31E4); // 定义芯片工作时的配置位
uchar k,ads; //off堵转后马上回到关闭档马上转动
uchar start,start1,start2,kkkk; //start为启动一次标志位 start1为堵转保护启动标志位
uchar mo_stop;
uchar ssss,num;
///////////////////////////////////////////////////////////////////////////////////////
uchar adtongdao(uchar channel);
void delay(uint time);
void init(); // I/O口初始化函数申明
void mode_select(); // ADC函数申明
void off_mode();
void auto_mode();
void low_mode();
void high_mode();
void anion(); //负离子监测,
void motor_stop();
void voltage_test();
void st1();
///////////////////////////////////////////////////////////////////////////////////////
void main()
{
init();
while(1)
{
voltage_test();
}
}
uchar adtongdao(uchar channel)
{
uchar s,k,temp,i,j;
uchar bian[N]={0,0,0,0,0};
uint ADRES=0; //累加和注意清零
for(s=0;s channel&=0x07; ADCON0&=0x01; //ADON=1;,flag ADCON0|=(channel<<2); delay(1); GODONE=1; while(GODONE) continue; //while(GODONE==1) 注意程序简洁 k++; bian[k]=ADRESH; if(k==N) { k=0; for(i=0;i if(bian[i]>bian[j]) { temp=bian[i]; bian[i]=bian[j]; bian[j]=temp; } } } } for(i=3;i ads=(uchar)(ADRES/(N-6)); return ads; //仅仅返回高位值 } void delay(uint time) //1ms延时 { uint x,y; for(x=110;x>0;x--) for(y=time;y>0;y--); } void init() //初始化函数 { CMCON=0x07; //比较器控制寄存器,比较器关断 PORTA=0x00; OSCCAL=0x80; //内部振荡器校准寄存器,中心频率4MHz OPTION=0x7F; //选择寄存器,使能弱上拉功能 INTCON=0x00; //中断控制寄存器,禁止所有中断 T1CON=0x00; //Timer1控制寄存器 PIE1=0x00; //外设中断使能寄存器,禁止EE写完成中断、A/D转换中断、比较器中断 WPUA=0x13; //使能弱上拉 CMCON=0x07; //比较器控制寄存器,比较器关断 IOCA=0x00; //电平变换中断控制寄存器,禁止电平变化中断 ADCON1=0x00; //A/D转换时钟频率选择: ADCON0=0X01; //采用左对齐 TRISA=0x1B; //0001 1011 TRISC=0x3F; //PORTC输入 ANSEL=0xFB; //AN3~AN7作为A/D模块的模拟信号输入 start=1; start1=1; start2=1; } void mode_select() // 工作模式选择 { uchar ADCR,i; if(kkkk==1) //堵转后返回OFF档位时判断从新开始 { kkkk=0; for(i=0;i<255;i++) //约4秒 255*16=4000 { ADCR=adtongdao(4); if(ADCR<=55) delay(16); else if(ADCR>55) break; } } ADCR=adtongdao(4); if (ADCR<=2) { if(k<4) high_mode(); } else if (ADCR<=20) { if(k<4) low_mode(); } else if (ADCR<=55) { if(k<4) auto_mode(); } else off_mode(); } void high_mode() { if(start1==1) { start1=0; if(start2==1){start2=0;delay(4000);} //在档位上重新上电延时和进口主板现象一致 st1(); } if(mo_stop<2) { if(ssss==1) { delay(3000); CMCON=0x07; RA0=0; RA1=0; RA2=0; RA5=0; } else { CMCON=0x0D; VRCON=0x87; ssss=1; if(num<3) anion(); } } else { CMCON=0x0D; VRCON=0x87; if(num<3) anion(); } } void low_mode() { if(start1==1) { start1=0; if(start2==1){start2=0;delay(4000);} //在档位上重新上电延时和进口主板现象一致,实际从低档测试时候把 delay(4000)可以该小一点 st1(); } if(mo_stop<2) { if(ssss==1) { delay(3000); CMCON=0x07; RA0=0; RA1=0; RA2=0; RA5=0; } else { CMCON=0x0D; VRCON=0x82; if(num<3) anion(); ssss=1; } } else { CMCON=0x0D; VRCON=0x82; if(num<3) anion(); } } void auto_mode() { uchar auto_ad; auto_ad=adtongdao(7); start1=0; //屏蔽高、低之间的推力 if(start2==1){start2=0;delay(4000);} //在档位上重新上电延时和进口主板现象一致 st1(); if(auto_ad>72&&auto_ad<180) //80对应电压值为1.5V左右、145对应3.7V { if(mo_stop<2) { if(ssss==1) { delay(3000); CMCON=0x07; RA0=0; RA1=0; RA2=0; RA5=0; } else { CMCON=0x0D; VRCON=0x87; if(num<3) anion(); ssss=1; } } else { CMCON=0x0D; VRCON=0x87; if(num<3) anion(); } } e lse if(auto_ad>180) { if(mo_stop<2) { if(ssss==1) { delay(3000); CMCON=0x07; RA0=0; RA1=0; RA2=0; RA5=0; } else { CMCON=0x0D; VRCON=0x88; if(num<3) anion(); ssss=1; } } else { CMCON=0x0D; VRCON=0x88; if(num<3) anion(); } } else if(auto_ad<72) { if(mo_stop<2) { if(ssss==1) { delay(3000); CMCON=0x07; RA0=0; RA1=0; RA2=0; RA5=0; } else { CMCON=0x0D; VRCON=0x84; if(num<3) anion(); ssss=1; } } else { CMCON=0x0D; VRCON=0x84; if(num<3) //负离子拔插查2次 anion(); } } } void off_mode() { CMCON=0x07; //比较器控制寄存器 RA0=0; RA1=0; RA2=0; RA3=0; RA4=0; //堵转反馈 RA5=0; k=0; //控制电机堵转次数 start=1; //自动档启动时候仅仅一次保护标志位 start1=0; start2=0; //克服掉自动档启动时候的沿时 ssss=0; //控制启动时拔电机 num=0; //控制负离子拔插次数 } void anion() { uchar anion_ad,kk; // 初值设置为ss=1,可以让程序一直执行程序 RA5=1; delay(5); // 注意调节时间,注意实时性 anion_ad=adtongdao(5); if((anion_ad>2)&&(anion_ad<25)) { RA5=1; kk=1; } else { RA5=0; if(kk==1){kk=0;num++;}//num<3 其实加到3结束 delay(2000); } } void motor_stop() { mo_stop=adtongdao(3); if(mo_stop>130) //马达正常运转时候,AN3对应的最高电压值为:3.43V左右,对应的AD值约为:175 { delay(1); if(mo_stop>130) //35为单片机进行电流监测电流最小值 { CMCON=0x07; //比较器控制寄存器 RA0=0; RA1=0; RA2=0; RA3=0; RA4=0; start=1; start1=1; delay(2000); kkkk=1; k++; if(k==4) RA5=0; } } } void voltage_test() { uchar vo_test; vo_test=adtongdao(6); if((vo_test<70)||(vo_test>130)) //70对应工作电压为9.1V,130对应工作电压为:16.1V { delay(1); if((vo_test<70)||(vo_test>130)) { CMCON=0x07; //比较器控制寄存器 PORTA=0; //关闭负离子 } } else { motor_stop(); mode_select(); } } void st1() { if(start==1) { start=0; RA2=1; delay(1); RA2=0; RA2=1; delay(1); RA2=0; RA2=1; delay(2); RA2=0; RA2=1; delay(2); RA2=0; RA2=1; delay(2); RA2=0; RA2=1; delay(2); RA2=0; RA2=1; delay(3); RA2=0; RA2=1; delay(4); RA2=0; RA1=1; delay(4); RA2=0; RA1=1; delay(5); RA2=0; RA1=1; delay(6); RA2=0; delay(4); RA2=1; delay(7); RA2=0; delay(5); RA2=1; delay(8); RA2=0; delay(6); RA2=1; delay(9); RA2=0; delay(7); RA2=1; delay(10); RA2=0; delay(8); RA2=1; delay(11); RA2=0; delay(9); RA2=1; delay(11); RA2=0; delay(10); RA2=1; delay(12); RA2=0; delay(11); RA2=1; delay(13); RA2=0; delay(12); RA2=1; delay(14); RA2=0; delay(13); RA2=1; delay(15); RA2=0; delay(14); RA2=1; delay(17); RA2=0; delay(16); RA2=1; delay(18); RA2=0; delay(17); RA2=1; delay(19); RA2=0; delay(20); RA2=1; delay(20); RA2=0; delay(25); RA2=1; delay(22); RA2=0; delay(30); RA2=1; delay(24); RA2=0; delay(35); RA2=1; delay(25); RA2=0; delay(40); RA2=1; delay(28); RA2=0; delay(43); RA2=1; delay(29); RA2=0; delay(45); RA2=1; delay(30); RA2=0; delay(50); RA2=1; delay(35); RA2=0; delay(55); RA2=1; delay(40); RA2=0; delay(60); RA2=1; delay(45); RA2=0; delay(65); RA2=1; delay(50); } }