📄 demo.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 + -