找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 724|回复: 0
收起左侧

C51单片机队列 方式 中断接收 查询发送程序

[复制链接]
ID:1043726 发表于 2022-9-3 16:00 | 显示全部楼层 |阅读模式
  1. #include "Queue.h"

  2. volatile unsigned char rx_data;
  3. extern SeqCycleQueue Q;

  4. void Send_Char(u8 ch)
  5. {
  6.     SBUF = ch;
  7.     while(TI == 0);
  8.     TI = 0;
  9. }


  10. //----------------------------------------------
  11. void main (void)
  12. {
  13.     volatile unsigned char tmp = 0;
  14.     TMOD = 0x20;   //T1方式2
  15.     TH1 = 0xFD;    //Baud:9600bps@11.0592MHz
  16.     TL1 = 0xFD;
  17.     TR1 = 1;       //启动定时器1
  18.    
  19.     SCON = 0x50;   //串口方式1, 8-n-1, 允许接收
  20.     REN = 1;      //使能串口接收
  21.     EA  = 1;      //打开总中断
  22.     ES  = 1;      //打开串口中断开关


  23.     Init_Cycle_Queue(&Q);
  24.     while(1)
  25.     {
  26.         if(!Is_Queue_Empty(&Q))
  27.         {
  28.             Delete_Queue(&Q, &tmp);
  29.             Send_Char(tmp);
  30.         }
  31.     }
  32. }
  33. //----------------------------------------------
  34. void serial(void) interrupt 4
  35. {
  36.     if(RI)
  37.     {
  38.         rx_data = SBUF;
  39.         //P1 = rx_data;
  40.         Entry_Queue(&Q, rx_data);
  41.         RI = 0;
  42.     }
  43. }
复制代码

  1. #include "Queue.h"
  2. SeqCycleQueue Q;

  3. void Init_Cycle_Queue(SeqCycleQueue *Q)
  4. {
  5.         Q->front = 0;
  6.         Q->rear  = 0;
  7. }

  8. bool Entry_Queue(SeqCycleQueue *Q,u8 x)
  9. {
  10.         if((Q->rear+1) % Maxsize == Q->front)
  11.     {
  12.                 return false;
  13.     }
  14.         Q->element[Q->rear] = x;
  15.         Q->rear = (Q->rear+1) % Maxsize;
  16.         return true;
  17. }
  18. bool Delete_Queue(SeqCycleQueue *Q,u8 *x)
  19. {
  20.         if(Q->front == Q->rear)
  21.                 return false;
  22.         *x = Q->element[Q->front];
  23.         Q->front = (Q->front+1) % Maxsize;
  24.         return true;
  25. }

  26. bool Get_front_value(SeqCycleQueue *Q,u8 *x)
  27. {
  28.         if(Q->front == Q->rear)
  29.     {
  30.         return false;
  31.     }
  32.     else
  33.     {
  34.         *x = Q->element[Q->front];
  35.         return true;
  36.     }
  37. }

  38. bool Is_Queue_Full(SeqCycleQueue *Q)
  39. {
  40.     if((Q->rear+1) % Maxsize == Q->front)
  41.         {
  42.         return true;
  43.     }
  44.     else
  45.     {
  46.             return false;
  47.     }
  48. }

  49. bool Is_Queue_Empty(SeqCycleQueue *Q)
  50. {
  51.         if(Q->front == Q->rear)
  52.     {
  53.                 return true;
  54.     }
  55.     else
  56.     {
  57.         return false;
  58.     }
  59. }
复制代码

  1. #ifndef __QUEUE__
  2. #define __QUEUE__
  3. #include <REGX52.H>
  4. #include "stdbool.h"


  5. #define u8       unsigned char
  6. #define Maxsize 10

  7. typedef struct{
  8.         u8 element[Maxsize];
  9.         u8 front;
  10.         u8 rear;
  11. }SeqCycleQueue;


  12. void Init_Cycle_Queue(SeqCycleQueue *Q);
  13. bool Entry_Queue(SeqCycleQueue *Q,u8 x);
  14. bool Delete_Queue(SeqCycleQueue *Q,u8 *x);
  15. bool Get_front_value(SeqCycleQueue *Q,u8 *x);
  16. bool Is_Queue_Full(SeqCycleQueue *Q);
  17. bool Is_Queue_Empty(SeqCycleQueue *Q);


  18. #endif
复制代码
  1. #ifndef  __STDBOOL_H__
  2. #define  __STDBOOL_H__

  3. typedef enum{
  4.     false = 0,
  5.     true  = 1,

  6. }bool;


  7. #endif
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表