资源描述
机车刮雨刷控制程序
精品文档
/********************************************
CPU==AT89C2051 F==11.0592MHZ
WXQ20160714 用于刮雨刷电机控制
********************************************/
//#include <public.h>
#include <REG2051.h>
#include <absacc.h>
#include <intrins.h>
//数据类型定义
#define uchar unsigned 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 = 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^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 Work_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
//******************************************
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;
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; //Int0中断允许 测量步进电机频率信号
//外部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=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定时中断
{
TH1=0x4C;
TL1=0x00;
}
***************************************************************/
//外中断0,用来检测正向脉冲
void int0() interrupt 0
{
zxmc = 1; //正向到位
//fxmc = 0; //清楚负向脉冲
//if(Work_Mode>0)
//{
//V110_KZ = 1; //关闭MOS
//}
}
//外中断1,用来检测反向脉冲
void int1() 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 = 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); //等待反向到位信号
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; //标志位清零
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(fxmc==0); //等待正向到位信号
V110_KZ = 1;
fxmc = 0;
}
/**********************************************************
主程序代码
**********************************************************/
void main(void)
{
uchar key =0;
Init_Mcu();
Y_zt = 0;
X_zt = 0;
Work_Mode = 0;
ResetPLC = 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; //停机开关闭合
delNs(1); //延时1秒
V110_KZ = 0; //接通110V电源
}
else
{
V110_KZ = 1; //接通110V电源
}
//=======KEY检测==========
//key = P3&0xB2;
//if(key!=0)
//{
//delay10ms(); //延时10MS去抖动,判断开关位置
//key = P3&0xB2;
//if(key!=0) //工作模式判断
//{
if(J_X)
{
Work_Mode = 1;
if(reset==0)
{
ResetPLC = 0; // 复位PLC编码器
delay10ms(); //
delay10ms(); //
ResetPLC = 1;
reset = 1;
}
}
if(D_S)
{
Work_Mode = 2;
if(reset==0)
{
ResetPLC = 0; // 复位PLC编码器
delay10ms(); //
delay10ms(); //
ResetPLC = 1;
reset = 1;
}
}
if(G_S)
{
Work_Mode = 3;
if(reset==0)
{
ResetPLC = 0; // 复位PLC编码器
delay10ms(); //
delay10ms(); //
ResetPLC = 1;
reset = 1;
}
}
if(T_Z)
{
Work_Mode = 0;
reset = 0;
ResetPLC = 0; // 复位PLC编码器
}
// }
// }
dog = ~dog;
//=======工作模式实现部分==========
switch(Work_Mode)
{
case JianXie: //间歇模式1
//JianX_KZ();
Work_Mode = 0;
break;
case DiSu: //低速模式2
//GDS_KZ(0);
Work_Mode = 0;
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;
}
}
}
收集于网络,如有侵权请联系管理员删除
展开阅读全文