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

📄 demo.c

📁 UCOSII2.85针对8051单片机的移植版本
💻 C
字号:
#include <includes.h>
#include <stdio.h>

#define SERIAL_BAUDRATE0 0
#define SERIAL_BAUDRATE1 1
#define SERIAL_BAUDRATE2 2
#define SERIAL_BAUDRATE3 3

#define SERIAL_BAUD_RATE0 SERIAL_BAUDRATE0
#define SERIAL_BAUD_RATE1 SERIAL_BAUDRATE1
#define SERIAL_BAUD_RATE2 SERIAL_BAUDRATE2
#define SERIAL_BAUD_RATE3 SERIAL_BAUDRATE3

#define SERIAL_MODE0 0//8-bit var. baudrate
#define SERIAL_MODE1 1//9-bit var. baudrate

#define COMM_Q_SIZE 100//Maximum to 65535

OS_EVENT *CommQRx,*CommQTx;
INT8U Perr;

void *CommMsgRx[COMM_Q_SIZE],*CommMsgTx[COMM_Q_SIZE];
INT8U SerialStatWord;//Readonly
                     //  __ __ __ __ __ __ __ __
                     // |__|__|__|__|__|__|__|__|
                     //  D7 D6 D5 D4 D3 D2 D1 D0
                     //
                     //  D7:    Serial Mode
                     //             0--SERIAL_MODE0
                     //             1--SERIAL_MODE1
                     //  D6-D4: Serial Baudrate
                     //             000--SERIAL_BAUDRATE0
                     //             001--SERIAL_BAUDRATE1
                     //             010--SERIAL_BAUDRATE2
                     //             011--SERIAL_BAUDRATE3
                     //             others--SERIAL_BAUDRATE0(default,can also be defined by user)
                     //  D3 D2: Tx-Buffer Status
                     //             00--Normal(stored,but not full)
                     //             10--Empty
                     //             11--Full
                     //  D1 D0: Rx-Buffer Status
                     //             00--Normal
                     //             10--Empty
                     //             11--Full
                        
void SerialInit(INT8U smode,INT8U sbaudrate) reentrant;
void SerialBufCreate(void) reentrant;
void RxBufgetch(INT8U *ch) reentrant;
void TxBufputch(INT8U *ch) reentrant;
void SerialBufClr(void) reentrant;
void Serial(void) reentrant;

#define TxStart() TI=1
#define SerialRelease() ES=0

/*
*************************************************************************************************
*/
void SerialInit(INT8U smode,INT8U sbaudrate) reentrant//串口初始化
{    
    if(smode==SERIAL_MODE0) {SCON=0x50;SerialStatWord&=0x7F;}
    else {SCON=0xD0;SerialStatWord|=0x80;}
    SerialStatWord&=0x8F;
    TMOD&=0x0F;
    TMOD|=0x20;
    switch(sbaudrate)
    {
        case SERIAL_BAUD_RATE0:
            TL1=0xFD;//19200bps@11.059MHz,TL1=256-(2^SMOD/32*Fosc/12*1/Baudrate)
            PCON=0x80;
            break;
        case SERIAL_BAUD_RATE1:
            TL1=0xFD;//9600bps@11.059MHz
            PCON=0x00;
            SerialStatWord|=0x10;
            break;
        case SERIAL_BAUD_RATE2:
            TL1=0xFA;//4800bps@11.059MHz
            PCON=0x00;
            SerialStatWord|=0x20;
            break;
        case SERIAL_BAUD_RATE3:
            TL1=0xF4;//2400bps@11.059MHz
            PCON=0x00;
            SerialStatWord|=0x30;
            break;
        default:
            TL1=0xFD;//9600bps@11.059MHz
            PCON=0x00;
    }
    TH1=TL1;
    TR1=1;//Start timer1
    ES=1;//Enable serialport interrupt
}
/*
*************************************************************************************************
*/
void SerialBufCreate(void) reentrant//建立串口收发缓冲区
{
    CommQRx=OSQCreate(&CommMsgRx[0],COMM_Q_SIZE);
    CommQTx=OSQCreate(&CommMsgTx[0],COMM_Q_SIZE);
    SerialStatWord&=0xF0;
    SerialStatWord|=0x0A;
}
/*
*************************************************************************************************
*/
void RxBufgetch(INT8U *ch) reentrant//从串口接收缓冲区读1字节数据
{
    ch=(INT8U *)OSQAccept(CommQRx, &Perr);
    if(ch!=(INT8U *)0) SerialStatWord&=0xFC;
    else {SerialStatWord&=0xFC;SerialStatWord|=0x02;}
}
/*
*************************************************************************************************
*/
void TxBufputch(INT8U *ch) reentrant//向串口发送缓冲区写1字节数据
{
    INT8U err;
    err=OSQPost(CommQTx,(void *)ch);
    if(err==OS_NO_ERR) SerialStatWord&=0xF3;
    else {SerialStatWord&=0xF3;SerialStatWord|=0x0C;}
}
/*
*************************************************************************************************
*/
void SerialBufClr(void) reentrant//清空串口收发缓冲区
{
    OSQFlush(CommQRx);
    OSQFlush(CommQTx);
    SerialStatWord&=0xF0;
    SerialStatWord|=0x0A;
}
/*
*************************************************************************************************
*/
void Serial(void) reentrant//串口中断服务子程序
{
    INT8U *ch,err;
    if(TI)
    {
        TI=0;
        ch=(INT8U *)OSQAccept(CommQTx, &Perr);
        if(ch!=(INT8U *)0)
        {
            ACC=*ch;
            TB8=P;
            SBUF=ACC;
            SerialStatWord&=0xF3;
        }
        else {SerialStatWord&=0xF3;SerialStatWord|=0x08;}        
    }
    if(RI)
    {
        RI=0;
        if(SM0)
        {
            ACC=SBUF;
            if(P==RB8)
            {
                err=OSQPost(CommQRx,(void *)0x99);//sfr SBUF=0x99,see "reg51.h"
                if(err==OS_NO_ERR) {SerialStatWord&=0xFC;}
                else {SerialStatWord&=0xFC;SerialStatWord|=0x03;}
            }
        }
        else
        {
            err=OSQPost(CommQRx,(void *)0x99);//sfr SBUF=0x99,see "reg51.h"
            if(err==OS_NO_ERR) {SerialStatWord&=0xFC;}
            else {SerialStatWord&=0xFC;SerialStatWord|=0x03;}
        }
    }
}
/*
*************************************************************************************************
*/
/*
*************************************************************************************************
*/
void PrintChar(INT8U ch) reentrant//显示字符(ASCII码)
{
    INT8U temp;
    do {temp=SerialStatWord&0x0C;}//Delay till Tx-Buffer empty(very important)
    while(temp!=0x08);
    TxBufputch(&ch);
    TxStart();
}
/*
*************************************************************************************************
*/
void PrintDec(INT16U dec) reentrant//十进制格式显示数据(16-bit)
{
    INT8U a,b,c,d,e;
    a=dec%10;
    b=dec%100/10;
    c=dec%1000/100;
    d=dec%10000/1000;
    e=dec/10000;
    if(e!=0) PrintChar(e+'0');
    if(d!=0) PrintChar(d+'0');
    if(c!=0) PrintChar(c+'0');
    if(b!=0) PrintChar(b+'0');
    PrintChar(a+'0');
}
/*
*************************************************************************************************
*/
void PrintHex(INT8U hex) reentrant//十六进制格式显示数据(8-bit)
{
    INT8U temp;
    temp=hex>>4;
    if(temp>=0&&temp<=9) temp=temp+'0';
    else temp=temp+'A'-10;
    PrintChar(temp);
    temp=hex&0x0F;
    if(temp>=0&&temp<=9) temp=temp+'0';
    else temp=temp+'A'-10;
    PrintChar(temp);
}
/*
*************************************************************************************************
*/
void PrintStr(INT8U *str) reentrant//显示字符串
{
    INT8U temp;
    do {temp=SerialStatWord&0x0C;}//Delay till Tx-Buffer empty(very important)
    while(temp!=0x08);
    while(*str!='\0')
    {
        TxBufputch(str);
        str++;
    }
    TxStart();
}
/*
*************************************************************************************************
*/
void ClrScr() reentrant//清屏
{        
    PrintStr("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
}
/*
*************************************************************************************************
*/
#define TASK_STK_SIZE MaxStkSize//Maximum to 65535

OS_STK MyTaskStk[TASK_STK_SIZE];

void MyTask(void *ppdata) reentrant
{
    ppdata=ppdata;
    while(1)
    {
        ClrScr();
        PrintStr("\t\t***********************************************************\n");
        PrintStr("\t\t*    (c) 2003 DRAGON JUBILATION ELECTRONICS Co., Ltd.     *\n");
        PrintStr("\t\t*                 All Rights Reserved                     *\n");
        PrintStr("\t\t*       THE DEMO OF 8051MCU SERIAL COMMUNICATIONS         *\n");
        PrintStr("\t\t*                    Ver 1.0(beta)                        *\n");
        PrintStr("\t\t*                                                         *\n");
        PrintStr("\t\t*      ###       ###            ###########   ########    *\n");
        PrintStr("\t\t*       ##       #########      ###   ##      ###    ##   *\n");
        PrintStr("\t\t*   ##########   ###            ###   ##      ###    ##   *\n");
        PrintStr("\t\t*     ##   #      #######       ### #####     ###    ##   *\n");
        PrintStr("\t\t*      #  #             ##      ### ##  ##    #########   *\n");
        PrintStr("\t\t*  ############  #########      ### ##  ##    ###         *\n");
        PrintStr("\t\t*    ########    ###            ###  #####    ###         *\n");
        PrintStr("\t\t*    ##     ##   ########       ###   ##      ###         *\n");
        PrintStr("\t\t*    #########   ###            ###   ##      ###     ##  *\n");
        PrintStr("\t\t*    ##     ##   ########        ##########    ########   *\n");
        PrintStr("\t\t*    #########   ###                                      *\n");
        PrintStr("\t\t*    ##     ##   ########        ##   ##     ##    ##     *\n");
        PrintStr("\t\t*    ##     ##   ###     ##     ###    ###    ###   ###   *\n");
        PrintStr("\t\t*    ##    ##     ########      ###    ###    ###   ####  *\n");
        PrintStr("\t\t*                                                         *\n");
        PrintStr("\t\t***********************************************************\n");
        PrintStr("\t\tSerialStatWord=");PrintHex(SerialStatWord);PrintChar('\n');
        OSTimeDly(0);
    }
}

OS_EVENT *idata SerialSem;

OS_STK MyTaskStk_A[TASK_STK_SIZE];
void MyTask_A(void *ppdata) reentrant
{
	INT8U err = 0xff;
	OS_SEM_DATA SemData;
	ppdata=ppdata;
	while (1)
	{
		OSSemQuery(SerialSem, &SemData);
		printf("\n\rHello, world");
		OSSemPend(SerialSem, 2*OS_TICKS_PER_SEC, &err);
		if (err == OS_ERR_NONE)
		{
			PrintStr("\n\tOS_ERR_NONE I am MyTask_A");
        }
        else if (err == OS_ERR_TIMEOUT)
        {
			PrintStr("\n\OS_ERR_TIMEOUT I am MyTask_A");

        }
		else
		{
			PrintStr("\n\I am MyTask_A");
		}
        //OSTimeDly(1*OS_TICKS_PER_SEC);    
		
	}
}

OS_STK MyTaskStk_B[TASK_STK_SIZE];
void MyTask_B(void *ppdata) reentrant
{
	ppdata=ppdata;
	while (1)
	{
		OSTimeDly(8*OS_TICKS_PER_SEC);    
		PrintStr("\n\t I am MyTask_B");
		OSSemPost(SerialSem);
		
	}
}

OS_STK MyTaskStk_C[TASK_STK_SIZE];
void MyTask_C(void *ppdata) reentrant
{
	INT8U err;
	ppdata=ppdata;
	while (1)
	{
		OSSemPend(SerialSem, 0, &err);
		//OSSemAccept(SerialSem);
		PrintStr("\n\t I am MyTask_C");
        OSTimeDly(2*OS_TICKS_PER_SEC);    
	}
}
/*
*************************************************************************************************
*/
void InitTimer0(void) reentrant; // simon add


main()
{
    OSInit();
	
    InitTimer0(); //simon add

    SerialSem = OSSemCreate(0);
    SerialBufCreate();
    SerialInit(SERIAL_MODE0,SERIAL_BAUDRATE3);
    //OSTaskCreate(MyTask, (void *)0, &MyTaskStk[0],0);
	
	OSTaskCreate(MyTask_A, (void *)0, &MyTaskStk_A[0],4);
	OSTaskCreate(MyTask_B, (void *)0, &MyTaskStk_B[0],5);
	OSTaskCreate(MyTask_C, (void *)0, &MyTaskStk_C[0],6);

    OSStart();
}

⌨️ 快捷键说明

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