1、
机车刮雨刷控制程序
精品文档
/********************************************
CPU==AT89C2051 F==11.0592MHZ
WXQ20160714 用于刮雨刷电机控制
********************************************/
//#include
2、ed char #define uint unsigned int #define ulong unsigned long //试验模式 #define TingZhi 0 #define JianXie 1 #define DiSu 2 #define GaoSu 3 #define NOP2 _nop_(); _nop_(); #define NOP4 _nop_(); _nop_(); _nop_(); _nop_(); //输入引脚定义 sbit dog
3、 P3^0; //喂狗信号 sbit J_X = P3^1; //间歇位 sbit Z_X = P3^2; //正向脉冲检测 sbit F_X = P3^3; //负向脉冲检测 sbit T_Z = P3^4; //停止位 sbit D_S = P3^5; //低速位 sbit G_S = P3^7; //高速位 //输出引脚定义 sbit HX_KZ = P1^0; //换向控制 sbit TJ_DD = P1
4、^1; //停机断电 sbit GS_KZ = P1^2; //高速控制 sbit DS_KZ = P1^3; //低速控制 sbit ResetPLC = P1^4; //复位PLC编码器 sbit L_R = P1^5; //电机复位时在左OR右 默认1=左 sbit KG2_KZ = P1^6; //开关2 IRF840 sbit V110_KZ = P1^7; //110V开关1 IRF840 uchar data t1s; //1秒钟计时寄存器 uint data Wo
5、rk_Mode; //工作模式寄存器 uchar data Y_zt,X_zt; //原状态,新状态 uchar bdata flg; sbit zxmc = flg^0; //正向脉冲标志位 sbit fxmc = flg^1; //负向脉冲标志位 sbit reset = flg^6; //复位编码器标志位 sbit t1sflg = flg^7; //1s定时标志 //*************以下为子程序***************** //延时10ms //***************************
6、 void delay10ms(void) { uchar i,j; for(i=0;i<24;i++) { dog = ~dog; for(j=0;j<250;j++) { ; } } } /******************************** CPU初始化程序 *********************************/ void Init_Mcu(void) { PCON=0; //DPS=0x00;
7、 TCON=0x00; TMOD=0x11; TH1=0x4C; TL1=0x00; TH0=0x4C; TL0=0x00; TR0 = 1; //t1定时方式1 16位定时用 50ms ET0 = 1; //PT0 = 1; //T0中断级别为高 //TR1 = 1; //ET1 = 1; //定时器1中断使能 //外部INT0 IT0 = 1; //Int0为下降沿触发 //PX0 = 1; //Int0中断级别为高 EX0 = 1; //I
8、nt0中断允许 测量步进电机频率信号 //外部INT1 IT1 = 1; //Int1为下降沿触发 20120920修正初始化值, //PX1 = 1; //Int1中断级别为高 EX1 = 1; //Int1中断中断禁止,实际用到时再打开 P1 = 0xFF; //开机所有输出关闭 flg = 0; //标志位清零 EA = 1; } //T0 50ms中断 void timer0() interrupt 1 { TH0=0x4C; //50ms中断一次 TL0=
9、0x11; t1s++; if(t1s>=20) { t1sflg = 1; t1s = 0 ; } } //延时N秒函数 void delNs(uchar s) { do { t1sflg = 0; while(t1sflg==0); s--; }while(s); } /************************************************************* void timer1() interrupt 3 //50ms定
10、时中断 { TH1=0x4C; TL1=0x00; } ***************************************************************/ //外中断0,用来检测正向脉冲 void int0() interrupt 0 { zxmc = 1; //正向到位 //fxmc = 0; //清楚负向脉冲 //if(Work_Mode>0) //{ //V110_KZ = 1; //关闭MOS //} } //外中断1,用来检测反向脉冲 void int1(
11、) interrupt 2 { fxmc = 1; //负向到位 //zxmc = 0; //清楚正向脉冲 //if(Work_Mode>0) //{ //V110_KZ = 1; //关闭MOS //} } //高低速控制 void GDS_KZ(uchar gds) { uchar jc=0; zxmc = 0; fxmc = 0; //高低速判断 V110_KZ = 1;//MOS关闭 if(gds) { GS_KZ = 0; DS_KZ
12、 = 1; } else { GS_KZ = 1; DS_KZ = 0; } HX_KZ = 0; //切换为正向 TJ_DD = 0; //停机开关闭合 V110_KZ = 0; //接通110V电源 while(zxmc==0); //等待正向到位信号 zxmc = 0; HX_KZ = 1; //切换为负向 V110_KZ = 0; //反向动作 while(fxmc==0); /
13、/等待反向到位信号 fxmc = 0; } //间歇控制程序 void JianX_KZ(void) { uchar jc=0; zxmc = 0; //标志位清零 fxmc = 0; //高低速判断 V110_KZ = 1;//MOS关闭 GS_KZ = 1; DS_KZ = 0; HX_KZ = 1; //切换为正向 TJ_DD = 0; //停机开关闭合 delNs(3); zxmc = 0; //标
14、志位清零 do { V110_KZ = 0; //接通110V电源 } while(zxmc==0); //等待正向到位信号 V110_KZ = 1; //接通110V电源 zxmc = 0; HX_KZ = 0; //切换为负向 delNs(3); zxmc = 0; //标志位清零 do { V110_KZ = 0; } while(fx
15、mc==0); //等待正向到位信号 V110_KZ = 1; fxmc = 0; } /********************************************************** 主程序代码 **********************************************************/ void main(void) { uchar key =0; Init_Mcu(); Y_zt = 0; X_zt = 0; Work_Mode = 0; ResetPLC
16、 0; // 复位PLC编码器 delay10ms(); // delay10ms(); // ResetPLC = 1; // zxmc = 0; //标志位清零 fxmc = 0; delNs(2); //延时1秒 EX0 = 0; EX1 = 0; while(1) { if(J_X) { GS_KZ = 1; DS_KZ = 0; HX_KZ = 0; //切换为正向 TJ_DD = 0; //停
17、机开关闭合 delNs(1); //延时1秒 V110_KZ = 0; //接通110V电源 } else { V110_KZ = 1; //接通110V电源 } //=======KEY检测========== //key = P3&0xB2; //if(key!=0) //{ //delay10ms(); //延时10MS去抖动,判断开关位
18、置 //key = P3&0xB2; //if(key!=0) //工作模式判断 //{ if(J_X) { Work_Mode = 1; if(reset==0) { ResetPLC = 0; // 复位PLC编码器 delay10ms(); // delay10ms(); //
19、 ResetPLC = 1; reset = 1; } } if(D_S) { Work_Mode = 2; if(reset==0) { ResetPLC = 0; // 复位PLC编码器 delay10ms(); // delay10ms(); //
20、 ResetPLC = 1; reset = 1; } } if(G_S) { Work_Mode = 3; if(reset==0) { ResetPLC = 0; // 复位PLC编码器 delay10ms(); // delay10ms(); //
21、 ResetPLC = 1; reset = 1; } } if(T_Z) { Work_Mode = 0; reset = 0; ResetPLC = 0; // 复位PLC编码器 } // } // } dog = ~dog; //=======工作模式实现部分=========
22、 switch(Work_Mode) { case JianXie: //间歇模式1 //JianX_KZ(); Work_Mode = 0; break; case DiSu: //低速模式2 //GDS_KZ(0); Work_Mode = 0;
23、 break; case GaoSu: //高速模式3 //GDS_KZ(1); Work_Mode = 0; break; case TingZhi: //停止模式0 P1 = 0xEF; Work_Mode = 0; break; default: P1 = 0xEF; Work_Mode = 0; break; } } } 收集于网络,如有侵权请联系管理员删除






