cc2410外部中断和与PC之间串口通信的一个综合性参考代码

    实现功能:1.当热释红外感应到有人时,引起cc2410的中断事件,将向PC发送一个字符串。

                      2.当PC向cc2410发送一个X-X-X-X格式的字符串,如果检测到第3个X为‘2',则使LED1灯闪烁。

  代码如下,仅作参考:

#include <ioCC2430.h>
#include <string.h>
#include <stdio.h>

#define uint unsigned int
#define uchar unsigned char
#define LED1 P1_0
#define LED2 P1_1
void Delay(uint);
void initUARTtest(void);
void UartTX_Send_String(char *Data,int len);
unsigned int irda_flag;
char Recdata[30];
uchar RTflag = 1;
uchar temp;
uint  datanumber = 0;
uint  stringlen;

/****************************************************************
*函数功能 :延时						
*入口参数 :定性延时									
*返 回 值 :无												
*说    明 :													
****************************************************************/
void Delay(uint n)
{
	uint i,t;
        for(i = 0;i<5;i++)
	for(t = 0;t<n;t++);
}

/****************************************************************
*函数功能 :初始化串口									
*入口参数 :无												
*返 回 值 :无							
*说    明 :57600-8-n-1						
****************************************************************/
void initUART(void)
{

    CLKCON &= ~0x40;              //晶振
    while(!(SLEEP & 0x40));      //等待晶振稳定

    PERCFG = 0x00;				//位置1 P0口
    P0SEL = 0x3c;				//P0用作串口
    P2DIR &= ~0XC0;                             //P0优先作为串口0

    U0CSR |= 0x80;				//UART方式
    U0GCR |= 10;				//baud_e
    U0BAUD |= 216;				//波特率设为57600
    UTX0IF = 0;

    U0CSR |= 0xC0;  
    IEN0 |= 0x84;
}

/****************************************************************
*函数功能 :串口发送字符串函数					
*入口参数 : data:数据									
*			len :数据长度							
*返 回 值 :无											
*说    明 :				
****************************************************************/
void UartTX_Send_String(char *Data,int len)
{
  int j;

  for(j=0;j<len;j++)
  {
    U0DBUF = *Data++;
    while(UTX0IF == 0);
    UTX0IF = 0;
  }

}

void UartTX_Send_word(char word)
{
    U0DBUF = word;
    while(UTX0IF == 0);
    UTX0IF = 0;
}

/*****************************************
//IO P1_2中断模式初始化
*****************************************/
void Init_IO(void)
{
    P1DIR = 0X03; //设置LED
    LED1 = 1;
    LED2 = 1;

    // P1_2 interrupt io initialized.
    P1DIR &= ~(0x01<<2);//P1_2 input mode
    P1INP &= ~(0x01<<2);//P1_2 Pull up
    P1IEN |=(0x01<<2);//P1_2 int enable
    PICTL &= ~(0x01<<1);//P1_2 rasing edge
    //PICTL |= (0x01<<1); //falling edge

    IEN0 |=0x80;   //全局允许中断
    IEN2 |=(0x01<<4);   //P1端口中断允许

    P1IFG &=~(0x01<<2); // P1_2中断标志清0
};


/****************************************************************
*函数功能 :主函数								
*入口参数 :无							
*返 回 值 :无						
*说    明 :无							
****************************************************************/
void main(void)
{	

        irda_flag = 0;

	initUART();

        Init_IO();// P0_0 IO初始化

	while(1)
	{
          LED1 = 1;
          LED2 = 0;
          if( 1 == irda_flag ){
            irda_flag = 0;

            UartTX_Send_String("3-S1-1-0",8);	

            UartTX_Send_word(0x0A);
            UartTX_Send_word(0x0D);
          }


           if(RTflag == 1)			//接收
          {
            LED2=0;				//接收状态指示
            if( temp != 0)
            {
                if((temp!='\r')&&(datanumber<30))
                {                               //'\r‘回车键为结束字符
                                                //最多能接收30个字符
                  Recdata[datanumber++] = temp;
                }
                else
                {
                  RTflag = 3;                   //进入发送状态
                }
                if(datanumber == 30)RTflag = 3;
              temp  = 0;
            }
          }

          if(RTflag == 3)			//如果串口上有数据发送上来则RTflag=3
          {
            datanumber = 0;			//指针归0
            char *delim="-";
            char *p;
            int i=0;
            int mm=0;
            printf("hello\n");
            strtok(Recdata,delim);  //注意分割字符串函数strtok的用法。
            while((i!=2)&&(p=strtok(NULL,delim))) i++;  
                   if(*p=='2'){     //如果分割到的第三个字符为'2',则使LED1闪烁。
                      for(mm=0;mm<10;mm++){
                   LED1=1;
                   Delay(10000);
                   LED1=0;
                   Delay(10000);
                   LED1=1;
                   Delay(10000);
                   LED1=0;
                   Delay(10000);
                   LED1=1;
                   Delay(10000);
                   LED1=0;
                   Delay(10000);
                   LED1=1;
                   Delay(10000);
                   LED1=0;
                   Delay(10000);
                      }
                   }


                   U0CSR |= 0x80;
                   RTflag = 1;
          }


	}
}

/*********************************************************************
//中断服务程序(P1_2端口)
*********************************************************************/
#pragma vector = P1INT_VECTOR
 __interrupt void P1_ISR(void)
 {

        if((P1IFG&0X04) > 0)         //中断
        {
          P1IFG &= ~(0x04);
          irda_flag = 1;

          LED1 = 0;
          Delay(1000);

        }

        P1IF = 0;          //清中断标志

 }

/**************************************************
*新增UART0_ISR中断服务程序
**************************************************/

#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
  URX0IF = 0;
  temp = U0DBUF;
}



 

(------------完----------)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值