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

📄 serial.c

📁 Small RTOSv1.12.x 下dp-51例子, 包括完整的原程序和说明
💻 C
字号:
/*********************************************************************************************************
**				                               Small RTOS(51)
**                                   The Real-Time Kernel(For Keil c51)
**
**                                  (c) Copyright 2002-2002, chenmingji
**                                           All Rights Reserved
**
**                                                  V1.11.0
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: serial.c
**创   建   人: 陈明计
**最后修改日期: 2003年3月25日
**描        述: 在DP-51上实现闹钟的例子的串行口驱动程序
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 陈明计
** 版  本: V1.00
** 日 期: 2003年3月25日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版  本:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define IN_SERIAL

#include "config.h"
                                            /* 声明使用的外部变量           */
extern uint8 OS_Q_MEM_SEL CommandData[];
extern uint8 OS_Q_MEM_SEL SerialInData[];
extern uint8 OS_Q_MEM_SEL SerialOutData[];
extern uint8 OS_Q_MEM_SEL Alarm[];

void PutChar(uint8 Data);

bit SerialCanSend = 1;                      /* 正在发送标志,0:正在发送    */

/*********************************************************************************************************
** 函数名称: SerialInit
** 功能描述: 初始化串行口
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年3月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        void SerialInit(void)
{
	SCON = 0x50;
	PCON = 0x80;
	TMOD = TMOD & 0x0f;
	TMOD = TMOD | 0x20;
	TH1 = 0xf4;                   //com is 4800 b/s
	TL1 = 0xf4;
	TR1 = 1;
	ES = 1;
}

/*********************************************************************************************************
** 函数名称: Send
** 功能描述: 发送一个数据包
** 输 入: Data:指向要发送的数据指针
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年3月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        void Send(uint8 OS_Q_MEM_SEL *Data)
{
    uint8 Sem;
    
    PutChar(STARTBYTE1);
    PutChar(STARTBYTE2);
    Sem = STARTBYTE1 + STARTBYTE2;
    
    PutChar(*Data);
    Sem += *Data++;
    PutChar(*Data);
    Sem += *Data++;
    PutChar(*Data);
    Sem += *Data++;
    PutChar(*Data);
    Sem += *Data++;
    PutChar(*Data);
    Sem += *Data++;
    
    PutChar(-Sem);
}

/*********************************************************************************************************
** 函数名称: PutChar
** 功能描述: 发送一个字节
** 输 入: Data:发送的数据
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年3月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
    void PutChar(uint8 Data)
{
    OS_ENTER_CRITICAL();
    if (SerialCanSend == 1)                         
    {
        SerialCanSend = 0;
        SBUF = Data;                                /* 串口空闲,直接发送   */
    }
    else
    {
        OSQIntPost(SerialOutData,Data);             /* 数据入队             */
    }
    OS_EXIT_CRITICAL();
}  

/*********************************************************************************************************
** 函数名称: Recuve
** 功能描述: 串口接收处理任务
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年3月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
    void Recuve(void)
{
    uint8 data temp,temp1;
    uint8 Sum,i;
                                                /* 建立所需要的消息队列 */
    OSQCreate(CommandData, 16);
    OSQCreate(SerialInData, 16);
    OSQCreate(SerialOutData, 32);
    SerialInit();                               /* 初始化串行口         */
    
    while (1)
    {
        OSQPend(&temp,SerialInData,0);          /* 接收一个字节         */
        while (1)
        {
            OSQPend(&temp1,SerialInData,0);     /* 接收一个字节         */
            if ((temp == STARTBYTE1) && (temp1 == STARTBYTE2))
            {
                break;                          /* 接收到起始字符       */
            }
            temp = temp1;
        }
        Sum = STARTBYTE1 + STARTBYTE2;
        
        for (i = 0; i < 5; i++)                 /* 接收数据包           */
        {
            OSQPend(&temp1, SerialInData, 0);
            Alarm[i] = temp1;
            Sum += temp1;
        }

        OSQPend(&temp1, SerialInData, 0);       /* 接收校验和           */
        Sum += temp1;
        if (Sum == 0)                           /* 检验接收到的数据包   */
        {                                       /* 发送消息给主任务     */
            OSQIntPost(CommandData, Alarm[0]);
        }
    }
}

/*********************************************************************************************************
** 函数名称: comm
** 功能描述: 串口中断处理程序
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年3月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_INT_ENTER >0 
#pragma disable                                        /* 除非最高优先级中断,否则,必须加上这一句                 */
#endif
		void comm(void) interrupt 4
{
    uint8 data temp;
	if (RI == 1)
	{
#if EN_OS_INT_ENTER >0
        OS_INT_ENTER();
#endif
		RI = 0;
        OSQIntPost(SerialInData,SBUF);
        OSIntExit();
		return;
	}
	if (TI == 1)
	{
		TI = 0;
		if (OSQAccept(&temp,SerialOutData) == OS_Q_OK)
		{
		    SBUF = temp;
		}
		else
		{
		    SerialCanSend = 1;
		}
	}
}

/**********************end****************************************/

⌨️ 快捷键说明

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