实现功能: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;
}