1.学习单片机须注意以下几点:<br />首先你要明确学习单片机的目的是什么,对于大多数学习者来说,学习单片机的目的应该是应用,把它运用到你所在的行业或产品之中,单片机对于你的工作来说,只是一个工具或部件,那么在应用中我们选用单片机的标准是什么呢?四个字“够用就行”。可以说现在应用系统中绝大部分的项目,最简单的8位51单片机就可以胜任,现在真正需要高档单片机的项目还是少数。老板们<br />不会投入多余的钱去选用你推荐的所谓高级单片机,大部分人遵循“只买对的不买贵的”这样理性的原则,理性的人不会盲目的追随比尔 盖茨的不断升级,因为这些东西一方面有技术发展的需求,但是也有相当一部分是老板们为追求更大商业利益的炒作。因此我还是要说,如果你没有学过C51单片机的话,还是要学C51单片机。为什么?原因很简单,因为它是单片机的祖宗,后来的单片机都是在它的基础上开发出来的,是他的儿孙们。它也最容易学,更适合初学者。它的功能强大,物美价廉,大部分应用项目用它就够了,没有必要用高档的,当你学会了C51之后,如果确实需要用别的单片机,对于使用C语言编程的人来说,学习其它单片机还是比较容易的,写好的程序移植到其他单片机上也不是很难的事情,他们都是相通的. <br /> F-EeeOS学习板是明霞科技为“单片机和嵌入试操作系统应用”课程的专门设计的实验平台,它以AT89S52为范例介绍了MCS-51系列单片机各部件的C语言编程,产品开发中常用外设驱动程序编写的方法,目前流行的RTOS操作系统uCOS-Ⅱ在MCS-51系列单片机的移植和应用。<br /> F-EeeOS学习板资源丰富,明霞科技为您提供了基础篇,提高篇,高级篇三种类型的实验,其中基础篇的实验能快速帮助您熟悉MCS51系列单片机各部件的使用,学习完基础篇后,您会对MCS51系列单片机有个清晰的认识,能够在单片机上实现简单的功能; 提高篇是为对单片机有了认识后准备的,在这篇中通过学习LCD显示,I/O口模拟IIC通信,RS232通信的驱动程序编写,您能熟悉常用外设开发的方法,能培养您以后在产品开发过程中良好的编程习惯和 编写模块化程序的方法,在您认真学习完提高篇的实验后您可以大声地说:“我已经进入单片机开发的大门!”;高级篇是对单片机开发更深一步的探讨,是为今后您学习更高级CPU做准备的,在这篇中明霞科技通过实验告诉您如何把目前流行的ucos操作系统移植到MCS51写列芯片上,如何快速掌握基于ucos操作系统开发自己的产品和如何快进行模块化程序设计,最后再通过闹钟程序事例帮助您对整个学习做最后的巩固。<br /> 最后我相信大家在完成这些实验后能熟练掌握单片机开发的方法,只要您认真完成了这些实验您今后一定能快速成长为一个优秀的单片机开发者!<br /><br /><br />有兴趣的请联系QQ:11830067 <br />电话:13590189626(深圳号码)<br /><br />如果学生团队购买价格更加优惠。<br />2.这是提供给用户学习模块化程序设计的例子(队列来实现串口的驱动).<br />#define SCI_DRIVER<br />/*****************************************************************************************<br />*Copyright: MASNK Corporation *<br />*File name: SciDriver.c *<br />*Author: Kenny_wang *<br />*Version: V1.0 *<br />*Date: 2008/06/24 *<br />******************************************************************************************/<br /><br />/*****************************************************************************************<br /> Hardware Environment: <br /> AT89S52 <br /> Crystal:6M Hz<br />******************************************************************************************/<br />/*****************************************************************************************<br />*Modify List:<br />*<br />*1.2008/06/25 Kenny_wang <br />*----(1).release the original version. <br />*<br />******************************************************************************************/<br />#include "reg52.h"<br />#include "SciDriverSciDriver.h"<br />#include "SciDriverSourceFunLst.h"<br />#include "SciDriverPortsSciconfig.h"<br /><br /><br />/********************************************************************************<br />* Constant Define *<br />********************************************************************************/<br />#define cQBufNormal 0<br />#define cQBufFull 1<br />#define cQBufEmpty 2<br /><br />/********************************************************************************<br />* Queue structure *<br />********************************************************************************/<br />typedef struct{<br /> unsigned char *pIn;<br /> unsigned char *pOut;<br /> unsigned char *pStart;<br /> unsigned int bLength;<br /> unsigned int wSize;<br /> }QUEUE;<br /><br />/********************************************************************************<br />* Sci structure *<br />* Including tranmit and receive queue structure and Tx,Rx threshold variabls *<br />********************************************************************************/<br />typedef struct{<br /> unsigned char bTxStatus;<br /> unsigned int wTxLength;<br /> unsigned char *pbTx;<br /> QUEUE *pqRx;<br /> unsigned char bSciType;<br /> }SciStruct;<br /><br />/********************************************************************************<br />* List of Sci structure and queue *<br />********************************************************************************/<br />SciStruct SciList;<br />SciStruct *pSciIndex;<br />QUEUE QList;<br />unsigned char bSciRxBuf[MAX_SCI_BUF_SIZE];<br />unsigned char *pSciBuf = bSciRxBuf;<br />unsigned char bSciNo = 0;<br /><br />/********************************************************************************<br />* Internal Function Declaration *<br />********************************************************************************/<br />void sQInit(QUEUE *pq,unsigned char *pStart,unsigned int wSize);<br />unsigned char sQDataIn(QUEUE *pq,unsigned char bData); <br />unsigned char sQDataOut(QUEUE *pq,unsigned char *pData);<br /><br />/********************************************************************************<br />*Function name: sQInit *<br />*Parameters: pq: pointer to queue structure to be initialized *<br />* start: start address of ring buffer *<br />* size: the size of the ring buffer *<br />*Description: initialize a queue structure *<br />********************************************************************************/<br />void sQInit(QUEUE *pq,unsigned char *pStart,unsigned int wSize)<br />{<br /> pq->pIn = pStart;<br /> pq->pOut = pStart;<br /> pq->pStart = pStart;<br /> pq->bLength = 0;<br /> pq->wSize = wSize;<br />}<br /><br />/********************************************************************************<br />*Function name: sQDataIn *<br />*Parameters: pq: pointer to queue structure to be initialized *<br />* data: the data to be inserted into the queue *<br />*Returns: cQBufNormal: data has been inserted into the queue *<br />* cQBufFull: the buffer is full *<br />*Description: insert a data into the queue *<br />********************************************************************************/<br />unsigned char sQDataIn(QUEUE *pq,unsigned char bData)<br />{<br /> if(pq->bLength == pq->wSize)<br /> {<br /> if(pq->pIn == pq->pStart)<br /> {<br /> *(pq->pStart + pq->wSize) = bData;<br /> }<br /> else<br /> {<br /> *(pq->pIn-1) = bData;<br /> }<br /> return(cQBufFull);<br /> }<br /> else<br /> {<br /> *(pq->pIn) = bData;<br /> pq->bLength++;<br /> if(pq->pIn == pq->pStart + pq->wSize - 1)<br /> {<br /> pq->pIn = pq->pStart;<br /> }<br /> else<br /> {<br /> pq->pIn++;<br /> }<br /> return(cQBufNormal);<br /> }<br />}<br /><br />/********************************************************************************<br />*Function name: sQDataOut *<br />*Parameters: pq: pointer to queue structure to be initialized *<br />* pdata: the address to save the data *<br />*Returns: cQBufNormal: data has been inserted into the queue *<br />* cQBufEmpty: the buffer is empty *<br />*Description: Get a data from the queue *<br />********************************************************************************/<br />unsigned char sQDataOut(QUEUE *pq,unsigned char *pData)<br />{<br /> if(pq->bLength == 0)<br /> {<br /> return(cQBufEmpty);<br /> }<br /> *pData = *(pq->pOut);<br /> pq->bLength--;<br /> if(pq->pOut == pq->pStart + pq->wSize - 1)<br /> {<br /> pq->pOut = pq->pStart;<br /> }<br /> else<br /> {<br /> pq->pOut++;<br /> }<br /> return(cQBufNormal);<br />}<br /><br />/********************************************************************************<br />*Function Name: sInitialSci *<br />*Parameters: bSciId: sci id *<br />* *bRxBuf: receive buffer start address *<br />* wRxSize: receive buffer length *<br />* bTxBuf: transmit buffer start address *<br />* wTxSize: transmit buffer length *<br />* type: sci type *<br />*Descriptions: assign and initialize the sci control struct to sci *<br />********************************************************************************/<br />void sInitialSci(unsigned int wRxSize,unsigned char bType)<br />{<br /> QUEUE *pq;<br /> SciStruct *pSci;<br /><br /> pSci = &SciList;<br /> pSciIndex = pSci;<br /><br /> pSci->pqRx = &QList;<br /> pq = pSci->pqRx;<br /> sQInit(pq,pSciBuf,wRxSize);<br /> pSciBuf += wRxSize;<br /> bSciNo++;<br /><br /> pSci->bTxStatus = cSciTxRdy;<br /> pSci->wTxLength = 0;<br /><br /> pSci->bSciType = bType;<br />}<br /><br />/********************************************************************************<br />*Function Name: sSciRxISR *<br />*Parameters: bSciId: sci id *<br />*Description: This function is executed in Sci rx interrupt io2sci rx compare *<br />* interrupt. *<br />********************************************************************************/<br />void sSciRxISR(void)<br />{<br /> unsigned char bData;<br /> QUEUE *pq;<br /> SciStruct *pSci;<br /><br /> pSci = pSciIndex;<br /> pq = pSci->pqRx;<br /><br /> if(sbGetSciRxRdy() == cSciRxRdy)<br /> {<br /> sSciResetRx();<br /> bData = sbGetSciRxData();<br /> sQDataIn(pq,bData);<br /> }<br />}<br /><br />/********************************************************************************<br />*Function Name: sSciRead *<br />*Parameters: bSciId: sci id *<br />* *pBuf: address to save data received *<br />*Returns: cSciRxBufEmpty: receive buffer is empty *<br />* cSciRxRdy: get one byte data successfully *<br />*Description: This function is executed in AP *<br />********************************************************************************/<br />unsigned char sSciRead(unsigned char *pBuf)<br />{<br /> QUEUE *pq;<br /> unsigned char bTemp;<br /> SciStruct *pSci;<br /><br /> pSci = pSciIndex;<br /> pq = pSci->pqRx;<br /><br /> OS_ENTER_CRITICAL();<br /> bTemp = sQDataOut(pq,pBuf);<br /> OS_EXIT_CRITICAL();<br /><br /> if(bTemp == cQBufEmpty)<br /> {<br /> return(cSciRxBufEmpty);<br /> }<br /> else <br /> {<br /> return(cSciRxRdy);<br /> }<br />}<br /><br />/********************************************************************************<br />*Function Name: sSciTxISR *<br />*Parameters: bSciId: sci id *<br />*Description: This function is executed in Sci Tx interrupt io2sci Tx compare *<br />* interrupt. *<br />********************************************************************************/<br />void sSciTxISR(void)<br />{<br /> SciStruct *pSci;<br /><br /> pSci = pSciIndex;<br /><br /><br /> if(sbGetSciTxRdy() == cSciTxRdy)<br /> {<br /> if(pSci->wTxLength == 0)<br /> {<br /> pSci->bTxStatus = cSciTxRdy;<br /> sSciResetTx();<br /> }<br /> else<br /> {<br /> sSciTxData(*(pSci->pbTx));<br /> (pSci->pbTx)++;<br /> (pSci->wTxLength)--;<br /> sSciResetTx();<br /> }<br /> }<br />}<br /><br />/********************************************************************************<br />*Function Name: sSciWrite *<br />*Parameters: bSciId: sci id *<br />* *pstart: start address of data to be sent *<br />* wLength: the length of data to be send *<br />*Returns: cSciTxBufFull: transmit buffer is empty *<br />* cSciTxRdy: send one byte data successfully *<br />*Description: This function is executed in AP *<br />********************************************************************************/<br />unsigned char sSciWrite(unsigned char *pStart,unsigned int wLength)<br />{<br /> SciStruct *pSci;<br /><br /> pSci = pSciIndex;<br /><br /> if(pSci->bTxStatus == cSciTxBusy)<br /> {<br /> return(cSciTxBusy);<br /> }<br /><br /> OS_ENTER_CRITICAL();<br /> pSci->pbTx = pStart;<br /> pSci->wTxLength = wLength;<br /> pSci->bTxStatus = cSciTxBusy;<br /><br /> sSciTxData(*(pSci->pbTx));<br /> (pSci->pbTx)++;<br /> (pSci->wTxLength)--;<br /><br /> OS_EXIT_CRITICAL();<br /><br /> return(cSciTxRdy);<br />}<br /><br />/********************************************************************************<br />*Function Name: sbGetSciTxStatus *<br />*Parameters: bSciId: sci id *<br />*Returns: sci tx status cSciTxRdy *<br />* cSciTxBusy *<br />*Description: Get the sci trasmit status *<br />********************************************************************************/<br />unsigned char sbGetSciTxStatus(void)<br />{<br /> SciStruct *pSci;<br /><br /> pSci = pSciIndex;<br /><br /> return(pSci->bTxStatus);<br />}<br /><br />/********************************************************************************<br />*Function Name: sSetSciBaudRate *<br />*Parameters: bSciId: sci id *<br />*Returns: bBaudrate Sci Baudrate *<br />*Description: Set the sci baudrate *<br />********************************************************************************/<br />void sSetSciBaudRate(unsigned char bBaudrate)<br />{<br /> sSciChangeBaudRate(bBaudrate);<br />}<br /> |
|