C51 队列 方式 中断接收 查询发送
扫描二维码
随时随地手机看文章
Keil C51没有 《stdbool.h》头文件,自己做一个
stdbool.h
#ifndef__STDBOOL_H__
#define__STDBOOL_H__
typedefenum{
false=0,
true=1,
}bool;
#endif
最简单的数组模拟循环队列
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;//打开串口中断开关
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 手册,发送缓冲与接收缓冲是独立的两个SBUF(虽然都对应 名字一样的SUBF 特殊功能寄存器)