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

📄 serial.c

📁 Small_RTOS1.12.1是陈明计大侠针对8051单片机写的一个精简的操作系统
💻 C
字号:
/*********************************************************************************************************
**				                               Small RTOS(51)
**                                   The Real-Time Kernel(For Keil c51)
**
**                                  (c) Copyright 2002-2003, chenmingji
**                                           All Rights Reserved
**
**                                                  V1.12.0
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: serial.c
**创   建   人: 陈明计
**最后修改日期: 2002年12月30日
**描        述: 为消息队列编制的测试代码。
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 陈明计
** 版  本: V1.10
** 日 期: 2002年9月1日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 版  本: V1.11.0
** 日 期: 2003年12月2日
** 描 述: 删除TaskC代码
**
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 版  本: V1.12.0
** 日 期: 2003年12月30日
** 描 述: 删除TaskC代码
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"

uint8 Buf[NBYTE - 3];
uint8 OS_Q_MEM_SEL SerialData[14];


		void InitSerial(void)
{
	SCON = 0x50;
	PCON = 0x80;
	TMOD = TMOD & 0x0f;
	TMOD = TMOD | 0x20;
	TH1 = 0xf3;                   //com is 4800 b/s
	TL1 = 0xf3;
	TR1 = 1;
	ES = 1;

}


                            void main(void)
{
	InitSerial();
	TMOD = (TMOD & 0XF0) | 0X01;
	TL0 = 0x0;
	TH0 = 0x0;
	TR0 = 1;
	ET0 = 1;
	TF0 = 0;
    OSStart();
}

        void comm(void) interrupt 4
{
    OS_INT_ENTER();
    if (RI == 1)
    {
        RI = 0;
#if EN_OS_Q_INT_POST > 0
        OSQIntPost(SerialData,SBUF);
#endif
#if EN_OS_Q_INT_POST_FRONT > 0
        OSQIntPostFront(SerialData,SBUF);
#endif

    }
    if (TI == 1)
    {
        TI = 0;
        OSIntSendSignal(1);
    }
    OSIntExit();
}

    void Recuve(void)
{
    uint8 data temp,temp1;
    uint8 Sum,i;

    OSQCreate(SerialData,14);

start:
#if EN_OS_Q_NMsgs > 0
    while (OSQNMsgs(SerialData) < NBYTE)
    {
        OSWait(K_TMO,1);
    }
#endif

    OSQPend(&temp,SerialData,0);
    while (1)
    {
        while (1)
        {
            if (OSQPend(&temp1,SerialData,20) == OS_Q_TMO)
            {
                goto start;
            }
            if ((temp == STARTBYTE1) && (temp1 == STARTBYTE2))
            {
                break;
            }            
            temp = temp1;
        }
        
start1:
        Sum = STARTBYTE1 + STARTBYTE2;
        
        if (OSQPend(&temp1,SerialData,20) == OS_Q_TMO)
        {
            goto start;
        }
        
        for (i = 0; i < NBYTE - 3; i++)
        {
            temp = temp1;
            if (OSQPend(&temp1,SerialData,20) == OS_Q_TMO)
            {
                goto start;
            }

            if ((temp == STARTBYTE1) && (temp1 == STARTBYTE2))
            {
                goto start1;
            }
            Buf[i] = temp;
            Sum += temp;
        }
        Sum += temp1;
        if (Sum == 0)
        {
            OSSendSignal(1);
        }        
    }
}


                            void TaskB(void)
{
    while (1)
    {
        OSWait(K_SIG,0);
        SBUF = 'O';
        OSWait(K_SIG,0);
        SBUF = 'K';
        OSWait(K_SIG,0);
        SBUF = '!';
        OSWait(K_SIG,0);
        SBUF = '\n';
        OSWait(K_SIG,0);
    } 
}

                            void TaskD(void)
{
    while (1)
    {
#if EN_OS_Q_POST > 0
        OSWait(K_TMO,10);
        OSQPost(SerialData,0xf0);
        OSWait(K_TMO,10);
        OSQPost(SerialData,0xf1);
        OSWait(K_TMO,10);
        OSQPost(SerialData,0xf0);
        OSWait(K_TMO,10);
        OSQPost(SerialData,0xf0);
        OSWait(K_TMO,10);
        OSQPost(SerialData,0x00);
        OSWait(K_TMO,10);
        OSQPost(SerialData,0x00);
        OSWait(K_TMO,10);
        OSQPost(SerialData,0x3f);
#endif
#if EN_OS_Q_POST_FRONT > 0
        OSWait(K_TMO,10);
        OSQPostFront(SerialData,0x3f);
        OSWait(K_TMO,10);
        OSQPostFront(SerialData,0x00);
        OSWait(K_TMO,10);
        OSQPostFront(SerialData,0x00);
        OSWait(K_TMO,10);
        OSQPostFront(SerialData,0xf0);
        OSWait(K_TMO,10);
        OSQPostFront(SerialData,0xf0);
        OSWait(K_TMO,10);
        OSQPostFront(SerialData,0xf1);
        OSWait(K_TMO,10);
        OSQPostFront(SerialData,0xf0);
#endif
        OSWait(K_TMO,200);
        
    } 
}

⌨️ 快捷键说明

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