分享农民讲习所的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!"}; /*********************************************************************************
**函数: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; /*允许中断*/
} /*********************************************************************************
**函数: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));
}
} /*********************************************************************************
**函数: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); /*接收数据存入队列*/
}
} 讲习所已成传说了。。。 :L 出来格式 全错了 做个标记~~~ 好多带*好的 农民运动讲习所的其它马甲是什么?
上回看到有个网友说他在别的论坛上的马甲是金色雨水,是吗? 这些大牛 都不知道怎么 离开的是不是吵架后就离开了 留一个脚印 所长曾经贴过一个裸奔的GUI代码,现在下载不了,有没有谁收藏了,能否传上来一下? up 学习! MARK1 记号 mark一下 好帖 好帖,标记 顶一下
页:
[1]
2