基本信息
源码名称:串口通讯--串口控制LED
源码大小:0.48M
文件格式:.zip
开发语言:C/C++
更新时间:2019-09-08
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍

串口通讯--串口控制LED

/****************************************************************************
* 文 件 名: main.c
* 作    者: Andy
* 修    订: 2013-01-08
* 版    本: 1.0
* 描    述: 设置串口调试助手波特率:115200bps 8N1
*           串口调试助手给CC2530字符串控制Led灯,命令如下:
* D1#/d1#开关Led1 ; D2#/d2#开关Led1 ; A0#点亮Led1和Led2 A1#关闭Led1和Led2; 
****************************************************************************/
#include <ioCC2530.h>
#include <string.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

#define UART0_RX    1
#define UART0_TX    2
#define CONTROL_LED 3
#define SIZE        4
#define ON          1
#define OFF         0
#define LED1        P1_0   //定义P1.0口为LED1控制端


char RxBuf;
char UartState;
uchar count;
char RxData[SIZE];         //存储发送字符串

/****************************************************************************
* 名    称: DelayMS()
* 功    能: 以毫秒为单位延时
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint msec)
{ 
    uint i,j;
    
    for (i=0; i<msec; i  )
        for (j=0; j<1070; j  );
}

/****************************************************************************
* 名    称: InitLed()
* 功    能: 设置LED灯相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
    P1DIR |= 0x01;               //P1.0定义为输出口
    LED1 = 0;
}

/****************************************************************************
* 名    称: InitUart()
* 功    能: 串口初始化函数
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitUart(void)
{ 
    PERCFG = 0x00;           //外设控制寄存器 USART 0的IO位置:0为P0口位置1 
    P0SEL = 0x0c;            //P0_2,P0_3用作串口(外设功能)
    P2DIR &= ~0xC0;          //P0优先作为UART0
    
    U0CSR |= 0x80;           //设置为UART方式
    U0GCR |= 11;				       
    U0BAUD |= 216;           //波特率设为115200
    UTX0IF = 0;              //UART0 TX中断标志初始置位0
    U0CSR |= 0x40;           //允许接收 
    IEN0 |= 0x84;            //开总中断允许接收中断  
}

/****************************************************************************
* 名    称: UartSendString()
* 功    能: 串口发送函数
* 入口参数: Data:发送缓冲区   len:发送长度
* 出口参数: 无
****************************************************************************/
void UartSendString(char *Data, int len)
{
    uint i;
    
    for(i=0; i<len; i  )
    {
        U0DBUF = *Data  ;
        while(UTX0IF == 0);
        UTX0IF = 0;
    }
}

/****************************************************************************
* 名    称: UART0_ISR(void) 串口中断处理函数 
* 描    述: 当串口0产生接收中断,将收到的数据保存在RxBuf中
****************************************************************************/
#pragma vector = URX0_VECTOR 
__interrupt void UART0_ISR(void) 
{ 
    URX0IF = 0;       // 清中断标志 
    RxBuf = U0DBUF;                           
}


/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{	
    CLKCONCMD &= ~0x40;                        //设置系统时钟源为32MHZ晶振
    while(CLKCONSTA & 0x40);                   //等待晶振稳定为32M
    CLKCONCMD &= ~0x47;                        //设置系统主时钟频率为32MHZ   
    
    InitLed();                                 //设置LED灯相应的IO口
    InitUart();                                //串口初始化函数   
    UartState = UART0_RX;                      //串口0默认处于接收模式
    memset(RxData, 0, SIZE);
    
    while(1)
    {
        if(UartState == UART0_RX)              //接收状态 
        { 
            if(RxBuf != 0) 
            {                 
                if((RxBuf != '#')&&(count < 3))//以'#'为结束符,一次最多接收50个字符            
                    RxData[count  ] = RxBuf; 
                else
                {
                    if(count >= 3)             //判断数据合法性,防止溢出
                    {
                        count = 0;              //计数清0
                        memset(RxData, 0, SIZE);//清空接收缓冲区
                    }
                    else
                        UartState = CONTROL_LED;//进入发送状态 
                }
                RxBuf  = 0;
            }
        }
        
        if(UartState == CONTROL_LED)            //控制LED灯 
        {
            //判断接收的数据合法性
            if(RxData[0]=='d'||RxData[0]=='D'&&(RxData[1]=='1'||RxData[1]=='2'))
            {
                if(RxData[1]=='1')
                    LED1 = ~LED1;               //高电平点亮

            }
            else if(RxData[0]=='a'||RxData[0]=='A'&&(RxData[1]=='0'||RxData[1]=='1'))
            {
                if(RxData[1]=='0')
                {
                    LED1 = ON;

                }
                else
                {
                    LED1 = OFF;

                }
            }
            
            UartState = UART0_RX;
            count = 0;               
            memset(RxData, 0, SIZE);           //清空接收缓冲区
        }
    }
}