📄 main.c
字号:
/*********************************************************************************************************
** 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 + -