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

发布者:真诚的友谊最新更新时间:2017-11-27 来源: eefocus关键字:C51  队列  方式  中断接收  查询发送 手机看文章 扫描二维码
随时随地手机看文章

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 特殊功能寄存器)


关键字:C51  队列  方式  中断接收  查询发送 引用地址:C51 队列 方式 中断接收 查询发送

上一篇:标准80C51单片机模拟I2C总线的主机程序
下一篇:C51 中断接收 查询发送

推荐阅读最新更新时间:2024-03-16 15:47

汽车电子技术:带你了解发动机三种热循环方式
  上一期我们说到了发动机的热效率,但是一提到热效率就不得不说热循环,目前市面上发动机比较多的热循环方式有三种奥托循环、米勒循环和阿特金森循环,今天就来说说这些......   市面上大部分发动机都是奥托循环,四冲程发动机吸气、压缩、做功、排气都伴随着正常的气门开闭时机,每次气门的开闭都在活塞的上止点或下止点,请看下面的GIF动图,这样的循环方式比较常规,压缩和做功的活塞行程都一样,但是这并不满足于人们对性能的需求,很多人想要增加压缩比,但是又不能使压缩比过大。   这么一种常规的热循环方式存在着,阿特金森循环和米勒循环又是从何而来的呢?这要说到咱们经常关注的一个参数——压缩比,很多人都以压缩比的高低来判断车辆好坏,认为
[嵌入式]
汽车电子技术:带你了解发动机三种热循环<font color='red'>方式</font>
实时时钟DS1302读写程序(C51)
//打开DS1302 void TimeSpiOpen(void) { TIMECLK = 0; TIMERST = 0;//禁止DS1302 TIMEIO = 1;//释放数据总线 TIMERST = 1;//使能DS1302 } //关闭DS1302 void TimeSpiClose(void) { TIMERST = 0;//禁止DS1302 TIMEIO = 1;//释放数据总线 TIMECLK = 1; } //读写DS1302 unsigned char TimeSpiReadWrite(unsigned char val) { unsigned char i; ACC = val;//取8位数据 for (i =
[单片机]
三种方式改善低照度摄像机成像质量
  除了最原始的增加补光灯或红外灯、选用大靶面CCD(该方法百万像素摄像机普遍采用)外,长期来改善低照度成像效果的手段不外乎下面几种。   选用高灵敏度CCD,目前摄像机大多采用两大系列CCD,一是索尼的SUPPERHADCCD系列,另一是索尼的EX-VIEWHADCCD系列。EXVIEWHADCCD将CCD每一像素的开口率提高,进而达到更低照度。技术资料介绍EXVIEWHADCCD的低照效果是SUPPERHADCCD的4~6倍,实际上确实有提升;   ·彩转黑技术,目前采用这一技术甚多,可配合使用红外灯。转换技术有两种,一是采用红外滤光片和切换电路来进行彩色/黑白转换;另一种利用电子电路将彩色信号滤除掉,无需红外滤光片。高端
[安防电子]
c51: 24C02 多字节读、写
//函数功能, //写入2个数据,在读出。 #include reg51.h #include intrins.h //变量声明 #define uchar unsigned char #define uint unsigned int //将数值转换为字符 uchar digit = 0123456789ABCDEF ; //延时 1ms void delayms() { uchar i; for(i=0;i 250;i++); for(i=0;i 80;i++); } void delaynms(uint s) { uint tem; for(tem=0;tem s;tem++) { delay
[单片机]
<font color='red'>c51</font>: 24C02 多字节读、写
keil下C51启动代码详解
由于CPU和程序启动代码文件STARTUP.a51的重要性,一些8051派生的CPU产品要求初始化CPU来满足设计中的相应的硬件,因此,有时候用户需要对STARTUP.a51进行修改,所以进行注释一下: ;--------------------------------------------------- ;startup.A51: 用户上电初始化程序 ;---------------------------------------------------- ; ;使用以下EQU命令可定义在CPU复位时需要用0进行初始化的内存空间 ; ;IDATA存储器的空间的绝对起始地址总是零 IDATALEN EQU 80H ;
[单片机]
4×4键盘C51单片机程序源码分享
/*MCU:AT89S52*/ #include #include #define uchar unsigned char int key; int del; void Key_Scan(void); /************主程序*************/ void main(void) { void Key_Scan(void); void delay(int); while(1) { Key_Scan(); delay(2000); } } /********矩键查寻键值4*4程序******/ void Key_Scan(void) { uchar readkey; uchar x_temp,y_temp; P
[单片机]
4×4键盘<font color='red'>C51</font>单片机程序源码分享
恩智浦推出基于A71CH信任锚的创新“即插可信”方式保障
面向众多市场应用领域提供安全物联网(IoT)嵌入式解决方案的领先供应商恩智浦半导体(NXP Semiconductors N.V.)今日推出新的A71CH安全元件(SE)信任锚,这是一款针对下一代物联网设备(如边缘节点和网关)的即时可用安全解决方案。这款芯片旨在保护点对点或云连接的安全,可预置所需的机密信息,用于自主云接入和点对点身份验证。该解决方案从芯片级提供了信任根(RoT),具有加密密钥存储、密钥生成和派生等安全功能,以保护隐私数据和双向验证。 恩智浦物联网安全解决方案总经理Philippe Dubois表示:“企业现在开始意识到在未来云应用和服务中保证物联网设备和连接安全的重要性,但是他们缺乏集成方面的知识或合适的安全
[网络通信]
PWM控制亮度的流水灯c51程序
#include Reg52.h //--重定义函数变量--// #define uchar unsigned char #define uint unsigned int #define ulong unsigned long /* 定义常量 */ #define FOSC 12000000L //主时钟 #define T50us (65536-FOSC/12/1000000*50) //12T 模式下,50us 时间的计算方法 #define T10ms (65536-FOSC/12/1000*10) //12T 模式下,10ms 时间的计算方法 //--定义全局变量--// uc
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved