4707|3

330

帖子

907

TA的资源

一粒金砂(中级)

楼主
 

分享农民讲习所的51代码整理 [复制链接]

文章来源 农民讲习所 发的一篇 (设计者.叶志伟)《建立通用处理程序》

其中涉及到 指针使用 内存分配  串口处理等

注意 其中 串口使用了函数  未处理重入函数

  1. /*********************************************************************************
  2. **@CPU @ AT89S52
  3. **@RAM @ 256Bytes
  4. **@ROM @ 0x0000-0x1fff
  5. **@时间@ 12/19/09
  6. **@环境@ keil uv3 v8.16
  7. **@整理@ jerkoh
  8. **@功能@ 51单片机模块化设计
  9. **@注意@ 请保留以下字样-> 版权.设计者.叶志伟.农民讲习所.21IcBBS
  10. *********************************************************************************/

  11. /*********************************************************************************
  12. **包含头文件
  13. *********************************************************************************/
  14. #include
  15. /*********************************************************************************
  16. **定义功能原型
  17. *********************************************************************************/
  18. void Memory_Init(unsigned char *pRamEnd);
  19. void Memory_Destory(void);
  20. void Memory_MemSet(unsigned char idata *pRam,unsigned char mChar,unsigned char mLen);
  21. unsigned char idata *Memory_Malloc(unsigned char mSize);
  22. void Queue_Init(void);
  23. void Queue_Destory(void);
  24. void Queue_Push(struct QueueBuffer *pQueueBuffer,unsigned char mData);
  25. void Queue_Clear(struct QueueBuffer *pQueueBuffer);
  26. unsigned char Queue_Pop(struct QueueBuffer *pQueueBuffer);
  27. unsigned char Queue_Read(struct QueueBuffer *pQueueBuffer,unsigned char mId);
  28. unsigned int Queue_Num(struct QueueBuffer *pQueueBuffer);
  29. struct QueueBuffer *Queue_Register(unsigned int mSize);
  30. void Uart08_Init(unsigned char SendBufferMax,unsigned char ReciBufferMax,unsigned char mBaud);
  31. void Uart08_Destory(void);
  32. /*********************************************************************************
  33. **定义结构体
  34. *********************************************************************************/
  35. struct QueueBuffer /*缓冲队列结构体*/
  36. { /*结构体内成员是指针占3字节*/
  37. unsigned char *aBufferStart; /*缓冲区起始点*/
  38. unsigned char *aBufferEnd; /*缓冲区结束点*/
  39. unsigned char *pIn; /*写指针*/
  40. unsigned char *pOut; /*读指针*/
  41. unsigned int mCount; /*缓冲区数据个数*/

  42. };
  43. struct Uart0
  44. {
  45. struct QueueBuffer *psSend; /*发送队列指针*/
  46. struct QueueBuffer *psReci; /*接收队列指针*/
  47. };
  48. /*********************************************************************************
  49. **申明全局变量及宏定义
  50. *********************************************************************************/
  51. #define mSendBufferMax 32 /*发送缓冲区最大数据个数*/
  52. #define mReciBufferMax 32 /*接收缓冲区最大数据个数*/
  53. #define Baud_9600_11M 6 /*9600 8/n/1*/
  54. /*宏定义串口发送*/
  55. #define Uart08_Push(x) do{Queue_Push(sUart0.psSend,x);\
  56. if(!fUart0_Send_OK){fUart0_Send_OK=1;TI=1;};\
  57. }while(0)
  58. /*宏定义串口接收*/
  59. #define Uart08_Pop() Queue_Pop(sUart0.psReci)
  60. /*宏定义读串口指定ID号*/
  61. #define Uart08_Read(x) Queue_Read(sUart0.psReci,x)
  62. /*宏定义读串口接受区数据个数*/
  63. #define Uart08_ReciNum() Queue_Num(sUart0.psReci)
  64. /*宏定义串口发送区清0*/
  65. #define Uart08_SendClear(x) do{Queue_Clear(sUart0.psend);}while(0);
  66. /*宏定义串口接收区清0*/
  67. #define Uart08_ReciClear(x) do{Queue_Clear(sUart0.pReci);}while(0);

  68. data struct Uart0 sUart0; /*定义串口的结构体*/
  69. bit fUart0_Send_OK; /*发送结束标记*/
  70. unsigned char idata *pRamEnd; /*内存指针尾*/
  71. /*用于测试的缓冲区*/
  72. unsigned char idata TestBuffer[32]={"Hello World!"};
复制代码

此帖出自51单片机论坛
点赞 关注
 

回复
举报

330

帖子

907

TA的资源

一粒金砂(中级)

沙发
 
  1. /*********************************************************************************
  2. **函数:int main(void)
  3. **入参:null
  4. **返回:0
  5. **功能: main
  6. **时间:12/19/09
  7. **说明:null
  8. *********************************************************************************/
  9. int main(void)
  10. {
  11. unsigned char i;
  12. unsigned char *pString;

  13. Memory_Init((unsigned char idata*)0xff); /*初始化内存模块*/
  14. Memory_Destory(); /*内存回收资源*/
  15. Queue_Init(); /*初始化队列*/
  16. Queue_Destory(); /*队列回收资源*/
  17. /*串口初始化*/
  18. Uart08_Destory();
  19. Uart08_Init(mSendBufferMax,mReciBufferMax,Baud_9600_11M);

  20. EA =1; /*允许总中断*/

  21. while(1)
  22. {
  23. pString=TestBuffer; /*指针指向数组*/
  24. for(i=0;i<32;i++)
  25. {
  26. Uart08_Push(*pString++); /*发送"Hello World!"*/
  27. }
  28. for(;;);
  29. }
  30. return 1;
  31. }
  32. /*********************************************************************************
  33. **函数:void Uart08_Init(unsigned char SendBufferMax,\
  34. unsigned char ReciBufferMax,unsigned char mBaud)
  35. **入参:SendBufferMax ReciBufferMax mBaud
  36. **返回:0
  37. **功能: 串口初始化
  38. **时间:12/20/09
  39. **说明:null
  40. *********************************************************************************/
  41. void Uart08_Init(unsigned char SendBufferMax,\
  42. unsigned char ReciBufferMax,unsigned char mBaud)
  43. {
  44. fUart0_Send_OK = 0;
  45. Memory_MemSet((unsigned char idata*)&sUart0,0,sizeof(struct Uart0));
  46. sUart0.psSend=Queue_Register(SendBufferMax); /*申请发送队列*/
  47. sUart0.psReci=Queue_Register(ReciBufferMax); /*申请接收队列*/

  48. PCON |=0x80; /*波特率加倍*/
  49. TMOD =(TMOD&0x0f) | 0x20; /*T1自动重装*/
  50. TH1 =TL1=(~mBaud)+1; /*T1的定时初值*/
  51. TR1 =1; /*开定时器1*/
  52. SCON =0x40 | 0x10; /*SM1=1 ,REN=1*/
  53. ES =1; /*允许中断*/
  54. }
复制代码
此帖出自51单片机论坛
 
 
 

回复

330

帖子

907

TA的资源

一粒金砂(中级)

板凳
 
  1. /*********************************************************************************
  2. **函数:void Uart08_Destory(void)
  3. **入参:null
  4. **返回:0
  5. **功能: 回收串口资源
  6. **时间:12/20/09
  7. **说明:null
  8. *********************************************************************************/
  9. void Uart08_Destory(void)
  10. {
  11. TR1 =0;
  12. TMOD &=0x0f;
  13. PCON &=~0x80;
  14. ES =0;
  15. SCON =0;
  16. }


  17. /*********************************************************************************
  18. **函数:Memory_Init(unsigned char *pRamEnd)
  19. **入参:*pRamEnd
  20. **返回:null
  21. **功能: 初始化内存 内存指针指向RAM的最后
  22. **时间:12/19/09
  23. **说明:null
  24. *********************************************************************************/
  25. void Memory_Init(unsigned char *pRamEnd)
  26. {
  27. pRamEnd=0;
  28. }
  29. /*********************************************************************************
  30. **函数:void Memory_Destory(void)
  31. **入参:null
  32. **返回:null
  33. **功能: 析构
  34. **时间:12/19/09
  35. **说明:IDLE STOP 进入此函数 释放硬件资源
  36. *********************************************************************************/
  37. void Memory_Destory(void)
  38. {
  39. ;
  40. }

  41. /*********************************************************************************
  42. **函数:unsigned char idata *Memory_Malloc(unsigned char mSize)
  43. **入参:mSzie
  44. **返回:*pRamEnd 返回分配后的起始指针
  45. **功能: 内存分配
  46. **时间:12/19/09
  47. **说明:null
  48. *********************************************************************************/
  49. unsigned char idata *Memory_Malloc(unsigned char mSize)
  50. {
  51. pRamEnd -= mSize;
  52. return pRamEnd;
  53. }

  54. /*********************************************************************************
  55. **函数:void Memory_MemSet(unsigned char idata *pRam,\
  56. unsigned char mChar,unsigned char mLen)
  57. **入参:*pRam,mChar,mLen
  58. **返回:null
  59. **功能: 指定数据内存清除
  60. **时间:12/19/09
  61. **说明:null
  62. *********************************************************************************/
  63. void Memory_MemSet(unsigned char idata *pRam,\
  64. unsigned char mChar,unsigned char mLen)
  65. {
  66. while(mLen--)
  67. {
  68. *pRam++ = mChar;
  69. }
  70. }
  71. /*********************************************************************************
  72. **函数:void Queue_Init(void)
  73. **入参:null
  74. **返回:null
  75. **功能: 初始化队列
  76. **时间:12/19/09
  77. **说明:null
  78. *********************************************************************************/
  79. void Queue_Init()
  80. {
  81. ;
  82. }

  83. /*********************************************************************************
  84. **函数:void Queue_Destory(void)
  85. **入参:null
  86. **返回:null
  87. **功能: 释放队列硬件资源
  88. **时间:12/19/09
  89. **说明:null
  90. *********************************************************************************/
  91. void Queue_Destory()
  92. {
  93. ;
  94. }
  95. /*********************************************************************************
  96. **函数:void Queue_Push(struct QueueBuffer *pQueueBuffer,unsigned char mData)/

  97. **入参:QueueBuffer *pQueueBuffer mData
  98. **返回:null
  99. **功能: 将数据压入队列
  100. **时间:12/19/09
  101. **说明:null
  102. *********************************************************************************/
  103. void Queue_Push(struct QueueBuffer *pQueueBuffer,unsigned char mData)
  104. {

  105. bit fEaReg;
  106. /*注意:如果是重入函数内部不能使用Bool变量*/
  107. /*重入函数 KEIL默认 将所有变量定位到外部RAM的最高处,而外部RAM不可以位寻址*/
  108. *pQueueBuffer->pIn++ = mData;
  109. if(pQueueBuffer->pIn==pQueueBuffer->aBufferEnd)
  110. {
  111. pQueueBuffer->pIn=pQueueBuffer->aBufferStart;
  112. }
  113. fEaReg=EA;
  114. EA=0;
  115. pQueueBuffer->mCount++;
  116. EA=fEaReg;

  117. }

  118. /*********************************************************************************
  119. **函数:unsigned char Queue_Pop(struct QueueBuffer *pQueueBuffer)
  120. **入参:QueueBuffer *pQueueBuffer
  121. **返回:mData
  122. **功能: 将数据弹出队列
  123. **时间:12/19/09
  124. **说明:null
  125. *********************************************************************************/
  126. unsigned char Queue_Pop(struct QueueBuffer *pQueueBuffer)
  127. {
  128. unsigned char mData;
  129. bit fEaReg;

  130. mData=*pQueueBuffer->pOut ;
  131. if(++pQueueBuffer->pOut==pQueueBuffer->aBufferEnd)
  132. {
  133. pQueueBuffer->pOut=pQueueBuffer->aBufferStart;
  134. }
  135. fEaReg=EA;
  136. EA=0;
  137. pQueueBuffer->mCount--;
  138. EA=fEaReg;
  139. return mData;
  140. }

  141. /*********************************************************************************
  142. **函数:unsigned char Queue_Read(struct QueueBuffer *pQueueBuffer,unsigned char mId)
  143. **入参:QueueBuffer *pQueueBuffer unsigned char mId
  144. **返回:null
  145. **功能: 读队列指定序号数据
  146. **时间:12/19/09
  147. **说明:null
  148. *********************************************************************************/
  149. unsigned char Queue_Read(struct QueueBuffer *pQueueBuffer,unsigned char mId)
  150. {
  151. unsigned char *pTemp;
  152. pTemp=pQueueBuffer->pOut+mId;
  153. if(pTempaBufferEnd)
  154. {
  155. return (*pTemp);
  156. }
  157. else
  158. {
  159. return (*(pTemp-pQueueBuffer->aBufferEnd+pQueueBuffer->aBufferStart));
  160. }

  161. }
复制代码
此帖出自51单片机论坛
 
 
 

回复

330

帖子

907

TA的资源

一粒金砂(中级)

4
 
  1. /*********************************************************************************
  2. **函数:unsigned int Queue_Num(struct QueueBuffer *pQueueBuffer)
  3. **入参:QueueBuffer *pQueueBuffer
  4. **返回:i
  5. **功能: 返回队列数据个数
  6. **时间:12/19/09
  7. **说明:null
  8. *********************************************************************************/
  9. unsigned int Queue_Num(struct QueueBuffer *pQueueBuffer)
  10. {
  11. unsigned int i;
  12. bit fEaReg;

  13. fEaReg=EA;
  14. EA=0;
  15. i=pQueueBuffer->mCount;
  16. EA=fEaReg;
  17. return i;
  18. }

  19. /*********************************************************************************
  20. **函数:void Queue_Clear(struct QueueBuffer *pQueueBuffer)
  21. **入参:QueueBuffer *pQueueBuffer
  22. **返回:i
  23. **功能: 队列清空
  24. **时间:12/19/09
  25. **说明:null
  26. *********************************************************************************/
  27. void Queue_Clear(struct QueueBuffer *pQueueBuffer)
  28. {
  29. bit fEaReg;

  30. fEaReg=EA;
  31. EA=0;
  32. pQueueBuffer->pIn=pQueueBuffer->pOut=pQueueBuffer->aBufferStart;
  33. pQueueBuffer->mCount=0;
  34. EA=fEaReg;

  35. }
  36. /*********************************************************************************
  37. **函数:struct QueueBuffer *Queue_Register(unsigned int mSize)
  38. **入参:unsigned int mSize
  39. **返回:指针pQueueBuffer;
  40. **功能: 申请注册缓冲队列
  41. **时间:12/19/09
  42. **说明:null
  43. *********************************************************************************/
  44. struct QueueBuffer *Queue_Register(unsigned int mSize)
  45. {
  46. struct QueueBuffer *pQueueBuffer;

  47. /*分配纪录队列信息的结构变量*/
  48. pQueueBuffer =(struct QueueBuffer*)Memory_Malloc(sizeof(struct QueueBuffer));
  49. /*纪录队列信息的结构变量清0*/
  50. Memory_MemSet((unsigned char *)pQueueBuffer,0,sizeof(struct QueueBuffer));

  51. /*分配队列所需内存*/
  52. pQueueBuffer->aBufferStart=pQueueBuffer->pIn=pQueueBuffer->pOut=Memory_Malloc

  53. (mSize);
  54. /*队列结束指针*/
  55. pQueueBuffer->aBufferEnd=pQueueBuffer->aBufferStart+mSize;
  56. /*返回struct QueueBuffer 结构指针*/
  57. return pQueueBuffer;
  58. }
  59. /*********************************************************************************
  60. **函数:void UART08() interrupt 4
  61. **入参:null
  62. **返回:null
  63. **功能: 串口中断函数
  64. **时间:12/19/09
  65. **说明:null
  66. *********************************************************************************/
  67. void UART08() interrupt 4
  68. {
  69. if(TI)
  70. {
  71. TI =0;
  72. if(Queue_Num(sUart0.psSend)) /*检测发送区是否有数据*/
  73. {
  74. SBUF =Queue_Pop(sUart0.psSend); /*串口发送*/
  75. }
  76. else
  77. {
  78. fUart0_Send_OK =0; /*发送队列空 清标记 不再发送*/
  79. }
  80. }

  81. if(RI)
  82. {
  83. RI =0;
  84. Queue_Push(sUart0.psReci,SBUF); /*接收数据存入队列*/
  85. }
  86. }
复制代码
此帖出自51单片机论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表