打印

分享农民讲习所的51代码整理

[复制链接]
10741|36
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jerkoh|  楼主 | 2009-12-20 21:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
整理电脑资料
阅读了下农民讲习所的一片PDF**
写了个完整的代码例子
供初学者学习下
**来源 农民讲习所 发的一片 设计者.叶志伟
《建立通用处理程序》

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

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

/*********************************************************************************
[email=**@CPU]**@CPU[/email] @ AT89S52
[email=**@RAM]**@RAM[/email] @ 256Bytes
[email=**@ROM]**@ROM[/email] @ 0x0000-0x1fff
**@时间@ 12/19/09
**@环境@ keil uv3 v8.16
**@整理@ jerkoh
**@功能@ 51单片机模块化设计  
**@注意@ 请保留以下字样-> 版权.设计者.叶志伟.农民讲习所.21IcBBS  
*********************************************************************************/
           
/*********************************************************************************
**包含头文件
*********************************************************************************/      
#include <reg52.h>
/*********************************************************************************
**定义功能原型
*********************************************************************************/
void Memory_Init(unsigned char  *pRamEnd);
void Memory_Destory(void);
void Memory_MemSet(unsigned char idata  *pRam,unsigned char mChar,unsigned char mLen);
unsigned char idata  *Memory_Malloc(unsigned char mSize);
void Queue_Init(void);
void Queue_Destory(void);
void Queue_Push(struct QueueBuffer  *pQueueBuffer,unsigned char mData);
void Queue_Clear(struct QueueBuffer  *pQueueBuffer);
unsigned char Queue_Pop(struct QueueBuffer  *pQueueBuffer);
unsigned char Queue_Read(struct QueueBuffer  *pQueueBuffer,unsigned char mId);
unsigned int  Queue_Num(struct QueueBuffer  *pQueueBuffer);
struct QueueBuffer   *Queue_Register(unsigned int mSize);
void Uart08_Init(unsigned char SendBufferMax,unsigned char ReciBufferMax,unsigned char mBaud);
void Uart08_Destory(void);
/*********************************************************************************
**定义结构体
*********************************************************************************/
struct QueueBuffer        /*缓冲队列结构体*/
{                 /*结构体内成员是指针占3字节*/
    unsigned char  *aBufferStart;      /*缓冲区起始点*/
    unsigned char  *aBufferEnd;     /*缓冲区结束点*/
    unsigned char  *pIn;      /*写指针*/
    unsigned char  *pOut;      /*读指针*/
unsigned int    mCount;      /*缓冲区数据个数*/
  
};
struct Uart0
{
   struct QueueBuffer  *psSend;    /*发送队列指针*/
struct QueueBuffer  *psReci;    /*接收队列指针*/
};
/*********************************************************************************
**申明全局变量及宏定义
*********************************************************************************/
#define mSendBufferMax 32      /*发送缓冲区最大数据个数*/
#define mReciBufferMax 32      /*接收缓冲区最大数据个数*/
#define Baud_9600_11M  6      /*9600 8/n/1*/
            /*宏定义串口发送*/
#define Uart08_Push(x)       do{Queue_Push(sUart0.psSend,x);\
             if(!fUart0_Send_OK){fUart0_Send_OK=1;TI=1;};\
                             }while(0)
               /*宏定义串口接收*/
#define Uart08_Pop()         Queue_Pop(sUart0.psReci)
            /*宏定义读串口指定ID号*/
#define Uart08_Read(x)       Queue_Read(sUart0.psReci,x)
            /*宏定义读串口接受区数据个数*/
#define Uart08_ReciNum()     Queue_Num(sUart0.psReci)
                                       /*宏定义串口发送区清0*/
#define Uart08_SendClear(x)  do{Queue_Clear(sUart0.psend);}while(0);            
                                       /*宏定义串口接收区清0*/
#define Uart08_ReciClear(x)  do{Queue_Clear(sUart0.pReci);}while(0);

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

相关帖子

沙发
jerkoh|  楼主 | 2009-12-20 21:19 | 只看该作者
/*********************************************************************************
**函数:int main(void)
**入参:null
**返回:0
**功能: main
**时间:12/19/09
**说明:null
*********************************************************************************/
int main(void)
{
    unsigned char i;
unsigned char *pString;
   
    Memory_Init((unsigned char idata*)0xff);    /*初始化内存模块*/                                                                                          
Memory_Destory();          /*内存回收资源*/
    Queue_Init();           /*初始化队列*/
    Queue_Destory();          /*队列回收资源*/
               /*串口初始化*/
Uart08_Destory();
Uart08_Init(mSendBufferMax,mReciBufferMax,Baud_9600_11M);
           
EA =1;             /*允许总中断*/

     while(1)
     {
    pString=TestBuffer;         /*指针指向数组*/
    for(i=0;i<32;i++)
    {
      Uart08_Push(*pString++);          /*发送"Hello World!"*/
    }
    for(;;);  
     }
     return 1;
}
/*********************************************************************************
**函数:void Uart08_Init(unsigned char SendBufferMax,\
                         unsigned char ReciBufferMax,unsigned char mBaud)
**入参:SendBufferMax  ReciBufferMax mBaud
**返回:0
**功能: 串口初始化
**时间:12/20/09
**说明:null
*********************************************************************************/
void Uart08_Init(unsigned char SendBufferMax,\
                 unsigned char ReciBufferMax,unsigned char mBaud)
{
     fUart0_Send_OK = 0;
  Memory_MemSet((unsigned char idata*)&sUart0,0,sizeof(struct Uart0));
  sUart0.psSend=Queue_Register(SendBufferMax);      /*申请发送队列*/
  sUart0.psReci=Queue_Register(ReciBufferMax);      /*申请接收队列*/

  PCON |=0x80;            /*波特率加倍*/
  TMOD  =(TMOD&0x0f) | 0x20;            /*T1自动重装*/
  TH1   =TL1=(~mBaud)+1;             /*T1的定时初值*/
  TR1   =1;                            /*开定时器1*/
  SCON  =0x40 | 0x10;                         /*SM1=1 ,REN=1*/
  ES    =1;                                   /*允许中断*/
}

使用特权

评论回复
板凳
jerkoh|  楼主 | 2009-12-20 21:20 | 只看该作者
/*********************************************************************************
**函数:void Uart08_Destory(void)                        
**入参:null
**返回:0
**功能: 回收串口资源
**时间:12/20/09
**说明:null
*********************************************************************************/
void Uart08_Destory(void)
{
   TR1   =0;
  TMOD &=0x0f;
  PCON &=~0x80;
  ES    =0;
  SCON  =0;
}


/*********************************************************************************
**函数:Memory_Init(unsigned char  *pRamEnd)
**入参:*pRamEnd
**返回:null
**功能: 初始化内存  内存指针指向RAM的最后
**时间:12/19/09
**说明:null
*********************************************************************************/
void Memory_Init(unsigned char  *pRamEnd)
{
   pRamEnd=0;
}
/*********************************************************************************
**函数:void Memory_Destory(void)
**入参:null
**返回:null
**功能: 析构
**时间:12/19/09
**说明:IDLE STOP 进入此函数 释放硬件资源
*********************************************************************************/
void Memory_Destory(void)
{
;
}

/*********************************************************************************
**函数:unsigned char idata  *Memory_Malloc(unsigned char mSize)
**入参:mSzie
**返回:*pRamEnd 返回分配后的起始指针
**功能: 内存分配
**时间:12/19/09
**说明:null
*********************************************************************************/
unsigned char idata  *Memory_Malloc(unsigned char mSize)
{
    pRamEnd -= mSize;
return   pRamEnd;
}

/*********************************************************************************
**函数:void Memory_MemSet(unsigned char idata *pRam,\
                           unsigned char mChar,unsigned char mLen)
**入参:*pRam,mChar,mLen
**返回:null
**功能: 指定数据内存清除
**时间:12/19/09
**说明:null
*********************************************************************************/
void Memory_MemSet(unsigned char idata  *pRam,\
                   unsigned char mChar,unsigned char mLen)
{
    while(mLen--)
{
   *pRam++ = mChar;
}
}
/*********************************************************************************
**函数:void Queue_Init(void)
**入参:null
**返回:null
**功能: 初始化队列
**时间:12/19/09
**说明:null
*********************************************************************************/
void Queue_Init()
{
;
}

/*********************************************************************************
**函数:void Queue_Destory(void)
**入参:null
**返回:null
**功能: 释放队列硬件资源
**时间:12/19/09
**说明:null
*********************************************************************************/
void Queue_Destory()
{
;
}
/*********************************************************************************
**函数:void Queue_Push(struct QueueBuffer  *pQueueBuffer,unsigned char mData)/
                                             
**入参:QueueBuffer *pQueueBuffer  mData
**返回:null
**功能: 将数据压入队列
**时间:12/19/09
**说明:null
*********************************************************************************/
void Queue_Push(struct QueueBuffer  *pQueueBuffer,unsigned char mData)
{
   
    bit fEaReg;     
/*注意:如果是重入函数内部不能使用Bool变量*/
/*重入函数 KEIL默认 将所有变量定位到外部RAM的最高处,而外部RAM不可以位寻址*/
*pQueueBuffer->pIn++ = mData;
if(pQueueBuffer->pIn==pQueueBuffer->aBufferEnd)
{
    pQueueBuffer->pIn=pQueueBuffer->aBufferStart;
}
fEaReg=EA;
EA=0;
pQueueBuffer->mCount++;
EA=fEaReg;

}

/*********************************************************************************
**函数:unsigned char Queue_Pop(struct QueueBuffer  *pQueueBuffer)
**入参:QueueBuffer *pQueueBuffer
**返回:mData
**功能: 将数据弹出队列
**时间:12/19/09
**说明:null
*********************************************************************************/
unsigned char Queue_Pop(struct QueueBuffer  *pQueueBuffer)
{
unsigned char mData;
    bit fEaReg;     

mData=*pQueueBuffer->pOut ;
if(++pQueueBuffer->pOut==pQueueBuffer->aBufferEnd)
{
    pQueueBuffer->pOut=pQueueBuffer->aBufferStart;
}
fEaReg=EA;
EA=0;
pQueueBuffer->mCount--;
EA=fEaReg;
return mData;
}

/*********************************************************************************
**函数:unsigned char Queue_Read(struct QueueBuffer  *pQueueBuffer,unsigned char mId)
**入参:QueueBuffer  *pQueueBuffer  unsigned char mId
**返回:null
**功能: 读队列指定序号数据
**时间:12/19/09
**说明:null
*********************************************************************************/
unsigned char Queue_Read(struct QueueBuffer *pQueueBuffer,unsigned char mId)
{
   unsigned char *pTemp;
   pTemp=pQueueBuffer->pOut+mId;
   if(pTemp<pQueueBuffer->aBufferEnd)
   {
   return (*pTemp);
   }
   else
   {
      return (*(pTemp-pQueueBuffer->aBufferEnd+pQueueBuffer->aBufferStart));
   }

}

使用特权

评论回复
地板
jerkoh|  楼主 | 2009-12-20 21:20 | 只看该作者
/*********************************************************************************
**函数:unsigned int Queue_Num(struct QueueBuffer  *pQueueBuffer)
**入参:QueueBuffer *pQueueBuffer
**返回:i
**功能: 返回队列数据个数
**时间:12/19/09
**说明:null
*********************************************************************************/
unsigned int Queue_Num(struct QueueBuffer  *pQueueBuffer)
{
    unsigned int i;
    bit fEaReg;

   fEaReg=EA;
EA=0;
i=pQueueBuffer->mCount;
EA=fEaReg;
return i;
}

/*********************************************************************************
**函数:void Queue_Clear(struct QueueBuffer  *pQueueBuffer)
**入参:QueueBuffer *pQueueBuffer
**返回:i
**功能: 队列清空
**时间:12/19/09
**说明:null
*********************************************************************************/
void Queue_Clear(struct QueueBuffer  *pQueueBuffer)
{
    bit fEaReg;

   fEaReg=EA;
EA=0;
pQueueBuffer->pIn=pQueueBuffer->pOut=pQueueBuffer->aBufferStart;
pQueueBuffer->mCount=0;
EA=fEaReg;

}
/*********************************************************************************
**函数:struct QueueBuffer  *Queue_Register(unsigned int mSize)
**入参:unsigned int mSize
**返回:指针pQueueBuffer;
**功能: 申请注册缓冲队列
**时间:12/19/09
**说明:null
*********************************************************************************/
struct QueueBuffer  *Queue_Register(unsigned int mSize)
{
    struct QueueBuffer  *pQueueBuffer;

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

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

(mSize);
/*队列结束指针*/
pQueueBuffer->aBufferEnd=pQueueBuffer->aBufferStart+mSize;
/*返回struct QueueBuffer 结构指针*/
return  pQueueBuffer;  
}
/*********************************************************************************
**函数:void UART08() interrupt 4
**入参:null
**返回:null
**功能: 串口中断函数
**时间:12/19/09
**说明:null
*********************************************************************************/
void UART08() interrupt 4  
{
     if(TI)
  {
     TI =0;
  if(Queue_Num(sUart0.psSend))     /*检测发送区是否有数据*/
  {
     SBUF =Queue_Pop(sUart0.psSend);     /*串口发送*/
  }
  else
  {
     fUart0_Send_OK =0;       /*发送队列空 清标记 不再发送*/
  }
  }

  if(RI)
  {
     RI =0;
  Queue_Push(sUart0.psReci,SBUF);     /*接收数据存入队列*/
  }
}

使用特权

评论回复
5
zyok| | 2009-12-20 21:22 | 只看该作者
讲习所已成传说了。。。

使用特权

评论回复
6
jerkoh|  楼主 | 2009-12-20 21:22 | 只看该作者
:L 出来格式 全错了

使用特权

评论回复
7
hotpower| | 2009-12-20 22:20 | 只看该作者
做个标记~~~

使用特权

评论回复
8
杜专| | 2009-12-20 23:11 | 只看该作者
好多  带*好的

使用特权

评论回复
9
ejack| | 2009-12-21 06:35 | 只看该作者
农民运动讲习所的其它马甲是什么?
上回看到有个网友说他在别的论坛上的马甲是金色雨水,是吗?

使用特权

评论回复
10
itelectron| | 2009-12-21 08:10 | 只看该作者
这些大牛 都不知道怎么 离开的  是不是吵架后就离开了

使用特权

评论回复
11
328500920| | 2009-12-21 12:21 | 只看该作者
留一个脚印

使用特权

评论回复
12
红金龙吸味| | 2009-12-22 09:50 | 只看该作者
所长曾经贴过一个裸奔的GUI代码,现在下载不了,有没有谁收藏了,能否传上来一下?

使用特权

评论回复
13
thanksgiving| | 2010-1-28 10:26 | 只看该作者
up

使用特权

评论回复
14
oksmn| | 2010-1-30 15:16 | 只看该作者
学习!

使用特权

评论回复
15
linhuaou| | 2010-2-1 12:56 | 只看该作者
MARK1

使用特权

评论回复
16
老的男人| | 2010-2-6 19:27 | 只看该作者
记号

使用特权

评论回复
17
arm86| | 2010-2-8 11:58 | 只看该作者
mark一下

使用特权

评论回复
18
金蝉子| | 2010-2-8 14:19 | 只看该作者
好帖

使用特权

评论回复
19
DM_man| | 2010-2-8 14:21 | 只看该作者
好帖,标记

使用特权

评论回复
20
zyzwyh| | 2010-2-9 07:53 | 只看该作者
顶一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

116

主题

1401

帖子

2

粉丝