jerkoh 发表于 2009-12-20 21:19

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

整理电脑资料
阅读了下农民讲习所的一片PDF**
写了个完整的代码例子
供初学者学习下
**来源 农民讲习所 发的一片 设计者.叶志伟
《建立通用处理程序》

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

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

/*********************************************************************************
**@CPU @ AT89S52
**@RAM @ 256Bytes
**@ROM @ 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 intQueue_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_11M6      /*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;      /*定义串口的结构体*/
bitfUart0_Send_OK;      /*发送结束标记*/
unsigned char idata*pRamEnd;         /*内存指针尾*/
            /*用于测试的缓冲区*/
unsigned char idata TestBuffer={"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)
**入参:SendBufferMaxReciBufferMax 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 *pQueueBuffermData
**返回: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*pQueueBufferunsigned 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 结构指针*/
returnpQueueBuffer;
}
/*********************************************************************************
**函数: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);   /*接收数据存入队列*/
}
}

zyok 发表于 2009-12-20 21:22

讲习所已成传说了。。。

jerkoh 发表于 2009-12-20 21:22

:L 出来格式 全错了

hotpower 发表于 2009-12-20 22:20

做个标记~~~

杜专 发表于 2009-12-20 23:11

好多带*好的

ejack 发表于 2009-12-21 06:35

农民运动讲习所的其它马甲是什么?
上回看到有个网友说他在别的论坛上的马甲是金色雨水,是吗?

itelectron 发表于 2009-12-21 08:10

这些大牛 都不知道怎么 离开的是不是吵架后就离开了

328500920 发表于 2009-12-21 12:21

留一个脚印

红金龙吸味 发表于 2009-12-22 09:50

所长曾经贴过一个裸奔的GUI代码,现在下载不了,有没有谁收藏了,能否传上来一下?

thanksgiving 发表于 2010-1-28 10:26

up

oksmn 发表于 2010-1-30 15:16

学习!

linhuaou 发表于 2010-2-1 12:56

MARK1

老的男人 发表于 2010-2-6 19:27

记号

arm86 发表于 2010-2-8 11:58

mark一下

金蝉子 发表于 2010-2-8 14:19

好帖

DM_man 发表于 2010-2-8 14:21

好帖,标记

zyzwyh 发表于 2010-2-9 07:53

顶一下
页: [1] 2
查看完整版本: 分享农民讲习所的51代码整理