📄 main.c
字号:
/***************************************************************************
** 文 件 名:MAIN.C
** 编 写 者:
** 编写日期:2008年9月16日
** 简要描述:
** 修改记录:
** 版 本:
***************************************************************************/
#include "C8051F310.h"
#include <rtx51tny.h>
/***************************************************************************
函数名称:PCA_Init()
简要描述:初始化PCA模块,PCA0-5均配置为边缘捕捉(上升沿和下降沿)
Called from the Init_Device() function
输入: 无 // 输入参数说明,包括每个参数的作用、取值说明及参数间关系
输出: 无 // 输出参数的说明, 返回值的说明
修改日志:
***************************************************************************/
void PCA_Init()
{
PCA0CN = 0x40;
PCA0MD &= ~0x40;
PCA0MD = 0x00;
PCA0CPM0 = 0x30;
PCA0CPM1 = 0x30;
PCA0CPM2 = 0x30;
PCA0CPM3 = 0x30;
PCA0CPM4 = 0x30;
}
//void Timer_Init()
//{
// TMR3CN = 0x04; // time3
//}
/***************************************************************************
函数名称:Port_IO_Init()
简要描述:初始化端口// 函数目的、功能等的描述
输入: 无 // 输入参数说明,包括每个参数的作用、取值说明及参数间关系
输出: 无 // 输出参数的说明, 返回值的说明
修改日志:
***************************************************************************/
void Port_IO_Init()
{
// P0.0 - CEX0 (PCA), Open-Drain, Digital
// P0.1 - CEX1 (PCA), Open-Drain, Digital
// P0.2 - Skipped, Open-Drain, Analog
// P0.3 - Skipped, Open-Drain, Analog
// P0.4 - CEX2 (PCA), Open-Drain, Digital
// P0.5 - CEX3 (PCA), Open-Drain, Digital
// P0.6 - CEX4 (PCA), Open-Drain, Digital
// P0.7 - Unassigned, Open-Drain, Digital
// P1.0 - Unassigned, Open-Drain, Digital
// P1.1 - Unassigned, Open-Drain, Digital
// P1.2 - Unassigned, Open-Drain, Digital
// P1.3 - Unassigned, Open-Drain, Digital
// P1.4 - Unassigned, Open-Drain, Digital
// P1.5 - Unassigned, Open-Drain, Digital
// P1.6 - Unassigned, Open-Drain, Digital
// P1.7 - Unassigned, Open-Drain, Digital
// P2.0 - Unassigned, Open-Drain, Digital
// P2.1 - Unassigned, Open-Drain, Digital
// P2.2 - Unassigned, Open-Drain, Digital
// P2.3 - Unassigned, Open-Drain, Digital
P0SKIP = 0x0C;
XBR1 = 0x45;
}
/***************************************************************************
函数名称:Oscillator_Init()
简要描述:初始化振荡器,使用外部晶振22.118432MHz,晶振频率作为系统时钟
输入: 无 // 输入参数说明,包括每个参数的作用、取值说明及参数间关系
输出: 无 // 输出参数的说明, 返回值的说明
修改日志:
***************************************************************************/
void Oscillator_Init()
{
int i = 0;
OSCXCN = 0x67;
/* for (i = 0; i < 3000; i++); // Wait 1ms for initialization
while ((OSCXCN & 0x80) == 0); */
OSCICN = 0x83;
}
/***************************************************************************
函数名称:Interrupts_Init()
简要描述:初始化中断
输入: 无
输出: 无
修改日志:
***************************************************************************/
void Interrupts_Init()
{
EIE1 = 0x90;
EIP1 = 0x10;
}
// Initialization function for device,
// Call Init_Device() from your main program
/***************************************************************************
函数名称:Init_Device(void)
简要描述:执行总初始化
输入: 无
输出: 无
修改日志:
***************************************************************************/
void Init_Device(void)
{
P1=0x00;
PCA_Init();
Port_IO_Init();
Oscillator_Init();
Interrupts_Init();
}
/***************************************************************************
函数名称:PCA_ISR (void) interrupt 11
简要描述:PCA中断服务程序
输入: 无
输出: 无
修改日志:
***************************************************************************/
void PCA_ISR (void) interrupt 11
{
EA=0;
if (CCF0)
{
if (CEX0 == 0) // 下降沿跳变
{
P2 = 0x01; // 除第一通道RTS1外RTS2~RTS5置低电平
P2 = 0x01; // 除第一通道RTS1外RTS2~RTS5置低电平
P2 = 0x01; // 除第一通道RTS1外RTS2~RTS5置低电平
TXD_BUS = 0; // 发送总线跟随跳变
}
else // 上升沿跳变
{
TXD_BUS = 1; // 发送总线跟随跳变
TXD_BUS = 1; // 发送总线跟随跳变
TXD_BUS = 1; // 发送总线跟随跳变
P2 = 0xff; // 所有通道恢复为高电平
}
CCF0 = 0;
CCF4 = 0;
}
if (CCF1)
{
if (CEX1 == 0) // 下降沿跳变
{
P2 = 0x02; // 除第二通道RTS2外RTS1~RTS5置低电平
P2 = 0x02; // 除第二通道RTS2外RTS1~RTS5置低电平
P2 = 0x02; // 除第二通道RTS2外RTS1~RTS5置低电平
TXD_BUS = 0;
}
else // 上升沿跳变
{
TXD_BUS = 1;
TXD_BUS = 1;
TXD_BUS = 1;
P2 = 0xff; // 所有通道恢复为高电平
}
CCF1 = 0;
CCF4 = 0;
}
if (CCF2)
{
if (CEX2 == 0) // 下降沿跳变
{
P2 = 0x04; // 除第一通道RTS1外RTS2~RTS5置低电平
P2 = 0x04; // 除第一通道RTS1外RTS2~RTS5置低电平
P2 = 0x04; // 除第一通道RTS1外RTS2~RTS5置低电平
TXD_BUS = 0; // 发送总线跟随跳变
}
else // 上升沿跳变
{
TXD_BUS = 1; // 发送总线跟随跳变
TXD_BUS = 1; // 发送总线跟随跳变
TXD_BUS = 1; // 发送总线跟随跳变
P2 = 0xff; // 所有通道恢复为高电平
}
CCF2 = 0;
CCF4 = 0;
}
if (CCF3)
{
if (CEX3 == 0) // 下降沿跳变
{
P2 = 0x08; // 除第四通道RTS4外RTS1~RTS5置低电平
P2 = 0x08; // 除第四通道RTS4外RTS1~RTS5置低电平
P2 = 0x08; // 除第四通道RTS4外RTS1~RTS5置低电平
TXD_BUS = 0;
}
else // 上升沿跳变
{
TXD_BUS = 1;
TXD_BUS = 1;
TXD_BUS = 1;
P2 = 0xff; // 所有通道恢复为高电平
}
CCF3 = 0;
CCF4 = 0;
}
if (CCF4)
{
if (CEX4 == 0) // 下降沿跳变
{
P2 = 0x10; // 除第五通道RTS5外RTS1~RTS5置低电平
P2 = 0x10; // 除第五通道RTS5外RTS1~RTS5置低电平
P2 = 0x10; // 除第五通道RTS5外RTS1~RTS5置低电平
TXD_BUS = 0;
}
else // 上升沿跳变
{
TXD_BUS = 1;
TXD_BUS = 1;
TXD_BUS = 1;
P2 = 0xff; // 所有通道恢复为高电平
}
CCF4 = 0;
}
EA = 1;
}
/***************************************************************************
函数名称:ComDisplay()
简要描述:RXD通道运行状态显示,COMn_OK = 0正常,1不正常
输入: 无
输出: 无
修改日志:
***************************************************************************/
void Com1Display()
{
if(RXD1 == 1)
{
COM1_OK = 0;
PCA0CPM0 = 0x31; //开捕捉中断
}
else
{
if(COM1_OK == 0)
{
os_wait( K_TMO,20,0); //延迟约20MS后,判断RXD是否恢复为高电平
if(RXD1 == 1)
{
COM1_OK = 0; //通道1正常
PCA0CPM0 = 0x31;
}
else
{
TXD_BUS = 1;
COM1_OK = 1; //通道1不正常
PCA0CPM0 = 0x30; //禁止PCA捕捉模块0中断产生
TXD_BUS = 1;
P2 = 0xff;
}
}
}
}
/***************************************************************************
函数名称:ComDisplay()
简要描述:RXD通道运行状态显示,COMn_OK = 0正常,1不正常
输入: 无
输出: 无
修改日志:
***************************************************************************/
void Com2Display()
{
if(RXD2 == 1)
{
COM2_OK = 0;
PCA0CPM1 = 0x31; //开捕捉中断
}
else
{
if(COM2_OK == 0)
{
os_wait( K_TMO,20,0);
if(RXD2 == 1)
{
COM2_OK = 0;
PCA0CPM1 = 0x31;
}
else
{
TXD_BUS = 1;
COM2_OK = 1;
PCA0CPM1 = 0x30; //禁止PCA捕捉模块1中断产生
TXD_BUS = 1;
P2 = 0xff;
}
}
}
}
/***************************************************************************
函数名称:ComDisplay()
简要描述:RXD通道运行状态显示,COMn_OK = 0正常,1不正常
输入: 无
输出: 无
修改日志:
***************************************************************************/
void Com3Display()
{
if(RXD3 == 1)
{
COM3_OK = 0;
PCA0CPM2 = 0x31;
}
else
{
if(COM3_OK == 0)
{
os_wait( K_TMO,20,0);
if(RXD3 == 1)
{
COM3_OK = 0;
PCA0CPM2 = 0x31;
}
else
{
TXD_BUS = 1;
COM3_OK = 1;
PCA0CPM2 = 0x30; //禁止PCA捕捉模块2中断产生
TXD_BUS = 1;
P2 = 0xff;
}
}
}
}
/***************************************************************************
函数名称:ComDisplay()
简要描述:RXD通道运行状态显示,COMn_OK = 0正常,1不正常
输入: 无
输出: 无
修改日志:
***************************************************************************/
void Com4Display()
{
if(RXD4 == 1)
{
COM4_OK = 0;
PCA0CPM3 = 0x31;
}
else
{
if(COM4_OK == 0)
{
os_wait( K_TMO,20,0);
if(RXD4 == 1)
{
COM4_OK = 0;
PCA0CPM3 = 0x31; //开捕捉中断
}
else
{
TXD_BUS = 1;
COM4_OK = 1;
PCA0CPM3 = 0x30; //禁止PCA捕捉模块3中断产生
TXD_BUS = 1;
P2 = 0xff;
}
}
}
}
/***************************************************************************
函数名称:ComDisplay()
简要描述:RXD通道运行状态显示,COMn_OK = 0正常,1不正常
输入: 无
输出: 无
修改日志:
***************************************************************************/
void Com5Display()
{
if(RXD5 == 1)
{
COM5_OK = 0;
PCA0CPM4 = 0x31;
}
else
{
if(COM5_OK == 0)
{
os_wait( K_TMO,20,0);
if(RXD5 == 1)
{
PCA0CPM4 = 0x31;
COM5_OK = 0;
}
else
{
TXD_BUS = 1;
COM5_OK = 1;
PCA0CPM4 = 0x30; //禁止PCA捕捉模块4中断产生
TXD_BUS = 1;
P2 = 0xff;
}
}
}
}
/***************************************************************************
函数名称:Task0()
简要描述:任务0,初始化,建立任务1,2
输入: 无
输出: 无
修改日志:
***************************************************************************/
void Task0() _task_ 0
{
EA=0;
Init_Device();
EA = 1;
os_create_task(1);
os_create_task(2);
os_create_task(3);
os_create_task(4);
os_create_task(5);
os_create_task(6);
os_delete_task(0);
}
/*******************任务1 通道状态灯显示****************************/
void Task1() _task_ 1
{ while(1)
{
Com1Display();
}
}
/*******************任务2 通道状态灯显示****************************/
void Task2() _task_ 2
{ while(1)
{
Com2Display();
}
}
/*******************任务3 通道状态灯显示****************************/
void Task3() _task_ 3
{ while(1)
{
Com3Display();
}
}
/*******************任务4 通道状态灯显示****************************/
void Task4() _task_ 4
{ while(1)
{
Com4Display();
}
}
/*******************任务5 通道状态灯显示****************************/
void Task5() _task_ 5
{ while(1)
{
Com5Display();
}
}
/*******************任务6 系统状态灯显示****************************/
void Task6() _task_ 6
{
while(1)
{
os_wait( K_TMO,500,0); //延时500MS
SYS_RUNNING = ~SYS_RUNNING;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -