⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 KEIL C编译 到位监控程序
💻 C
字号:
//main.c 可能中文文件夹下有问题 //电机输出应该屏蔽其他电机异动
//风扇 12v 0.37A  灯 12mA 12V  门磁 0.67A 24V
#include "AT89X51.h"
#include "main.h"
#include <intrins.h>
#include <absacc.h>
//#include <reg52.h>
#define  uchar unsigned char
#define  uint unsigned int

BYTE workState = HALT_STATUS;	//工作状态


//输出数组
uchar ACK_BUF[LENMAX];                //Command in length=3 数据(命令) 接收 缓冲区
uchar DLE_BUF[DLELENMAX];               //state out length=3  数据(状态) 发送 缓冲区
//uchar    TRUE_LEN=0;                   //接收字符个数统计变量
uchar    IN_LENGTH;
bit first_DLE=0;

uchar CMDIN[LENMAX];                //Command in length=3 数据(命令) 接收 缓冲区

uchar    count=0;                   //接收字符个数统计变量
bit      RECE_flag=0;               //接收标志位(1=成功接收)
//bit      RECE_bak=0;                //接收标志位(1=成功接收) 长时间保留位
//bit      SEND_flag=0;               //发送标志位(1=一次发送完毕,接下去等待 成功接收了)
//bit timerOver;                        //=1:定时器时间到了 标志位
//uint timeCounter=0;

bit timerHap;                        //=1:定时器时间到了 标志位
uint counter=0;	                     //定时器循环次数计数器


extern BYTE bdata outputByte2;   //XBYTE[0x1000];
extern bit OLT8;  //控制投币口   开 关
extern bit OLT9;  //控制维修灯   亮 灭 
extern bit OLTA;  //控制出卡处灯 亮 灭
//extern bit OLTB;  //
extern bit OLTE;  //控制fan1 亮 灭
extern bit OLTF;  //控制fan2 亮 灭

uchar pwm1;       //调制脉宽计数
bit fan1=0;      //风扇1

uchar pwm2;       //调制脉宽计数
bit fan2=0;      //风扇2

uchar pwm3;       //调制脉宽计数
bit cardlamp=0;  //出票口灯

uchar pwm4;       //调制脉宽计数
bit mainlamp=0;  //维修处灯
//time0
#define RELOAD_HIGH 0xD8	
#define RELOAD_LOW 0xF0
//time2
#define LD_T2H 0xFF	
#define LD_T2L 0x9B
//FC17 1ms 
//FE0C 0.5ms
//FFCD 50us 
//FF9B 100us
/**********************************************************************
** 函数名称: 	init_time2
** 功能描述: 	初始化定时器2  Door
** 输 入:      无     
** 输 出: 		无
** 全局变量:	无
** 调用模块: 	无
***********************************************************************/
void INIT_TIME2(void)
{
    T2CON=0x00;   //16位自动重载定时器
    T2MOD=0x00;   //DCEN=0,定时器向上计数
    TH2=0xFF;     //
    TL2=0xFF;     //上顶点,加计数到该点了 就溢出
    RCAP2H=LD_T2H;//
    RCAP2L=LD_T2L;//下位点,向上计数的开始点
    ET2=1;        //使能定时器2中断
    EA = 1;
    TR2=1;        //开始定时
}
/**********************************************************************
** 函数名称: 	init_time0
** 功能描述: 	初始化定时器0  com
***********************************************************************/
void INIT_TIME0(void)
{
    PX0=1;              //
	PX1=1;              //外部中断01位高于定时器0的中断级别
    TMOD=TMOD|0x01;		//定时器0在模式1下工作
	TL0=RELOAD_LOW;//0x00;			//定时器每50ms产生一次溢出
	TH0=RELOAD_HIGH;//0x4C;			//自动重装的值
	ET0=1;				//使能定时器0中断
	EA=1;				//使能总中断
    TR0=1;				//开始计时 
}
void tick_int(void) interrupt 1 //using 0 //定时器
{
	TR0=0; // 停止定时器
   
	P2_0=!P2_0;	 //先不喂狗

	if(counter > 0)
	{
		counter--;
		if(counter == 0) timerHap=1;
	}

	TH0=RELOAD_HIGH; // 设置重装值
	TL0=RELOAD_LOW;
	TR0=1; // 重新启动定时器
}


/**********************************************************************
** 函数名称: 	TIME2 定时器中断益处程序--
** 全局变量:	
***********************************************************************/
void timer2 (void) interrupt 5
{
 TR2=0;        //关定时
 P2_0=!P2_0;	 //先不喂狗

 /*if(timeCounter > 0)
	{
		timeCounter--;
		if(timeCounter == 0) timerOver=1;
	}*/

if(fan1)
   { 
     if(pwm1<=PWM50)//导通时间 1-8
	    {
		 OLTE = 0;
		}//正方向  转
	 else
	   { 
	     if(pwm1<PWM100) //关断时间 9-10
	       {
		    OLTE = 1;
	    	}//停 
		  else
		   { pwm1=0; }
	    }
	  pwm1++;
   }
  else { OLTE = 1; }  //停

if(fan2)
   { 
     if(pwm2<=PWM50)//导通时间 1-8
	    {
		 OLTF = 0;
		}//正方向  转
	 else
	   { 
	     if(pwm2<PWM100) //关断时间 9-10
	       {
		    OLTF = 1;
	    	}//停 
		  else
		   { pwm2=0; }
	    }
	  pwm2++;
   }
  else { OLTF = 1; }  //停 

/*if(mainlamp)
   { 
     if(pwm4<=PWM50)//导通时间 1-8
	    {
		 OLT9=0; 
		}//正方向  转
	 else
	   { 
	     if(pwm4<PWM100) //关断时间 9-10
	       {
		    OLT9=1; 
	    	}//停 
		  else
		   { pwm4=0; }
	    }
	  pwm4++;
   }
  else { 
         OLT9=1; 
       }  //停

if(cardlamp)
   { 
     if(pwm3<=PWM50)//导通时间 1-8
	    {
		 OLTA=0; 
	  	}//正方向  转
	 else
	   { 
	     if(pwm3<PWM100) //关断时间 9-10
	       {
		    OLTA=1; 
        	}//停 
		  else
		   { pwm3=0; }
	    }
	  pwm3++;
   }
  else { 
        OLTA=1; 
       }  //停
*/
XBYTE[0x1000] = outputByte2;  //公用
  
RCAP2H=LD_T2H; 
RCAP2L=LD_T2L;

  TR2=1;        //开始定时
}

/////////////////////////////
//名称: timerSet                                               
//功能: 设置定时器2				           
//输入: ms,定时时间,毫秒  1ms 最小单位 
//输出: 定时时间到时, 
///////////////////////
/*void timerSet(uchar ms)
{
	TR2=0; // 停止定时器
	timerOver = 0;
	timeCounter = ms;
	TR2=1; // 重新启动定时器
}*/
/////////////////////////////
//名称: setTimer                                               
//功能: 设置定时器				           
//输入: ms,定时时间,毫秒  10ms 最小单位 
//输出: 定时时间到时,输出TF0 
///////////////////////
void setTimer(WORD ms)
{
	TR0=0; // 停止定时器
	timerHap = 0;
	counter = ms/10;
	//TF0=0;	//清除标志位
	TR0=1; // 重新启动定时器
}
 
main()
{
    INIT_TIME2();  //first
   //releaseAllMotor(); //锁住所有电机
   init_serialcom();
   INIT_TIME0();
   // send_string_com(STAOUT,LENGTH);//发送 for test   
   while(1)
      {
       P2_0=!P2_0;      //喂狗
	   
	    switch(workState)
	    {
		 case HALT_STATUS:
		   	 if(RECE_flag)    //1/ 如果有新数据 //pass
               { 
	            workState=EXEC_STATUS;
		       }
	   	 break;

		 case EXEC_STATUS:	//执行报文
	    	 if(RECE_flag)    //1/ 如果有新数据 //pass
               { 
	            execCommand();
                RECE_flag=0;
		       }  
		 break;


         default:
		 break;
	   }
 
      }//while end
}//main end

/**********************************************************************
** 函数名称: 	serial_recive   //pass
** 功能描述: 	串口接收中断函数接收一个字符串
** 输 入:      无    
** 输 出: 		无
** 全局变量:	count: 接收字符个数统计变量
                inbuf1[LENGHT]   数据接收缓冲区
                LENGHT           接收数据总长度
				RECE_flag        接收标志位
** 调用模块: 	无
***********************************************************************/
void serial_recive () interrupt 4  
{
    if(RI)
    {   
	    unsigned char ch;
		RI = 0;
        ch=SBUF;
		if(first_DLE==0)
		{
         if(ch==DLE) //                                  
            {   
		     first_DLE=1;
			 //丢掉 ch
		    }
	     else //(ch!=0x10) 
			{
			 if(ch==ETX)// 03 03 未处理
			    {
			      CMDIN[count++]=ch;
                  RECE_flag=1;                //表示已经完成一次完整接收
		     	  IN_LENGTH=count;            //接收到数据的总长度
			      count=0; 
			     }
			  else
			      {
	     	      CMDIN[count++]=ch;
			      }
			  first_DLE=0;
		    }
        }

        else //first_DLE==1
          {
        //     if(ch==DLE||ch==ETX||ch==STX) //   
        //     {}//
        //    else {}   //
           CMDIN[count++]=ch;
           first_DLE=0;
          }
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -