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

📄 main.c

📁 利用SMALL RTOS51做的一个项目
💻 C
📖 第 1 页 / 共 4 页
字号:
/*********************************************************************************************************
**                                             Small RTOS(51)
**                                   The Real-Time Kernel(For Keil c51)
**
**                                  (c) Copyright 2002-2002, chenmingji
**                                           All Rights Reserved
**
**                                                  V1.12.1
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: main.C
**创   建   人: 龚树强
**最后修改日期: 2004年9月25日
**描        述: 基于AT89S52和SMALL_RTOS 51的生产线计数器控制器项目(用于雅芳生产线)
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 龚树强
** 版  本: V1.0
** 日 期: 2004年9月25日
** 描 述: 原始版本,基于AT89C2051和SMALL_RTOS 51的触摸屏项目
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版  本:
** 日 期:
** 描 述:
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
** 描 述: 
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#include "main.h"


/*********************************************************************************************************
** 函数名称: init
** 功能描述: 初始化函数,一般在多任务环境启动前调用
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: IICInit()
**
** 作 者: 陈明计
** 日 期: 2003年4月27日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/



        void init(void)
{
    //"系统初始化"

    //IE = 0x00;      //"清除中断"
    EX0 = 1;        //0"外部中断0允许"
    //ET0 = 1;        //1"定时器0中断允许"
    EX1 = 1;        //2"外部中断1允许"
    //ET1 = 1;        //3"定时器1中断允许"
    ES = 1;         //4"串行中断允许"
	ET2 = 1;	    //5"定时器2中断允许"

    IP = 0;         //"清除中断优先级"
    //PS = 1;         //"串行中断优先"
    //PX0 = 1;        //"外部中断0"
    //PT0 = 1;        //"定时器中断0"
    //PX1 = 1;        //"外部中断1"
    //PT1 = 0;        //"定时器中断1"

    TCON = 0;            //"定时器控制寄存器"
    //TF1             //"T1溢出标志"
    //TR1 = 1;        //"T1运行控制"
    //TF0             //"T0溢出标志"
    //TR0 = 1;        //"T0运行控制"
    IT1 = 1;        //"外部中断1触发方式 0=电平 1=边沿"
    IE1 = 0;          //"外部中断1申请标志"
    IT0 = 1;        //"外部中断0触发方式 0=电平 1=边沿"
	IE0 = 0;          //"外部中断0申请标志"
      
    
    //TMOD            //"定时器模式控制寄存器"
    //  |GATE    |C//T   |M0      |M1      |GATE   |C//T   |M0       |M1        |
	TMOD = 0x21;	  //定时器0工作在方式1,GATE,C/T为0	
					  //定时器0工作在方式2,GATE,C/T为0		
    //"高4位用于T1  低4位用于T0"

    //SCON  "串行控制"
	SCON = 0xF0;
    //| SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI  | RI  |
    //"| SM0  SM1 | 工作方式  |   说    明   |   波 特 率    |"
    //"|   0    0 | 方 式 0   |   同步移位   |   fosc/12     |"
    //"|   0    1 | 方 式 1   | 10位异步收发 |  定时器控制   |"
    //"|   1    0 | 方 式 2   | 11位异步收发 |fosc/32|fosc/64|"
    //"|   1    1 | 方 式 3   | 11位异步收发 |  定时器控制   |"
    //"SM2 多机通讯允许"
    //"REN 接收允许控制"
    //"TB8 发送数据第9位"
    //"RB8 接收数据第9位"
    //"TI  发送中断标志"
    //"RI  接受中断标志"
	

    //PCON "电源控制寄存器"
	PCON = 0x00;
    //SMOD"波特率选择位 =1 方式1,2,3 波特率加倍"
	//"波特率=2^(sod)*fosc/(32*12*(256-初值))"
    T2CON = 0x0;
    TR2 = 1;
    ET2 = 1;
	//TR0 = 1;        //"T0运行控制"
	TR1 = 1; 
#if	OS_TIME_ISR == 5
	//系统节拍中断使用定时器2,中断频率为50Hz
    RCAP2H = (65536 - (11059200 / 12) / OS_TICKS_PER_SEC) / 256;
    RCAP2L = (65536 - (11059200 / 12) / OS_TICKS_PER_SEC) % 256;
    TH2 = (65536 - (11059200 / 12) / OS_TICKS_PER_SEC) / 256;
    TL2 = (65536 - (11059200 / 12) / OS_TICKS_PER_SEC) % 256;

#else if OS_TIME_ISR == 1
	//系统节拍中断使用定时器0,中断频率为50Hz
   	_Reg_TH0 = (65536 - (11059200 / 12) / OS_TICKS_PER_SEC) / 256;
    _Reg_TL0 = (65536 - (11059200 / 12) / OS_TICKS_PER_SEC) % 256;
    TH0 = _Reg_TH0;
    TL0 = _Reg_TL0;	
#endif	   

//	TH1 = 0xFA;			//baudrate=4800
//	TL1 = 0xFA;

	TH1 = 0xFD;			//baudrate=9600
	TL1 = 0xFD;
	
	//设置dp-51使用的存储空间xdata、code均为0页	
}




		void FeedBack(void)
{
	LED_NUM_OFF();
	OSWait(K_TMO, OS_TICKS_PER_SEC/10 );
	LED_NUM_ON();

	_Beep=1;
				
	OSWait(K_TMO, OS_TICKS_PER_SEC/10 );
			
	_Beep=0;
			
	if(!_Flag_AutoMode)
	{
		LED_NUM_OFF();
	}
}
/*********************************************************************************************************
** 函数名称: SystemInit()
** 功能描述: 初始化函数,一般在多任务环境启动前调用
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 
**
** 作 者: 陈明计
** 日 期: 2003年4月27日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

		void SystemInit(void)
{
	uint8 i;
    //"系统初始化"
 	init();


	Write728x(0x12,SCN|INV|BMS);
	Write728x(0x11,0x80);
	Write728x(0x10,0xFF);
	Write728x(0x19,0xFF);
			
	_Flag_DispChanged=1;

	PS2_CLK=1;
	PS2_DATA=1;

	_Flag_AutoMode=TRUE;											//自动模式	:TRUE		手动模式  :FALSE
	LED_NUM_ON();	

	_Flag_KeyLock=FALSE;											//键盘锁
	_Flag_Set=TRUE;													//设置目标产量	:TRUE		设置当前产量  :FALSE

	_Flag_State_Producing=FALSE;										//工作状态
	
	_Flag_State_Error=FALSE;
		
	_Flag_State_Finish=FALSE;	

	_Flag_State_TaskAccepted=FALSE;

	_IdleTimer=180;


	SERIAL_DIRECTION_CTRL=0;

	_Beep=0;

	for(i=0;i<12;i++)
	{
		Write728x(i,0xFF);
	}
														
	_CurrentValue=0;
	_TargetValue=0;
	DispNum(1,_CurrentValue);
	DispNum(0,_TargetValue);


	_Flag_DispSpeed=1;
	DispNum(2,_ProduceSpeed);
	_LedProduceSpeed=1;
	_LedProducedPersent=0;

}


/*********************************************************************************************************
** 函数名称: main
** 功能描述: 主函数,用户程序从这里执行
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: init(),OSStart(),LCMIni(),LCMClr();
**
** 作 者: 龚树强
** 日 期: 2004年10月15日
**-------------------------------------------------------------------------------------------------------
** 修改人:  
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/


		void main(void)
{

    SystemInit();

	                                            

    //DispNum(2,500);

//	串口测试
/*	SERIAL_DIRECTION_CTRL=1;
	ES=0;
	for(;;)
	{
		
		SBUF=0X01;
		while(!TI);
		TI=0;
	}*/
	
//	LED_NUM_ON();

//	LED_NUM_OFF();
	
    OSStart(); 
}



/*********************************************************************************************************
** 函数名称: ISR_Serial
** 功能描述: 一个任务,Serial的中断处理函数
**
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: OSSemCreate(),DispStr(),OSWait(),DispClr(),OSSemPost(),
**
** 作 者: 龚树强
** 日 期: 2004年10月15日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        void ISR_Serial(void)		interrupt	SERIAL_ISR
{
    uint8 data temp;
	if (RI == 1)
	{
#if EN_OS_INT_ENTER >0
        OS_INT_ENTER();
#endif
		RI = 0;
		RB8 = 0;

        OSQIntPost(SerialInData,SBUF);
        OSIntExit();
		return;
	}
	if (TI == 1)
	{
		TI = 0;
		if ((OSQNMsgs(SerialOutData)%7)!=0)
		{
			SERIAL_DIRECTION_CTRL=1;

			OSQAccept(&temp,SerialOutData);

			_ResendBuffer[_BufferIndex]=temp;

			_BufferIndex++;

			TB8=0;

		    SBUF = temp;
		}
		else
		{
		    
			//OSSemIntPost(SEM_SendBuffer);

	//		if( OSQNMsgs(SerialOutData) > 0 )
	//		{
	//			OSQAccept(&temp,SerialOutData);

	//			_BufferIndex=0;

	//			_ResendBuffer[_BufferIndex]=temp;

	//			TB8=1;

	//	    	SBUF = temp;

	//		}
	//		else
	//		{	
				SERIAL_DIRECTION_CTRL=0;
	//		}
			if(!_Flag_RequestAccept)
			{
				_Flag_RequestAccept=1;
				OSIntSendSignal(1);
			}
		}
	}
       
}


/*********************************************************************************************************
** 函数名称: ISR_Counter_Int
** 功能描述: 一个任务,计数器的中断处理函数
**
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: OSSemCreate(),DispStr(),OSWait(),DispClr(),OSSemPost(),
**
** 作 者: 龚树强
** 日 期: 2004年10月15日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        void ISR_Counter_Int(void)			interrupt	COUNTER_INT_ISR
{
	OS_INT_ENTER();                                     			// 中断开始处理   

	IE0=0;
	EX0=0;
	
	
	TH0=TIME_THREADHOLD_LOW>>8;
	TL0=TIME_THREADHOLD_LOW;

	TR0=1;
	ET0=1;

	_Flag_CounterFallDown=1;
         
  
    OSIntExit();                                        			// 中断结束处理   
       
}


/*********************************************************************************************************
** 函数名称: ISR_Counter_Tmr
** 功能描述: 一个任务,计数器的中断处理函数
**
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: OSSemCreate(),DispStr(),OSWait(),DispClr(),OSSemPost(),
**
** 作 者: 龚树强
** 日 期: 2004年10月15日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        void ISR_Counter_Tmr(void)			interrupt	COUNTER_TMR_ISR
{
	OS_INT_ENTER();                                     			// 中断开始处理   

	TR0=0;
	ET0=0;

	_Flag_CounterTimeOut=1;
         
  
    OSIntExit();                                        			// 中断结束处理   
       
}

/*********************************************************************************************************
** 函数名称: ISR_Keyboard
** 功能描述: 一个任务,Keyboard的中断处理函数
**
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: OSSemCreate(),DispStr(),OSWait(),DispClr(),OSSemPost(),
**
** 作 者: 龚树强
** 日 期: 2004年10月15日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        void ISR_Keyboard(void)		interrupt	KEYBOARD_ISR
{
    uint8 i,temp;
	uint8 timer;

 	
    OS_INT_ENTER();                                     // 中断开始处理                                    

    IE1=0;
	EX1=0;

	ET2=1;
	TF2=0;
	
	PS2_CLK=1;
	PS2_DATA=1;

	temp=0;
  	
	for(timer=OVERTIME_THREAD;;timer--)
	{
		if(timer)
		{
			if(PS2_CLK){break;}
		}
		else{goto ERROR_OVERTIME;}
	} 
	for(i=0;i<8;i++)
	{
		temp>>=1;
		for(timer=OVERTIME_THREAD;;timer--)
		{
			if(timer)
			{
				if(!PS2_CLK)
				{
					if(PS2_DATA){temp+=0x80;}

					break;
				}
			}
			else{goto ERROR_OVERTIME;}
		} 
		for(timer=OVERTIME_THREAD;;timer--)
		{
			if(timer)
			{
				if(PS2_CLK){break;}
			}
			else{goto ERROR_OVERTIME;}
		}
	}   

	for(;i<10;i++)
	{
		for(timer=OVERTIME_THREAD;;timer--)
		{
			if(timer)
			{
				if(!PS2_CLK){break;}
			}
			else{goto ERROR_OVERTIME;}
		} 
		for(timer=OVERTIME_THREAD;;timer--)
		{
			if(timer)
			{
				if(PS2_CLK){break;}
			}
			else{goto ERROR_OVERTIME;}
		}
	}   
	
	if(temp>0xF0)
		goto ERROR_OVERTIME;


	_KeyboardTimer=UP_DELAY_THREADHOLD;
	
	if(_Flag_KeyPressed)
	{
		if((temp==0xF0))
		{
			_KeyboardTimer=0;
			_Flag_KeyPressed=0;
			OSQIntPost(CommandData,_KeyScanReg);		
			_KeyScanReg=0;
		}
	} 
	else
	{
		if(temp==KEY_LOCK)
		{
			OSQIntPost(CommandData,temp);
		}
		else if((temp!=0xE0)&&(_KeyScanReg!=temp))
		{
			_Flag_KeyPressed=1;

			_KeyScanReg=temp;
		}
		
		
		
	} 
	

		
ERROR_OVERTIME	:	EX1=1;
					IE1=0;
    OSIntExit();     
       
}


/*********************************************************************************************************
** 函数名称: BH_Serial
** 功能描述: 一个任务,SerialInt的BottomHalf函数
**

⌨️ 快捷键说明

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