×
单片机 > 单片机程序设计 > 详情

C51 队列 方式 中断接收 查询发送

发布时间:2020-06-04 发布时间:
|

Keil C51没有 《stdbool.h》头文件,自己做一个


stdbool.h


  1. #ifndef  __STDBOOL_H__  

  2. #define  __STDBOOL_H__  

  3.   

  4. typedef enum{  

  5.     false = 0,  

  6.     true  = 1,  

  7.   

  8. }bool;  

  9.   

  10.   

  11. #endif  




最简单的数组模拟循环队列


Queue.h


  1. #ifndef __QUEUE__  

  2. #define __QUEUE__  

  3. #include   

  4. #include "stdbool.h"  

  5.   

  6.   

  7. #define u8       unsigned char  

  8. #define Maxsize 10  

  9.   

  10. typedef struct{  

  11.     u8 element[Maxsize];  

  12.     u8 front;  

  13.     u8 rear;  

  14. }SeqCycleQueue;  

  15.   

  16.   

  17. void Init_Cycle_Queue(SeqCycleQueue *Q);  

  18. bool Entry_Queue(SeqCycleQueue *Q,u8 x);  

  19. bool Delete_Queue(SeqCycleQueue *Q,u8 *x);  

  20. bool Get_front_value(SeqCycleQueue *Q,u8 *x);  

  21. bool Is_Queue_Full(SeqCycleQueue *Q);  

  22. bool Is_Queue_Empty(SeqCycleQueue *Q);  

  23.   

  24.   

  25. #endif  





Queue.c


  1. #include "Queue.h"  

  2. SeqCycleQueue Q;  

  3.   

  4. void Init_Cycle_Queue(SeqCycleQueue *Q)  

  5. {  

  6.     Q->front = 0;  

  7.     Q->rear  = 0;  

  8. }  

  9.   

  10. bool Entry_Queue(SeqCycleQueue *Q,u8 x)  

  11. {  

  12.     if((Q->rear+1) % Maxsize == Q->front)  

  13.     {  

  14.         return false;  

  15.     }  

  16.     Q->element[Q->rear] = x;  

  17.     Q->rear = (Q->rear+1) % Maxsize;  

  18.     return true;  

  19. }  

  20. bool Delete_Queue(SeqCycleQueue *Q,u8 *x)  

  21. {  

  22.     if(Q->front == Q->rear)  

  23.         return false;  

  24.     *x = Q->element[Q->front];  

  25.     Q->front = (Q->front+1) % Maxsize;  

  26.     return true;  

  27. }  

  28.   

  29. bool Get_front_value(SeqCycleQueue *Q,u8 *x)  

  30. {  

  31.     if(Q->front == Q->rear)  

  32.     {  

  33.         return false;  

  34.     }  

  35.     else  

  36.     {  

  37.         *x = Q->element[Q->front];  

  38.         return true;  

  39.     }  

  40. }  

  41.   

  42. bool Is_Queue_Full(SeqCycleQueue *Q)  

  43. {  

  44.     if((Q->rear+1) % Maxsize == Q->front)  

  45.     {   

  46.         return true;  

  47.     }  

  48.     else  

  49.     {  

  50.         return false;  

  51.     }  

  52. }  

  53.   

  54. bool Is_Queue_Empty(SeqCycleQueue *Q)  

  55. {  

  56.     if(Q->front == Q->rear)  

  57.     {  

  58.         return true;  

  59.     }  

  60.     else  

  61.     {  

  62.         return false;  

  63.     }  

  64. }  




main.c


  1. #include "Queue.h"  

  2.   

  3. volatile unsigned char rx_data;  

  4. extern SeqCycleQueue Q;  

  5.   

  6. void Send_Char(u8 ch)  

  7. {  

  8.     SBUF = ch;  

  9.     while(TI == 0);  

  10.     TI = 0;  

  11. }  

  12.   

  13.   

  14. //----------------------------------------------  

  15. void main (void)  

  16. {  

  17.     volatile unsigned char tmp = 0;  

  18.     TMOD = 0x20;   //T1方式2  

  19.     TH1 = 0xFD;    //Baud:9600bps@11.0592MHz  

  20.     TL1 = 0xFD;  

  21.     TR1 = 1;       //启动定时器1  

  22.       

  23.     SCON = 0x50;   //串口方式1, 8-n-1, 允许接收  

  24.     REN = 1;      //使能串口接收  

  25.     EA  = 1;      //打开总中断  

  26.     ES  = 1;      //打开串口中断开关  

  27.   

  28.   

  29.     Init_Cycle_Queue(&Q);  

  30.     while(1)  

  31.     {  

  32.         if(!Is_Queue_Empty(&Q))  

  33.         {  

  34.             Delete_Queue(&Q, &tmp);  

  35.             Send_Char(tmp);  

  36.         }  

  37.     }  

  38. }  

  39. //----------------------------------------------  

  40. void serial(void) interrupt 4  

  41. {  

  42.     if(RI)  

  43.     {  

  44.         rx_data = SBUF;  

  45.         //P1 = rx_data;  

  46.         Entry_Queue(&Q, rx_data);  

  47.         RI = 0;  

  48.     }  

  49. }   

  50. //----------------------------------------------  




阅读 51 手册,发送缓冲与接收缓冲是独立的两个SBUF(虽然都对应 名字一样的SUBF 特殊功能寄存器)




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计