微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 朱兆祺ForARM步步为营单片机项目篇(连载)

朱兆祺ForARM步步为营单片机项目篇(连载)

时间:10-02 整理:3721RD 点击:

    朱兆祺ForARM步步为营单片机基础篇一共25课,已经全部完成:http://bbs.elecfans.com/jishu_401095_1_1.html。
    这堂课开始,进行朱兆祺ForARM步步为营单片机项目篇,这里会涉及很多未来发展趋势的技术。项目篇使用的主控制板是朱兆祺ForARM步步为营单片机第二版:http://item.taobao.com/item.htm?spm=a1z10.1.w6545579-4546600052.5.VaB5nH&id=36402509748。
   
朱兆祺教你如何攻破C语言学习、笔试与机试的难点(连载):
http://bbs.elecfans.com/jishu_354666_1_1.html

朱兆祺ForARM步步为营单片机基础篇(连载):
http://bbs.elecfans.com/jishu_401095_1_1.html


朱兆祺带你一步一步学习嵌入式(连载):
http://bbs.elecfans.com/jishu_357014_1_1.html

朱兆祺ForARM步步为营单片机项目篇目录:
1.朱兆祺ForARM步步为营单片机项目篇:基于MT254x蓝牙4.0(之初识蓝牙4.0):
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=427091&pid=2828149&fromuid=222350
2.朱兆祺ForARM步步为营单片机项目篇:基于MT254x蓝牙4.0(蓝牙4.0驱动程序)


朱兆祺ForARM步步为营单片机项目篇:基于MT254x蓝牙4.0(之初识蓝牙4.0)


    这堂课开始,我们进入ForARM步步为营单片机的项目篇。

视频下载地址:
http://pan.baidu.com/share/link?shareid=3562495290&uk=3996269986#dir/path=%2F%E6%9C%B1%E5%85%86%E7%A5%BAForARM%2F%E6%9C%B1%E5%85%86%E7%A5%BAForARM%E5%8D%95%E7%89%87%E6%9C%BA%2F%E6%9C%B1%E5%85%86%E7%A5%BAForARM%E5%8D%95%E7%89%87%E6%9C%BA%E9%A1%B9%E7%9B%AE%E7%AF%87%EF%BC%88%E5%9F%BA%E4%BA%8E%E7%AC%AC%E4%BA%8C%E7%89%88%E5%AD%A6%E4%B9%A0%E6%9D%BF%EF%BC%89%2F%E9%A1%B9%E7%9B%AE%E8%A7%86%E9%A2%91

朱兆祺ForARM步步为营单片机项目篇:基于MT254x蓝牙4.0(蓝牙4.0驱动程序)


    在上一节已经带着大家初识蓝牙4.0模块,这一堂课给大家展示下蓝牙4.0在朱兆祺51单片机学习板的驱动程序。


    为了没有接触过蓝牙4.0的工程师照样可以使用蓝牙4.0进行串口透传功能的实现,馒头科技蓝牙4.0的蓝牙4.0模块实现主从一体、串口透传的固件。蓝牙4.0的详细介绍(AT指令集、使用手册等等请查看:http://bbs.elecfans.com/jishu_431223_1_1.html)。


   



/*


  *使用朱兆祺51单片机控制蓝牙4.0的头文件


*/
#include "config.h"
#include "uart.h"
#include "delay.h"

#ifndef  __COMMAND_H__
#define  __COMMAND_H__

/*


*  注意这个联合体的使用,不要觉得C语言中的结构体和联合体、指针等没有使用,使用这些东西可以大大提高你程序的效率


*/
typedef enum       
{
        AT_CALL,        //非查询非设置命令                               
        AT_GET,                //查询命令                                       
        AT_SET,                //设置命令                       
} AT_t;

/*  
*  使用这个联合体包含基本常用的AT指令
*/
typedef enum       
{
        AT_TEST,
        AT_HELP,
        AT_VERS,
        AT_NAME,
        AT_RENEW,
        AT_RESET,
        AT_ROLE,
        AT_NOTI,
        AT_IMME,
        AT_START,
        AT_TYPE,
       
        AT_BAUD,
        AT_FLOW,
        AT_PARI,
        AT_STOP,
       
        AT_ADVI,
        AT_POWE,
       
        AT_SCAN,
        AT_SHOW,
        AT_CON,
        AT_CONN,
        AT_CONNL,

       
        AT_ISCON,
        AT_DISCON,
        AT_CLEAR,
        AT_RADD,
        AT_SAVE,
       
        AT_PASS,
        AT_MAC,
        AT_RSSI,
        AT_TEMP,
       
        AT_LED,
        AT_PDIR,
        AT_PDAT,
       
        AT_PWRM,
        AT_SLEEP,
        AT_WAKE,
        AT_BATC,
        AT_BATT,
} AT_cmd;

/*
*  变量的声明,注意结构体的使用
*/
struct ATCmdIndex
{
        AT_cmd        cmd;
        uint8                *ucpCmdPrefix;
};

/*


*  WK管脚的使用:


*  1.管脚电平的改变可以唤醒


*  2.管脚电平决定当前工作模式,高电平——AT指令;低电平——透传


*/
sbit WK        = P2^0;

/*


*  模块处于远控模式


*  do……while(1)的这个用法我在C语言技术公开课有详细讲解,请查看


*/
#define        ATMode()                \
                do                        \
                {                        \
                        WK = 1;        \
                }while(0)



/*


*  模块处于透传模式


*/
#define        TTMode()                \
                do                        \
                {                        \
                        WK = 0;        \
                }while(0)

/* AT指令的发送 */
extern int8 ATCmdSend(AT_cmd cmd, AT_t type, uint8 *ucpPara);

/* AT指令数据的接收 */
extern int8 ATGetPara(AT_t type, uint8 **ucppParaAddr, uint8 *ucParaLen);
#endif        /* end of file */


我们再来看一下功能的具体实现。
/*************************************************
*  文件名称:command.c
*  文件功能:发送AT指令实现文件
*  文件作者:Lawrence
*  创建时间:2014-04-09
*  修改时间:
*  文件版本:V0.3
*************************************************/
#include "command.h"
/*
**        AT指令表
** 索引号 ,        指令前缀
*/
code struct ATCmdIndex        ATCmdTable[] =
{
        /*================常用指令==================*/
        {AT_TEST,        "AT+"},                                                //测试                                               
        {AT_HELP,        "AT+HELP"},                                                //帮助查询
        {AT_VERS,         "AT+VERS"},                                                //软件版本查询
        {AT_NAME,         "AT+NAME"},                                                //查询/设置模块名称,最长允许15个字符
        {AT_RENEW,         "AT+RENEW"},                                        //恢复出厂设置
        {AT_RESET,         "AT+RESET"},                                        //重启模块       
        {AT_ROLE,        "AT+ROLE"},                                                //查询/设置主从模式
        {AT_NOTI,        "AT+NOTI"},                                                //查询/设置是否把当前连接状态通知给用户
        {AT_IMME,        "AT+IMME"},                                                //查询/设置模块工作方式
        {AT_START,        "AT+START"},                                        //开始工作
        {AT_TYPE,        "AT+TYPE"},                                                //查询/设置模块密码验证类型
        /*================串口指令==================*/
        {AT_BAUD,        "AT+BAUD"},                                                //查询/设置波特率
        {AT_FLOW,        "AT+FLOW"},                                                //查询/设置硬件流控
        {AT_PARI,        "AT+PARI"},                                                //查询/设置串口校验
        {AT_STOP,        "AT+STOP"},                                                //查询/设置停止位
        /*================从机指令==================*/
        {AT_ADVI,        "AT+ADVI"},                                                //查询/设置广播时间间隔
        {AT_POWE,        "AT+POWE"},                                                //查询/设置模块发射功率       
        /*================主机指令==================*/
        {AT_SCAN,        "AT+SCAN"},                                                //搜索可连接模块
        {AT_SHOW,        "AT+SHOW"},                                                //查询/设置模块在手动搜索时是否返回名字
        {AT_CON,        "AT+CON"},                                                //连接指定蓝牙MAC地址的从模块
        {AT_CONN,        "AT+CONN"},                                                //连接搜索返回的模块
        {AT_CONNL,        "AT+CONNL"},                                        //连接最后一次连接成功的从模块
       
        /*==============连接相关指令================*/
        {AT_ISCON,        "AT+ISCON"},                                        //查询当前模块是否处于连接状态
        {AT_DISCON,        "AT+DISCON"},                                        //断开连接
        {AT_CLEAR,        "AT+CLEAR"},                                        //清除模块配对信息
        {AT_RADD,        "AT+RADD"},                                                //查询成功连接过的远程主机地址
        {AT_SAVE,        "AT+SAVE"},                                                //查询/设置模块成功连接后是否保存连接地址
        /*============模块信息相关指令==============*/
        {AT_PASS,        "AT+PASS"},                                                //查询/设置配对密码
        {AT_MAC,        "AT+MAC"},                                                //查询本机MAC地址
        {AT_RSSI,        "AT+RSSI"},                                                //读取 RSSI 信号值
        {AT_TEMP,        "AT+TEMP"},                                                //查询模块温度
       
        /*===============IO监控指令================*/
        {AT_LED,        "AT+LED"},                                                //查询/设置LED输出状态
        {AT_PDIR,        "AT+PDIR"},                                                //查询/设置PIO口的输入输出方向
        {AT_PDAT,        "AT+PDAT"},                                                //查询/设置PIO口的输入输出状态
        /*=============电源管理指令================*/       
        {AT_PWRM,        "AT+PWRM"},                                                //查询/设置模块进入自动休眠的时间
        {AT_SLEEP,        "AT+SLEEP"},                                        //让模块进行休眠状态
        {AT_WAKE,        "AT+WAKE"},                                                //将模块从休眠状态唤醒
        {AT_BATC,        "AT+BATC"},                                                //查询/设置电量监控开关
        {AT_BATT,        "AT+BATT"},                                                //查询电量信息
};
/*******************************************************
*  函数名称:FindCmd
*  函数功能:在AT指令表中查找目标指令
*  入口参数:ucCmd,指令索引号;                       
*  出口参数:uint8 *,找到的该指令的前缀首地址
*  函数说明:
******************************************************/
static uint8 *FindCmd(AT_cmd cmd)
{
        uint8        ucSize        = sizeof(ATCmdTable) / sizeof(ATCmdTable[0]);               
        uint8 i;
        for(i = 0; i<ucSize; i++)
        {
                if(cmd == ATCmdTable.cmd)
                {
                        return ATCmdTable.ucpCmdPrefix;                                //返回这个AT指令的前缀首地址
                }
        }
       
        return NULL;
}

/*******************************************************
*  函数名称:ATCmdSend
*  函数功能:发送AT指令
*  入口参数:        cmd,指令索引号;
                        type,指令类型;
                        ucpPara,指令携带的参数,无参数请设置为NULL;
*  出口参数:__OK,成功;__ERR,失败
*  函数说明:
******************************************************/
int8 ATCmdSend(AT_cmd cmd, AT_t type, uint8 *ucpPara)
{
        #define CMDLEN        (64)
       
        uint8 ucCmdStr[CMDLEN] = {0};                                        //AT指令缓冲区
        uint8 *ucpSrc;                                                       
        ucpSrc = FindCmd(cmd);                                                //查找该指令,取得前缀
        if(NULL == ucpSrc)
        {
                return __ERR;                                                //没有找到,命令无效
        }
       
        strcpy(ucCmdStr, ucpSrc);                                        //将命令拷贝到缓冲区
        if(AT_GET == type)
        {
                strcat(ucCmdStr, "?");                                        //查询命令,则在指令后面加上问号
        }
        else if(AT_SET == type)
        {
                strcat(ucCmdStr, "[");                                        //设置命令,把要设置的参数填充到缓冲区
                strcat(ucCmdStr, ucpPara);
                strcat(ucCmdStr, "]");
        }
        else
        {
                _nop_();                                                        //非查询非设置命令,不带问号不带参数
        }
        UARTSend(ucCmdStr, strlen(ucCmdStr));                        //将指令通过串口发送给模块
        MyBzero(ucCmdStr, CMDLEN);
       
        /*
        **在波特率为9600的情况下,传输一个字节需要0.96ms,
        **由于串口接收是通过中断来完成,主线程序需要延时等待中断,
        **而一般的AT指令的回复的数据量都不大(不超过64),除了AT+SCAN这条指令,
        **所以一般情况下延时不需要很长。
        */
        UARTStartRecv();                                                        //串口开始接收数据
        if(AT_SCAN == cmd)
        {
                //Delay100ms(40);                                                //扫描过程需要4秒
                //Delay1ms(64);                                                //特殊命令延时特殊处理
                while(NULL == strstr(ucRecvBuf, "OK+END"));        //等待“OK+END”结束回复
        }
        else
        {               
                //Delay1ms(32);
                Delay1ms(100);
        }
        UARTStopRecv();                                                        //串口停止接收数据       
        return __OK;
}
/*******************************************************
*  函数名称:ATGetPara
*  函数功能:从串口接收缓冲区取出AT指令的回复参数
*  入口参数:        ucType,指令类型;
                        ucppParaAddr,存储本函数获取到回复参数首地址;
                        ucParaLen,存储本函数获取到回复参数长度;
*  出口参数:__OK,成功;__ERR,失败
*  函数说明:
******************************************************/
int8 ATGetPara(AT_t type, uint8 **ucppParaAddr, uint8 *ucpParaLen)
{
        if((NULL == ucppParaAddr) || (NULL == ucpParaLen))
        {
                return __ERR;                                               
        }
       
        if(AT_CALL == type)
        {
                *ucppParaAddr        = ucRecvBuf;
                *ucpParaLen                = strlen(ucRecvBuf);                        //对于CALL指令,直接返回原始数据,不进行预处理
        }
        else if(AT_GET == type)
        {
                if(strncmp(ucRecvBuf, "OK+GET:", 7) == 0)                        //进一步校验回复格式是否正确
                {
                        *ucppParaAddr        = ucRecvBuf + 7;                        //取出para的首地址
                        *ucpParaLen                = strlen(ucRecvBuf) - 7 - 2;        //略去OK+GET: 和 \r\n
                }
                else
                {
                        return __ERR;
                }
        }
        else if(AT_SET == type)
        {
                if(strncmp(ucRecvBuf, "OK+SET:", 7) == 0)
                {
                        *ucppParaAddr        = ucRecvBuf + 7;                        //取出para的首地址
                        *ucpParaLen                = strlen(ucRecvBuf) - 7 - 2;        //略去OK+SET: 和 \r\n
                }
                else if(strncmp(ucRecvBuf, "OK+CONN:", 8) == 0)                //考虑AT+CON[para1]和AT+CONN[para1]这两条指令的特殊性,需特殊处理
                {
                        *ucppParaAddr        = ucRecvBuf + 8;                        //取出para的首地址
                        *ucpParaLen                = strlen(ucRecvBuf) - 8 - 2;        //略去OK+CONN: 和 \r\n
                }
                else
                {
                        return __ERR;
                }
        }
        else
        {
                return __ERR;
        }
        return __OK;
}
功能进一步实现请看下一节,精彩在更新。
效果预先看:





朱兆祺ForARM步步为营单片机项目篇:基于MT254x蓝牙4.0(串口驱动程序)
    使用串口通过AT指令控制蓝牙,是一种快速对蓝牙进行二次开发的渠道。从单片机的第一课开始,我就强调一定要增强程序的可移植性,因此模块化编程是必要的。
UART的头文件:

  1. /*************************************************
  2. *  ???t??3?£ouart.h
  3. *  ???t1|?ü£o′??úêμ?????t
  4. *  ???t×÷??£oLawrence
  5. *  ′′?¨ê±??£o2014-04-08
  6. *  DT??ê±??£o
  7. *  ???t°?±?£oV0.3
  8. *************************************************/
  9. #include "config.h"

  10. #ifndef  __UART_H__
  11. #define  __UART_H__

  12. /*======================oê?¨ò?=======================*/

  13. #define FOSC 11059200L                                                      //?μí3?§???ù?ê
  14. #define BAUD 115200                                                       //UART2¨ì??êéè??
  15. #define PCON_SMOD        (FALSE)                                                //2¨ì??êê?·??ó±?

  16. /*Define UART parity mode*/
  17. #define NONE_PARITY     0                                                   //?TD£?é
  18. #define ODD_PARITY      1                                                   //??D£?é
  19. #define EVEN_PARITY     2                                                   //??D£?é

  20. #define PARITYBIT NONE_PARITY                                           //éè???TD£?é·?ê?

  21. #define UART_BUF_SIZE        (64)                                                //′??ú?óê??o3???′óD?

  22. //????2¨ì??êê±£?Dèòaòààμμ¥???ú?ù′|μ?ê±?ó?£ê?£?12T/6T
  23. #ifdef        CCT_12T
  24. #define        CCT_MODE        (32)
  25. #else
  26. #define        CCT_MODE        (16)
  27. #endif


  28. /*====================±?á?éù?÷=======================*/       
  29. extern uint8 ucRecvBuf[UART_BUF_SIZE];                                //′??úμ??óê??o3???
  30. extern uint8 ucBufIndex;                                                //?o3???êy?Y????




  31. /*====================oˉêyéù?÷=======================*/

  32. /*******************************************************
  33. *  oˉêy??3?£oUARTInit
  34. *  oˉêy1|?ü£o′??ú3?ê??ˉ£?115200bps@11.0592MHz
  35. *  è??ú2?êy£o?T
  36. *  3??ú2?êy£o__OK£?3é1|£?__ERR£?꧰ü
  37. *  oˉêy?μ?÷£o
  38. ******************************************************/
  39. uint8 UARTInit(void);       

  40. /*******************************************************
  41. *  oˉêy??3?£oUARTSendByte
  42. *  oˉêy1|?ü£o′??ú·¢?íò???×??ú
  43. *  è??ú2?êy£oòa·¢?íμ?×??úêy?Y
  44. *  3??ú2?êy£o__OK£?3é1|£?__ERR£?꧰ü
  45. *  oˉêy?μ?÷£o
  46. ******************************************************/
  47. extern int8 UARTSendByte(uint8 ucByte);

  48. /*******************************************************
  49. *  oˉêy??3?£oUARTSend
  50. *  oˉêy1|?ü£o′??ú·¢?íè??é??×??ú
  51. *  è??ú2?êy£ouiData£?òa·¢?íμ?êy?Yμ??eê?μ??·£?uiLen£?òa·¢?íμ?×??úêy
  52. *  3??ú2?êy£o__OK£?3é1|£?__ERR£?꧰ü
  53. *  oˉêy?μ?÷£o
  54. ******************************************************/
  55. extern int8 UARTSend(uint8 *ucpData, uint32 uiLen);

  56. /*******************************************************
  57. *  oˉêy??3?£oMyBzero
  58. *  oˉêy1|?ü£o??á??o3???
  59. *  è??ú2?êy£opBufAddr£??o3???ê×μ??·£?uiLen£??o3???3¤?è
  60. *  3??ú2?êy£o__OK£?3é1|£?__ERR£?꧰ü
  61. *  oˉêy?μ?÷£o
  62. ******************************************************/
  63. extern int8 MyBzero(uint8 *ucpBufAddr, uint32 uiLen);

  64. /*******************************************************
  65. *  oˉêy??3?£oUARTStartRecv
  66. *  oˉêy1|?ü£o?a??′??ú?D???óê?
  67. *  è??ú2?êy£o?T
  68. *  3??ú2?êy£o__OK£?3é1|£?__ERR£?꧰ü
  69. *  oˉêy?μ?÷£o
  70. ******************************************************/
  71. extern int8 UARTStartRecv(void);

  72. /*******************************************************
  73. *  oˉêy??3?£oUARTStopRecv
  74. *  oˉêy1|?ü£o1?±?′??ú?D???óê?
  75. *  è??ú2?êy£o?T
  76. *  3??ú2?êy£o?T
  77. *  oˉêy?μ?÷£o
  78. ******************************************************/
  79. #define        UARTStopRecv()        \
  80.                 do                        \
  81.                 {                        \
  82.                         ES        = 0;        \
  83.                         RI        = 0;        \
  84.                 }while(0)



  85. #endif        /* end of file */

复制代码




UART的驱动程序:

  1. /*************************************************
  2. *  ???t??3?£ouart.c
  3. *  ???t1|?ü£o′??úêμ?????t
  4. *  ???t×÷??£oLawrence
  5. *  ′′?¨ê±??£o2014-04-08
  6. *  DT??ê±??£o
  7. *  ???t°?±?£oV0.3
  8. *************************************************/

  9. #include "uart.h"


  10. uint8 ucRecvBuf[UART_BUF_SIZE]        = {0};                        //′??úμ??óê??o3???
  11. uint8 ucBufIndex         = 0;                                                        //?o3???êy?Y????


  12. #if        defined( CONFIG_STC89C52RC ) ||        \
  13.         defined( CONFIG_STC12C5A60S2 )

  14. #if        defined(CONFIG_C52_12M)

  15. /*******************************************************
  16. *  oˉêy??3?£oUARTInit
  17. *  oˉêy1|?ü£o′??ú3?ê??ˉ
  18. *  è??ú2?êy£o?T
  19. *  3??ú2?êy£o__OK£?3é1|£?__ERR£?꧰ü
  20. *  oˉêy?μ?÷£o
  21. ******************************************************/
  22. #if 0
  23. int8 UARTInit(void)
  24. {
  25.         //′??ú1¤×÷?£ê?éè??
  26. #if PCON_SMOD
  27.         PCON        |= 0x80;                                                        //PCON.SMOD=1,2¨ì??ê?ó±?
  28.         #define BAUD_DOUBLE        (2)
  29. #else
  30.         PCON        &= 0x7F;                                                        //PCON.SMOD=0,2¨ì??ê2??ó±?
  31.         #define BAUD_DOUBLE        (1)
  32. #endif
  33.         SCON        = 0x50;                                                        //SCON.SM0=0,SCON.SM1=1,1¤×÷·?ê?1£?8bit-?TD£?é??£?
  34.         EA        = 1;                                                                //?a×ü?D??
  35.         ES        = 0;                                                                //?è2??a??′??ú?D??
  36.         
  37.         /*
  38.         *ó??è??éè??£?êy×???′ó£?ó??è??????£o
  39.         *0:        PSH        = 0;        PS        = 0;
  40.         *1:        PSH        = 0;        PS        = 1;
  41.         *2:        PSH        = 1;        PS        = 0;
  42.         *3:        PSH        = 1;        PS        = 1;
  43.         *×¢£oIPHà???μ?bit2??ü??DD??2ù×÷
  44.         */
  45.         IPH        &= ~(0x01<<4);        PS        = 0;
  46.         
  47.         //?¨ê±?÷1ìá1?2¨ì??ê£?2¨ì??êéè??£?TH1 = - 2^SMOD * SYSclk / (12|6) / 32 / BAUD£?        
  48.         TMOD        &= 0x0F;
  49.         TMOD        |= 0x20;                                                        //?¨ê±?÷1éè???a8bit×??ˉ??×°?£ê?
  50.         //TH1        = TL1        = - (BAUD_DOUBLE * FOSC/CCT_MODE/32/BAUD);                //éè???¨ê±?÷3?ê??μ        
  51.         TH1        = TL1        = 0xFD;
  52.         TR1        = 1;                                                                //?a???¨ê±?÷
  53.         
  54.         return __OK;         
  55. }
  56. #endif

  57. /*******************************************************
  58. *  oˉêy??3?£oUARTInit
  59. *  oˉêy1|?ü£o′??ú3?ê??ˉ£?115200bps@11.0592MHz
  60. *  è??ú2?êy£o?T
  61. *  3??ú2?êy£o__OK£?3é1|£?__ERR£?꧰ü
  62. *  oˉêy?μ?÷£o
  63. ******************************************************/
  64. uint8 UARTInit(void)               
  65. {        
  66.         #if (PARITYBIT == NONE_PARITY)
  67.         SCON = 0x50;                                                            //8-bit variable UART
  68.         #elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY)
  69.         SCON = 0xda;                                                            //9-bit variable UART, parity bit initial to 1
  70.         #endif

  71.         /* ?¨ê±?÷2ê?ó?à′UART2¨ì??ê????μ? */
  72.         TL2 = RCAP2L = (65536-(FOSC/CCT_MODE/BAUD));                         //éè???¨ê±?÷2μ??¨ê±ê±??
  73.         TH2 = RCAP2H = (65536-(FOSC/CCT_MODE/BAUD)) >> 8;
  74.         
  75.         T2CON = 0x34;                                                           //???ˉ?¨ê±?÷2
  76.         
  77.         EA        = 1;                                                                        //?a×ü?D??
  78.         ES        = 0;                                                                        //?è2??a??′??ú?D??
  79.         
  80.         /*
  81.         *′??ú?D??ó??è??éè??£?êy×???′ó£?ó??è??????£o
  82.         *0:        PSH        = 0;        PS        = 0;
  83.         *1:        PSH        = 0;        PS        = 1;
  84.         *2:        PSH        = 1;        PS        = 0;
  85.         *3:        PSH        = 1;        PS        = 1;
  86.         *×¢£oIPHà???μ?bit2??ü??DD??2ù×÷
  87.         */
  88.         IPH        &= ~(0x01<<4);        PS        = 0;
  89.         
  90.         return __OK;
  91. }

  92. /*******************************************************
  93. *  oˉêy??3?£oUARTSendByte
  94. *  oˉêy1|?ü£o′??ú·¢?íò???×??ú
  95. *  è??ú2?êy£oòa·¢?íμ?×??úêy?Y
  96. *  3??ú2?êy£o__OK£?3é1|£?__ERR£?꧰ü
  97. *  oˉêy?μ?÷£o
  98. ******************************************************/
  99. int8 UARTSendByte(uint8 ucByte)
  100. {
  101.         SBUF        = ucByte;
  102.         while(!TI);
  103.         TI        = 0;
  104.         
  105.         return __OK;
  106. }

  107. /*******************************************************
  108. *  oˉêy??3?£oUARTSend
  109. *  oˉêy1|?ü£o′??ú·¢?íè??é??×??ú
  110. *  è??ú2?êy£ouiData£?òa·¢?íμ?êy?Yμ??eê?μ??·£?uiLen£?òa·¢?íμ?×??úêy
  111. *  3??ú2?êy£o__OK£?3é1|£?__ERR£?꧰ü
  112. *  oˉêy?μ?÷£o
  113. ******************************************************/
  114. int8 UARTSend(uint8 *ucpData, uint32 uiLen)
  115. {
  116.         //EA        = 0;                                                                //·¢?íêy?Y2??ü±?′ò??
  117.         while(uiLen--)
  118.         {
  119.                 SBUF=*(ucpData++);
  120.                 while(!TI);                                                        //TI=0,?μ?÷é?ò?ì???á??1??·¢íê£?TI?1??óD±???1£?μè′y
  121.                 TI=0;                                                                //TI=0,μ±?°SBUF′?′¢μ?êy?Y·¢?í
  122.         }
  123.         //EA        = 1;                                                                //???′?D??
  124.         
  125.         return __OK;
  126. }

  127. /*******************************************************
  128. *  oˉêy??3?£oUARTInterrupt
  129. *  oˉêy1|?ü£o′??ú?D??£??óê?êy?Y
  130. *  è??ú2?êy£o?T
  131. *  3??ú2?êy£o?T
  132. *  oˉêy?μ?÷£o
  133. ******************************************************/
  134. void UARTInterrupt(void) interrupt 4
  135. {
  136.         if(RI)
  137.         {
  138.                 RI        = 0;                                                        //RI=0,SM2=0,?óê?êy?Y×°??μ?SBUF?D
  139.                 ucRecvBuf[ucBufIndex]        = SBUF;                        //è?3?ó2?t?o3???μ?êy?Y
  140.                 ucBufIndex++;                                                //×?±???′??óê?êy?Y
  141.                 if(ucBufIndex > UART_BUF_SIZE)
  142.                 {
  143.                         ES        = 0;                                                //êy?Y3?3?·??§£?1??D??£????1??′??óê?
  144.                         ucBufIndex        = 0;                                        //êy?Y??????á?
  145.                 }
  146.         }
  147. }

  148. /*******************************************************
  149. *  oˉêy??3?£oMyBzero
  150. *  oˉêy1|?ü£o??á??o3???
  151. *  è??ú2?êy£opBufAddr£??o3???ê×μ??·£?uiLen£??o3???3¤?è
  152. *  3??ú2?êy£o__OK£?3é1|£?__ERR£?꧰ü
  153. *  oˉêy?μ?÷£o
  154. ******************************************************/
  155. int8 MyBzero(uint8 *ucpBufAddr, uint32 uiLen)
  156. {
  157.         uint32 i;
  158.         for(i = 0; i < uiLen; i++)
  159.         {
  160.                 *(ucpBufAddr + i)        = 0;
  161.         }
  162.         
  163.         return __OK;
  164. }

  165. /*******************************************************
  166. *  oˉêy??3?£oUARTStartRecv
  167. *  oˉêy1|?ü£o?a??′??ú?D???óê?
  168. *  è??ú2?êy£o?T
  169. *  3??ú2?êy£o__OK£?3é1|£?__ERR£?꧰ü
  170. *  oˉêy?μ?÷£o
  171. ******************************************************/
  172. int8 UARTStartRecv(void)
  173. {
  174.         MyBzero(ucRecvBuf, UART_BUF_SIZE);                                //?óê?êy?Y?°£??è°????°μ?êy?Y????
  175.         ucBufIndex        = 0;                                                        //êy?Y??????á?
  176.         RI        = 0;                                                                //?á?D????á?
  177.         ES        = 1;                                                                //?a???D??

  178.         return __OK;
  179. }


  180. #endif        /* end of CONFIG_C52_12M */


  181. #endif        /* end of CONFIG_STC... */

复制代码




朱大哥加油~我们向你学习了~

额,注释都变成乱码了

不错的资料。谢谢啊

视频的下载?

您好,我想看您的全套视频,但是找不到啊- -

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top