C51 隊(duì)列 方式 中斷接收 查詢發(fā)送
Keil C51沒有 《stdbool.h》頭文件,自己做一個
stdbool.h
#ifndef__STDBOOL_H__
#define__STDBOOL_H__
typedefenum{
false=0,
true=1,
}bool;
#endif
最簡單的數(shù)組模擬循環(huán)隊(duì)列
Queue.h
#ifndef__QUEUE__
#define__QUEUE__
#include
#include"stdbool.h"
#defineu8unsignedchar
#defineMaxsize10
typedefstruct{
u8element[Maxsize];
u8front;
u8rear;
}SeqCycleQueue;
voidInit_Cycle_Queue(SeqCycleQueue*Q);
boolEntry_Queue(SeqCycleQueue*Q,u8x);
boolDelete_Queue(SeqCycleQueue*Q,u8*x);
boolGet_front_value(SeqCycleQueue*Q,u8*x);
boolIs_Queue_Full(SeqCycleQueue*Q);
boolIs_Queue_Empty(SeqCycleQueue*Q);
#endif
Queue.c
#include"Queue.h"
SeqCycleQueueQ;
voidInit_Cycle_Queue(SeqCycleQueue*Q)
{
Q->front=0;
Q->rear=0;
}
boolEntry_Queue(SeqCycleQueue*Q,u8x)
{
if((Q->rear+1)%Maxsize==Q->front)
{
returnfalse;
}
Q->element[Q->rear]=x;
Q->rear=(Q->rear+1)%Maxsize;
returntrue;
}
boolDelete_Queue(SeqCycleQueue*Q,u8*x)
{
if(Q->front==Q->rear)
returnfalse;
*x=Q->element[Q->front];
Q->front=(Q->front+1)%Maxsize;
returntrue;
}
boolGet_front_value(SeqCycleQueue*Q,u8*x)
{
if(Q->front==Q->rear)
{
returnfalse;
}
else
{
*x=Q->element[Q->front];
returntrue;
}
}
boolIs_Queue_Full(SeqCycleQueue*Q)
{
if((Q->rear+1)%Maxsize==Q->front)
{
returntrue;
}
else
{
returnfalse;
}
}
boolIs_Queue_Empty(SeqCycleQueue*Q)
{
if(Q->front==Q->rear)
{
returntrue;
}
else
{
returnfalse;
}
}
main.c
#include"Queue.h"
volatileunsignedcharrx_data;
externSeqCycleQueueQ;
voidSend_Char(u8ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
//----------------------------------------------
voidmain(void)
{
volatileunsignedchartmp=0;
TMOD=0x20;//T1方式2
TH1=0xFD;//Baud:9600bps@11.0592MHz
TL1=0xFD;
TR1=1;//啟動定時器1
SCON=0x50;//串口方式1,8-n-1,允許接收
REN=1;//使能串口接收
EA=1;//打開總中斷
ES=1;//打開串口中斷開關(guān)
Init_Cycle_Queue(&Q);
while(1)
{
if(!Is_Queue_Empty(&Q))
{
Delete_Queue(&Q,&tmp);
Send_Char(tmp);
}
}
}
//----------------------------------------------
voidserial(void)interrupt4
{
if(RI)
{
rx_data=SBUF;
//P1=rx_data;
Entry_Queue(&Q,rx_data);
RI=0;
}
}
//----------------------------------------------
閱讀 51 手冊,發(fā)送緩沖與接收緩沖是獨(dú)立的兩個SBUF(雖然都對應(yīng) 名字一樣的SUBF 特殊功能寄存器)